2011-05-01 53 views
2

爲我的罪孽(和 樂趣 的學習經歷)我正在寫一個窗口管理器(我知道,我知道)。窗口管理器應該如何處理ConfigureRequestEvent?

我使用python和XCB(python-xpyb)。

到目前爲止,我已經發現我需要在根窗口上使用SubStructureRedirect掩碼,並且我成功地傳遞了與應用程序的頂級窗口相關的事件。我正在通過啓動xterm來測試這個。

我得到一個ConfigureRequestEvent,接着是一個暫停,接着是另一個ConfigureRequestEvent,然後是一個MapRequestEvent。

當我得到MapRequestEvent時,我打電話connection.core.MapWindowChecked(e.window),它工作,但映射一個窗口,只有一個像素或兩個寬/高。

那麼我的問題是我應該如何處理ConfigureRequestEvent來使窗口的大小正確(假設這就是我所缺少的)?

更準確地說,我打電話到底是什麼? MapWindowChecked是一個明顯的選擇,但我似乎無法找到如何實際配置寬度/高度。我猜它是ConfigureWindow,但接受的參數對我來說似乎很模糊。上次我調用它時,我使用了xcb.xproto.CW.EventMask,但CW中沒有任何標誌似乎與寬度/高度有關。

PS關於這一切的文檔對我來說似乎相當難以捉摸。我看過一些可能使用xcb的python窗口管理器,他們似乎使用他們自己的具有額外功能的自定義版本。另外,檢查/調試一個正在運行的窗口管理器(它也負責映射你的調試器窗口)是一個PITA,因此我在這裏問。可能會更好地使用兩臺機器或虛擬機或其他東西。

謝謝。

+0

調試窗口管理器的方式是使用像Xephyr或Xnes​​t這樣的嵌套X服務器。編寫一個腳本,在每次更改之後使用單個命令啓動WM,以便在嵌套X服務器內進行測試。如果你看一下metacity的來源,那就是或曾經是這樣的腳本。 – 2011-05-02 14:36:57

+0

我處於幾乎相同的情況。我的小WM管理着以固定的位置和大小映射窗口,但是像你一樣,我得到兩個ConfigureRequest事件,它們之間的延遲很長。你有沒有想過爲什麼你會得到兩個事件,或者爲什麼他們之間有這樣的延遲? – 2011-10-06 12:45:58

回答

1

簡短的答案是通過調用ConfigureWindow配置窗口(大小,堆棧等)。長的答案就是在這裏強制執行策略並遵守XSizeHints等規範。最好看一下現有WM的來源,並瞭解他們的工作。你究竟做了什麼取決於你想要的用戶界面。

讓它工作的最簡單的方法就是僅僅根據請求詢問沒有策略或提示覆蓋時的ConfigureWindow。但是你很快就會看到很多可用性問題,不得不添加更多的智能。

+0

謝謝。我在問什麼應該更清楚。我的意思是我打電話來實際配置窗口。我有這樣的印象,我應該修改事件並將其傳遞,但​​我現在還不確定。我在抽象中理解WM應該做什麼,並且爲了讓更好的術語成爲我想要寫的東西,就是一個'Pass Through'WM。我澄清了我的問題。 – DaedalusFall 2011-05-02 13:00:07

+0

對,協議請求是ConfigureWindow,它是Xlib中的XConfigureWindow()和XCB中的xcb_configure_window()。我認爲Python稱之爲類似的東西。如果你看一下現有的WM源代碼,你可以看到這個想法。 ConfigureWindow中的字段與ConfigureRequestEvent中的字段完全匹配,因此只需將它們複製即可。 – 2011-05-02 14:34:58

+0

查看「man XConfigureWindow」和「man XConfigureRequestEvent」以獲得很多好的細節。 – 2011-05-02 14:36:06