2016-06-23 24 views
1

Ich muss die Aktualisierungsrate eines Monitors programmatisch erhalten.Diskrepanz zwischen Kommandozeile XRandR und eigenem Code

Als ich xrandr (1.4.1, opensuse 13) auf der Kommandozeile Typ I erhalten:

Screen 0: minimum 8 x 8, current 1920 x 1200, maximum 16384 x 16384 
VGA-0 disconnected primary (normal left inverted right x axis y axis) 
DVI-D-0 connected 1920x1200+0+0 (normal left inverted right x axis y axis) 518mm x 324mm 
    1920x1200  60.0*+ 
    1920x1080  60.0 
    1680x1050  60.0 
    1600x1200  60.0 
    1280x1024  60.0 
    1280x960  60.0 
    1024x768  60.0 
    800x600  60.3 
    640x480  59.9 
HDMI-0 disconnected (normal left inverted right x axis y axis) 

Dieses Ergebnis wird durch nvidia-settings bestätigt -Q Refreshrate, unter anderem.

Aber ... wenn ich den folgenden Code ausführen (Herkunft: https://github.com/raboof/xrandr/blob/master/xrandr.c), zusammengestellt mit g ++ 4.8.1 (mit -lX11 -lXext -lXrandr):

int nsize; 
int nrate; 
short *rates; 
XRRScreenSize *sizes; 
Display *dpy = XOpenDisplay(NULL); 
Window root = DefaultRootWindow(dpy); 

XRRScreenConfiguration *conf = XRRGetScreenInfo(dpy, root); 
printf ("Current rate: %d\n",XRRConfigCurrentRate(conf)); 

sizes = XRRConfigSizes(conf, &nsize); 
printf(" SZ: Pixels   Refresh\n"); 
for (int i = 0; i < nsize; i++) { 
    printf("%-2d %5d x %-5d", i, sizes[i].width, sizes[i].height); 
    rates = XRRConfigRates(conf, i, &nrate); 
    if (nrate) 
     printf(" "); 
    for (int j = 0; j < nrate; j++) 
     printf("%-4d", rates[j]); 
    printf("\n"); 
} 

XRRFreeScreenConfigInfo(conf); 

ich:

Current rate: 50 
SZ: Pixels  Refresh 
0 1920 x 1200 50 
1 1920 x 1080 51 
2 1680 x 1050 52 
3 1600 x 1200 53 
4 1280 x 1024 54 
5 1280 x 960 55 
6 1024 x 768 56 
7 800 x 600 57 
8 640 x 480 58 
9 1440 x 900 59 
10 1366 x 768 60 
11 1280 x 800 61 
12 1280 x 720 62 

Warum bekomme ich dieses Ergebnis? Was mache ich falsch?

Die Software verwendet OpenGL mit GLEW. Kann das irgendeinen Einfluss haben? Wir rufen glXQueryDrawable (dpy, Zeichen, GLX_SWAP_INTERVAL_EXT, & val) aber danach, und ich glaube nicht, dass dies einen Einfluss haben sollte.

+0

Zusätzliche Informationen: 1-, was hauptsächlich auf ich brauche die richtige Bildwiederholfrequenz 2-bekomme ich nur den Code-Schnipsel getippt oben in einer einzigen C-Datei (außerhalb unserer großen Projekt), es kompiliert (g ++ -o t0 test0.c -lX11-lXrandr) und das gleiche falsche Ergebnis erhalten. – GuillaumeR

Antwort

0

fand ich die Antwort:

Wenn die XRandR Sever Version 1.2 des Protokolls unterstützt, dann werden die entsprechenden Funktionen verwendet werden müssen (welche ich von https://github.com/raboof/xrandr/blob/master/xrandr.c durch Kopieren Code-Schnipsel zu tun planen, wo has_1_2 ist wahr).

Mein Code in der Frage verwendet Funktionen für die Version 1.1 des Protokolls, und daher werden nur die Metamodes zurückgegeben.

Als einfache Prüfung, habe ich versucht, die beiden folgenden Befehle:

xrandr --q1

xrandr --q12.

Und in der Tat die erste gibt mir das gleiche Ergebnis, das ich programmatisch bekomme.

Credits gehen zu http://www.ogre3d.org/forums/viewtopic.php?f=4&t=65010&start=200