2012-12-04 7 views
9

Hier ist ein Beispiel Aufruf xrandr:xrandr bezogen, C-Programmierung

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

über ein System denken, wo der Anruf Erfolg hat; Es gibt zwei Bildschirme (LVDS und DVI-0), die mit unterschiedlichen Auflösungen arbeiten. Der DVI-0 ist rechts in der Mitte platziert.

Wie bekomme ich all diese Informationen in einem C-Programm? Ich überprüfte den xrandr-Quellcode, aber ich fand es schwierig zu lesen und es gibt keine offensichtliche Möglichkeit, den Wert --pos abzufragen (edit: es ist in Sichtweite versteckt, dank der Antwort von Ernestopheles, die ich bekommen habe).

Ich weiß, dass ich ein _NET_WORKAREA mit XGetWindowProperty fragen kann, aber soweit ich gesehen habe, sagt es nicht die Bildschirmpositionen, nur die Größe des idealen Rechtecks, das sie alle enthält.

Nach einigen anderen Studie von Xrandr-Code, scheint dieser Code ein Schritt nach vorne die Lösung. Noch bin ich nicht überzeugt, Xrandr.c um Zeile 2940 geht davon aus, dass crtc_info möglicherweise nicht verfügbar ist. Ich vermisse immer noch den anderen Weg, Auflösung und Position zu bekommen.

 

    #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

Hallo dort verknüpfe ich mich gefragt, ob Sie heute davon überzeugt, über Ihren Code waren? Oder wenn du einen besseren Weg gefunden hast? – yatg

+0

Ich dachte, eine Kombination von diesem und xinerma zu verwenden, falls xrandr nicht verfügbar ist: http://stackoverflow.com/a/836376/5062337 – yatg

Antwort

1

Ich bin mir nicht sicher, ob ich die Frage richtig verstehe. den folgenden Befehl Angenommen, möchten Sie die Parameter des aktuellen Status des x-Server auszulesen, verwenden:

xrandr -q
und sein Ausgang analysieren:

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

für den ersten Bildschirm und

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

für der Zweite. Das Ausführen des Befehls und Parsen kann in C geschrieben innerhalb eines Programms erfolgen

+0

Dank Ihrer Antwort bemerkte ich, dass der Positionswert gerade in der Nähe der Auflösung ist. Zumindest kann ich den Xrandr-Code überprüfen, wie er es bestimmt. –

5

Sie jede Bildschirmauflösung, indem Sie diese bekommen können:

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]);  

Nach diesem crtc_info->width wird die Breite des Monitors enthalten und crtc_info->x der x Position.

vergessen Sie nicht, das beinhaltet:

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

und kompilieren mit -lX11 -lXrandr die Bibliotheken

Verwandte Themen