使用(python)xlib

时间:2018-07-03 17:56:04

标签: python xlib

我正在尝试使用以下脚本在每个创建的普通窗口上设置_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED属性:

#!/usr/bin/python

from Xlib import display, X, error, protocol

disp = display.Display()

root = disp.screen().root
root.change_attributes(event_mask=X.SubstructureNotifyMask)

hide_atom = disp.intern_atom('_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED')
type_atom = disp.intern_atom('_NET_WM_WINDOW_TYPE')
normal_atom = disp.intern_atom('_NET_WM_WINDOW_TYPE_NORMAL')

while True:
    event = disp.next_event()
    if event.type == X.CreateNotify:
        win = event.window
        try:
            type = win.get_full_property(type_atom, X.AnyPropertyType)
        except error.BadWindow:        
            continue
        if type and type.value[0] == normal_atom:
            event = protocol.event.ClientMessage(window=win,
                                                 client_type=hide_atom,
                                                 data=(32, [1, 0, 0, 0, 0]))                    
            mask = X.SubstructureRedirectMask | X.SubstructureNotifyMask
            root.send_event(event, event_mask=mask)
            disp.flush()

问题是正确捕获了创建事件,发送了消息,但最后没有任何反应:(。

我以某种方式设法使两者同时起作用:

  1. 在发送事件之前睡一秒钟。
  2. 调用xprop设置属性。

也就是说:

time.sleep(0.2)
os.system(
    f'xprop -id {win.id} -f _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED 32c '
    f'-set _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED 0x1')

这两个条件都是必需的。显然,我不希望调用外部实用程序,并且至少要了解为什么需要睡眠以及如何避免睡眠。


更新:我用更简单的

替换了消息传递部分
win.change_property(hide_atom, Xatom.CARDINAL, 32, [1])

在通话之前,有必要睡一会儿,我想了解原因。

0 个答案:

没有答案