在Python xlib中绘制窗口边框

时间:2012-04-21 21:36:34

标签: python xlib

我正在使用python的xlib绑定编写一个窗口管理器,而我(最初)试图以更加pythonic的方式模仿dwm的行为。我已经得到了很多我需要的东西,但是我在使用X的内置窗口边框功能来指示窗口焦点时遇到了麻烦。

假设我有一个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()

但是,我从中得不到任何东西 - 我可以添加print语句来证明我的程序确实正在运行我与事件关联的回调函数,但我在边框上绝对没有颜色变化。任何人都可以确定我在这里错过了什么?我可以用一个更完整的例子来粘贴,如果有帮助的话。我不确定它会不会因为这是处理边界的唯一一点。

1 个答案:

答案 0 :(得分:4)

看起来这是完整的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()

我希望这可以帮助后来的人!