我正在尝试使用以下脚本在每个创建的普通窗口上设置_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()
问题是正确捕获了创建事件,发送了消息,但最后没有任何反应:(。
我以某种方式设法使两者同时起作用:
也就是说:
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])
在通话之前,有必要睡一会儿,我想了解原因。