2012-12-04 20 views
9

Oto przykład wywołanie xrandr:xrandr związane, C programowanie

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

Pomyśl o systemie, w którym to wezwanie ma powodzenie; istnieją dwa ekrany (LVDS i DVI-0) pracujące w różnych rozdzielczościach. DVI-0 znajduje się po prawej stronie w środku.

Jak mogę uzyskać wszystkie te informacje w programie C? Sprawdziłem kod źródłowy xrandr, ale trudno mi było go odczytać i nie ma wyraźnego sposobu na zapytanie o wartość --pos (edycja: jest ukryta na widoku, dzięki odpowiedzi ernestopheles, mam ją).

Wiem, że mogę poprosić o _NET_WORKAREA z XGetWindowProperty, ale o ile widziałem, nie mówi pozycji ekranu, tylko rozmiar idealnego prostokąta, który zawiera je wszystkie.

Po kilku innych badaniach kodu xrandr ten kod wydaje się być krokiem naprzód w rozwiązaniu. Jednak nie jestem przekonany, xrandr.c wokół linii 2940 zakłada, że ​​crtc_info może być niedostępny. Wciąż tęsknię za inną drogą, by uzyskać rozwiązanie i pozycję.

 

    #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

Cześć Zastanawiam się, czy jesteś przekonany o swojej dzisiejszej kodu? Lub jeśli znalazłeś lepszy sposób? – yatg

+0

Myślałem, że użyję kombinacji tego i xinerma w przypadku, gdy xrandr nie jest dostępny: http://stackoverflow.com/a/836376/5062337 – yatg

Odpowiedz

1

Nie jestem pewien, czy poprawnie rozumiem pytanie. Zakładając, chcesz odczytać parametry obecnego stanu X-Server, należy użyć następującego polecenia:

xrandr -q
i analizować swoje wyjście:

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

na pierwszym ekranie i

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

dla drugi. Uruchomienie polecenia i analizowania może się to odbywać w ramach programu napisanego w C.

+0

Dzięki twojej odpowiedzi zauważyłem, że wartość pozycji jest tuż obok rozdzielczości. Przynajmniej mogę sprawdzić kod xrandr o tym, jak to określa. –

5

można dostać każdą rozdzielczość ekranu w ten sposób:

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

Po tym crtc_info->width będzie zawierać szerokość monitora i crtc_info->x na x pozycja.

nie zapomnij obejmuje:

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

i skompilować z -lX11 -lXrandr połączyć biblioteki