2012-04-21 158 views
3

我正在使用python的xlib綁定編寫窗口管理器,我(最初)嘗試以更pythonic的方式模仿dwm的行爲。我已經獲得了我所需要的大部分內容,但是我無法使用內置的窗口邊框功能來指示窗口焦點。在Python xlib中繪製窗口邊框

假設我有一個Xlib的窗口類的實例,並且我正在閱讀文檔,這應該做我想做的事情(至少現在) - 將預先存在的窗口的窗口邊框設置爲花哨的顏色並將邊框寬度設置爲2px。

def set_active_border(self, window): 
    border_color = self.colormap.alloc_named_color(\ 
     "#ff00ff").pixel 
    window.change_attributes(None,border_pixel=border_color, 
      border_width = 2) 
    self.dpy.sync() 

不過,我什麼也沒有從這個 - 我可以添加打印語句來證明我的程序確實運行,我與該事件相關聯的回調函數,但我得到絕對的邊界上沒有顏色變化。任何人都可以確定我在這裏錯過了什麼嗎?如果它有幫助,我可以將pastebin更完整的示例。我並不確定它會如何,因爲這是處理邊界的唯一一點。

+0

Python Xlib綁定似乎是底層Xlib函數的直接轉換。在Xlib中,XChangeWindowAttributes()不接受border_width屬性。窗口管理器通常通過調用XConfigureWindow()或XSetWindowBorderWidth()來建立border_width。 – ottomeister 2012-04-22 05:37:39

+0

Gaah。我想說的是:如果你還沒有這樣做,請在調用change_attributes()之前,在你的set_active_border()函數中調用window.configure(border_width = 2)。 (我沒有看到XSetBorderWidth()的Python綁定。)XSetWindowBorderWidth()。 – ottomeister 2012-04-22 05:46:17

+0

我有一個調用配置(border_width = 2)在那裏之前,但它被註釋掉。沒有辦法似乎工作。我試過: window.configure(border_width = 2); window.change_attributes(...)和只有window.change_attributes()。仍然沒有骰子。當我有更多信息時,我會報告回來。 – bbenne10 2012-04-22 13:16:29

回答

3

看起來這是完整的PEBKAC。我找到了答案。基本上,我這樣做:

def set_active_border(self, window): 
    border_color = self.colormap.alloc_named_color(\ 
     "#ff00ff").pixel 
    window.configure(border_width = 2) 
    window.change_attributes(None,border_pixel=border_color, 
     border_width = 2) 
    self.dpy.sync() 

顯然這是令人困惑的X足以說它什麼都不做。我已經偶然發現解決的辦法是刪除從window.change_attributes的BORDER_WIDTH部分()調用,就像這樣:

def set_active_border(self, window): 
    border_color = self.colormap.alloc_named_color(\ 
     "#ff00ff").pixel 
    window.configure(border_width = 2) 
    window.change_attributes(None,border_pixel=border_color) 
    self.dpy.sync() 

我希望這以後可以幫助別人的道路!