我可以在 openbox 中使用 _NET_WM_WINDOW_TYPE_DOCK EWHM 扩展吗?

Can I use _NET_WM_WINDOW_TYPE_DOCK EWHM extension in openbox?

Openbox 声称符合 EWMH here. I want to use this compliance layer to implement a decoration-less window, as proposed on this question's best answer

因此,我正在尝试使用 python 和 Xlib 构建一个简单的 window,它使用 _NET_WM_WINDOW_TYPE_DOCK 类型提示来摆脱 window 装饰。但是该过程失败并显示以下代码:

from Xlib import X, display
d = display.Display()
s = d.screen()
w = s.root.create_window(10, 10, 100, 100, 1, s.root_depth, background_pixel=s.black_pixel, event_mask=X.ExposureMask|X.KeyPressMask)
int_atom = d.intern_atom('int')
wm_window_type = d.intern_atom('_NET_WM_WINDOW_TYPE')
wm_window_type_dock = d.intern_atom('_NET_WM_WINDOW_TYPE_DOCK')
w.change_property(wm_window_type, int_atom, 32, [wm_window_type_dock, ], X.PropModeReplace)
w.map()
d.next_event()
d.next_event()

print(w.get_full_property(wm_window_type, X.AnyPropertyType).value[0])
print(wm_window_type_dock)

window 出现了,但仍然有装饰品。最后两个打印语句都是 return 434,所以我猜 window 确实有一个有效的 EWMH window_type。 所以问题是双重的:

好吧,我花了大约 12 个小时才找到答案:

我在 change_property 中使用了错误的原子。该电话应为:

w.change_property(wm_window_type, Xatom.ATOM, 32, [wm_window_type_dock, ], X.PropModeReplace)

因此,使用相关的 import 语句,整个代码变为:

from Xlib import X, Xatom, display
d = display.Display()
s = d.screen()
w = s.root.create_window(10, 10, 100, 100, 1, s.root_depth, background_pixel=s.black_pixel, event_mask=X.ExposureMask|X.KeyPressMask)
wm_window_type = d.intern_atom('_NET_WM_WINDOW_TYPE')
wm_window_type_dock = d.intern_atom('_NET_WM_WINDOW_TYPE_DOCK')
w.change_property(wm_window_type, Xatom.ATOM, 32, [wm_window_type_dock, ], X.PropModeReplace)
w.map()
d.next_event()
d.next_event()
print(w.get_full_property(wm_window_type, Xatom.ATOM).value[0])
print(wm_window_type_dock)

按预期工作(请注意,如果您的屏幕背景为黑色,您应该更改 background_pixel 值才能看到任何内容)。