From e2293240210aae90162e40cffe89b74cdca9d9c7 Mon Sep 17 00:00:00 2001 From: fufesou Date: Wed, 2 Nov 2022 11:32:30 +0800 Subject: [PATCH 1/2] flutter_desktop: get double click time, win Signed-off-by: fufesou --- flutter/lib/consts.dart | 2 -- flutter/lib/desktop/pages/file_manager_page.dart | 5 +++-- flutter/lib/desktop/widgets/tabbar_widget.dart | 4 ++-- src/flutter_ffi.rs | 4 ++-- src/platform/linux.rs | 7 +++++++ src/platform/macos.rs | 6 ++++++ src/platform/windows.rs | 4 ++++ 7 files changed, 24 insertions(+), 8 deletions(-) diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index dc4dc2c94..c13a87d41 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -33,8 +33,6 @@ const int kMobileMaxDisplayHeight = 1280; const int kDesktopMaxDisplayWidth = 1920; const int kDesktopMaxDisplayHeight = 1080; -const int kDesktopDoubleClickTimeMilli = 200; - const Size kConnectionManagerWindowSize = Size(300, 400); // Tabbar transition duration, now we remove the duration const Duration kTabTransitionDuration = Duration.zero; diff --git a/flutter/lib/desktop/pages/file_manager_page.dart b/flutter/lib/desktop/pages/file_manager_page.dart index 042158fcb..63122df88 100644 --- a/flutter/lib/desktop/pages/file_manager_page.dart +++ b/flutter/lib/desktop/pages/file_manager_page.dart @@ -57,7 +57,8 @@ class _FileManagerPageState extends State final _breadCrumbScrollerRemote = ScrollController(); /// [_lastClickTime], [_lastClickEntry] help to handle double click - int _lastClickTime = DateTime.now().millisecondsSinceEpoch; + int _lastClickTime = + DateTime.now().millisecondsSinceEpoch - bind.getDoubleClickTime() - 1000; Entry? _lastClickEntry; final _dropMaskVisible = false.obs; // TODO impl drop mask @@ -404,7 +405,7 @@ class _FileManagerPageState extends State final elapsed = current - _lastClickTime; _lastClickTime = current; if (_lastClickEntry == entry) { - if (elapsed < kDesktopDoubleClickTimeMilli) { + if (elapsed < bind.getDoubleClickTime()) { return true; } } else { diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index 229e8bd35..c21f58e4b 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -178,7 +178,7 @@ typedef LabelGetter = Rx Function(String key); /// [_lastClickTime], help to handle double click int _lastClickTime = - DateTime.now().millisecondsSinceEpoch - kDesktopDoubleClickTimeMilli - 1000; + DateTime.now().millisecondsSinceEpoch - bind.getDoubleClickTime() - 1000; class DesktopTab extends StatelessWidget { final bool showLogo; @@ -311,7 +311,7 @@ class DesktopTab extends StatelessWidget { final current = DateTime.now().millisecondsSinceEpoch; final elapsed = current - _lastClickTime; _lastClickTime = current; - if (elapsed < kDesktopDoubleClickTimeMilli) { + if (elapsed < bind.getDoubleClickTime()) { // onDoubleTap toggleMaximize(isMainWindow) .then((value) => isMaximized.value = value); diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 45bcd12e3..1c53829f1 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -804,8 +804,8 @@ pub fn main_is_root() -> bool { is_root() } -pub fn main_is_release() -> bool { - is_release() +pub fn get_double_click_time() -> SyncReturn { + SyncReturn(crate::platform::get_double_click_time() as _) } pub fn main_start_dbus_server() { diff --git a/src/platform/linux.rs b/src/platform/linux.rs index a02c4618b..3a779b577 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -684,3 +684,10 @@ pub fn check_super_user_permission() -> ResultType { let status = std::process::Command::new("pkexec").arg(arg).status()?; Ok(status.success() && status.code() == Some(0)) } + +pub fn get_double_click_time() -> u32 { + // to-do + // GtkSettings *settings = gtk_settings_get_default (); + // g_object_get (settings, "gtk-double-click-time", &double_click_time, NULL); + 500 as _ +} diff --git a/src/platform/macos.rs b/src/platform/macos.rs index 3273a22a5..9a474321e 100644 --- a/src/platform/macos.rs +++ b/src/platform/macos.rs @@ -537,3 +537,9 @@ pub fn quit_gui() { let () = msg_send!(NSApp(), terminate: nil); }; } + + +pub fn get_double_click_time() -> u32 { + // to-do: https://github.com/servo/core-foundation-rs/blob/786895643140fa0ee4f913d7b4aeb0c4626b2085/cocoa/src/appkit.rs#L2823 + 500 as _ +} diff --git a/src/platform/windows.rs b/src/platform/windows.rs index ae9574f33..b067f514b 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -1632,3 +1632,7 @@ pub fn is_foreground_window_elevated() -> ResultType { fn get_current_pid() -> u32 { unsafe { GetCurrentProcessId() } } + +pub fn get_double_click_time() -> u32 { + unsafe { GetDoubleClickTime() } +} From 7a972e9305846d08673ff139291c63ed12bad876 Mon Sep 17 00:00:00 2001 From: fufesou Date: Tue, 1 Nov 2022 23:54:10 -0700 Subject: [PATCH 2/2] flutter_desktop: get double click time, linux Signed-off-by: fufesou --- src/client/io_loop.rs | 6 +++--- src/platform/linux.rs | 27 +++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index e4e604cde..52042da06 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -28,7 +28,7 @@ use hbb_common::tokio::{ }; use hbb_common::{ allow_err, - message_proto::{self, *}, + message_proto::*, sleep, }; use hbb_common::{fs, log, Stream}; @@ -1185,10 +1185,10 @@ impl Remote { } #[cfg(windows)] - fn handle_cliprdr_msg(&self, clip: message_proto::Cliprdr) { + fn handle_cliprdr_msg(&self, clip: hbb_common::message_proto::Cliprdr) { if !self.handler.lc.read().unwrap().disable_clipboard { #[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] - if let Some(message_proto::cliprdr::Union::FormatList(_)) = &clip.union { + if let Some(hbb_common::message_proto::cliprdr::Union::FormatList(_)) = &clip.union { if self.client_conn_id != clipboard::get_client_conn_id(&crate::flutter::get_cur_session_id()) .unwrap_or(0) diff --git a/src/platform/linux.rs b/src/platform/linux.rs index 3a779b577..8c0df67dd 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -685,9 +685,32 @@ pub fn check_super_user_permission() -> ResultType { Ok(status.success() && status.code() == Some(0)) } +type GtkSettingsPtr = *mut c_void; +type GObjectPtr = *mut c_void; +#[link(name = "gtk-3")] +extern "C" { + // fn gtk_init(argc: *mut c_int, argv: *mut *mut c_char); + fn gtk_settings_get_default() -> GtkSettingsPtr; +} + +#[link(name = "gobject-2.0")] +extern "C" { + fn g_object_get(object: GObjectPtr, first_property_name: *const c_char, ...); +} + pub fn get_double_click_time() -> u32 { - // to-do // GtkSettings *settings = gtk_settings_get_default (); // g_object_get (settings, "gtk-double-click-time", &double_click_time, NULL); - 500 as _ + unsafe { + let mut double_click_time = 0u32; + let property = std::ffi::CString::new("gtk-double-click-time").unwrap(); + let setings = gtk_settings_get_default(); + g_object_get( + setings, + property.as_ptr(), + &mut double_click_time as *mut u32, + 0 as *const libc::c_void, + ); + double_click_time + } }