2009-07-20 6 views
10

Ich versuche, die Auflösung des Bildschirms sowie die Auflösung eines bestimmten Fensters (in dem ein Programm läuft) auf Linux-System zu erhalten. Ich muss die Auflösung nicht ändern, ich brauche nur die aktuellen Werte. Soweit ich weiß, können wir einige Systemfunktionen unter Windows aufrufen, wie können wir das unter Linux tun, vorzugsweise in C/C++? Danke im Voraus.Wie programmgesteuert die Auflösung eines Fensters und das des Systems in Linux erhalten?

Update: Eigentlich brauche ich keine GUI, obwohl ich weiß, Qt und GTK + kann es tun, ich bin zurückhaltend, eine externe Bibliothek für nur die Auflösung zu bekommen.

+0

Wenn es keine GUI ist, dann ist es eine Konsole app? Brauchen Sie diese Werte, auch wenn Sie nicht unter X laufen? – jmanning2k

+0

Es gibt GUI, aber der Teil, an dem ich arbeite, braucht keinen. Es benötigt nur diese Werte für die spätere Messung. –

Antwort

6

In X11 müssen Sie die XGetWindowAttributes von Xlib aufrufen, um die verschiedenen Fensterinformationen zu erhalten, einschließlich der Größe und Position relativ zum übergeordneten Element. Für ein Beispiel, wie es verwendet wird, können Sie nach 'xwininfo.c' googlen.

Das heißt, wahrscheinlich wirst du ein paar mehr High-Level-Framework verwenden, um Ihre Fensterprogrammierung zu tun - und die Chancen sind hoch, dass es bereits einige andere Primitive dafür hat, siehe ein Beispiel für Qt - so möchten Sie vielleicht geben ein bisschen mehr Hintergrund über die Frage.

0

Das Befehlszeilentool xdpyinfo stellt diese Informationen für Sie bereit. Um es programmatisch zu tun, müssen Sie Xlib verwenden, wie Andrew Y erklärt.

6

Hängt ab:

+0

Kann Qt oder Gtk + eine bestimmte Fensterauflösung erhalten? –

+0

Ich kann eine Liste von Windows mit GTK bekommen, aber keinen Namen, ID oder irgendetwas. Keine Ahnung, wie man ein bestimmtes Fenster identifiziert. Schließlich ging Xlib und löste mein Problem (obwohl der Code ein wenig ekelhaft aussieht ...). –

9

Bildschirmauflösung zu erhalten, können Sie XRandR Erweiterung verwenden, wie in xrandr Quellen:

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

Sie können die Ausgabe "xrandr" in Ihrem Xterm eingeben.

Oder besser, verwenden Sie die xdpyinfo Methode:

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 ist detaillierter als DisplayWidth/DisplayHeight, aber beide sind nützlich (aus verschiedenen Gründen). – ephemient

+0

Soweit ich weiß, kann 'DisplayWidht' /' DisplayHeight' nur die aktuelle Bildschirmgröße anzeigen. Sie sollen nicht alle verfügbaren Bildschirmgrößen (Anzeigemodi) auflisten. Dafür stehen 'Xrandr' oder' XF86vm'. – SasQ

+0

Kurze Frage: Muss das 'groups' Array (als Adresse) von' XRRConfigSizes' zurückgegeben werden? Oder wird es intern von der Bibliothek zugewiesen und verwaltet? Ich konnte nichts darüber in der Dokumentation finden (wenn es welche gibt, über die knappe Manpage hinaus). – SasQ

Verwandte Themen