我正在使用python和python3-xlib(这是Xlib接口的纯python实现,但基本上与C Xlib非常相似)。出于教育目的,我试图创建一个简单的窗口管理器,当打开窗口时,该窗口管理器应能够强制窗口具有某些特定大小。在我的示例中,我想强制窗口的宽度和高度为500px。
我监听ConfigureRequest事件和MapRequest事件。如果我不更改宽度和高度,而是直接将打开窗口的提示传递而不更改它们,则将其传递给窗口的配置,一切都会按预期进行。
但是,当我指定的大小不是新打开的窗口的预期大小时,MapRequest会延迟3秒钟以上(在ConfigureRequest之后,> 3s的时间窗口可见)。当我使用xterm
测试时,就是这种情况。当我测试gnome-terminal
时,MapRequest在ConfigureRequest之前被触发,并立即可见,但未重绘(尽管我可以通过盲目键入exit
Return关闭它)。
这显然不是预期的行为。我做错什么了吗?
相关代码:
def handle_event(self):
try:
event = self.display.next_event()
except Xlib.error.ConnectionClosedError:
print("The connection to display '"+self.display.get_display_name()+"' was closed by the server")
print("Exiting now")
sys.exit(0)
if event.type in self.event_map:
self.event_map[event.type](event) # calls on_configure_request or on_map_request depending on event type
。
def handle_configure_request(self, event):
window = event.window
args = { 'border_width': 3 }
if event.value_mask & Xlib.X.CWX:
args['x'] = event.x
if event.value_mask & Xlib.X.CWY:
args['y'] = event.y
if event.value_mask & Xlib.X.CWWidth:
args['width'] = event.width
if event.value_mask & Xlib.X.CWHeight:
args['height'] = event.height
if event.value_mask & Xlib.X.CWSibling:
args['sibling'] = event.above
if event.value_mask & Xlib.X.CWStackMode:
args['stack_mode'] = event.stack_mode
args["width"] = 500
args["height"] = 500
window.configure(**args)
print("Configured") # printed twice for every window -> is this normal?
。
def on_map_request(self, event):
print("Mapping now") # when width and height are changed like above, this is printed more than 3s after on_configure_request when testing with xterm
event.window.map()
print("Mapped")