Я использую 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")