Replaced fake_input with display_manager's send_event

This commit is contained in:
Asura 2022-06-24 12:01:22 +08:00 committed by GitHub
parent 8aeacf77b3
commit c842642c02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,6 +6,7 @@ import sys
import socket
from Xlib.ext.xtest import fake_input
from Xlib import X
import Xlib
KeyCode._from_symbol("\0") # test
@ -16,15 +17,31 @@ class MyController(Controller):
:param event: The *X* keyboard event.
:param int keysym: The keysym to handle.
"""
event = X.KeyPress if is_press \
else X.KeyRelease
keysym = self._keysym(key)
# Get keycode according to system language
keycode = self._display.keysym_to_keycode(keysym)
event = Xlib.display.event.KeyPress if is_press \
else Xlib.display.event.KeyRelease
origin_keysym = self._keysym(key)
keycode = self._display.keysym_to_keycode(origin_keysym)
with display_manager(self._display) as dm, self.modifiers as modifiers:
# Under certain cimcumstances, such as when running under Xephyr,
# the value returned by dm.get_input_focus is an int
window = dm.get_input_focus().focus
send_event = getattr(
window,
'send_event',
lambda event: dm.send_event(window, event))
send_event(event(
detail=keycode,
state=self._shift_mask(modifiers),
time=0,
root=dm.screen().root,
window=window,
same_screen=0,
child=Xlib.X.NONE,
root_x=0, root_y=0, event_x=0, event_y=0))
fake_input(self._display, event, keycode)
self._display.sync()
keyboard = MyController()