c – 在Xlib / Xt中处理“新顶级窗口”事件
发布时间:2020-12-16 07:25:01 所属栏目:百科 来源:网络整理
导读:因此,我需要知道何时创建顶级窗口.我正在Xlib / Xt级别以及不支持EWMH规范的Window Manager上工作.我的想法是挂钩根窗口的SubstructureNotify事件.但事情并不像那样简单. 问题是并非每个CreateNotify事件都对应于[b]顶级[/ b]窗口的创建.所以我认为我需要做
因此,我需要知道何时创建顶级窗口.我正在Xlib / Xt级别以及不支持EWMH规范的Window Manager上工作.我的想法是挂钩根窗口的SubstructureNotify事件.但事情并不像那样简单.
问题是并非每个CreateNotify事件都对应于[b]顶级[/ b]窗口的创建.所以我认为我需要做的是测试我从事件中得到的窗口,以确认它是一个顶级窗口.我已经接近了,但是一些虚假的窗户仍然通过我的网络.例如,在GTK应用程序中,如果您有一个下拉框并单击它,则会创建一个新窗口,我无法弄清楚如何捕获和忽略.这样的窗口与典型的顶级应用程序窗口难以区分. 这是我到目前为止所拥有的: // I am omiting (tons of) cleanup code and where I set the display and toplevel variables. Display* display; Widget toplevel; bool has_name(Window window) { XTextProperty data = XTextProperty (); return (!XGetWMName (display,window,&data)); } bool has_client_leader(Window window) { unsigned long nitems = 0; unsigned char* data = 0; Atom actual_type; int actual_format; unsigned long bytes; // WM_CLIENT_LEADER is an interned Atom for the WM_CLIENT_LEADER property int status = XGetWindowProperty (display,WM_CLIENT_LEADER,0L,(~0L),False,AnyPropertyType,&actual_type,&actual_format,&nitems,&bytes,&data); if (status != Success || acutal_type == None) return false; Window* leader = reinterpret_cast<Window*> (data); return (*leader != 0); } bool has_class(Window window) { XClassHint data = XClassHint (); return (!GetClassHint (display,&data)); } void handle_event(Widget widget,XtPointer,XEvent* event,Boolean*) { if (event->type != CreateNotify) return; Window w = event->xcreatewindow.window; // confirm window has a name if (!has_name (w)) return; // confirm window is a client window Window client = XmuClientWindow (display,w); if (!client || client != w) return; // confirm window has a client leader that is not 0x0 if (!has_client_leader (client)) return; // confirm window has a class if (!has_class (client)) return; // The window has passed all our checks! // Go on to do stuff with the window ... } int main(int argc,char* argv[]) { // ... // Setting up the event handler for SubstructureNotify on root window Window root_window = XDefaultRootWindow (display); Widget dummy = XtCreateWidget ("dummy",coreWidgetClass,toplevel,0); XtRegisterDrawable (display,root_window,dummy); XSelectInput (display,SubstructureNotifyMask); XtAddRawEventHandler (dummy,SubstructureNotifyMask,handle_event,0); // ... } 很长一段时间,但有没有人有任何想法我可以尝试?我想不出我能在这里真正做到的其他事情. 解决方法
我假设你熟悉
ICCCM及其
long-winded discussion.
你检查过WM_TRANSIENT_FOR属性了吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |