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; }
Cześć Zastanawiam się, czy jesteś przekonany o swojej dzisiejszej kodu? Lub jeśli znalazłeś lepszy sposób? – yatg
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