我想攔截WM_DELETE_WINDOW
消息,該消息發佈到我正在編寫的應用程序(AllTray)的某個特定窗口選擇中,以便我可以對其執行操作,而不是接收應用程序。如果可能的話,我目前正在考慮在GDK級別via gdk_display_add_client_message_filter
上嘗試此操作,但如果有Xlib解決方案,我也會很高興;它似乎是可能的,但我似乎並沒有理解我是如何成功地做到這一點。在X11上攔截WM_DELETE_WINDOW?
目前,我有兩個程序(用C編寫的),我想用它來得到這個想通了,the first one什麼也不做,但創建一個窗口,並註冊它知道WM_DELETE_WINDOW
和the second one企圖趕上消息,但似乎失敗了;它似乎沒有做任何事情。我是否理解錯誤的文檔,或者是否有其他需要做的事情(或者我需要完全避免使用GDK)?
背景是這樣的:在我重寫AllTray之前,它會做的事情似乎是嘗試攔截鼠標單擊X按鈕本身。對於一些窗口管理器來說,這可以正常工作,對於其他人來說根本無法工作,對於其他人,用戶必須手動配置它,並指示AllTray關閉窗口的按鈕。我正在尋找的是一個不涉及LD_LIBRARY_PRELOAD
的解決方案,它適用於任何符合當前標準的窗口管理器/應用程序組合,並在窗口關閉時發送ClientMessage。
UPDATE:我仍在尋找答案。我目前所採取的路線是嘗試重新放置窗戶並自己管理,但我無法使其工作。重新裝修後,我似乎無法以任何方式恢復原狀。我可能會錯過一些非常基本的東西,但我無法弄清楚如何讓它再次出現在我自己的窗口中,將它重新顯示在屏幕上。
UPDATE 2:好的,所以我撞上了另一堵磚牆。 X服務器文檔說在窗口的事件掩碼上設置StructureNotifyMask以接收MapNotify和ReparentNotify事件。我有興趣收到。我目前的想法是創建一個窗口,作爲一個事件接收器,然後當我得到有趣的事件的事件,通過創建和重新制定行動。但是,這似乎並不奏效。我實際收到的唯一事件是PropertyNotify事件。所以,這條路線似乎也不怎麼樣。
我認爲這可能是通過重新設置你自己的頂層窗口並過濾你傳遞的事件嗎?我不認爲你現在正在努力的方式可以工作。 – wrt 2009-07-23 21:39:59
這樣做有什麼缺點嗎?也就是說,有什麼特別的東西會導致干擾XDND之類的東西?這是一個可移植的想法嗎?(因爲它不會破壞應用程序或窗口管理器)? 我似乎能夠找到非常少的信息。我認爲這也意味着我將不得不爲每個新的客戶端窗口創建一個新的「父窗口」,對嗎? – 2009-07-23 23:10:32