如何使用 Xlib 恢复 window?

How to restore a window with Xlib?

我已经使用 XIconifyWindow 成功地图标化了 window,但后来没能恢复它。我尝试了以下方法:

XMapRaised (display, window);

并且:

XMapWindow (display, window);

并且:

XClientMessageEvent ev;
std::memset (&ev, 0, sizeof ev);
ev.type = ClientMessage;
ev.window = window;
ev.message_type = XInternAtom(display, "WM_CHANGE_STATE", False);
ev.format = 32;
ev.data.l[0] = NormalState;
XSendEvent (display, RootWindow(display, XDefaultScreen(display)), False,
  SubstructureRedirectMask |SubstructureNotifyMask, (XEvent*)&ev);
XFlush (display);

没有成功。我在 GNOME 3.14.0 中使用 Debian Jessie。

折腾了好久,终于解决了!

在 GNOME 3 中,windows 没有 "iconify/minimize" 按钮。 window 似乎无法最小化,无论是用户还是代码。当我调用 XIconifyWindow 时,window 没有最小化。如果它被最小化,我会得到一个 "UnmapNotify" 事件,但我没有。发生的事情是,window 被隐藏(“_NET_WM_STATE_HIDDEN”被添加到 window 的“_NET_WM_STATE”属性),另一个 window 被激活。所以我对 "unminimize" window 要做的就是激活它:

XClientMessageEvent ev;
std::memset (&ev, 0, sizeof ev);
ev.type = ClientMessage;
ev.window = window;
ev.message_type = XInternAtom(display, "_NET_ACTIVE_WINDOW", True);
ev.format = 32;
ev.data.l[0] = 1;
ev.data.l[1] = CurrentTime;
ev.data.l[2] = ev.data.l[3] = ev.data.l[4] = 0;
XSendEvent (display, RootWindow(display, XDefaultScreen(display)), False,
  SubstructureRedirectMask |SubstructureNotifyMask, (XEvent*)&ev);
XFlush (display);

顺便说一句,调用 XRaiseWindow 无效,似乎必须激活它。