diff --git a/flutter/lib/common/widgets/setting_widgets.dart b/flutter/lib/common/widgets/setting_widgets.dart index a970fca57..7b7aab4d4 100644 --- a/flutter/lib/common/widgets/setting_widgets.dart +++ b/flutter/lib/common/widgets/setting_widgets.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/consts.dart'; +import 'package:flutter_hbb/models/desktop_render_texture.dart'; import 'package:flutter_hbb/models/platform_model.dart'; import 'package:get/get.dart'; @@ -204,3 +205,35 @@ List ServerConfigImportExportWidgets( icon: Icon(Icons.copy, color: Colors.grey), onPressed: export)) ]; } + +List<(String, String)> otherDefaultSettings() { + List<(String, String)> v = [ + ('View Mode', 'view_only'), + if (isDesktop) ('show_monitors_tip', kKeyShowMonitorsToolbar), + if (isDesktop) ('Collapse toolbar', 'collapse_toolbar'), + ('Show remote cursor', 'show_remote_cursor'), + if (isDesktop) ('Zoom cursor', 'zoom-cursor'), + ('Show quality monitor', 'show_quality_monitor'), + ('Mute', 'disable_audio'), + if (isDesktop) ('Enable file copy and paste', 'enable_file_transfer'), + ('Disable clipboard', 'disable_clipboard'), + ('Lock after session end', 'lock_after_session_end'), + ('Privacy mode', 'privacy_mode'), + if (isMobile) ('Touch mode', 'touch-mode'), + ('True color (4:4:4)', 'i444'), + ('Reverse mouse wheel', 'reverse_mouse_wheel'), + ('swap-left-right-mouse', 'swap-left-right-mouse'), + if (isDesktop && useTextureRender) + ( + 'Show displays as individual windows', + kKeyShowDisplaysAsIndividualWindows + ), + if (isDesktop && useTextureRender) + ( + 'Use all my displays for the remote session', + kKeyUseAllMyDisplaysForTheRemoteSession + ) + ]; + + return v; +} diff --git a/flutter/lib/common/widgets/toolbar.dart b/flutter/lib/common/widgets/toolbar.dart index 3ea8e5371..8bd7cd53e 100644 --- a/flutter/lib/common/widgets/toolbar.dart +++ b/flutter/lib/common/widgets/toolbar.dart @@ -623,26 +623,52 @@ List toolbarKeyboardToggles(FFI ffi) { final option = 'allow_swap_key'; final value = bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); + onChanged(bool? value) { + if (value == null) return; + bind.sessionToggleOption(sessionId: sessionId, value: option); + } + + final enabled = !ffi.ffiModel.viewOnly; v.add(TToggleMenu( value: value, - onChanged: (value) { - if (value == null) return; - bind.sessionToggleOption(sessionId: sessionId, value: option); - }, + onChanged: enabled ? onChanged : null, child: Text(translate('Swap control-command key')))); } + // reverse mouse wheel + if (ffiModel.keyboard) { + var optionValue = + bind.sessionGetReverseMouseWheelSync(sessionId: sessionId) ?? ''; + if (optionValue == '') { + optionValue = bind.mainGetUserDefaultOption(key: 'reverse_mouse_wheel'); + } + onChanged(bool? value) async { + if (value == null) return; + await bind.sessionSetReverseMouseWheel( + sessionId: sessionId, value: value ? 'Y' : 'N'); + } + + final enabled = !ffi.ffiModel.viewOnly; + v.add(TToggleMenu( + value: optionValue == 'Y', + onChanged: enabled ? onChanged : null, + child: Text(translate('Reverse mouse wheel')))); + } + // swap left right mouse - if (!isMobile && ffiModel.keyboard) { + if (ffiModel.keyboard) { final option = 'swap-left-right-mouse'; final value = bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); + onChanged(bool? value) { + if (value == null) return; + bind.sessionToggleOption(sessionId: sessionId, value: option); + } + + final enabled = !ffi.ffiModel.viewOnly; v.add(TToggleMenu( value: value, - onChanged: (value) { - if (value == null) return; - bind.sessionToggleOption(sessionId: sessionId, value: option); - }, + onChanged: enabled ? onChanged : null, child: Text(translate('swap-left-right-mouse')))); } return v; diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 29a8b3b31..939741d7a 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -1059,8 +1059,7 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin { // Simple temp wrapper for PR check tmpWrapper() { // Setting page is not modal, oldOptions should only be used when getting options, never when setting. - Map oldOptions = - jsonDecode(bind.mainGetOptionsSync()); + Map oldOptions = jsonDecode(bind.mainGetOptionsSync()); old(String key) { return (oldOptions[key] ?? '').trim(); } @@ -1348,28 +1347,8 @@ class _DisplayState extends State<_Display> { } Widget other(BuildContext context) { - final children = [ - otherRow('View Mode', 'view_only'), - otherRow('show_monitors_tip', kKeyShowMonitorsToolbar), - otherRow('Collapse toolbar', 'collapse_toolbar'), - otherRow('Show remote cursor', 'show_remote_cursor'), - otherRow('Zoom cursor', 'zoom-cursor'), - otherRow('Show quality monitor', 'show_quality_monitor'), - otherRow('Mute', 'disable_audio'), - otherRow('Enable file copy and paste', 'enable_file_transfer'), - otherRow('Disable clipboard', 'disable_clipboard'), - otherRow('Lock after session end', 'lock_after_session_end'), - otherRow('Privacy mode', 'privacy_mode'), - otherRow('Reverse mouse wheel', 'reverse_mouse_wheel'), - otherRow('True color (4:4:4)', 'i444'), - otherRow('swap-left-right-mouse', 'swap-left-right-mouse'), - ]; - if (useTextureRender) { - children.add(otherRow('Show displays as individual windows', - kKeyShowDisplaysAsIndividualWindows)); - children.add(otherRow('Use all my displays for the remote session', - kKeyUseAllMyDisplaysForTheRemoteSession)); - } + final children = + otherDefaultSettings().map((e) => otherRow(e.$1, e.$2)).toList(); return _Card(title: 'Other Default Options', children: children); } } diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index 208fafc5f..fe917278f 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -1613,7 +1613,6 @@ class _KeyboardMenu extends StatelessWidget { Divider(), viewMode(), Divider(), - reverseMouseWheel(), ...toolbarToggles, ]); } @@ -1738,30 +1737,6 @@ class _KeyboardMenu extends StatelessWidget { ffi: ffi, child: Text(translate('View Mode'))); } - - reverseMouseWheel() { - return futureBuilder(future: () async { - final v = - await bind.sessionGetReverseMouseWheel(sessionId: ffi.sessionId); - if (v != null && v != '') { - return v; - } - return bind.mainGetUserDefaultOption(key: 'reverse_mouse_wheel'); - }(), hasData: (data) { - final enabled = !ffi.ffiModel.viewOnly; - onChanged(bool? value) async { - if (value == null) return; - await bind.sessionSetReverseMouseWheel( - sessionId: ffi.sessionId, value: value ? 'Y' : 'N'); - } - - return CkbMenuButton( - value: data == 'Y', - onChanged: enabled ? onChanged : null, - child: Text(translate('Reverse mouse wheel')), - ffi: ffi); - }); - } } class _ChatMenu extends StatefulWidget { diff --git a/flutter/lib/mobile/pages/settings_page.dart b/flutter/lib/mobile/pages/settings_page.dart index 0aa417437..644ebeef0 100644 --- a/flutter/lib/mobile/pages/settings_page.dart +++ b/flutter/lib/mobile/pages/settings_page.dart @@ -789,23 +789,14 @@ class __DisplayPageState extends State<_DisplayPage> { ), SettingsSection( title: Text(translate('Other Default Options')), - tiles: [ - otherRow('Show remote cursor', 'show_remote_cursor'), - otherRow('Show quality monitor', 'show_quality_monitor'), - otherRow('Mute', 'disable_audio'), - otherRow('Disable clipboard', 'disable_clipboard'), - otherRow('Lock after session end', 'lock_after_session_end'), - otherRow('Privacy mode', 'privacy_mode'), - otherRow('Touch mode', 'touch-mode'), - otherRow('True color (4:4:4)', 'i444'), - otherRow('swap-left-right-mouse', 'swap-left-right-mouse'), - ], + tiles: + otherDefaultSettings().map((e) => otherRow(e.$1, e.$2)).toList(), ), ]), ); } - otherRow(String label, String key) { + SettingsTile otherRow(String label, String key) { final value = bind.mainGetUserDefaultOption(key: key) == 'Y'; return SettingsTile.switchTile( initialValue: value, diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index b094e230c..1edac42ca 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -1214,26 +1214,19 @@ impl PeerConfig { } fn insert_default_options(mp: &mut HashMap) { - let mut key = "codec-preference"; - if !mp.contains_key(key) { - mp.insert(key.to_owned(), UserDefaultConfig::read().get(key)); - } - key = "custom-fps"; - if !mp.contains_key(key) { - mp.insert(key.to_owned(), UserDefaultConfig::read().get(key)); - } - key = "zoom-cursor"; - if !mp.contains_key(key) { - mp.insert(key.to_owned(), UserDefaultConfig::read().get(key)); - } - key = "touch-mode"; - if !mp.contains_key(key) { - mp.insert(key.to_owned(), UserDefaultConfig::read().get(key)); - } - key = "i444"; - if !mp.contains_key(key) { - mp.insert(key.to_owned(), UserDefaultConfig::read().get(key)); - } + [ + "codec-preference", + "custom-fps", + "zoom-cursor", + "touch-mode", + "i444", + "swap-left-right-mouse", + ] + .map(|key| { + if !mp.contains_key(key) { + mp.insert(key.to_owned(), UserDefaultConfig::read().get(key)); + } + }); } } diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 56000419e..f5791f085 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -340,12 +340,13 @@ pub fn session_set_keyboard_mode(session_id: SessionID, value: String) { } } -pub fn session_get_reverse_mouse_wheel(session_id: SessionID) -> Option { - if let Some(session) = sessions::get_session_by_session_id(&session_id) { +pub fn session_get_reverse_mouse_wheel_sync(session_id: SessionID) -> SyncReturn> { + let res = if let Some(session) = sessions::get_session_by_session_id(&session_id) { Some(session.get_reverse_mouse_wheel()) } else { None - } + }; + SyncReturn(res) } pub fn session_set_reverse_mouse_wheel(session_id: SessionID, value: String) {