2016-06-23 10 views
1

モニタのリフレッシュレートをプログラムで取得する必要があります。コマンドラインXRandRと自分のコードの相違

私はgetコマンドラインでxrandrを(1.4.1、openSUSEの13)を入力する場合:

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) 

この結果は、とりわけ、リフレッシュレート -q のnvidia-設定によって確認されました。 (-lX11 -lXext -lXrandr付き)G ++ 4.8.1でコンパイルした、:私は、次のコード(https://github.com/raboof/xrandr/blob/master/xrandr.c起源):実行したときに

しかし...

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

を私が取得:

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 

なぜこの結果が得られますか? 私は間違っていますか?

このソフトウェアは、OpenGL with GLEWを使用しています。これは影響を与えることができますか? glXQueryDrawable(dpy、drawable、GLX_SWAP_INTERVAL_EXT、& val)を呼び出しますが、その後は影響がないと思います。

+0

追加情報:1-私は主に2-Iはちょうど(私たちの大きなプロジェクトの外に)単一のCファイルに上記のコードを入力した右のリフレッシュレートを取得するためにされて必要なもの、それをコンパイル(g ++ -o t0 test0.c -lX11 -lXrandr)、同じ誤った結果が得られます。 – GuillaumeR

答えて

0

私は答えを見つけた:

xrandrを断つには、プロトコルのバージョン1.2をサポートしている場合は、適切な関数を(使用する必要があり、私はhttps://github.com/raboof/xrandr/blob/master/xrandr.cどこhas_1_2からのコードスニペットをコピーして行う予定WICHがtrue)。

質問の私のコードは、プロトコルのバージョン1.1の機能を使用しているため、メタモードだけが返されます。

xrandr --q1

xrandr --q12

は簡単なチェックとして、私は次の2つのコマンドを試してみました。

実際、最初のプログラムでは私がプログラム的に得たのと同じ結果が得られます。

クレジットはhttp://www.ogre3d.org/forums/viewtopic.php?f=4&t=65010&start=200に行く

関連する問題