From 73da1583da22ddb6318417f0bc601faeccc91ead Mon Sep 17 00:00:00 2001 From: open-trade Date: Thu, 3 Feb 2022 17:19:25 +0800 Subject: [PATCH] mouse works --- lib/model.dart | 57 ++++++++++++++++++++++++++++++++++++++++---- lib/remote_page.dart | 1 - lib/web_model.dart | 38 +++++++++++++++++++++-------- 3 files changed, 81 insertions(+), 15 deletions(-) diff --git a/lib/model.dart b/lib/model.dart index 687b113f3..29482492c 100644 --- a/lib/model.dart +++ b/lib/model.dart @@ -367,7 +367,6 @@ class CursorModel with ChangeNotifier { void touch(double x, double y, bool right) { final scale = FFI.canvasModel.scale; - print(scale); final xoffset = FFI.canvasModel.x; final yoffset = FFI.canvasModel.y; _x = (x - xoffset) / scale + _displayOriginX; @@ -633,8 +632,10 @@ class FFI { } static void close() { - savePreference(id, cursorModel.x, cursorModel.y, canvasModel.x, - canvasModel.y, canvasModel.scale, ffiModel.pi.currentDisplay); + if (FFI.imageModel.image != null && !isDesktop) { + savePreference(id, cursorModel.x, cursorModel.y, canvasModel.x, + canvasModel.y, canvasModel.scale, ffiModel.pi.currentDisplay); + } id = ""; setByName('close', ''); imageModel.update(null); @@ -657,7 +658,54 @@ class FFI { } static handleMouse(Map evt) { - // + var type = ''; + switch (evt['type']) { + case 'mousedown': + type = 'down'; + break; + case 'mouseup': + type = 'up'; + break; + case 'mousemove': + break; + default: + return; + } + evt['type'] = type; + var x = evt['x']; + var y = evt['y']; + final d = FFI.ffiModel.display; + x -= FFI.canvasModel.x; + y -= FFI.canvasModel.y; + if (x < 0 || x > d.width || y < 0 || y > d.height) { + return; + } + x += d.x; + y += d.y; + if (type != '') { + x = 0; + y = 0; + } + evt['x'] = '$x'; + evt['y'] = '$y'; + var buttons = ''; + switch (evt['buttons']) { + case 1: + buttons = 'left'; + break; + case 2: + buttons = 'right'; + break; + case 4: + buttons = 'wheel'; + break; + } + evt['buttons'] = buttons; + if (evt['ctrl'] != true) evt.remove('ctrl'); + if (evt['shift'] != true) evt.remove('shift'); + if (evt['alt'] != true) evt.remove('alt'); + if (evt['command'] != true) evt.remove('command'); + setByName('send_mouse', json.encode(evt)); } static listenToMouse(bool yesOrNo) { @@ -713,6 +761,7 @@ void savePreference(String id, double xCursor, double yCursor, double xCanvas, } Future> getPreference(String id) async { + if (!isDesktop) return null; SharedPreferences prefs = await SharedPreferences.getInstance(); var p = prefs.getString('peer' + id); if (p == null) return null; diff --git a/lib/remote_page.dart b/lib/remote_page.dart index bd632b2ef..4a2ccbdf5 100644 --- a/lib/remote_page.dart +++ b/lib/remote_page.dart @@ -438,7 +438,6 @@ class _RemotePageState extends State { } Widget getBodyForDesktopWithListener() { - print(FFI.ffiModel.display.width); return MouseRegion( onEnter: (event) { print('enter'); diff --git a/lib/web_model.dart b/lib/web_model.dart index 156196312..eeab1eff8 100644 --- a/lib/web_model.dart +++ b/lib/web_model.dart @@ -4,7 +4,8 @@ import 'common.dart'; import 'dart:html'; import 'dart:async'; -final List> mouselisteners = []; +final List> mouseListeners = []; +int lastMouseDownButtons = 0; class PlatformFFI { static void clearRgbaFrame() {} @@ -26,7 +27,6 @@ class PlatformFFI { } static Future init() async { - window.document.onContextMenu.listen((evt) => evt.preventDefault()); isWeb = true; isDesktop = !js.context.callMethod('isMobile'); js.context.callMethod('init'); @@ -35,37 +35,55 @@ class PlatformFFI { // MouseRegion onHover not work for mouse move when right button down static void startDesktopWebListener( Function(Map) handleMouse) { + lastMouseDownButtons = 0; // document.body.getElementsByTagName('flt-glass-pane')[0].style.cursor = 'none'; - mouselisteners.add(window.document.onMouseMove + mouseListeners.add(window.document.onMouseMove .listen((evt) => handleMouse(getEvent(evt)))); - mouselisteners.add(window.document.onMouseDown + mouseListeners.add(window.document.onMouseDown .listen((evt) => handleMouse(getEvent(evt)))); - mouselisteners.add( + mouseListeners.add( window.document.onMouseUp.listen((evt) => handleMouse(getEvent(evt)))); - mouselisteners.add(window.document.onMouseWheel.listen((evt) => {})); + mouseListeners.add(window.document.onMouseWheel.listen((evt) { + var dx = evt.deltaX; + var dy = evt.deltaY; + if (dx > 0) + dx = -1; + else if (dx < 0) dx = 1; + if (dy > 0) + dy = -1; + else if (dy < 0) dy = 1; + setByName('send_mouse', '{"type": "wheel", "x": "$dx", "y": "$dy"}'); + })); + mouseListeners.add( + window.document.onContextMenu.listen((evt) => evt.preventDefault())); } static void stopDesktopWebListener() { - mouselisteners.forEach((l) { + mouseListeners.forEach((l) { l.cancel(); }); - mouselisteners.clear(); + mouseListeners.clear(); } } Map getEvent(MouseEvent evt) { // https://github.com/novnc/noVNC/blob/679b45fa3b453c7cf32f4b4455f4814818ecf161/core/rfb.js // https://developer.mozilla.org/zh-CN/docs/Web/API/Element/mousedown_event - final out = {}; + final Map out = {}; out['type'] = evt.type; out['x'] = evt.client.x; out['y'] = evt.client.y; out['ctrl'] = evt.ctrlKey; out['shift'] = evt.shiftKey; out['alt'] = evt.altKey; - out['meta'] = evt.metaKey; + out['command'] = evt.metaKey; out['buttons'] = evt .buttons; // left button: 1, right button: 2, middle button: 4, 1 | 2 = 3 (left + right) + if (evt.buttons != 0) { + lastMouseDownButtons = evt.buttons; + } else { + out['buttons'] = lastMouseDownButtons; + } return out; }