2009-07-20 9 views
10

Próbuję uzyskać rozdzielczość ekranu, a także rozdzielczość określonego okna (w którym uruchomiony jest program) w systemie Linux. Nie muszę modyfikować rozdzielczości, potrzebuję tylko bieżących wartości. O ile wiem, możemy wywołać niektóre funkcje systemowe, aby to zrobić w systemie Windows, jak możemy to zrobić na Linuksie, najlepiej używając języka C/C++? Z góry dziękuję.Jak programowo uzyskać rozdzielczość okna i systemu w systemie Linux?

aktualizacja: Właściwie nie potrzebuję GUI, chociaż wiem, że Qt i GTK + mogą to zrobić, niechętnie dołączam bibliotekę zewnętrzną, aby uzyskać rozdzielczość.

+0

Jeśli nie ma GUI, to jest to aplikacja konsoli? Czy potrzebujesz tych wartości, nawet jeśli nie działają pod X? – jmanning2k

+0

Istnieje GUI, ale część, nad którą pracuję, nie jest potrzebna. Potrzebne są tylko te wartości do późniejszego pomiaru. –

Odpowiedz

6

W X11 musisz wywołać Xlib's XGetWindowAttributes, aby uzyskać różne informacje o oknie, w tym rozmiar i położenie względem rodzica. Na przykład, w jaki sposób jest używany, możesz google dla "xwininfo.c".

To powiedziawszy, prawdopodobnie będziesz używał jakiegoś bardziej zaawansowanego frameworka do programowania twojego okna - a szanse są wysokie, że ma już jakieś inne prymitywy tego, zobacz przykład dla Qt - więc możesz chcieć dać trochę więcej tła na temat tego pytania.

0

Narzędzie wiersza poleceń xdpyinfo udostępnia tę informację; aby to zrobić programowo, musisz użyć Xlib, jak wyjaśnia Andrew Y.

6

Wymaga:

+0

Czy Qt czy Gtk + mogą uzyskać określoną rozdzielczość okna? –

+0

Mogę uzyskać listę okien z GTK, ale bez nazwy, identyfikatora lub czegokolwiek. Nie mam pojęcia, jak rozpoznać konkretne okno. W końcu poszedłem na Xlib i rozwiązałem mój problem (choć kod wygląda trochę obrzydliwie ...). –

9

Aby uzyskać rozdzielczość ekranu, można użyć rozszerzenia xrandr, jak w xrandr źródeł:

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

Możesz zobaczyć wyjście "xrandr" w twoim xtermie.

lub lepiej użyć metody 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 jest bardziej szczegółowy niż DisplayWidth/DisplayHeight, ale oba są przydatne (z różnych powodów). – ephemient

+0

O ile mi wiadomo, 'DisplayWidht' /' DisplayHeight' może wyświetlać tylko bieżący rozmiar ekranu. Nie mają na celu wyświetlenia wszystkich dostępnych rozmiarów ekranu (tryby wyświetlania). Właśnie do tego służą 'Xrandr' lub' XF86vm'. – SasQ

+0

Krótkie pytanie: Czy tablica 'rozmiar' zwrócona (jako adres) z' XRRConfigSizes' wymaga późniejszego zwolnienia? Czy jest ona przydzielana i zarządzana wewnętrznie przez bibliotekę? Nie mogłem nic na ten temat znaleźć w dokumentacji (jeśli jest, poza skąpą stroną podręcznika). – SasQ

Powiązane problemy