diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 3757d96e6..01229ab2b 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -280,10 +280,12 @@ class ImagePaint extends StatelessWidget { final s = c.scale; mouseRegion({child}) => Obx(() => MouseRegion( - cursor: (cursorOverImage.isTrue && keyboardEnabled.isTrue) - ? (remoteCursorMoved.isTrue - ? SystemMouseCursors.none - : _buildCustomCursorLinux(context, s)) + cursor: cursorOverImage.isTrue + ? keyboardEnabled.isTrue + ? (remoteCursorMoved.isTrue + ? SystemMouseCursors.none + : _buildCustomCursorLinux(context, s)) + : _buildDisabledCursor(context, s) : MouseCursor.defer, onHover: (evt) {}, child: child)); @@ -350,6 +352,28 @@ class ImagePaint extends StatelessWidget { } } + MouseCursor _buildDisabledCursor(BuildContext context, double scale) { + final cursor = Provider.of(context); + final cacheLinux = cursor.cacheLinux; + if (cacheLinux == null) { + return MouseCursor.defer; + } else { + if (cursor.cachedForbidmemoryCursorData == null) { + cursor.updateForbiddenCursorBuffer(); + } + final key = 'disabled_cursor_key'; + cursor.addKeyLinux(key); + return FlutterCustomMemoryImageCursor( + pixbuf: cursor.cachedForbidmemoryCursorData, + key: key, + hotx: cacheLinux.hotx, + hoty: cacheLinux.hoty, + imageWidth: 32, + imageHeight: 32, + ); + } + } + Widget _buildCrossScrollbarFromLayout( BuildContext context, Widget child, Size layoutSize, Size size) { final scrollConfig = CustomMouseWheelScrollConfig( diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 8b4d89461..1fd33bc77 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -79,7 +79,10 @@ class FfiModel with ChangeNotifier { if (k == 'name' || k.isEmpty) return; _permissions[k] = v == 'true'; }); - KeyboardEnabledState.find(id).value = _permissions['keyboard'] != false; + // Only inited at remote page + if (desktopType == DesktopType.remote) { + KeyboardEnabledState.find(id).value = _permissions['keyboard'] != false; + } debugPrint('$_permissions'); notifyListeners(); } @@ -938,6 +941,12 @@ class CursorModel with ChangeNotifier { customCursorController.freeCache(key); } } + + Uint8List? cachedForbidmemoryCursorData; + void updateForbiddenCursorBuffer() { + cachedForbidmemoryCursorData ??= base64Decode( + 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAkZQTFRFAAAA2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4GWAwCAAAAAAAA2B4GAAAAMTExAAAAAAAA2B4G2B4G2B4GAAAAmZmZkZGRAQEBAAAA2B4G2B4G2B4G////oKCgAwMDag8D2B4G2B4G2B4Gra2tBgYGbg8D2B4G2B4Gubm5CQkJTwsCVgwC2B4GxcXFDg4OAAAAAAAA2B4G2B4Gz8/PFBQUAAAAAAAA2B4G2B4G2B4G2B4G2B4G2B4G2B4GDgIA2NjYGxsbAAAAAAAA2B4GFwMB4eHhIyMjAAAAAAAA2B4G6OjoLCwsAAAAAAAA2B4G2B4G2B4G2B4G2B4GCQEA4ODgv7+/iYmJY2NjAgICAAAA9PT0Ojo6AAAAAAAAAAAA+/v7SkpKhYWFr6+vAAAAAAAA8/PzOTk5ERER9fX1KCgoAAAAgYGBKioqAAAAAAAApqamlpaWAAAAAAAAAAAAAAAAAAAAAAAALi4u/v7+GRkZAAAAAAAAAAAAAAAAAAAAfn5+AAAAAAAAV1dXkJCQAAAAAAAAAQEBAAAAAAAAAAAA7Hz6BAAAAMJ0Uk5TAAIWEwEynNz6//fVkCAatP2fDUHs6cDD8d0mPfT5fiEskiIR584A0gejr3AZ+P4plfALf5ZiTL85a4ziD6697fzN3UYE4v/4TwrNHuT///tdRKZh///+1U/ZBv///yjb///eAVL//50Cocv//6oFBbPvpGZCbfT//7cIhv///8INM///zBEcWYSZmO7//////1P////ts/////8vBv//////gv//R/z///QQz9sevP///2waXhNO/+fc//8mev/5gAe2r90MAAAByUlEQVR4nGNggANGJmYWBpyAlY2dg5OTi5uHF6s0H78AJxRwCAphyguLgKRExcQlQLSkFLq8tAwnp6ycPNABjAqKQKNElVDllVU4OVVhVquJA81Q10BRoAkUUYbJa4Edoo0sr6PLqaePLG/AyWlohKTAmJPTBFnelAFoixmSAnNOTgsUeQZLTk4rJAXWnJw2EHlbiDyDPCenHZICe04HFrh+RydnBgYWPU5uJAWinJwucPNd3dw9GDw5Ob2QFHBzcnrD7ffx9fMPCOTkDEINhmC4+3x8Q0LDwlEDIoKTMzIKKg9SEBIdE8sZh6SAJZ6Tkx0qD1YQkpCYlIwclCng0AXLQxSEpKalZyCryATKZwkhKQjJzsnNQ1KQXwBUUVhUXBJYWgZREFJeUVmFpMKlWg+anmqgCkJq6+obkG1pLEBTENLU3NKKrIKhrb2js8u4G6Kgpze0r3/CRAZMAHbkpJDJU6ZMmTqtFbuC6TNmhsyaMnsOFlmwgrnzpsxfELJwEXZ5Bp/FS3yWLlsesmLlKuwKVk9Ys5Zh3foN0zduwq5g85atDAzbpqSGbN9RhV0FGOzctWH3lD14FOzdt3H/gQw8Cg4u2gQPAwBYDXXdIH+wqAAAAABJRU5ErkJggg=='); + } } class QualityMonitorData {