From b321dff158f9a6a4a117059faa9467deb26a7761 Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 30 Oct 2022 14:38:35 +0800 Subject: [PATCH] flutter_desktop: debug win cursor 2 Signed-off-by: fufesou --- flutter/lib/desktop/pages/remote_page.dart | 28 +++++++++++----------- flutter/lib/models/model.dart | 28 +++++++++++++++++++++- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index b10534030..05a244802 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -284,7 +284,7 @@ class ImagePaint extends StatelessWidget { ? keyboardEnabled.isTrue ? (remoteCursorMoved.isTrue ? SystemMouseCursors.none - : _buildCustomCursorLinux(context, s)) + : _buildCustomCursor(context, s)) : _buildDisabledCursor(context, s) : MouseCursor.defer, onHover: (evt) {}, @@ -333,31 +333,31 @@ class ImagePaint extends StatelessWidget { } } - MouseCursor _buildCustomCursorLinux(BuildContext context, double scale) { + MouseCursor _buildCustomCursor(BuildContext context, double scale) { final cursor = Provider.of(context); - final cacheLinux = cursor.cacheLinux; - if (cacheLinux == null) { + final cache = cursor.cache ?? cursor.defaultCache; + if (cache == null) { return MouseCursor.defer; } else { - final key = cacheLinux.updateGetKey(scale); + final key = cache.updateGetKey(scale); cursor.addKey(key); return FlutterCustomMemoryImageCursor( - pixbuf: cacheLinux.data, + pixbuf: cache.data, key: key, - // hotx: cacheLinux.hotx, - // hoty: cacheLinux.hoty, + // hotx: cache.hotx, + // hoty: cache.hoty, hotx: 0, hoty: 0, - imageWidth: (cacheLinux.width * cacheLinux.scale).toInt(), - imageHeight: (cacheLinux.height * cacheLinux.scale).toInt(), + imageWidth: (cache.width * cache.scale).toInt(), + imageHeight: (cache.height * cache.scale).toInt(), ); } } MouseCursor _buildDisabledCursor(BuildContext context, double scale) { final cursor = Provider.of(context); - final cacheLinux = cursor.cacheLinux; - if (cacheLinux == null) { + final cache = cursor.cache; + if (cache == null) { return MouseCursor.defer; } else { if (cursor.cachedForbidmemoryCursorData == null) { @@ -368,8 +368,8 @@ class ImagePaint extends StatelessWidget { return FlutterCustomMemoryImageCursor( pixbuf: cursor.cachedForbidmemoryCursorData, key: key, - hotx: cacheLinux.hotx, - hoty: cacheLinux.hoty, + hotx: 0, + hoty: 0, imageWidth: 32, imageHeight: 32, ); diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 754d62fac..54d77ca95 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -724,6 +724,8 @@ class CursorModel with ChangeNotifier { ui.Image? _image; final _images = >{}; CursorData? _cache; + final _defaultCacheId = -1; + CursorData? _defaultCache; final _cacheMap = {}; final _cacheKeys = {}; double _x = -10000; @@ -736,7 +738,8 @@ class CursorModel with ChangeNotifier { WeakReference parent; ui.Image? get image => _image; - CursorData? get cacheLinux => _cache; + CursorData? get cache => _cache; + CursorData? get defaultCache => _getDefaultCache(); double get x => _x - _displayOriginX; @@ -753,6 +756,29 @@ class CursorModel with ChangeNotifier { Set get cachedKeys => _cacheKeys; addKey(String key) => _cacheKeys.add(key); + CursorData? _getDefaultCache() { + if (_defaultCache == null) { + if (Platform.isWindows) { + Uint8List data = defaultCursorImage!.getBytes(format: img2.Format.bgra); + _hotx = defaultCursorImage!.width / 2; + _hoty = defaultCursorImage!.height / 2; + + _defaultCache = CursorData( + peerId: id, + id: _defaultCacheId, + image: defaultCursorImage?.clone(), + scale: 1.0, + data: data, + hotx: _hotx, + hoty: _hoty, + width: defaultCursorImage!.width, + height: defaultCursorImage!.height, + ); + } + } + return _defaultCache; + } + // remote physical display coordinate Rect getVisibleRect() { final size = MediaQueryData.fromWindow(ui.window).size;