Несоответствие между командной строкой XRandR и собственным кодом

Мне нужно программно получить частоту обновления монитора.

Когда я печатаю 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)

Этот результат подтверждается nvidia-settings -q RefreshRate, между прочим

Но …
когда я запускаю следующий код (origin: https://github.com/raboof/xrandr/blob/master/xrandr.c), скомпилированный с g ++ 4.8.1 (с -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);

Я получил:

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 с GLEW. может ли это иметь какое-либо влияние?
Мы звоним glXQueryDrawable (dpy, drawable, GLX_SWAP_INTERVAL_EXT, &вал) но потом, и я не думаю, что это должно иметь какое-либо влияние.

1

Решение

Я нашел ответ:

Если сервер XRandR поддерживает версию 1.2 протокола, то необходимо использовать соответствующие функции (что я планирую сделать путем копирования фрагментов кода из https://github.com/raboof/xrandr/blob/master/xrandr.c где has_1_2 правда).

Мой код в вопросе использует функции для версии 1.1 протокола, и поэтому возвращаются только метамод.

В качестве простой проверки я попробовал следующие две команды:

xrandr --q1

xrandr --q12,

И действительно, первый дает мне тот же результат, который я получаю программно.

Кредиты идут в http://www.ogre3d.org/forums/viewtopic.php?f=4&т = 65010&начать = 200

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]