diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index e3339c1ec..ccd8fbaac 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -11,6 +11,10 @@ const int kMainWindowId = 0; const kAllDisplayValue = -1; +const kKeyLegacyMode = 'legacy'; +const kKeyMapMode = 'map'; +const kKeyTranslateMode = 'translate'; + const String kPeerPlatformWindows = "Windows"; const String kPeerPlatformLinux = "Linux"; const String kPeerPlatformMacOS = "Mac OS"; diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index 1cfa36145..1f161ec42 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -26,10 +26,6 @@ import '../../common/shared_state.dart'; import './popup_menu.dart'; import './kb_layout_type_chooser.dart'; -const _kKeyLegacyMode = 'legacy'; -const _kKeyMapMode = 'map'; -const _kKeyTranslateMode = 'translate'; - class ToolbarState { final kStoreKey = 'remoteMenubarState'; late RxBool show; @@ -1406,18 +1402,16 @@ class _KeyboardMenu extends StatelessWidget { Widget build(BuildContext context) { var ffiModel = Provider.of(context); if (!ffiModel.keyboard) return Offstage(); + // If use flutter to grab keys, we can only use one mode. + // Map mode and Legacy mode, at least one of them is supported. String? modeOnly; if (stateGlobal.grabKeyboard) { if (bind.sessionIsKeyboardModeSupported( - sessionId: ffi.sessionId, mode: _kKeyMapMode)) { - bind.sessionSetKeyboardMode( - sessionId: ffi.sessionId, value: _kKeyMapMode); - modeOnly = _kKeyMapMode; + sessionId: ffi.sessionId, mode: kKeyMapMode)) { + modeOnly = kKeyMapMode; } else if (bind.sessionIsKeyboardModeSupported( - sessionId: ffi.sessionId, mode: _kKeyLegacyMode)) { - bind.sessionSetKeyboardMode( - sessionId: ffi.sessionId, value: _kKeyLegacyMode); - modeOnly = _kKeyLegacyMode; + sessionId: ffi.sessionId, mode: kKeyLegacyMode)) { + modeOnly = kKeyLegacyMode; } } return _IconSubmenuButton( @@ -1439,13 +1433,13 @@ class _KeyboardMenu extends StatelessWidget { keyboardMode(String? modeOnly) { return futureBuilder(future: () async { return await bind.sessionGetKeyboardMode(sessionId: ffi.sessionId) ?? - _kKeyLegacyMode; + kKeyLegacyMode; }(), hasData: (data) { final groupValue = data as String; List modes = [ - InputModeMenu(key: _kKeyLegacyMode, menu: 'Legacy mode'), - InputModeMenu(key: _kKeyMapMode, menu: 'Map mode'), - InputModeMenu(key: _kKeyTranslateMode, menu: 'Translate mode'), + InputModeMenu(key: kKeyLegacyMode, menu: 'Legacy mode'), + InputModeMenu(key: kKeyMapMode, menu: 'Map mode'), + InputModeMenu(key: kKeyTranslateMode, menu: 'Translate mode'), ]; List list = []; final enabled = !ffi.ffiModel.viewOnly; @@ -1463,12 +1457,12 @@ class _KeyboardMenu extends StatelessWidget { continue; } - if (pi.isWayland && mode.key != _kKeyMapMode) { + if (pi.isWayland && mode.key != kKeyMapMode) { continue; } var text = translate(mode.menu); - if (mode.key == _kKeyTranslateMode) { + if (mode.key == kKeyTranslateMode) { text = '$text beta'; } list.add(RdoMenuButton( diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 0d257eaf0..c8675dfa7 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -703,6 +703,10 @@ class FfiModel with ChangeNotifier { _pi.isSet.value = true; stateGlobal.resetLastResolutionGroupValues(peerId); + if (isDesktop) { + checkDesktopKeyboardMode(); + } + notifyListeners(); if (!isCache) { @@ -710,6 +714,36 @@ class FfiModel with ChangeNotifier { } } + checkDesktopKeyboardMode() async { + final curMode = await bind.sessionGetKeyboardMode(sessionId: sessionId); + if (curMode != null) { + if (bind.sessionIsKeyboardModeSupported( + sessionId: sessionId, mode: curMode)) { + return; + } + } + + // If current keyboard mode is not supported, change to another one. + + if (stateGlobal.grabKeyboard) { + for (final mode in [kKeyMapMode, kKeyLegacyMode]) { + if (bind.sessionIsKeyboardModeSupported( + sessionId: sessionId, mode: mode)) { + bind.sessionSetKeyboardMode(sessionId: sessionId, value: mode); + break; + } + } + } else { + for (final mode in [kKeyMapMode, kKeyTranslateMode, kKeyLegacyMode]) { + if (bind.sessionIsKeyboardModeSupported( + sessionId: sessionId, mode: mode)) { + bind.sessionSetKeyboardMode(sessionId: sessionId, value: mode); + break; + } + } + } + } + tryUseAllMyDisplaysForTheRemoteSession(String peerId) async { if (bind.sessionGetUseAllMyDisplaysForTheRemoteSession( sessionId: sessionId) !=