rustdesk 2022-03-15 12:13:46 +08:00
parent 3f57604891
commit eaeceeac29
2 changed files with 66 additions and 6 deletions

View File

@ -505,7 +505,9 @@ fn start_pynput_service(rx: mpsc::Receiver<(PyMsg, bool)>) {
} else { } else {
let mut status = Ok(true); let mut status = Ok(true);
for i in 0..100 { for i in 0..100 {
log::info!("#{} try to start pynput server", i); if i % 10 == 0 {
log::info!("#{} try to start pynput server", i);
}
status = std::process::Command::new("sudo") status = std::process::Command::new("sudo")
.args(vec![ .args(vec![
&format!("XDG_RUNTIME_DIR=/run/user/{}", userid) as &str, &format!("XDG_RUNTIME_DIR=/run/user/{}", userid) as &str,
@ -536,12 +538,14 @@ fn start_pynput_service(rx: mpsc::Receiver<(PyMsg, bool)>) {
} }
}); });
std::thread::spawn(move || { std::thread::spawn(move || {
for _ in 0..300 { for i in 0..300 {
std::thread::sleep(std::time::Duration::from_millis(100)); std::thread::sleep(std::time::Duration::from_millis(100));
let mut conn = match std::os::unix::net::UnixStream::connect(IPC_FILE) { let mut conn = match std::os::unix::net::UnixStream::connect(IPC_FILE) {
Ok(conn) => conn, Ok(conn) => conn,
Err(err) => { Err(err) => {
log::error!("Failed to connect to {}: {}", IPC_FILE, err); if i % 15 == 0 {
log::warn!("Failed to connect to {}: {}", IPC_FILE, err);
}
continue; continue;
} }
}; };

View File

@ -1,12 +1,67 @@
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
import Xlib
import os import os
import sys import sys
import socket import socket
INVALID = KeyCode._from_symbol("\0") # test KeyCode._from_symbol("\0") # test
keyboard = Controller() class MyController(Controller):
def _handle(self, key, is_press):
"""Resolves a key identifier and sends a keyboard event.
:param event: The *X* keyboard event.
:param int keysym: The keysym to handle.
"""
event = Xlib.display.event.KeyPress if is_press \
else Xlib.display.event.KeyRelease
keysym = self._keysym(key)
# Make sure to verify that the key was resolved
if keysym is None:
raise self.InvalidKeyException(key)
# If the key has a virtual key code, use that immediately with
# fake_input; fake input,being an X server extension, has access to
# more internal state that we do
if key.vk is not None:
with display_manager(self._display) as dm:
Xlib.ext.xtest.fake_input(
dm,
Xlib.X.KeyPress if is_press else Xlib.X.KeyRelease,
dm.keysym_to_keycode(key.vk))
# 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()
server_address = sys.argv[1] server_address = sys.argv[1]
if not os.path.exists(os.path.dirname(server_address)): if not os.path.exists(os.path.dirname(server_address)):
@ -52,7 +107,7 @@ def loop():
name = msg[1] name = msg[1]
else: else:
name = KeyCode._from_symbol(msg[1:]) name = KeyCode._from_symbol(msg[1:])
if name == INVALID: if str(name) == "<0>":
continue continue
try: try:
if msg[0] == "p": if msg[0] == "p":
@ -66,3 +121,4 @@ def loop():
loop() loop()
clientsocket.close() clientsocket.close()
server.close() server.close()