簡體   English   中英

如何使用Xlib還原窗口?

[英]How to restore a window with Xlib?

我設法使用XIconifyWindow圖標化了一個窗口,但后來卻沒有設法恢復它。 我嘗試了以下方法:

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中,窗口沒有“圖標化/最小化”按鈕。 看來,無論是用戶還是代碼,都無法最小化窗口。 當我調用XIconifyWindow ,窗口沒有最小化。 如果已將其最小化,那么我將獲得一個“ UnmapNotify”事件,而我沒有。 確實發生的是,該窗口被隱藏了(“ _NET_WM_STATE_HIDDEN”已添加到該窗口的“ _NET_WM_STATE”屬性中),並且另一個窗口被激活。 因此,要使窗口“最小化”,我要做的就是激活它:

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無效,似乎必須激活它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM