2012-07-06 7 views
11

Me gustaría saber cómo puedo obtener una lista de todas las pantallas Xorg en mi sistema, junto con una lista de pantallas asociadas con cada pantalla. Pasé un tiempo mirando la documentación de Xlib, pero no pude encontrar una función que haga lo que quiero. Supongamos que no tengo más dependencias que no sean OS y X de POSIX-complaint (p. Ej., No GTK). Si lo que pregunto no es posible asumiendo estas dependencias mínimas, entonces una solución que use otras bibliotecas está bien.Obtención de la lista de todas las pantallas Xorg

¡Muchas gracias por su ayuda!

Respuesta

15

La única forma que conozco de obtener una lista de pantallas es consultar el directorio /tmp/.X11-unix.

Una vez hecho esto, puede usar Xlib para consultar cada pantalla para obtener más información.

Por ejemplo:

#include <stdio.h> 
#include <dirent.h> 
#include <string.h> 
#include <X11/Xlib.h> 

int main(void) { 
    DIR* d = opendir("/tmp/.X11-unix"); 

    if (d != NULL) { 
     struct dirent *dr; 
     while ((dr = readdir(d)) != NULL) { 
      if (dr->d_name[0] != 'X') 
       continue; 

      char display_name[64] = ":"; 
      strcat(display_name, dr->d_name + 1); 

      Display *disp = XOpenDisplay(display_name); 
      if (disp != NULL) { 
       int count = XScreenCount(disp); 
       printf("Display %s has %d screens\n", 
        display_name, count); 

       int i; 
       for (i=0; i<count; i++) 
        printf(" %d: %dx%d\n", 
         i, XDisplayWidth(disp, i), XDisplayHeight(disp, i)); 

       XCloseDisplay(disp); 
      } 
     } 
     closedir(d); 
    } 

    return 0; 
} 

Ejecución de lo anterior me da esta salida con mis actuales pantallas/pantallas:

Display :0 has 1 screens 
0: 3046x1050 
Display :1 has 2 screens 
0: 1366x768 
1: 1680x1050 

nunca encontró una mejor manera de enumerar X pantallas, excepto eso. Me gustaría saber si existe una mejor alternativa.

+0

Parece que las tomas de visualización pueden estar en '/ usr/spool/hembra/X11 /' para hpux y '/ var/TSOL/puertas/.X11 en UNIX /' para algunas configuraciones de Solaris. Sin embargo, creo que estos son lo suficientemente raros que solo puedes confiar en '/ tmp/.X11-unix /'. – Azmisov

4

Como escribió netcoder, el problema tiene dos partes bien diferenciadas:

  1. conexión con el servidor X

    El proceso establece una conexión con un servidor X utilizando XOpenDisplay(). La conexión se corta usando XCloseDisplay(). El código de netcoders en este hilo es un buen ejemplo de cómo hacerlo correctamente.

    Como mencionó Netcoder, el problema es que no hay una manera confiable de averiguar a qué servidores X se puede conectar un proceso. Su código verifica la ubicación típica donde están los enchufes X, /tmp/.X11-unix/. Ese enfoque hace que no funcione en absoluto si el usuario está conectado remotamente, por ejemplo a través de SSH (con el reenvío X habilitado). En ese caso, realmente solo existe la variable de entorno DISPLAY (y quizás algunos archivos de truco wrt. ~/.Xauthority).

    Desafortunadamente, tampoco conozco ningún método mejor. Personalmente prefiero usar un archivo de configuración por usuario, digamos ~/.application/displays, donde el usuario puede enumerar los nombres de servidor que la aplicación debe tratar de conectar en el mismo formato que la variable de entorno DISPLAY, además de la predeterminada. No es automático (el código de netcoder es), pero este enfoque me satisface mejor.

  2. Conocer las pantallas proporcionadas por un servidor X

    XScreenCount() devolverá el número de pantallas proporcionadas por el servidor X el proceso está actualmente conectado. Si solo necesita las dimensiones de la pantalla, siga el ejemplo netcoders. Para obtener información más detallada, use XScreenOfDisplay(Display,index) para obtener los punteros Screen; 0 < = index < XScreenCount(Display).

    En el código C, las macros ScreenCount() y ScreenOfDisplay() suelen ser un poco más eficientes que las llamadas a la función real.

Cuestiones relacionadas