2009-07-20 6 views
10

Sto cercando di ottenere la risoluzione dello schermo e la risoluzione di una finestra specifica (in cui è in esecuzione un programma) sul sistema Linux. Non ho bisogno di modificare la risoluzione, ho solo bisogno dei valori attuali. Per quanto ne so, possiamo chiamare alcune funzioni di sistema per farlo su Windows, come possiamo farlo su Linux, preferibilmente usando il linguaggio C/C++? Grazie in anticipo.Come ottenere a livello di programmazione la risoluzione di una finestra e quella del sistema in Linux?

aggiornamento: In realtà, non ho bisogno di fare una GUI, anche se so che Qt e GTK + possono farlo, sono riluttante a includere una libreria esterna solo per ottenere la risoluzione.

+0

Se non c'è GUI, allora è una console app? Hai bisogno di quei valori anche quando non corri sotto X? – jmanning2k

+0

C'è la GUI, ma la parte su cui sto lavorando non ne ha bisogno. Ha solo bisogno di quei valori per misurazioni successive. –

risposta

6

In X11, è necessario chiamare il numero XGetWindowAttributes di Xlib per ottenere le varie informazioni sulla finestra, incluse la dimensione e la posizione relative al genitore. Per un esempio di come viene utilizzato, puoi usare google per "xwininfo.c".

Detto questo, probabilmente si utilizzerà un altro framework di livello superiore per la programmazione delle finestre - e le probabilità sono alte di avere già alcune primitive per questo, vedere un esempio per Qt - quindi si potrebbe voler dare un po 'più di sfondo sulla domanda.

0

Lo strumento da riga di comando xdpyinfo fornisce queste informazioni per voi; per farlo programmaticamente devi usare Xlib, come spiega Andrew Y.

6

Dipende:

+0

Qt o Gtk + possono ottenere una risoluzione specifica per una finestra? –

+0

Posso ottenere un elenco di finestre con GTK, ma nessun nome, ID o altro. Non ho idea di come identificare una finestra specifica. Alla fine è andato per Xlib, e ha risolto il mio problema (anche se il codice sembra un po 'disgustoso ...). –

9

Per ottenere la risoluzione dello schermo, è possibile utilizzare l'estensione XRandR, come in xrandr fonti:

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); 
    // ... 
    } 

È possibile visualizzare l'output digitando "xrandr" nel proprio xterm.

O, meglio, utilizzare il metodo 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 è più dettagliato di DisplayWidth/DisplayHeight, ma entrambi sono utili (per ragioni diverse). – ephemient

+0

Per quanto ne so, 'DisplayWidht' /' DisplayHeight' può solo elencare le dimensioni dello schermo corrente. Non sono pensati per elencare tutte le dimensioni dello schermo disponibili (modalità di visualizzazione). Ecco a cosa servono 'Xrandr' o' XF86vm'. – SasQ

+0

Domanda breve: l'array 'sizes' restituito (come indirizzo) da' XRRConfigSizes' richiede la possibilità di liberare in seguito? Oppure è allocato e gestito internamente dalla biblioteca? Non ho trovato nulla a riguardo nella documentazione (se ce n'è una, oltre la manpage banale). – SasQ

Problemi correlati