2009-07-20 22 views
10

Estoy tratando de obtener la resolución de la pantalla, así como la resolución de una ventana específica (en la que se ejecuta un programa) en el sistema Linux. No necesito modificar la resolución, solo necesito los valores actuales. Por lo que yo sé, podemos llamar a algunas funciones del sistema para que lo hagan en Windows, ¿cómo podemos hacer eso en Linux, preferiblemente usando el lenguaje C/C++? Gracias por adelantado.¿Cómo obtener programáticamente la resolución de una ventana y la del sistema en Linux?

actualización: En realidad, no necesito hacer una GUI, aunque sé que Qt y GTK + pueden hacerlo, soy reacio a incluir una biblioteca externa para obtener la resolución.

+0

Si no hay una interfaz gráfica de usuario, entonces se trata de una aplicación de consola? ¿Necesita esos valores incluso cuando no se ejecuta bajo X? – jmanning2k

+0

Hay una GUI, pero la parte en la que estoy trabajando no la necesita. Solo necesita esos valores para una medición posterior. –

Respuesta

6

En X11, debe llamar al XGetWindowAttributes de Xlib para obtener la información de la ventana, incluyendo el tamaño y la posición relativa al elemento primario. Para ver un ejemplo de cómo se usa, puede buscar en google 'xwininfo.c'.

Dicho esto, probablemente va a utilizar un marco de alto nivel más para hacer su programación de ventanas, y es muy probable que ya tenga otras primitivas para esto, vea un ejemplo para Qt, por lo que es posible que desee dar un poco más de fondo sobre la pregunta.

0

La herramienta de línea de comandos xdpyinfo proporciona esta información para usted; para hacerlo programáticamente necesitas usar Xlib, como explica Andrew Y.

6

Depende:

+0

¿Puede Qt o Gtk + obtener una resolución de ventana específica? –

+0

Puedo obtener una lista de ventanas con GTK, pero sin nombre, id ni nada. No tengo idea de cómo identificar una ventana específica. Finalmente fui a Xlib y resolví mi problema (aunque el código parece un poco desagradable ...). –

9

Para obtener resolución de la pantalla, puede utilizar la extensión XRandR, como en xrandr fuentes:

SizeID  current_size; 
    XRRScreenSize *sizes; 
    dpy = XOpenDisplay (display_name); 
    // ... 
    root = RootWindow (dpy, screen); 
    sc = XRRGetScreenInfo (dpy, root); 
    current_size = XRRConfigCurrentConfiguration (sc, &current_rotation); 
    sizes = XRRConfigSizes(sc, &nsize); 
    for (i = 0; i < nsize; i++) { 
    printf ("%c%-2d %5d x %-5d (%4dmm x%4dmm)", 
     i == current_size ? '*' : ' ', 
     i, sizes[i].width, sizes[i].height, 
     sizes[i].mwidth, sizes[i].mheight); 
    // ... 
    } 

Puede ver la salida escribiendo "xrandr" en su xterm.

O, mejor, utilice el método xdpyinfo:

Display *dpy; 
// dpy = ... 
int scr = /* ... */ 
printf (" dimensions: %dx%d pixels (%dx%d millimeters)\n", 
     DisplayWidth (dpy, scr), DisplayHeight (dpy, scr), 
     DisplayWidthMM(dpy, scr), DisplayHeightMM (dpy, scr)); 
+0

RandR es más detallado que DisplayWidth/DisplayHeight, pero ambos son útiles (por diferentes razones). – ephemient

+0

Hasta donde yo sé, 'DisplayWidht' /' DisplayHeight' solo puede mostrar el tamaño de la pantalla actual. No están destinados a enumerar todos los tamaños de pantalla disponibles (modos de visualización). Para eso están 'Xrandr' o' XF86vm'. – SasQ

+0

Pregunta breve: ¿La matriz 'sizes' devuelta (como una dirección) de' XRRConfigSizes' requiere liberación más adelante? ¿O es asignado y administrado internamente por la biblioteca? No pude encontrar nada sobre eso en la documentación (si es que hay alguno, más allá de la página escasa). – SasQ

Cuestiones relacionadas