2012-12-04 9 views
9

Ecco una chiamata esempio per xrandr:xrandr correlate, di programmazione C

 
$ xrandr --output LVDS --mode 1680x1050 --pos 0x0 --rotate normal --output S-video --off --output DVI-0 --mode 1024x768 --pos 1680x104 --rotate normal 

pensare a un sistema in cui la chiamata ha successo; ci sono due schermate (LVDS e DVI-0) che funzionano con risoluzioni diverse. Il DVI-0 è posizionato a destra nel mezzo.

Come posso ottenere tutte queste informazioni in un programma C? Ho controllato il codice sorgente xrandr, ma ho trovato difficile leggere e non c'è modo apparente di interrogare il valore --pos (edit: è nascosto in bella vista, grazie alla risposta di ernestofele).

So che posso chiedere un _NET_WORKAREA con XGetWindowProperty, ma per quanto ho visto non dice le posizioni dello schermo, solo la dimensione del rettangolo ideale che le contiene tutte.

Dopo qualche altro studio sul codice xrandr, questo codice sembra un passo in avanti nella soluzione. Tuttavia non sono convinto, xrandr.c intorno alla riga 2940 presuppone che crtc_info potrebbe non essere disponibile. Mi manca ancora l'altro modo per ottenere risoluzione e posizione.

 

    #include <stdio.h> 
    #include <X11/extensions/Xrandr.h> 

    int main() { 
     Display *disp; 
     XRRScreenResources *screen; 
     XRROutputInfo *info; 
     XRRCrtcInfo *crtc_info; 
     int iscres; 
     int icrtc; 

     disp = XOpenDisplay(0); 
     screen = XRRGetScreenResources (disp, DefaultRootWindow(disp)); 
     for (iscres = screen->noutput; iscres > 0;) { 
      --iscres; 

      info = XRRGetOutputInfo (disp, screen, screen->outputs[iscres]); 
      if (info->connection == RR_Connected) { 
       for (icrtc = info->ncrtc; icrtc > 0;) { 
        --icrtc; 

        crtc_info = XRRGetCrtcInfo (disp, screen, screen->crtcs[icrtc]); 
        fprintf(stderr, "==> %dx%d+%dx%d\n", crtc_info->x, crtc_info->y, crtc_info->width, crtc_info->height); 

        XRRFreeCrtcInfo(crtc_info); 
       } 
      } 
      XRRFreeOutputInfo (info); 
     } 
     XRRFreeScreenResources(screen); 

     return 0; 
    } 

+0

Hi there Mi chiedevo se tu fossi convinto circa il codice di oggi? O se hai trovato il modo migliore? – yatg

+0

Ho pensato di usare una combinazione di questo e xinerma nel caso in cui xrandr non sia disponibile: http://stackoverflow.com/a/836376/5062337 – yatg

risposta

1

Non sono sicuro, se ho capito bene la domanda. Supponendo, si desidera leggere i parametri dello stato attuale del x-server, utilizzare il seguente comando:

xrandr -q
e analizzare la sua produzione:

LVDS connected 1680x1050+0+0 (normal left inverted right x axis y axis) 123mm x 123mm 
[...] 

per la prima schermata e

TV_SVIDEO connected 1024x768+1680x104 (normal left inverted right x axis y axis) 123mm x 123mm 
[...] 

per il secondo. L'esecuzione del comando e l'analisi può essere fatto all'interno di un programma scritto in C.

+0

Grazie alla tua risposta ho notato che il valore della posizione è vicino alla risoluzione. Almeno posso controllare il codice xrandr su come lo determina. –

5

È possibile ottenere ogni risoluzione dello schermo in questo modo:

Display *dpy; 
XRRScreenResources *screen; 
XRRCrtcInfo *crtc_info; 

dpy = XOpenDisplay(":0"); 
screen = XRRGetScreenResources (dpy, DefaultRootWindow(dpy)); 
//0 to get the first monitor 
crtc_info = XRRGetCrtcInfo (dpy, screen, screen->crtcs[0]);  

Dopo che crtc_info->width conterrà la larghezza del monitor e la crtc_info->x x posizione.

non dimenticare il include:

#include <X11/Xlib.h> 
#include <X11/extensions/Xrandr.h> 

e compilare con -lX11 -lXrandr per collegare le librerie