Merge pull request #850 from asur4s/master

fix: Shift + (  in french keyboard
This commit is contained in:
RustDesk 2022-06-26 20:49:27 +08:00 committed by GitHub
commit 77dcbdb32b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,65 +1,48 @@
from pynput.keyboard import Key, Controller from pynput.keyboard import Key, Controller
from pynput.keyboard._xorg import KeyCode from pynput.keyboard._xorg import KeyCode
from pynput._util.xorg import display_manager from pynput._util.xorg import display_manager
import Xlib
import os import os
import sys import sys
import socket import socket
from Xlib.ext.xtest import fake_input
from Xlib import X
import Xlib
KeyCode._from_symbol("\0") # test KeyCode._from_symbol("\0") # test
class MyController(Controller): class MyController(Controller):
def _handle(self, key, is_press): def _handle(self, key, is_press):
"""Resolves a key identifier and sends a keyboard event. """Resolves a key identifier and sends a keyboard event.
:param event: The *X* keyboard event. :param event: The *X* keyboard event.
:param int keysym: The keysym to handle. :param int keysym: The keysym to handle.
""" """
event = Xlib.display.event.KeyPress if is_press \ event = Xlib.display.event.KeyPress if is_press \
else Xlib.display.event.KeyRelease else Xlib.display.event.KeyRelease
keysym = self._keysym(key)
# Make sure to verify that the key was resolved origin_keysym = self._keysym(key)
if keysym is None: keycode = self._display.keysym_to_keycode(origin_keysym)
raise self.InvalidKeyException(key)
# If the key has a virtual key code, use that immediately with with display_manager(self._display) as dm, self.modifiers as modifiers:
# fake_input; fake input,being an X server extension, has access to # Under certain cimcumstances, such as when running under Xephyr,
# more internal state that we do # the value returned by dm.get_input_focus is an int
if key.vk is not None: window = dm.get_input_focus().focus
with display_manager(self._display) as dm: send_event = getattr(
Xlib.ext.xtest.fake_input( window,
dm, 'send_event',
Xlib.X.KeyPress if is_press else Xlib.X.KeyRelease, lambda event: dm.send_event(window, event))
dm.keysym_to_keycode(key.vk)) 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))
# Otherwise use XSendEvent; we need to use this in the general case to
# work around problems with keyboard layouts
else:
try:
keycode, shift_state = self.keyboard_mapping[keysym]
with self.modifiers as modifiers:
alt_gr = Key.alt_gr in modifiers
if alt_gr:
self._send_key(event, keycode, shift_state)
else:
with display_manager(self._display) as dm:
Xlib.ext.xtest.fake_input(
dm,
Xlib.X.KeyPress if is_press else Xlib.X.KeyRelease,
keycode)
except KeyError:
with self._borrow_lock:
keycode, index, count = self._borrows[keysym]
self._send_key(
event,
keycode,
index_to_shift(self._display, index))
count += 1 if is_press else -1
self._borrows[keysym] = (keycode, index, count)
# Notify any running listeners
self._emit('_on_fake_event', key, is_press)
keyboard = MyController() keyboard = MyController()
@ -77,7 +60,7 @@ server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind(server_address) server.bind(server_address)
server.listen(1) server.listen(1)
clientsocket, address = server.accept() clientsocket, address = server.accept()
os.system('chmod a+rw %s'%server_address) os.system('chmod a+rw %s' % server_address)
print("Got pynput connection") print("Got pynput connection")
@ -121,4 +104,3 @@ def loop():
loop() loop()
clientsocket.close() clientsocket.close()
server.close() server.close()