【发布时间】:2009-07-21 04:53:41
【问题描述】:
我想截获发布到我正在编写的应用程序 (AllTray) 的特定窗口选择的 WM_DELETE_WINDOW 消息,以便我可以对其进行操作,而不是应用程序接收它。如果可能的话,我目前正在考虑在 GDK 级别 via gdk_display_add_client_message_filter 尝试这个,但如果有一个 Xlib 解决方案,我也会很高兴; 似乎是可能的,但我似乎不明白如何成功地做到这一点。
目前,我有两个程序(用 C 编写),我试图用它们来解决这个问题,the first one 只创建一个窗口并注册它知道WM_DELETE_WINDOW 和the second one 尝试捕捉该消息,但似乎没有这样做;它似乎什么也没做。我对此文档的理解是否有误,还是我需要做一些额外的事情(或者我是否需要完全避免为此使用 GDK)?
背景是这样的:在我重写 AllTray 之前,它的做事方式似乎是试图拦截鼠标单击 X 按钮本身。对于某些窗口管理器,这可以正常工作,对于其他窗口管理器,它根本不起作用,对于其他人,用户必须手动配置它并指示 AllTray 关闭窗口的按钮在哪里。我正在寻找的是一个不涉及LD_LIBRARY_PRELOAD 的解决方案,适用于任何符合当前标准的窗口管理器/应用程序组合,并在窗口关闭时发送WM_DELETE_WINDOW ClientMessage。
更新:我仍在寻找答案。我目前采取的路线是尝试重新设置窗口并自己管理它,但我无法让它工作。重生后,我似乎无法以任何方式找回它。我可能遗漏了一些非常基本的东西,但我不知道如何真正让它再次出现在我自己的窗口中,以使其重新出现在屏幕上。
更新 2:好的,所以我又碰了壁。 X 服务器文档说要在窗口的事件掩码上设置 StructureNotifyMask 以接收 MapNotify 和 ReparentNotify 事件。我也有兴趣收到。我目前的想法是创建一个仅用作事件接收器的窗口,然后当我收到有趣事物的事件时,通过创建和重新设置来对它们进行操作。但是,这似乎根本不起作用。我实际收到的唯一事件是 PropertyNotify 事件。所以,这条路线似乎也不是很好。
【问题讨论】:
-
我认为可以通过在您自己的顶层重新设置窗口的父级并过滤您传递的事件来实现?我认为你目前尝试的方式行不通。
-
这样做有什么缺点吗?也就是说,有什么特别的东西会导致它干扰 XDND 之类的东西吗?它是一个可移植的想法(例如,它不会破坏应用程序或窗口管理器)吗?我似乎能够找到很少的信息。我认为这也意味着我必须为每个新的客户端窗口创建一个新的“父”窗口,对吗?
标签: c linux events x11 intercept