Xlib ConfigureRequest с пользовательской конфигурацией не работает - PullRequest
0 голосов
/ 25 ноября 2018

Я использую python и python3-xlib (которые являются чистой реализацией Python интерфейса Xlib, но в основном очень похожи на C Xlib).В образовательных целях я пытаюсь создать простой оконный менеджер, который должен заставить окна иметь определенные размеры при открытии.В моем примере я хочу, чтобы окна имели ширину и высоту 500 пикселей.

Я слушаю событие ConfigureRequest и событие MapRequest.Если я не изменяю ширину и высоту, но напрямую передаю подсказки открывающегося окна, не меняя их, в конфигурацию окна, все работает как положено.

Однако, когда я указываю размер, который не являетсяпредполагаемый размер вновь открываемого окна, MapRequest задерживается более чем на 3 секунды (окно становится видимым через 3 с после ConfigureRequest).Это был тот случай, когда я проверял это, используя 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")
...