2015-02-27 2 views
1

Xorg запускается и создает виртуальный экранполучить физический размер экрана

размер виртуального экрана определенного быть 3120 х 1050

охватывающих мои 2 физических экранов 1680x1050 и 1440x900, используя Xinerama я думаю.

Нет конфигурационного файла, и я не хочу изменять системные настройки.

Мое приложение использовало DisplayWidth и DisplayHeight для получения размера экрана, что было хорошо при настройке на одном экране.

maxwidth = DisplayWidth (dpy, scrnum); 
maxheight = DisplayHeight (dpy, scrnum); 

Но при настройке с двумя экранами с автоматически созданным виртуальным экраном эти функции возвращают размер виртуального экрана.

Я пробовал разные способы, чтобы получить физический размер экрана, с тем же результатом:

maxwidth = XWidthOfScreen (XScreenOfDisplay(dpy, scrnum)); 
maxheight = XHeightOfScreen (XScreenOfDisplay(dpy, scrnum)); 

или

XWindowAttributes attr; 
XGetWindowAttributes(dpy, RootWindow(dpy, scrnum), &attr); 
maxwidth = attr.width; 
maxheight = attr.height; 

Можно ли получить размер физических экранов, используя только Xlib? Я хотел бы избежать добавления дополнительных зависимостей библиотек только для установки размера окна, но может быть, этого можно достичь с помощью расширения Xrand?

ответ

1

Единственный способ, которым я знаю, это использовать расширение Xrandr, как вы упомянули. Вы захотите использовать XRRGetScreenResources и прокрутите каждый Crtc, чтобы получить нужную вам информацию.

#include <X11/Xlib.h> 
#include <X11/extensions/Xrandr.h> 
#include <stdio.h> 

int main() 
{ 
    Display *display = XOpenDisplay(NULL); 
    XRRScreenResources *screens = XRRGetScreenResources(display, DefaultRootWindow(display)); 
    XRRCrtcInfo *info = NULL; 
    int i = 0; 

    for (i = 0; i < screens->ncrtc; i++) { 
     info = XRRGetCrtcInfo(display, screens, screens->crtcs[i]); 
     printf("%dx%d\n", info->width, info->height); 
     XRRFreeCrtcInfo(info); 
    } 
    XRRFreeScreenResources(screens); 

    return 0; 
} 
Смежные вопросы