From 60073e037e2ca1d02645e413ac15735ccb897d9e Mon Sep 17 00:00:00 2001 From: fufesou Date: Wed, 30 Nov 2022 10:28:03 +0800 Subject: [PATCH 1/2] wayland better uinput control Signed-off-by: fufesou --- src/server.rs | 4 +++ src/server/input_service.rs | 56 ++++++++++++++++++------------------- src/server/wayland.rs | 5 ++-- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/server.rs b/src/server.rs index 91a0da071..d08dd2672 100644 --- a/src/server.rs +++ b/src/server.rs @@ -379,6 +379,10 @@ pub async fn start_server(is_server: bool) { #[cfg(windows)] crate::platform::windows::bootstrap(); input_service::fix_key_down_timeout_loop(); + #[cfg(target_os = "linux")] + if crate::platform::current_is_wayland() { + allow_err!(input_service::setup_uinput(0, 1920, 0, 1080).await); + } #[cfg(target_os = "macos")] tokio::spawn(async { sync_and_watch_config_dir().await }); crate::RendezvousMediator::start_all().await; diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 4789e459b..b465658bb 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -223,44 +223,44 @@ lazy_static::lazy_static! { // The clients are ipc connections that must live shorter than tokio runtime. // Thus this funtion must not be called in a temporary runtime. #[cfg(target_os = "linux")] -pub async fn set_uinput() -> ResultType<()> { +pub async fn setup_uinput(minx: i32, maxx: i32, miny: i32, maxy: i32) -> ResultType<()> { // Keyboard and mouse both open /dev/uinput // TODO: Make sure there's no race + set_uinput_resolution(minx, maxx, miny, maxy).await?; - if ENIGO.lock().unwrap().get_custom_keyboard().is_none() { - let keyboard = super::uinput::client::UInputKeyboard::new().await?; - log::info!("UInput keyboard created"); - ENIGO - .lock() - .unwrap() - .set_custom_keyboard(Box::new(keyboard)); - } + let keyboard = super::uinput::client::UInputKeyboard::new().await?; + log::info!("UInput keyboard created"); + let mouse = super::uinput::client::UInputMouse::new().await?; + log::info!("UInput mouse created"); - let mouse_created = ENIGO.lock().unwrap().get_custom_mouse().is_some(); - if mouse_created { - std::thread::spawn(|| { - if let Some(mouse) = ENIGO.lock().unwrap().get_custom_mouse() { - if let Some(mouse) = mouse - .as_mut_any() - .downcast_mut::() - { - allow_err!(mouse.send_refresh()); - } else { - log::error!("failed downcast uinput mouse"); - } - } - }); - } else { - let mouse = super::uinput::client::UInputMouse::new().await?; - log::info!("UInput mouse created"); - ENIGO.lock().unwrap().set_custom_mouse(Box::new(mouse)); + ENIGO + .lock() + .unwrap() + .set_custom_keyboard(Box::new(keyboard)); + ENIGO.lock().unwrap().set_custom_mouse(Box::new(mouse)); + Ok(()) +} + +#[cfg(target_os = "linux")] +pub async fn update_mouse_resolution(minx: i32, maxx: i32, miny: i32, maxy: i32) -> ResultType<()> { + set_uinput_resolution(minx, maxx, miny, maxy).await?; + + if let Some(mouse) = ENIGO.lock().unwrap().get_custom_mouse() { + if let Some(mouse) = mouse + .as_mut_any() + .downcast_mut::() + { + allow_err!(mouse.send_refresh()); + } else { + log::error!("failed downcast uinput mouse"); + } } Ok(()) } #[cfg(target_os = "linux")] -pub async fn set_uinput_resolution(minx: i32, maxx: i32, miny: i32, maxy: i32) -> ResultType<()> { +async fn set_uinput_resolution(minx: i32, maxx: i32, miny: i32, maxy: i32) -> ResultType<()> { super::uinput::client::set_resolution(minx, maxx, miny, maxy).await } diff --git a/src/server/wayland.rs b/src/server/wayland.rs index 071077c84..fdf9bccec 100644 --- a/src/server/wayland.rs +++ b/src/server/wayland.rs @@ -174,14 +174,13 @@ pub(super) async fn check_init() -> ResultType<()> { if minx != maxx && miny != maxy { log::info!( - "send uinput resolution: ({}, {}), ({}, {})", + "update mouse resolution: ({}, {}), ({}, {})", minx, maxx, miny, maxy ); - allow_err!(input_service::set_uinput_resolution(minx, maxx, miny, maxy).await); - allow_err!(input_service::set_uinput().await); + allow_err!(input_service::update_mouse_resolution(minx, maxx, miny, maxy).await); } } Ok(()) From 767950d429618594945887c951af17738e6bc50b Mon Sep 17 00:00:00 2001 From: fufesou Date: Wed, 30 Nov 2022 10:43:15 +0800 Subject: [PATCH 2/2] remove unneccessary ?? Signed-off-by: fufesou --- flutter/lib/models/native_model.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/lib/models/native_model.dart b/flutter/lib/models/native_model.dart index 0fa023e53..be80bb65b 100644 --- a/flutter/lib/models/native_model.dart +++ b/flutter/lib/models/native_model.dart @@ -131,7 +131,7 @@ class PlatformFFI { AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; name = '${androidInfo.brand}-${androidInfo.model}'; id = androidInfo.id.hashCode.toString(); - androidVersion = androidInfo.version.sdkInt ?? 0; + androidVersion = androidInfo.version.sdkInt; } else if (Platform.isIOS) { IosDeviceInfo iosInfo = await deviceInfo.iosInfo; name = iosInfo.utsname.machine ?? '';