具有自定义配置的Xlib ConfigureRequest不起作用

时间:2018-11-25 15:59:54

标签: python c x11 xlib window-managers

我正在使用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")

0 个答案:

没有答案