свернуть полноэкранное окно Xlib OpenGL - PullRequest
6 голосов
/ 17 июня 2011

В настоящее время я пытаюсь включить alt-tabbing из моего полноэкранного окна Xlib OpenGL, но у меня возникли некоторые трудности. Я пробовал XUnmapWindow(..), который вроде работает, но разрешение не сбрасывается (если я не должен делать это вручную?), И мое окно Xlib не отображается в виде свернутого окна (то есть я не могу вернуться в окно, хотя приложение все еще работает в фоновом режиме).

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

Я слушаю FocusOut и FocusIn события, и FocusOut, кажется, вызывается, когда я alt-tab, но я просто не уверен, как заставить мое приложение правильно свернуть. Если я ничего не делаю в своем коде, когда вызывается событие FocusOut, мое приложение ничего не делает (т.е. я не могу свернуть окно).

Любая помощь будет оценена!

Редактировать : К сожалению, мне не удалось заставить X Windows правильно свернуть полноэкранное окно. Итак, чтобы обойти эту проблему, я решил destroy() полноэкранное окно, а затем create() новое окно в оконном режиме. Кажется, работает хорошо.

Ответы [ 2 ]

5 голосов
/ 17 июня 2011

XUnmapWindow() полностью удаляет окно с дисплея.Минимизация окна происходит через состояние EMWH ICCCM, так что диспетчер окон знает, что окно все еще существует в некоторой форме. И, как вы уже предполагали, несете ответственность за сброс разрешения экрана. Это, кстати, то же самое в Windows.

РЕДАКТИРОВАТЬ:

Минимизация окна в Xlib выполняется с помощью XIconifyWindow, который позаботится о том, чтобы установить правильные свойства ICCCM, и отобразит окно.Оба должны быть сделаны, чтобы правильно взаимодействовать с WM.Однако X11 определяет только методы, а не политику, поэтому при снятии карты с полноэкранного окна вы также обязаны сбросить разрешение экрана, как я уже писал выше.

С другой стороны: я предлагаю вам не делать• не изменяйте разрешение вообще, но вместо этого, если таковое доступно, визуализируйте в объект Framebuffer целевого размера и отобразите конечный результат на полный, собственный размер экрана.Если вы комбинируете это с наложением текста / HUD в собственном разрешении (я полагаю, что это для игры или подобного), вы получите намного более высокое качество и сохраните переключение разрешения.Вы можете даже объединить это с созданием скриншота рабочего стола и постепенным переходом к вашему контенту.

РЕДАКТИРОВАТЬ 2 для справки : XIconifyWindow - это просто вспомогательная / удобная функция, ее исходный кодэто

/*
 * This function instructs the window manager to change this window from
 * NormalState to IconicState.
 */
Status XIconifyWindow(Display *dpy, Window w, int screen)
{
    XClientMessageEvent ev;
    Atom prop;

    prop = XInternAtom(dpy, "WM_CHANGE_STATE", False);
    if(prop == None)
    return False;

    ev.type = ClientMessage;
    ev.window = w;
    ev.message_type = prop;
    ev.format = 32;
    ev.data.l[0] = IconicState;
    return XSendEvent(dpy, RootWindow(dpy, screen), False,
            SubstructureRedirectMask|SubstructureNotifyMask,
            (XEvent *)&ev);
}
1 голос
/ 17 июня 2011

Вы можете попробовать сделать это так:

XEvent xev;
Atom wm_state     =  XInternAtom(dpy, "_NET_WM_STATE", False);
Atom wm_hide_win  =  XInternAtom(dpy, "_NET_WM_STATE_HIDDEN", False);

memset(&xev, 0, sizeof(xev));
xev.type = ClientMessage;
xev.xclient.window = win;
xev.xclient.message_type = wm_state;
xev.xclient.format = 32;
xev.xclient.data.l[0] = _NET_WM_STATE_ADD;
xev.xclient.data.l[1] = wm_hide_win;

XSendEvent(dpy, DefaultRootWindow(dpy), False, SubstructureNotifyMask, &xev);

EDIT

Если у вас есть доступ к API gnome, вы можете использовать wnck_window_minimize () или взглянуть на источник этой функции.

...