X11, изменить разрешение и сделать окно полноэкранным

Я вытаскиваю свои волосы с этим.

Я изменяю разрешение экрана программно, используя следующее:

int FindBestVideoMode(int screen, unsigned int &width, unsigned int &height)
{
int modeCount;
XF86VidModeModeInfo** modes;

if (XF86VidModeGetAllModeLines(display, screen, &modeCount, &modes))
{
int bestMode  = -1;
int bestMatch = INT_MAX;
for(int i = 0; i < modeCount; i ++)
{
int match = (width  - modes[i]->hdisplay) *
(width  - modes[i]->hdisplay) +
(height - modes[i]->vdisplay) *
(height - modes[i]->vdisplay);

if(match < bestMatch)
{
bestMatch = match;
bestMode  = i;
}
}

width  = modes[bestMode]->hdisplay;
height = modes[bestMode]->vdisplay;

XFree(modes);

return bestMode;
}

return -1;
}

void SwitchVideoMode(int screen, int mode)
{
if (mode >= 0)
{
int modeCount;
XF86VidModeModeInfo** modes;

if (XF86VidModeGetAllModeLines(display, screen, &modeCount, &modes))
{
if (mode < modeCount)
{
XF86VidModeSwitchToMode(display, screen, modes[mode]);
XF86VidModeSetViewPort(display, screen, 0, 0);XFlush(display);
}

XFree(modes);
}
}
}

void SwitchToBestVideoMode(int screen, unsigned int &width, unsigned int &height)
{
SwitchVideoMode(screen, FindBestVideoMode(screen, width, height));
}

void RestoreVideoMode(int screen)
{
auto iVideoMode = DefaultVideoModes.Find(screen);
if (iVideoMode != nullptr)
{
XF86VidModeSwitchToMode(display, screen, &iVideoMode->value);
XF86VidModeSetViewPort(display, screen, 0, 0);

XFlush(display);
}
}

Это работает нормально. Затем я помещаю окно в полноэкранный режим со следующим:

XEvent e;
e.xclient.type         = ClientMessage;
e.xclient.window       = window;
e.xclient.message_type = _NET_WM_STATE;
e.xclient.format = 32;
e.xclient.data.l[0] = 2;    // _NET_WM_STATE_TOGGLE
e.xclient.data.l[1] = XInternAtom(display, "_NET_WM_STATE_FULLSCREEN", True);
e.xclient.data.l[2] = 0;    // no second property to toggle
e.xclient.data.l[3] = 1;
e.xclient.data.l[4] = 0;

XSendEvent(display, DefaultRootWindow(display), False, SubstructureRedirectMask | SubstructureNotifyMask, &e);
XMoveResizeWindow(display, window, 0, 0, width, height);

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

Я ожидаю, что я просто неправильно понимаю кое-что простое здесь, но любые идеи по этому поводу очень ценятся. Я не хочу использовать внешние библиотеки вот такой SDL.

Спасибо!

3

Решение

Проблема, с которой вы сталкиваетесь, заключается в том, что вы полагаетесь на оконный менеджер для правильного размещения окна. К сожалению, не все WM заботятся о XF86VidMode или RandR. Каноническое решение для создания полноэкранного окна после изменения режима видео состоит в том, чтобы создать окно как без границ и «переопределить переадресацию», чтобы оно не управлялось WM, а затем расположить его явно, чтобы охватить область от (0, 0) to (ширина vidmode, высота vidmode).

3

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

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

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