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

问题描述 投票:0回答:1

Openbox被声明为符合EWMH here。我想使用此合规性层来实现一个无装饰的窗口,如建议的on this question's best answer

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

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)

窗口出现,但仍然有装饰。最后两个打印语句都返回434,所以我猜该窗口确实具有有效的EWMH window_type。所以问题是双重的:

  • 我的代码是否有效?

  • openbox应该绘制一个无装饰的窗口吗? (为什么不呢?)

python xlib ewmh openbox
1个回答
0
投票

嗯,我花了大约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值以查看所有内容)。

© www.soinside.com 2019 - 2024. All rights reserved.