在Python xlib中绘制窗口边框

5
我正在使用Python的xlib绑定编写窗口管理器,并尝试以更具Python风格的方式模仿dwm的行为。目前,我已经得到了大部分我需要的内容,但是我在使用X的内置窗口边框功能来指示窗口焦点时遇到了麻烦。
假设我有一个Xlib窗口类的实例,并且我正确地阅读了文档,那么这应该可以实现我想要的功能(至少目前是这样) - 将预先存在的窗口的窗口边框设置为过于花哨的颜色,并将边框宽度设置为2像素。
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一个更完整的示例。我不确定它是否有帮助,因为这是处理边框的唯一部分。

Python的Xlib绑定似乎是底层Xlib函数的直接翻译。在Xlib中,XChangeWindowAttributes()不接受border_width属性。窗口管理器通常通过调用XConfigureWindow()或XSetWindowBorderWidth()来建立border_width。 - ottomeister
我想说的是:如果你还没有这样做,尝试在调用change_attributes()之前,在你的set_active_border()函数中调用window.configure(border_width=2)。(我没有看到XSetBorderWidth()的Python绑定。)XSetWindowBorderWidth()。 - ottomeister
之前我曾经调用过configure(border_width=2),但是它被注释掉了。现在似乎没有任何方法可行。我已经尝试过以下两种方式: window.configure(border_width=2); window.change_attributes(...) 和仅使用window.change_attributes()。但是还是不行。如果有更多信息,我会再次报告的。 - bbenne10
1个回答

4

看起来这是一个典型的用户错误。我找到了答案。基本上,我之前是这样做的:

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()

希望这能对以后的某位有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接