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