From b04773083080008c6112aa719602fd53d4d113d2 Mon Sep 17 00:00:00 2001 From: fufesou <13586388+fufesou@users.noreply.github.com> Date: Thu, 27 Jun 2024 13:05:45 +0800 Subject: [PATCH] Refact/android input changed notify clients (#8494) * refact: android, input control changed, notify clients Signed-off-by: fufesou * fix: android init input perm Signed-off-by: fufesou --------- Signed-off-by: fufesou --- flutter/lib/models/server_model.dart | 5 +++++ src/flutter_ffi.rs | 7 +++++++ src/ipc.rs | 2 ++ src/server/connection.rs | 8 ++++++++ src/ui_cm_interface.rs | 9 +++++++++ 5 files changed, 31 insertions(+) diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart index fc169c963..b643a7c20 100644 --- a/flutter/lib/models/server_model.dart +++ b/flutter/lib/models/server_model.dart @@ -177,6 +177,11 @@ class ServerModel with ChangeNotifier { await timerCallback(); }); } + + // Initial keyboard status is off on mobile + if (isMobile) { + bind.mainSetOption(key: kOptionEnableKeyboard, value: 'N'); + } } /// 1. check android permission diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index d34ecb14d..b8ae1abee 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -786,6 +786,13 @@ pub fn main_show_option(_key: String) -> SyncReturn { } pub fn main_set_option(key: String, value: String) { + #[cfg(target_os = "android")] + if key.eq(config::keys::OPTION_ENABLE_KEYBOARD) { + crate::ui_cm_interface::notify_input_control(config::option2bool( + config::keys::OPTION_ENABLE_KEYBOARD, + &value, + )); + } if key.eq("custom-rendezvous-server") { set_option(key, value.clone()); #[cfg(target_os = "android")] diff --git a/src/ipc.rs b/src/ipc.rs index f1141e041..c344dc54e 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -189,6 +189,8 @@ pub enum Data { MouseMoveTime(i64), Authorize, Close, + #[cfg(target_os = "android")] + InputControl(bool), #[cfg(windows)] SAS, UserSid(Option), diff --git a/src/server/connection.rs b/src/server/connection.rs index c2a754d06..2c649f0a9 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -400,6 +400,9 @@ impl Connection { } #[cfg(target_os = "android")] start_channel(rx_to_cm, tx_from_cm); + #[cfg(target_os = "android")] + conn.send_permission(Permission::Keyboard, conn.keyboard).await; + #[cfg(not(target_os = "android"))] if !conn.keyboard { conn.send_permission(Permission::Keyboard, false).await; } @@ -457,6 +460,11 @@ impl Connection { conn.on_close("connection manager", true).await; break; } + #[cfg(target_os = "android")] + ipc::Data::InputControl(v) => { + conn.keyboard = v; + conn.send_permission(Permission::Keyboard, v).await; + } ipc::Data::CmErr(e) => { if e != "expected" { // cm closed before connection diff --git a/src/ui_cm_interface.rs b/src/ui_cm_interface.rs index 38bfc72b5..8b4a31f3d 100644 --- a/src/ui_cm_interface.rs +++ b/src/ui_cm_interface.rs @@ -279,6 +279,15 @@ pub fn close(id: i32) { }; } +#[inline] +#[cfg(target_os = "android")] +pub fn notify_input_control(v: bool) { + for (_, mut client) in CLIENTS.write().unwrap().iter_mut() { + client.keyboard = v; + allow_err!(client.tx.send(Data::InputControl(v))); + } +} + #[inline] pub fn remove(id: i32) { CLIENTS.write().unwrap().remove(&id);