From a658e987b783320310f711de92f995340acae903 Mon Sep 17 00:00:00 2001 From: RustDesk <71636191+rustdesk@users.noreply.github.com> Date: Fri, 19 Jun 2026 12:34:59 +0800 Subject: [PATCH] Revert "Feature: Add monitor-switch buttons to remote toolbars (#15314)" (#15338) This reverts commit 7c8b0adc1ed49038380903f06518f4548c4d0f02. --- flutter/assets/display_switcher.svg | 7 - flutter/lib/consts.dart | 2 - .../desktop/pages/desktop_setting_page.dart | 42 ----- .../lib/desktop/widgets/remote_toolbar.dart | 157 ------------------ 4 files changed, 208 deletions(-) delete mode 100644 flutter/assets/display_switcher.svg diff --git a/flutter/assets/display_switcher.svg b/flutter/assets/display_switcher.svg deleted file mode 100644 index 4f5b4bb58..000000000 --- a/flutter/assets/display_switcher.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index 69f4be59e..8caf6ee11 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -174,8 +174,6 @@ const String kOptionShowVirtualMouse = "show-virtual-mouse"; const String kOptionVirtualMouseScale = "virtual-mouse-scale"; const String kOptionShowVirtualJoystick = "show-virtual-joystick"; const String kOptionAllowAskForNoteAtEndOfConnection = "allow-ask-for-note"; -const String kOptionAllowMonitorSwitchMainToolbar = "allow-monitor-switch-main-toolbar"; -const String kOptionAllowMonitorSwitchMinToolbar = "allow-monitor-switch-min-toolbar"; const String kOptionEnableShowTerminalExtraKeys = "enable-show-terminal-extra-keys"; // network options diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index ef5b75d36..d1d620014 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -407,7 +407,6 @@ class _GeneralState extends State<_General> { final RxBool serviceStop = isWeb ? RxBool(false) : Get.find(tag: 'stop-service'); RxBool serviceBtnEnabled = true.obs; - final GlobalKey _minToolbarOptionKey = GlobalKey(); @override Widget build(BuildContext context) { @@ -606,47 +605,6 @@ class _GeneralState extends State<_General> { }, )); } - children.add(_OptionCheckBox( - context, - 'Show monitor switch button on the main toolbar', - kOptionAllowMonitorSwitchMainToolbar, - isServer: false, - update: (enabled) async { - if (!enabled) { - await mainSetLocalBoolOption( - kOptionAllowMonitorSwitchMinToolbar, false); - } - if (mounted) setState(() {}); - reloadAllWindows(); - if (enabled) { - WidgetsBinding.instance.addPostFrameCallback((_) { - final ctx = _minToolbarOptionKey.currentContext; - if (ctx != null) { - Scrollable.ensureVisible( - ctx, - alignment: 0.5, - duration: const Duration(milliseconds: 250), - curve: Curves.easeInOut, - ); - } - }); - } - }, - )); - if (mainGetLocalBoolOptionSync(kOptionAllowMonitorSwitchMainToolbar)) { - children.add(KeyedSubtree( - key: _minToolbarOptionKey, - child: _OptionCheckBox( - context, - 'Show on the minimized toolbar', - kOptionAllowMonitorSwitchMinToolbar, - isServer: false, - update: (_) { - reloadAllWindows(); - }, - ).marginOnly(left: _kCheckBoxLeftMargin * 3), - )); - } return _Card(title: 'Other', children: children); } diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index da604e424..686120be5 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -779,7 +779,6 @@ class _RemoteToolbarState extends State { borderRadius: borderRadius, child: _DraggableShowHide( id: widget.id, - ffi: widget.ffi, sessionId: widget.ffi.sessionId, dragging: _dragging, fraction: _fraction, @@ -806,16 +805,6 @@ class _RemoteToolbarState extends State { BuildContext context, _ToolbarEdge edge, bool isHorizontal) { final List toolbarItems = []; toolbarItems.add(_PinMenu(state: widget.state)); - toolbarItems.add(Obx(() { - if ((PrivacyModeState.find(widget.id).isEmpty || - allowDisplaySwitchInPrivacyMode(pi)) && - pi.displaysCount.value > 1 && - mainGetLocalBoolOptionSync(kOptionAllowMonitorSwitchMainToolbar)) { - return _MainMonitorSwitchButton(id: widget.id, ffi: widget.ffi); - } else { - return const Offstage(); - } - })); if (!isWebDesktop) { toolbarItems.add(_MobileActionMenu(ffi: widget.ffi)); } @@ -976,80 +965,6 @@ class _MobileActionMenu extends StatelessWidget { } } -class _MonitorCycle { - final String id; - final FFI ffi; - const _MonitorCycle(this.id, this.ffi); - - PeerInfo get _pi => ffi.ffiModel.pi; - int get total => _pi.displays.length; - int get _current => CurrentDisplayState.find(id).value; - bool get _inRange => _current >= 0 && _current < total; - - String get label => _inRange ? '${_current + 1}' : '*'; - String get tooltip => '${translate('Switch display')} ($label/$total)'; - - void next() { - final t = total; - if (t < 2) return; - final from = _inRange ? _current : -1; - openMonitorInTheSameTab((from + 1) % t, ffi, _pi, updateCursorPos: false); - } -} - -class _MainMonitorSwitchButton extends StatelessWidget { - final String id; - final FFI ffi; - - const _MainMonitorSwitchButton({ - Key? key, - required this.id, - required this.ffi, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final cycle = _MonitorCycle(id, ffi); - return Obx(() { - if (cycle.total < 2) return const Offstage(); - final label = cycle.label; - - return _IconMenuButton( - tooltip: cycle.tooltip, - color: _ToolbarTheme.blueColor, - hoverColor: _ToolbarTheme.hoverBlueColor, - onPressed: cycle.next, - icon: SizedBox( - width: _ToolbarTheme.buttonSize, - height: _ToolbarTheme.buttonSize, - child: Stack( - alignment: const Alignment(0, -0.125), - children: [ - SvgPicture.asset( - 'assets/display_switcher.svg', - colorFilter: - const ColorFilter.mode(Colors.white, BlendMode.srcIn), - width: _ToolbarTheme.buttonSize, - height: _ToolbarTheme.buttonSize, - ), - Text( - label, - textAlign: TextAlign.center, - style: const TextStyle( - color: Colors.black, - fontSize: 11, - height: 1, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ); - }); - } -} - class _MonitorMenu extends StatelessWidget { final String id; final FFI ffi; @@ -3056,7 +2971,6 @@ class RdoMenuButton extends StatelessWidget { class _DraggableShowHide extends StatefulWidget { final String id; - final FFI ffi; final SessionID sessionId; final RxDouble fraction; final Rx<_ToolbarEdge> edge; @@ -3080,7 +2994,6 @@ class _DraggableShowHide extends StatefulWidget { const _DraggableShowHide({ Key? key, required this.id, - required this.ffi, required this.sessionId, required this.fraction, required this.edge, @@ -3337,9 +3250,6 @@ class _DraggableShowHideState extends State<_DraggableShowHide> { mainAxisSize: MainAxisSize.min, children: [ _buildDraggable(context), - Obx(() => collapse.isTrue - ? _MinimizedMonitorSwitchButton(id: widget.id, ffi: widget.ffi) - : const Offstage()), Obx(() => buttonWrapper( () { widget.setFullscreen(!isFullscreen.value); @@ -3500,70 +3410,3 @@ class EdgeThicknessControl extends StatelessWidget { return slider; } } - -class _MinimizedMonitorSwitchButton extends StatelessWidget { - final String id; - final FFI ffi; - - const _MinimizedMonitorSwitchButton({ - Key? key, - required this.id, - required this.ffi, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - const double iconSize = 20; - final cycle = _MonitorCycle(id, ffi); - - return Obx(() { - final label = cycle.label; - if (!mainGetLocalBoolOptionSync(kOptionAllowMonitorSwitchMinToolbar)) { - return const Offstage(); - } - if (cycle.total < 2) return const Offstage(); - if (PrivacyModeState.find(id).isNotEmpty && - !allowDisplaySwitchInPrivacyMode(ffi.ffiModel.pi)) { - return const Offstage(); - } - - return Tooltip( - message: cycle.tooltip, - child: TextButton( - onPressed: cycle.next, - style: ButtonStyle( - minimumSize: MaterialStateProperty.all(const Size(0, 0)), - padding: MaterialStateProperty.all(EdgeInsets.zero), - backgroundColor: MaterialStateProperty.resolveWith((states) { - if (states.contains(MaterialState.hovered)) { - return _ToolbarTheme.blueColor.withOpacity(0.15); - } - return null; - }), - ), - child: Stack( - alignment: const Alignment(0, -0.125), - children: [ - SvgPicture.asset( - 'assets/display_switcher.svg', - colorFilter: - ColorFilter.mode(_ToolbarTheme.blueColor, BlendMode.srcIn), - width: iconSize, - height: iconSize, - ), - Text( - label, - style: const TextStyle( - color: Colors.white, - fontSize: 9, - height: 1, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ); - }); - } -}