我正在使用python的xlib绑定编写的窗口管理器,(最初)我试图以更pythonic的方式模仿dwm的行为。我已经获得了很多所需的东西,但是使用X的内置窗口边框功能来指示窗口焦点时遇到了麻烦。
假设我有Xlib的window类的实例,并且我正在正确阅读文档,那么这应该做我想做的(至少现在是这样)-将预先存在的窗口的窗口边框设置为花哨的颜色并将边框宽度设置为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()
但是,我从中什么都没得到-我可以添加打印语句来证明我的程序确实正在运行与该事件相关联的回调函数,但是在边框上绝对没有颜色变化。谁能确定我在这里到底缺少什么?如果有帮助,我可以粘贴一个更完整的示例。我不确定是否会这样,因为这是处理边框的唯一方法。
看起来像是完整的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()
我希望这对以后的人有所帮助!