From 28aecbb9e95d84d7d5c183a049a4c2f0745b1899 Mon Sep 17 00:00:00 2001 From: fufesou Date: Mon, 13 Mar 2023 21:03:43 +0800 Subject: [PATCH 1/3] maybe better mouse hover Signed-off-by: fufesou --- flutter/lib/desktop/pages/remote_page.dart | 8 ++- flutter/lib/models/input_model.dart | 63 ++++++++++++++++++++-- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index ab0daece7..03074efc3 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -308,6 +308,10 @@ class _RemotePageState extends State } void leaveView(PointerExitEvent evt) { + if (_ffi.ffiModel.keyboard()) { + _ffi.inputModel.tryHoverEdgeOnExit(evt.position); + } + _cursorOverImage.value = false; _firstEnterImage.value = false; if (_onEnterOrLeaveImage4Menubar != null) { @@ -329,8 +333,8 @@ class _RemotePageState extends State PointerExitEventListener? onExit, ) { return RawPointerMouseRegion( - onEnter: enterView, - onExit: leaveView, + onEnter: onEnter, + onExit: onExit, onPointerDown: (event) { // A double check for blur status. // Note: If there's an `onPointerDown` event is triggered, `_isWindowBlur` is expected being false. diff --git a/flutter/lib/models/input_model.dart b/flutter/lib/models/input_model.dart index df9ad2585..f09bc3d60 100644 --- a/flutter/lib/models/input_model.dart +++ b/flutter/lib/models/input_model.dart @@ -419,7 +419,50 @@ class InputModel { 'type': _kMouseEventMove, }); - void handleMouse(Map evt) { + void tryHoverEdgeOnExit(Offset pos) => handleMouse( + { + 'x': pos.dx, + 'y': pos.dy, + 'buttons': 0, + 'type': _kMouseEventMove, + }, + onExit: true, + ); + + int trySetNearestRange(int v, int min, int max, int n) { + if (v < min && v >= min - n) { + v = min; + } + if (v > max && v <= max + n) { + v = max; + } + return v; + } + + Offset setNearestEdge(double x, double y, Display d) { + double left = x - d.x; + double right = d.x + d.width - 1 - x; + double top = y - d.y; + double bottom = d.y + d.height - 1 - y; + if (left < right && left < top && left < bottom) { + x = d.x; + } + if (right < left && right < top && right < bottom) { + x = d.x + d.width - 1; + } + if (top < left && top < right && top < bottom) { + y = d.y; + } + if (bottom < left && bottom < right && bottom < top) { + y = d.y + d.height - 1; + } + return Offset(x, y); + } + + void handleMouse( + Map evt, { + bool onExit = false, + }) { double x = evt['x']; double y = max(0.0, evt['y']); final cursorModel = parent.target!.cursorModel; @@ -501,6 +544,13 @@ class InputModel { } x += d.x; y += d.y; + + if (onExit) { + final pos = setNearestEdge(x, y, d); + x = pos.dx; + y = pos.dy; + } + var evtX = 0; var evtY = 0; try { @@ -512,10 +562,13 @@ class InputModel { return; } - if (evtX < d.x || - evtY < d.y || - evtX > (d.x + d.width) || - evtY > (d.y + d.height)) { + int minX = d.x.toInt(); + int maxX = (d.x + d.width).toInt() - 1; + int minY = d.y.toInt(); + int maxY = (d.y + d.height).toInt() - 1; + evtX = trySetNearestRange(evtX, minX, maxX, 3); + evtY = trySetNearestRange(evtY, minY, maxY, 3); + if (evtX < minX || evtY < minY || evtX > maxX || evtY > maxY) { // If left mouse up, no early return. if (evt['buttons'] != kPrimaryMouseButton || type != 'up') { return; From 3a6f94503cb8233a569cece096f8ea2126e73589 Mon Sep 17 00:00:00 2001 From: fufesou Date: Mon, 13 Mar 2023 21:05:41 +0800 Subject: [PATCH 2/3] trivial changes Signed-off-by: fufesou --- flutter/lib/desktop/pages/remote_page.dart | 2 +- flutter/lib/models/input_model.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 03074efc3..2099f2e95 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -309,7 +309,7 @@ class _RemotePageState extends State void leaveView(PointerExitEvent evt) { if (_ffi.ffiModel.keyboard()) { - _ffi.inputModel.tryHoverEdgeOnExit(evt.position); + _ffi.inputModel.tryMoveEdgeOnExit(evt.position); } _cursorOverImage.value = false; diff --git a/flutter/lib/models/input_model.dart b/flutter/lib/models/input_model.dart index f09bc3d60..21bbb9a39 100644 --- a/flutter/lib/models/input_model.dart +++ b/flutter/lib/models/input_model.dart @@ -419,7 +419,7 @@ class InputModel { 'type': _kMouseEventMove, }); - void tryHoverEdgeOnExit(Offset pos) => handleMouse( + void tryMoveEdgeOnExit(Offset pos) => handleMouse( { 'x': pos.dx, 'y': pos.dy, From 38de74f522b6bea06a628aac877f94fcf1855095 Mon Sep 17 00:00:00 2001 From: fufesou Date: Mon, 13 Mar 2023 21:18:10 +0800 Subject: [PATCH 3/3] set range from 3 to 5 Signed-off-by: fufesou --- flutter/lib/models/input_model.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flutter/lib/models/input_model.dart b/flutter/lib/models/input_model.dart index 21bbb9a39..9366d5b46 100644 --- a/flutter/lib/models/input_model.dart +++ b/flutter/lib/models/input_model.dart @@ -566,8 +566,8 @@ class InputModel { int maxX = (d.x + d.width).toInt() - 1; int minY = d.y.toInt(); int maxY = (d.y + d.height).toInt() - 1; - evtX = trySetNearestRange(evtX, minX, maxX, 3); - evtY = trySetNearestRange(evtY, minY, maxY, 3); + evtX = trySetNearestRange(evtX, minX, maxX, 5); + evtY = trySetNearestRange(evtY, minY, maxY, 5); if (evtX < minX || evtY < minY || evtX > maxX || evtY > maxY) { // If left mouse up, no early return. if (evt['buttons'] != kPrimaryMouseButton || type != 'up') {