diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 1b3aad9d8..2ff3d4477 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1113,3 +1113,12 @@ Future> getHttpHeaders() async { 'Bearer ${await bind.mainGetLocalOption(key: 'access_token')}' }; } + +// Simple wrapper of built-in types for refrence use. +class SimpleWrapper { + T t; + SimpleWrapper(this.t); + + T get value => t; + set value(T t) => this.t = t; +} diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index a7bed04ef..48c6c0ae3 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -20,6 +20,7 @@ import '../../models/platform_model.dart'; import '../../common/shared_state.dart'; bool _isCustomCursorInited = false; +final SimpleWrapper _firstEnterImage = SimpleWrapper(false); class RemotePage extends StatefulWidget { const RemotePage({ @@ -102,6 +103,10 @@ class _RemotePageState extends State if (!_isCustomCursorInited) { customCursorController.registerNeedUpdateCursorCallback( (String? lastKey, String? currentKey) async { + if (_firstEnterImage.value) { + _firstEnterImage.value = false; + return true; + } return lastKey == null || lastKey != currentKey; }); _isCustomCursorInited = true; @@ -172,6 +177,7 @@ class _RemotePageState extends State _rawKeyFocusNode.requestFocus(); } _cursorOverImage.value = true; + _firstEnterImage.value = true; if (_onEnterOrLeaveImage4Menubar != null) { try { _onEnterOrLeaveImage4Menubar!(true); @@ -184,6 +190,7 @@ class _RemotePageState extends State void leaveView(PointerExitEvent evt) { _cursorOverImage.value = false; + _firstEnterImage.value = false; if (_onEnterOrLeaveImage4Menubar != null) { try { _onEnterOrLeaveImage4Menubar!(false);