From 0e838d59d5cba5ba533b7fd4a9d7acebc0957f69 Mon Sep 17 00:00:00 2001 From: fufesou Date: Thu, 24 Aug 2023 12:03:29 +0800 Subject: [PATCH] Check if peer info is set Signed-off-by: fufesou --- flutter/lib/desktop/pages/remote_page.dart | 24 ++++++++--------- .../lib/desktop/pages/remote_tab_page.dart | 7 ++++- flutter/lib/models/model.dart | 13 +++++++++- src/client.rs | 26 ++++++++++++++----- 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 339ecb3f2..f8151e059 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -228,18 +228,12 @@ class _RemotePageState extends State removeSharedStates(widget.id); } - Widget emptyOverlay() => GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - bind.sessionInputOsPassword(sessionId: sessionId, value: ''); - }, - child: BlockableOverlay( - /// the Overlay key will be set with _blockableOverlayState in BlockableOverlay - /// see override build() in [BlockableOverlay] - state: _blockableOverlayState, - underlying: Container( - color: Colors.transparent, - ), + Widget emptyOverlay() => BlockableOverlay( + /// the Overlay key will be set with _blockableOverlayState in BlockableOverlay + /// see override build() in [BlockableOverlay] + state: _blockableOverlayState, + underlying: Container( + color: Colors.transparent, ), ); @@ -273,7 +267,8 @@ class _RemotePageState extends State inputModel: _ffi.inputModel, child: getBodyForDesktop(context))), Obx( - () => _ffi.ffiModel.waitForFirstImage.isTrue + () => _ffi.ffiModel.pi.isSet.isTrue && + _ffi.ffiModel.waitForFirstImage.isTrue ? emptyOverlay() : Offstage(), ), @@ -286,6 +281,9 @@ class _RemotePageState extends State onEnterOrLeaveImageCleaner: () => _onEnterOrLeaveImage4Toolbar = null, ), + Obx( + () => _ffi.ffiModel.pi.isSet.isFalse ? emptyOverlay() : Offstage(), + ), ], ), ); diff --git a/flutter/lib/desktop/pages/remote_tab_page.dart b/flutter/lib/desktop/pages/remote_tab_page.dart index 51bcec51d..1dd291e3b 100644 --- a/flutter/lib/desktop/pages/remote_tab_page.dart +++ b/flutter/lib/desktop/pages/remote_tab_page.dart @@ -20,6 +20,7 @@ import 'package:get/get.dart'; import 'package:bot_toast/bot_toast.dart'; import '../../common/widgets/dialog.dart'; +import '../../models/model.dart'; import '../../models/platform_model.dart'; class _MenuTheme { @@ -266,7 +267,11 @@ class _ConnectionTabPageState extends State { if (e.kind != ui.PointerDeviceKind.mouse) { return; } - if (e.buttons == 2) { + final remotePage = tabController.state.value.tabs + .firstWhere((tab) => tab.key == key) + .page as RemotePage; + if (remotePage.ffi.ffiModel.pi.isSet.isTrue && + e.buttons == 2) { showRightMenu( (CancelFunc cancelFunc) { return _tabMenuBuilder(key, cancelFunc); diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 25ba22c70..00b344e13 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -99,6 +99,7 @@ class FfiModel with ChangeNotifier { late final SessionID sessionId; RxBool waitForImageDialogShow = true.obs; + Timer? waitForImageTimer; RxBool waitForFirstImage = true.obs; Map get permissions => _permissions; @@ -159,6 +160,7 @@ class FfiModel with ChangeNotifier { _timer?.cancel(); _timer = null; clearPermissions(); + waitForImageTimer?.cancel(); } setConnectionType(String peerId, bool secure, bool direct) { @@ -511,6 +513,11 @@ class FfiModel with ChangeNotifier { tag: '$sessionId-waiting-for-image', ); waitForImageDialogShow.value = true; + waitForImageTimer = Timer(Duration(milliseconds: 1500), () { + if (waitForFirstImage.isTrue) { + bind.sessionInputOsPassword(sessionId: sessionId, value: ''); + } + }); bind.sessionOnWaitingForImageDialogShow(sessionId: sessionId); } @@ -603,6 +610,7 @@ class FfiModel with ChangeNotifier { } } + _pi.isSet.value = true; stateGlobal.resetLastResolutionGroupValues(peerId); notifyListeners(); @@ -1817,6 +1825,7 @@ class FFI { void onEvent2UIRgba() async { if (ffiModel.waitForImageDialogShow.isTrue) { ffiModel.waitForImageDialogShow.value = false; + ffiModel.waitForImageTimer?.cancel(); clearWaitingForImage(dialogManager, sessionId); } if (ffiModel.waitForFirstImage.value == true) { @@ -1935,7 +1944,7 @@ class Features { bool privacyMode = false; } -class PeerInfo { +class PeerInfo with ChangeNotifier { String version = ''; String username = ''; String hostname = ''; @@ -1947,6 +1956,8 @@ class PeerInfo { List resolutions = []; Map platform_additions = {}; + RxBool isSet = false.obs; + bool get is_wayland => platform_additions['is_wayland'] == true; bool get is_headless => platform_additions['headless'] == true; } diff --git a/src/client.rs b/src/client.rs index 17a62ed54..253c293ee 100644 --- a/src/client.rs +++ b/src/client.rs @@ -57,7 +57,10 @@ use scrap::{ ImageFormat, ImageRgb, }; -use crate::is_keyboard_mode_supported; +use crate::{ + common::input::{MOUSE_BUTTON_LEFT, MOUSE_TYPE_DOWN, MOUSE_TYPE_UP}, + is_keyboard_mode_supported, +}; #[cfg(not(feature = "flutter"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] @@ -2057,13 +2060,20 @@ pub fn send_pointer_device_event( /// # Arguments /// /// * `interface` - The interface for sending data. -fn activate_os(interface: &impl Interface) { +/// * `send_click` - Whether to send a click event. +fn activate_os(interface: &impl Interface, send_click: bool) { + let left_down = MOUSE_BUTTON_LEFT << 3 | MOUSE_TYPE_DOWN; + let left_up = MOUSE_BUTTON_LEFT << 3 | MOUSE_TYPE_UP; + send_mouse(left_up, 0, 0, false, false, false, false, interface); + std::thread::sleep(Duration::from_millis(50)); send_mouse(0, 0, 0, false, false, false, false, interface); std::thread::sleep(Duration::from_millis(50)); send_mouse(0, 3, 3, false, false, false, false, interface); - std::thread::sleep(Duration::from_millis(50)); - send_mouse(1 | 1 << 3, 0, 0, false, false, false, false, interface); - send_mouse(2 | 1 << 3, 0, 0, false, false, false, false, interface); + if send_click { + std::thread::sleep(Duration::from_millis(50)); + send_mouse(left_down, 0, 0, false, false, false, false, interface); + send_mouse(left_up, 0, 0, false, false, false, false, interface); + } /* let mut key_event = KeyEvent::new(); // do not use Esc, which has problem with Linux @@ -2096,11 +2106,13 @@ pub fn input_os_password(p: String, activate: bool, interface: impl Interface) { /// * `activate` - Whether to activate OS. /// * `interface` - The interface for sending data. fn _input_os_password(p: String, activate: bool, interface: impl Interface) { + let input_password = !p.is_empty(); if activate { - activate_os(&interface); + // Click event is used to bring up the password input box. + activate_os(&interface, input_password); std::thread::sleep(Duration::from_millis(1200)); } - if p.is_empty() { + if !input_password { return; } let mut key_event = KeyEvent::new();