簡體   English   中英

如何使用XCB繪制標題欄

[英]How to draw titlebar with XCB

我正在使用libxcb在c中創建一個簡單的窗口管理器,我正在嘗試使用標題欄,圖標和最小/最大/關閉按鈕來裝飾窗口。

我在Xephyr測試我的wm。 我可以生成一個新的xterm窗口,移動它並調整它的大小。 但現在我想裝飾新的xterm窗口(或任何其他應用程序),以便它有一個標題欄,圖標和最小/最大/關閉按鈕。

在我的Linux機器上,我剛剛安裝了一個Gtk主題,如果我以Firefox為例,那么在我在我的設置中設置該主題后,窗口就會被裝飾。 所以在這種情況下,我認為應用窗戶裝飾的是Gtk。 這是如何運作的?

我讀到EWMH窗口屬性_NET_WM_WINDOW_TYPE可用於確定如何處理窗口的裝飾。 所以我想我可以檢查窗口類型是否為_NET_WM_WINDOW_TYPE_NORMAL ,從應用程序中獲取WM_NAME ,然后在其上面手動繪制標題欄。

這是你應該如何正常繪制窗飾? 或者我可以使用Gtk(或其他東西)嗎?

所以在這種情況下,我認為應用窗戶裝飾的是Gtk。 這是如何運作的?

正確。 GTK應用程序告訴窗口管理器不要通過將邊框寬度設置為0來裝飾它們。現在我的建議是僅實現:如果窗口設置邊框寬度為0,則忽略它的裝飾。 我一開始不打擾任何其他事情。 事實上,你現在甚至可以忽略這個提示。

我讀到了EWMH窗口屬性[...]

現在不要打擾EWMH。 只是裝飾所有未設置邊框的托管窗口。此外,我沒有看到為什么不應該裝飾其他窗口類型(如對話框)的充分理由; 我不認為窗口管理器真的使用這個屬性來確定,但我只能肯定地說一對。

這是你應該如何正常繪制窗飾? 或者我可以使用Gtk(或其他東西)嗎?

雖然你沒有明確要求這個,但這句話中的最后一句話告訴我你可能不完全理解裝飾是如何工作的。 最常見的方式,我強烈建議你做這樣的,被稱為重排根

重新顯示意味着當您管理窗口時,您創建一個新窗口(當然您不應該像普通客戶端窗口那樣管理)稱為框架窗口,然后將客戶端窗口重新顯示到框架窗口中。 所以實際的頂級窗口是窗口管理器擁有的框架窗口; 客戶端窗口(用戶與之交互的窗口)是它的直接子節點。

現在,您只需使框架窗口略大於客戶端窗口,並在其中正確定位客戶端窗口。 當然,您需要跟蹤客戶端窗口的大小調整並對其進行操作。

那我們為什么要創建這個框架窗口呢? 簡單! 因為您可以創建一個用於它的像素圖,並在其上繪制標題欄。 這比直接繪制到子窗口更好,因為您不會弄亂您實際上沒有的窗口。

繪圖可以使用“原始”和簡單的調用來完成,例如xcb_poly_fill_rectangle或者您可以使用更復雜的方法,例如,使用像cairo這樣的庫(我建議)。 例如,i3窗口管理器使用一個簡單的抽象,它支持via compile flag(libi3 / draw_util.c)。

這種重排根的辦法就是為什么工具這樣的理由xwininfoxprop-frame選項。 默認情況下,這些工具實際上忽略了框架窗口並下降到客戶端窗口,幾乎隱藏了存在框架窗口的事實。 只需在同一個窗口上嘗試xpropxprop -frame ,您就會看到框架窗口附加的信息要少得多。

一旦你進行了重新定位和繪圖,你可以更多地思考你不需要/想要裝飾窗戶的情況。 鑒於此處有相當多的記錄,我認為首先實現這一點會讓你忙碌一段時間。 我強烈建議研究其他簡單窗口管理器的代碼。

暫無
暫無

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

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