diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 51225672b..8c56f69d2 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -517,6 +517,19 @@ class _RemotePageState extends State } } + void enterView(PointerEnterEvent evt) { + if (!_imageFocused) { + _physicalFocusNode.requestFocus(); + } + _cursorOverImage.value = true; + _ffi.enterOrLeave(true); + } + + void leaveView(PointerExitEvent evt) { + _cursorOverImage.value = false; + _ffi.enterOrLeave(false); + } + Widget _buildImageListener(Widget child) { return Listener( onPointerHover: _onPointHoverImage, @@ -525,15 +538,8 @@ class _RemotePageState extends State onPointerMove: _onPointMoveImage, onPointerSignal: _onPointerSignalImage, child: MouseRegion( - onEnter: (evt) { - if (!_imageFocused) { - _physicalFocusNode.requestFocus(); - } - _cursorOverImage.value = true; - }, - onExit: (evt) { - _cursorOverImage.value = false; - }, + onEnter: enterView, + onExit: leaveView, child: child)); } diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index dcf9a7b22..bfa6f5297 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -1003,6 +1003,10 @@ class FFI { downOrUp: down); } + void enterOrLeave(bool enter) { + bind.sessionEnterOrLeave(id: id, enter: enter); + } + /// Send key stroke event. /// [down] indicates the key's state(down or up). /// [press] indicates a click event(down and up). diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 72ccbe603..e5616bee6 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -247,6 +247,16 @@ pub fn session_handle_flutter_key_event( } } +pub fn session_enter_or_leave(id: String, enter: bool) { + if let Some(session) = SESSIONS.read().unwrap().get(&id) { + if enter { + session.enter(); + } else { + session.leave(); + } + } +} + pub fn session_input_key( id: String, name: String,