2012-04-21 123 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() 

我希望这以后可以帮助别人的道路!