From 8b8cfa7a1be34926cdab636410a4a8b09227fe5c Mon Sep 17 00:00:00 2001 From: Mr-Update <37781396+Mr-Update@users.noreply.github.com> Date: Fri, 8 Sep 2023 21:29:45 +0200 Subject: [PATCH 01/90] Update de.rs --- src/lang/de.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lang/de.rs b/src/lang/de.rs index 154805fbc..8dcf672c5 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -193,7 +193,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Logging in...", "Anmelden …"), ("Enable RDP session sharing", "RDP-Sitzungsfreigabe aktivieren"), ("Auto Login", "Automatisch anmelden (nur gültig, wenn Sie \"Nach Sitzungsende sperren\" aktiviert haben)"), - ("Enable Direct IP Access", "Direkten IP-Zugang aktivieren"), + ("Enable Direct IP Access", "Direkten IP-Zugriff aktivieren"), ("Rename", "Umbenennen"), ("Space", "Speicherplatz"), ("Create Desktop Shortcut", "Desktop-Verknüpfung erstellen"), @@ -427,7 +427,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Elevation Error", "Berechtigungsfehler"), ("Ask the remote user for authentication", "Den entfernten Benutzer zur Authentifizierung auffordern"), ("Choose this if the remote account is administrator", "Wählen Sie dies, wenn das entfernte Konto Administrator ist."), - ("Transmit the username and password of administrator", "Übermitteln Sie den Benutzernamen und das Passwort des Administrators"), + ("Transmit the username and password of administrator", "Benutzernamen und Passwort des Administrators übertragen"), ("still_click_uac_tip", "Der entfernte Benutzer muss immer noch im UAC-Fenster von RustDesk auf \"Ja\" klicken."), ("Request Elevation", "Erhöhte Rechte anfordern"), ("wait_accept_uac_tip", "Bitte warten Sie, bis der entfernte Benutzer den UAC-Dialog akzeptiert hat."), @@ -541,7 +541,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Change Color", "Farbe ändern"), ("Primary Color", "Primärfarbe"), ("HSV Color", "HSV-Farbe"), - ("Installation Successful!", ""), - ("Installation failed!", ""), + ("Installation Successful!", "Installation erfolgreich!"), + ("Installation failed!", "Installation fehlgeschlagen!"), ].iter().cloned().collect(); } From eb0a0662a32de3f10284de454e3fc3f7058276be Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 10 Sep 2023 14:14:57 +0800 Subject: [PATCH 02/90] feat, mouse wheel and touchpad scroll mode, default or reverse Signed-off-by: fufesou --- flutter/lib/consts.dart | 5 + .../desktop/pages/desktop_setting_page.dart | 46 ++++++ .../lib/desktop/widgets/remote_toolbar.dart | 146 +++++++++++------- libs/hbb_common/src/config.rs | 15 ++ src/client.rs | 11 ++ src/flutter_ffi.rs | 16 +- src/ui_session_interface.rs | 36 ++++- 7 files changed, 217 insertions(+), 58 deletions(-) diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index 7fcc7b3a7..24a9b3fad 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -138,6 +138,11 @@ const kRemoteScrollStyleAuto = 'scrollauto'; /// [kRemoteScrollStyleBar] Scroll image with scroll bar. const kRemoteScrollStyleBar = 'scrollbar'; +/// [kScrollModeDefault] Mouse or touchpad, the default scroll mode. +const kScrollModeDefault = 'default'; +/// [kScrollModeReverse] Mouse or touchpad, the reverse scroll mode. +const kScrollModeReverse = 'reverse'; + /// [kRemoteImageQualityBest] Best image quality. const kRemoteImageQualityBest = 'best'; diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 3a33c7e5b..38b2d3c57 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -105,6 +105,7 @@ class _DesktopSettingPageState extends State _TabInfo('Network', Icons.link_outlined, Icons.link), _TabInfo( 'Display', Icons.desktop_windows_outlined, Icons.desktop_windows), + _TabInfo('Input', Icons.keyboard_outlined, Icons.keyboard), _TabInfo('Account', Icons.person_outline, Icons.person), _TabInfo('About', Icons.info_outline, Icons.info) ]; @@ -121,6 +122,7 @@ class _DesktopSettingPageState extends State _Safety(), _Network(), _Display(), + _Input(), _Account(), _About(), ]; @@ -1220,6 +1222,50 @@ class _DisplayState extends State<_Display> { } } +class _Input extends StatefulWidget { + const _Input({Key? key}) : super(key: key); + + @override + State<_Input> createState() => _InputState(); +} + +class _InputState extends State<_Input> { + @override + Widget build(BuildContext context) { + final scrollController = ScrollController(); + return DesktopScrollWrapper( + scrollController: scrollController, + child: ListView( + controller: scrollController, + physics: DraggableNeverScrollableScrollPhysics(), + children: [ + scrollMode(context), + ]).marginOnly(bottom: _kListViewBottomMargin)); + } + + Widget scrollMode(BuildContext context) { + final key = 'scroll_mode'; + onChanged(String value) async { + await bind.mainSetUserDefaultOption(key: key, value: value); + setState(() {}); + } + + final groupValue = bind.mainGetUserDefaultOption(key: key); + return _Card(title: 'Default Scroll Mode', children: [ + _Radio(context, + value: kScrollModeDefault, + groupValue: groupValue, + label: 'Default scroll', + onChanged: onChanged), + _Radio(context, + value: kScrollModeReverse, + groupValue: groupValue, + label: 'Reverse scroll', + onChanged: onChanged), + ]); + } +} + class _Account extends StatefulWidget { const _Account({Key? key}) : super(key: key); diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index b59ae3736..a6aa1fd01 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -101,7 +101,7 @@ class ToolbarState { class _ToolbarTheme { static const Color blueColor = MyTheme.button; static const Color hoverBlueColor = MyTheme.accent; - static Color inactiveColor = Colors.grey[800]!; + static Color inactiveColor = Colors.grey[800]!; static Color hoverInactiveColor = Colors.grey[850]!; static const Color redColor = Colors.redAccent; @@ -546,9 +546,11 @@ class _PinMenu extends StatelessWidget { assetName: state.pin ? "assets/pinned.svg" : "assets/unpinned.svg", tooltip: state.pin ? 'Unpin Toolbar' : 'Pin Toolbar', onPressed: state.switchPin, - color: state.pin ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, - hoverColor: - state.pin ? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor, + color: + state.pin ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, + hoverColor: state.pin + ? _ToolbarTheme.hoverBlueColor + : _ToolbarTheme.hoverInactiveColor, ), ); } @@ -561,15 +563,18 @@ class _MobileActionMenu extends StatelessWidget { @override Widget build(BuildContext context) { if (!ffi.ffiModel.isPeerAndroid) return Offstage(); - return Obx(()=>_IconMenuButton( - assetName: 'assets/actions_mobile.svg', - tooltip: 'Mobile Actions', - onPressed: () => ffi.dialogManager.toggleMobileActionsOverlay(ffi: ffi), - color: ffi.dialogManager.mobileActionsOverlayVisible.isTrue - ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, - hoverColor: ffi.dialogManager.mobileActionsOverlayVisible.isTrue - ? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor, - )); + return Obx(() => _IconMenuButton( + assetName: 'assets/actions_mobile.svg', + tooltip: 'Mobile Actions', + onPressed: () => + ffi.dialogManager.toggleMobileActionsOverlay(ffi: ffi), + color: ffi.dialogManager.mobileActionsOverlayVisible.isTrue + ? _ToolbarTheme.blueColor + : _ToolbarTheme.inactiveColor, + hoverColor: ffi.dialogManager.mobileActionsOverlayVisible.isTrue + ? _ToolbarTheme.hoverBlueColor + : _ToolbarTheme.hoverInactiveColor, + )); } } @@ -1304,23 +1309,25 @@ class _KeyboardMenu extends StatelessWidget { color: _ToolbarTheme.blueColor, hoverColor: _ToolbarTheme.hoverBlueColor, menuChildren: [ - mode(modeOnly), + keyboardMode(modeOnly), localKeyboardType(), Divider(), - view_mode(), + viewMode(), + Divider(), + scrollMode(), ]); } - mode(String? modeOnly) { + keyboardMode(String? modeOnly) { return futureBuilder(future: () async { return await bind.sessionGetKeyboardMode(sessionId: ffi.sessionId) ?? _kKeyLegacyMode; }(), hasData: (data) { final groupValue = data as String; - List modes = [ - KeyboardModeMenu(key: _kKeyLegacyMode, menu: 'Legacy mode'), - KeyboardModeMenu(key: _kKeyMapMode, menu: 'Map mode'), - KeyboardModeMenu(key: _kKeyTranslateMode, menu: 'Translate mode'), + List modes = [ + 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; @@ -1330,7 +1337,7 @@ class _KeyboardMenu extends StatelessWidget { sessionId: ffi.sessionId, value: value); } - for (KeyboardModeMenu mode in modes) { + for (InputModeMenu mode in modes) { if (modeOnly != null && mode.key != modeOnly) { continue; } else if (!bind.sessionIsKeyboardModeSupported( @@ -1379,7 +1386,7 @@ class _KeyboardMenu extends StatelessWidget { ); } - view_mode() { + viewMode() { final ffiModel = ffi.ffiModel; final enabled = version_cmp(pi.version, '1.2.0') >= 0 && ffiModel.keyboard; return CkbMenuButton( @@ -1395,6 +1402,40 @@ class _KeyboardMenu extends StatelessWidget { ffi: ffi, child: Text(translate('View Mode'))); } + + scrollMode() { + return futureBuilder(future: () async { + final mode = await bind.sessionGetScrollMode(sessionId: ffi.sessionId); + if (mode != null) { + return mode; + } + return bind.mainGetUserDefaultOption(key: 'scroll_mode'); + }(), hasData: (data) { + final groupValue = data as String; + List modes = [ + InputModeMenu(key: kScrollModeDefault, menu: 'Default mode'), + InputModeMenu(key: kScrollModeReverse, menu: 'Reverse mode'), + ]; + List list = []; + final enabled = !ffi.ffiModel.viewOnly; + onChanged(String? value) async { + if (value == null) return; + await bind.sessionSetScrollMode(sessionId: ffi.sessionId, value: value); + } + + for (InputModeMenu mode in modes) { + var text = translate(mode.menu); + list.add(RdoMenuButton( + child: Text(text), + value: mode.key, + groupValue: groupValue, + onChanged: enabled ? onChanged : null, + ffi: ffi, + )); + } + return Column(children: list); + }); + } } class _ChatMenu extends StatefulWidget { @@ -1592,26 +1633,26 @@ class _IconMenuButtonState extends State<_IconMenuButton> { width: _ToolbarTheme.buttonSize, height: _ToolbarTheme.buttonSize, child: MenuItemButton( - style: ButtonStyle( - backgroundColor: MaterialStatePropertyAll(Colors.transparent), - padding: MaterialStatePropertyAll(EdgeInsets.zero), - overlayColor: MaterialStatePropertyAll(Colors.transparent)), - onHover: (value) => setState(() { - hover = value; - }), - onPressed: widget.onPressed, - child: Tooltip( - message: translate(widget.tooltip), - child: Material( - type: MaterialType.transparency, - child: Ink( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(_ToolbarTheme.iconRadius), - color: hover ? widget.hoverColor : widget.color, - ), - child: icon)), - ) - ), + style: ButtonStyle( + backgroundColor: MaterialStatePropertyAll(Colors.transparent), + padding: MaterialStatePropertyAll(EdgeInsets.zero), + overlayColor: MaterialStatePropertyAll(Colors.transparent)), + onHover: (value) => setState(() { + hover = value; + }), + onPressed: widget.onPressed, + child: Tooltip( + message: translate(widget.tooltip), + child: Material( + type: MaterialType.transparency, + child: Ink( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(_ToolbarTheme.iconRadius), + color: hover ? widget.hoverColor : widget.color, + ), + child: icon)), + )), ).marginSymmetric( horizontal: widget.hMargin ?? _ToolbarTheme.buttonHMargin, vertical: widget.vMargin ?? _ToolbarTheme.buttonVMargin); @@ -1675,18 +1716,17 @@ class _IconSubmenuButtonState extends State<_IconSubmenuButton> { onHover: (value) => setState(() { hover = value; }), - child: Tooltip( - message: translate(widget.tooltip), - child: Material( + child: Tooltip( + message: translate(widget.tooltip), + child: Material( type: MaterialType.transparency, child: Ink( - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(_ToolbarTheme.iconRadius), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(_ToolbarTheme.iconRadius), color: hover ? widget.hoverColor : widget.color, - ), - child: icon)) - ), + ), + child: icon))), menuChildren: widget.menuChildren .map((e) => _buildPointerTrackWidget(e, widget.ffi)) .toList())); @@ -1973,11 +2013,11 @@ class _DraggableShowHideState extends State<_DraggableShowHide> { } } -class KeyboardModeMenu { +class InputModeMenu { final String key; final String menu; - KeyboardModeMenu({required this.key, required this.menu}); + InputModeMenu({required this.key, required this.menu}); } _menuDismissCallback(FFI ffi) => ffi.inputModel.refreshMousePos(); diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index a48da5ff0..4d89d06cd 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -230,6 +230,7 @@ pub struct PeerConfig { skip_serializing_if = "String::is_empty" )] pub view_style: String, + // Image scroll style, scrollbar or scroll auto #[serde( default = "PeerConfig::default_scroll_style", deserialize_with = "PeerConfig::deserialize_scroll_style", @@ -276,6 +277,13 @@ pub struct PeerConfig { pub keyboard_mode: String, #[serde(flatten)] pub view_only: ViewOnly, + // Mouse wheel or touchpad scroll mode, default or reverse + #[serde( + default = "PeerConfig::default_scroll_mode", + deserialize_with = "PeerConfig::deserialize_scroll_mode", + skip_serializing_if = "String::is_empty" + )] + pub scroll_mode: String, #[serde( default, @@ -319,6 +327,7 @@ impl Default for PeerConfig { show_quality_monitor: Default::default(), keyboard_mode: Default::default(), view_only: Default::default(), + scroll_mode: Self::default_scroll_mode(), custom_resolutions: Default::default(), options: Self::default_options(), ui_flutter: Default::default(), @@ -1130,6 +1139,11 @@ impl PeerConfig { deserialize_image_quality, UserDefaultConfig::read().get("image_quality") ); + serde_field_string!( + default_scroll_mode, + deserialize_scroll_mode, + UserDefaultConfig::read().get("scroll_mode") + ); fn default_custom_image_quality() -> Vec { let f: f64 = UserDefaultConfig::read() @@ -1474,6 +1488,7 @@ impl UserDefaultConfig { } "custom_image_quality" => self.get_double_string(key, 50.0, 10.0, 0xFFF as f64), "custom-fps" => self.get_double_string(key, 30.0, 5.0, 120.0), + "scroll_mode" => self.get_string(key, "default", vec!["reverse"]), _ => self .options .get(key) diff --git a/src/client.rs b/src/client.rs index 0bfcfb655..f23a2c512 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1195,6 +1195,17 @@ impl LoginConfigHandler { self.save_config(config); } + /// Save mouse scroll mode("default", "reverse") to the current config. + /// + /// # Arguments + /// + /// * `value` - The view style to be saved. + pub fn save_scroll_mode(&mut self, value: String) { + let mut config = self.load_config(); + config.scroll_mode = value; + self.save_config(config); + } + /// Save scroll style to the current config. /// /// # Arguments diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index eaf273d2e..05dcf0343 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -21,8 +21,6 @@ use hbb_common::{ }; use std::{ collections::HashMap, - ffi::{CStr, CString}, - os::raw::c_char, str::FromStr, sync::{ atomic::{AtomicI32, Ordering}, @@ -302,6 +300,20 @@ pub fn session_set_keyboard_mode(session_id: SessionID, value: String) { } } +pub fn session_get_scroll_mode(session_id: SessionID) -> Option { + if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { + Some(session.get_scroll_mode()) + } else { + None + } +} + +pub fn session_set_scroll_mode(session_id: SessionID, value: String) { + if let Some(session) = SESSIONS.write().unwrap().get_mut(&session_id) { + session.save_scroll_mode(value); + } +} + pub fn session_get_custom_image_quality(session_id: SessionID) -> Option> { if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { Some(session.get_custom_image_quality()) diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index a8304b5d0..c416b95d9 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -1,4 +1,4 @@ -use crate::input::{MOUSE_BUTTON_LEFT, MOUSE_TYPE_DOWN, MOUSE_TYPE_UP}; +use crate::input::{MOUSE_BUTTON_LEFT, MOUSE_TYPE_DOWN, MOUSE_TYPE_UP, MOUSE_TYPE_WHEEL}; #[cfg(not(any(target_os = "android", target_os = "ios")))] use std::{collections::HashMap, sync::atomic::AtomicBool}; use std::{ @@ -175,6 +175,14 @@ impl Session { self.lc.write().unwrap().save_keyboard_mode(value); } + pub fn get_scroll_mode(&self) -> String { + self.lc.read().unwrap().scroll_mode.clone() + } + + pub fn save_scroll_mode(&mut self, value: String) { + self.lc.write().unwrap().save_scroll_mode(value); + } + pub fn save_view_style(&mut self, value: String) { self.lc.write().unwrap().save_view_style(value); } @@ -730,6 +738,7 @@ impl Session { }); } "pan_update" => { + let (x, y) = self.get_scroll_xy((x, y)); touch_evt.set_pan_update(TouchPanUpdate { x, y, @@ -753,11 +762,26 @@ impl Session { send_pointer_device_event(evt, alt, ctrl, shift, command, self); } + #[inline] + #[cfg(not(any(target_os = "android", target_os = "ios")))] + fn is_scroll_reverse_mode(&self) -> bool { + self.lc.read().unwrap().scroll_mode.eq("reverse") + } + + #[inline] + fn get_scroll_xy(&self, xy: (i32, i32)) -> (i32, i32) { + #[cfg(not(any(target_os = "android", target_os = "ios")))] + if self.is_scroll_reverse_mode() { + return (-xy.0, -xy.1); + } + xy + } + pub fn send_mouse( &self, mask: i32, - x: i32, - y: i32, + mut x: i32, + mut y: i32, alt: bool, ctrl: bool, shift: bool, @@ -772,6 +796,12 @@ impl Session { } } + let (x, y) = if mask == MOUSE_TYPE_WHEEL { + self.get_scroll_xy((x, y)) + } else { + (x, y) + }; + // #[cfg(not(any(target_os = "android", target_os = "ios")))] let (alt, ctrl, shift, command) = keyboard::client::get_modifiers_state(alt, ctrl, shift, command); From 28d8ad1e616428350b85f1fbc0020e34c6adabc2 Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 10 Sep 2023 14:23:22 +0800 Subject: [PATCH 03/90] add lang Signed-off-by: fufesou --- flutter/lib/desktop/pages/desktop_setting_page.dart | 4 ++-- src/lang/ar.rs | 4 ++++ src/lang/ca.rs | 4 ++++ src/lang/cn.rs | 4 ++++ src/lang/cs.rs | 4 ++++ src/lang/da.rs | 4 ++++ src/lang/de.rs | 4 ++++ src/lang/el.rs | 4 ++++ src/lang/eo.rs | 4 ++++ src/lang/es.rs | 4 ++++ src/lang/fa.rs | 4 ++++ src/lang/fr.rs | 4 ++++ src/lang/hu.rs | 4 ++++ src/lang/id.rs | 4 ++++ src/lang/it.rs | 4 ++++ src/lang/ja.rs | 4 ++++ src/lang/ko.rs | 4 ++++ src/lang/kz.rs | 4 ++++ src/lang/lt.rs | 4 ++++ src/lang/nl.rs | 4 ++++ src/lang/pl.rs | 4 ++++ src/lang/pt_PT.rs | 4 ++++ src/lang/ptbr.rs | 4 ++++ src/lang/ro.rs | 4 ++++ src/lang/ru.rs | 4 ++++ src/lang/sk.rs | 4 ++++ src/lang/sl.rs | 4 ++++ src/lang/sq.rs | 4 ++++ src/lang/sr.rs | 4 ++++ src/lang/sv.rs | 4 ++++ src/lang/template.rs | 4 ++++ src/lang/th.rs | 4 ++++ src/lang/tr.rs | 4 ++++ src/lang/tw.rs | 4 ++++ src/lang/ua.rs | 4 ++++ src/lang/vn.rs | 4 ++++ 36 files changed, 142 insertions(+), 2 deletions(-) diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 38b2d3c57..3b0332552 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -1255,12 +1255,12 @@ class _InputState extends State<_Input> { _Radio(context, value: kScrollModeDefault, groupValue: groupValue, - label: 'Default scroll', + label: 'Default mode', onChanged: onChanged), _Radio(context, value: kScrollModeReverse, groupValue: groupValue, - label: 'Reverse scroll', + label: 'Reverse mode', onChanged: onChanged), ]); } diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 0d9bdacd3..a1ba011ea 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 1ec5d78f3..27925a847 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 8e07a2965..1367b290a 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV 色"), ("Installation Successful!", "安装成功!"), ("Installation failed!", "安装失败!"), + ("Input", "输入"), + ("Default Scroll Mode", "默认滚动模式"), + ("Default mode", "默认模式"), + ("Reverse mode", "反向模式"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 5dd4dc9a3..0ef2dc12d 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 999875df2..7e4dd064f 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 8dcf672c5..e292ea0c0 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV-Farbe"), ("Installation Successful!", "Installation erfolgreich!"), ("Installation failed!", "Installation fehlgeschlagen!"), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index 4e7a83017..a2eec30b1 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 7cb5a1b2a..9374b652c 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index b1fc57954..d859cae31 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Color HSV"), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 1284ec985..a276ae718 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index fea4f7ffa..a126e1582 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Couleur TSL"), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index a9089de35..3dcba4992 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 27676a420..06fa9584a 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Warna HSV"), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 07234b3f4..0c1524109 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Colore HSV"), ("Installation Successful!", "Installazione completata"), ("Installation failed!", "Installazione fallita"), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index e6ef75815..b75af8315 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 6f26674c5..af849fc02 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index b68caad51..c4199b2ac 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 41caa606f..f9c9cd7ec 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 6010a4132..e625fbd6a 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV Kleur"), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index fe0693595..c17af1ce0 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index d0ade1088..cb57a1766 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 6dfc8f2a2..a0284535f 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index 01e0402a9..291489494 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index 2f86351cb..17ff0ae5e 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Цвет HSV"), ("Installation Successful!", "Установка выполнена успешно!"), ("Installation failed!", "Установка не выполнена!"), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 615dd08f4..e0386ee3c 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index a05b5f4c0..1ace96c0b 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index cfc2fda74..c6fca4d57 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 85bb6f488..9a3407ec7 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 90f543617..4333f78ce 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 7f58b4452..8b9bf3a91 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index 94251c5b2..220250d9b 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 57a337b1a..e05fecc21 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV Rengi"), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 49d1c08cf..69c5c4d21 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV 色"), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index b398afab5..54585793b 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index a6a4478e7..17e8a48f3 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -543,5 +543,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), + ("Input", ""), + ("Default Scroll Mode", ""), + ("Default mode", ""), + ("Reverse mode", ""), ].iter().cloned().collect(); } From 0c1899a0aff69c39c28350d8c376e3455fea2a95 Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 10 Sep 2023 14:25:41 +0800 Subject: [PATCH 04/90] format Signed-off-by: fufesou --- .../lib/desktop/widgets/remote_toolbar.dart | 69 +++++++++---------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index a6aa1fd01..63085d524 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -546,11 +546,9 @@ class _PinMenu extends StatelessWidget { assetName: state.pin ? "assets/pinned.svg" : "assets/unpinned.svg", tooltip: state.pin ? 'Unpin Toolbar' : 'Pin Toolbar', onPressed: state.switchPin, - color: - state.pin ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, - hoverColor: state.pin - ? _ToolbarTheme.hoverBlueColor - : _ToolbarTheme.hoverInactiveColor, + color: state.pin ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, + hoverColor: + state.pin ? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor, ), ); } @@ -563,18 +561,15 @@ class _MobileActionMenu extends StatelessWidget { @override Widget build(BuildContext context) { if (!ffi.ffiModel.isPeerAndroid) return Offstage(); - return Obx(() => _IconMenuButton( - assetName: 'assets/actions_mobile.svg', - tooltip: 'Mobile Actions', - onPressed: () => - ffi.dialogManager.toggleMobileActionsOverlay(ffi: ffi), - color: ffi.dialogManager.mobileActionsOverlayVisible.isTrue - ? _ToolbarTheme.blueColor - : _ToolbarTheme.inactiveColor, - hoverColor: ffi.dialogManager.mobileActionsOverlayVisible.isTrue - ? _ToolbarTheme.hoverBlueColor - : _ToolbarTheme.hoverInactiveColor, - )); + return Obx(()=>_IconMenuButton( + assetName: 'assets/actions_mobile.svg', + tooltip: 'Mobile Actions', + onPressed: () => ffi.dialogManager.toggleMobileActionsOverlay(ffi: ffi), + color: ffi.dialogManager.mobileActionsOverlayVisible.isTrue + ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, + hoverColor: ffi.dialogManager.mobileActionsOverlayVisible.isTrue + ? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor, + )); } } @@ -1633,26 +1628,26 @@ class _IconMenuButtonState extends State<_IconMenuButton> { width: _ToolbarTheme.buttonSize, height: _ToolbarTheme.buttonSize, child: MenuItemButton( - style: ButtonStyle( - backgroundColor: MaterialStatePropertyAll(Colors.transparent), - padding: MaterialStatePropertyAll(EdgeInsets.zero), - overlayColor: MaterialStatePropertyAll(Colors.transparent)), - onHover: (value) => setState(() { - hover = value; - }), - onPressed: widget.onPressed, - child: Tooltip( - message: translate(widget.tooltip), - child: Material( - type: MaterialType.transparency, - child: Ink( - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(_ToolbarTheme.iconRadius), - color: hover ? widget.hoverColor : widget.color, - ), - child: icon)), - )), + style: ButtonStyle( + backgroundColor: MaterialStatePropertyAll(Colors.transparent), + padding: MaterialStatePropertyAll(EdgeInsets.zero), + overlayColor: MaterialStatePropertyAll(Colors.transparent)), + onHover: (value) => setState(() { + hover = value; + }), + onPressed: widget.onPressed, + child: Tooltip( + message: translate(widget.tooltip), + child: Material( + type: MaterialType.transparency, + child: Ink( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(_ToolbarTheme.iconRadius), + color: hover ? widget.hoverColor : widget.color, + ), + child: icon)), + ) + ), ).marginSymmetric( horizontal: widget.hMargin ?? _ToolbarTheme.buttonHMargin, vertical: widget.vMargin ?? _ToolbarTheme.buttonVMargin); From 558567d399ab92641c1cfe2c0e7079a144beb3eb Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 10 Sep 2023 14:28:58 +0800 Subject: [PATCH 05/90] remove unused mut Signed-off-by: fufesou --- src/ui_session_interface.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index c416b95d9..fe1603601 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -780,8 +780,8 @@ impl Session { pub fn send_mouse( &self, mask: i32, - mut x: i32, - mut y: i32, + x: i32, + y: i32, alt: bool, ctrl: bool, shift: bool, From ea5c60af7a0f763d234a09f0f26a00864468f42e Mon Sep 17 00:00:00 2001 From: dignow Date: Sun, 10 Sep 2023 15:32:50 +0800 Subject: [PATCH 06/90] fix, android softkeyboard, 'delete input' on conn password Signed-off-by: dignow --- flutter/lib/mobile/pages/remote_page.dart | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/flutter/lib/mobile/pages/remote_page.dart b/flutter/lib/mobile/pages/remote_page.dart index 838545d0c..bd44ae5b5 100644 --- a/flutter/lib/mobile/pages/remote_page.dart +++ b/flutter/lib/mobile/pages/remote_page.dart @@ -275,7 +275,9 @@ class _RemotePageState extends State { return Offstage(); }(), _bottomWidget(), - gFFI.ffiModel.pi.isSet.isFalse ? emptyOverlay(MyTheme.canvasColor) : Offstage(), + gFFI.ffiModel.pi.isSet.isFalse + ? emptyOverlay(MyTheme.canvasColor) + : Offstage(), ], )), body: Overlay( @@ -316,12 +318,15 @@ class _RemotePageState extends State { Widget getRawPointerAndKeyBody(Widget child) { final keyboard = gFFI.ffiModel.permissions['keyboard'] != false; return RawPointerMouseRegion( - cursor: keyboard ? SystemMouseCursors.none : MouseCursor.defer, - inputModel: inputModel, - child: RawKeyFocusScope( - focusNode: _physicalFocusNode, - inputModel: inputModel, - child: child)); + cursor: keyboard ? SystemMouseCursors.none : MouseCursor.defer, + inputModel: inputModel, + child: gFFI.ffiModel.pi.isSet.isTrue + ? RawKeyFocusScope( + focusNode: _physicalFocusNode, + inputModel: inputModel, + child: child) + : child, + ); } Widget getBottomAppBar(bool keyboard) { From e1f2cd21e743b4d5996b0eb4c1f370642e184650 Mon Sep 17 00:00:00 2001 From: dignow Date: Sun, 10 Sep 2023 15:41:29 +0800 Subject: [PATCH 07/90] add comment Signed-off-by: dignow --- flutter/lib/mobile/pages/remote_page.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flutter/lib/mobile/pages/remote_page.dart b/flutter/lib/mobile/pages/remote_page.dart index bd44ae5b5..49601ece3 100644 --- a/flutter/lib/mobile/pages/remote_page.dart +++ b/flutter/lib/mobile/pages/remote_page.dart @@ -320,6 +320,8 @@ class _RemotePageState extends State { return RawPointerMouseRegion( cursor: keyboard ? SystemMouseCursors.none : MouseCursor.defer, inputModel: inputModel, + // Disable RawKeyFocusScope before the connecting is established. + // The "Delete" key on the soft keyboard may be grabbed when inputting the password dialog. child: gFFI.ffiModel.pi.isSet.isTrue ? RawKeyFocusScope( focusNode: _physicalFocusNode, From f1d5afe72aa41100f9aac7a5c8c6cd38bbb2305d Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 10 Sep 2023 18:31:16 +0800 Subject: [PATCH 08/90] Change the option 'Scroll mode' to be 'Reverse mouse wheel' Signed-off-by: fufesou --- .../desktop/pages/desktop_setting_page.dart | 47 +------- .../lib/desktop/widgets/remote_toolbar.dart | 109 +++++++++--------- libs/hbb_common/src/config.rs | 23 ++-- src/client.rs | 8 +- src/flutter_ffi.rs | 8 +- src/lang/ar.rs | 5 +- src/lang/ca.rs | 5 +- src/lang/cn.rs | 5 +- src/lang/cs.rs | 5 +- src/lang/da.rs | 5 +- src/lang/de.rs | 5 +- src/lang/el.rs | 5 +- src/lang/en.rs | 1 + src/lang/eo.rs | 5 +- src/lang/es.rs | 5 +- src/lang/fa.rs | 5 +- src/lang/fr.rs | 5 +- src/lang/hu.rs | 5 +- src/lang/id.rs | 5 +- src/lang/it.rs | 5 +- src/lang/ja.rs | 5 +- src/lang/ko.rs | 5 +- src/lang/kz.rs | 5 +- src/lang/lt.rs | 5 +- src/lang/nl.rs | 5 +- src/lang/pl.rs | 5 +- src/lang/pt_PT.rs | 5 +- src/lang/ptbr.rs | 5 +- src/lang/ro.rs | 5 +- src/lang/ru.rs | 5 +- src/lang/sk.rs | 5 +- src/lang/sl.rs | 5 +- src/lang/sq.rs | 5 +- src/lang/sr.rs | 5 +- src/lang/sv.rs | 5 +- src/lang/template.rs | 5 +- src/lang/th.rs | 5 +- src/lang/tr.rs | 5 +- src/lang/tw.rs | 5 +- src/lang/ua.rs | 5 +- src/lang/vn.rs | 5 +- src/ui_session_interface.rs | 10 +- 42 files changed, 116 insertions(+), 265 deletions(-) diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 3b0332552..468886cb8 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -105,7 +105,6 @@ class _DesktopSettingPageState extends State _TabInfo('Network', Icons.link_outlined, Icons.link), _TabInfo( 'Display', Icons.desktop_windows_outlined, Icons.desktop_windows), - _TabInfo('Input', Icons.keyboard_outlined, Icons.keyboard), _TabInfo('Account', Icons.person_outline, Icons.person), _TabInfo('About', Icons.info_outline, Icons.info) ]; @@ -122,7 +121,6 @@ class _DesktopSettingPageState extends State _Safety(), _Network(), _Display(), - _Input(), _Account(), _About(), ]; @@ -1218,50 +1216,7 @@ class _DisplayState extends State<_Display> { otherRow('Disable clipboard', 'disable_clipboard'), otherRow('Lock after session end', 'lock_after_session_end'), otherRow('Privacy mode', 'privacy_mode'), - ]); - } -} - -class _Input extends StatefulWidget { - const _Input({Key? key}) : super(key: key); - - @override - State<_Input> createState() => _InputState(); -} - -class _InputState extends State<_Input> { - @override - Widget build(BuildContext context) { - final scrollController = ScrollController(); - return DesktopScrollWrapper( - scrollController: scrollController, - child: ListView( - controller: scrollController, - physics: DraggableNeverScrollableScrollPhysics(), - children: [ - scrollMode(context), - ]).marginOnly(bottom: _kListViewBottomMargin)); - } - - Widget scrollMode(BuildContext context) { - final key = 'scroll_mode'; - onChanged(String value) async { - await bind.mainSetUserDefaultOption(key: key, value: value); - setState(() {}); - } - - final groupValue = bind.mainGetUserDefaultOption(key: key); - return _Card(title: 'Default Scroll Mode', children: [ - _Radio(context, - value: kScrollModeDefault, - groupValue: groupValue, - label: 'Default mode', - onChanged: onChanged), - _Radio(context, - value: kScrollModeReverse, - groupValue: groupValue, - label: 'Reverse mode', - onChanged: onChanged), + otherRow('Reverse mouse wheel', 'reverse_mouse_wheel'), ]); } } diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index 63085d524..a03fc7047 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -546,9 +546,11 @@ class _PinMenu extends StatelessWidget { assetName: state.pin ? "assets/pinned.svg" : "assets/unpinned.svg", tooltip: state.pin ? 'Unpin Toolbar' : 'Pin Toolbar', onPressed: state.switchPin, - color: state.pin ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, - hoverColor: - state.pin ? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor, + color: + state.pin ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, + hoverColor: state.pin + ? _ToolbarTheme.hoverBlueColor + : _ToolbarTheme.hoverInactiveColor, ), ); } @@ -561,15 +563,18 @@ class _MobileActionMenu extends StatelessWidget { @override Widget build(BuildContext context) { if (!ffi.ffiModel.isPeerAndroid) return Offstage(); - return Obx(()=>_IconMenuButton( - assetName: 'assets/actions_mobile.svg', - tooltip: 'Mobile Actions', - onPressed: () => ffi.dialogManager.toggleMobileActionsOverlay(ffi: ffi), - color: ffi.dialogManager.mobileActionsOverlayVisible.isTrue - ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, - hoverColor: ffi.dialogManager.mobileActionsOverlayVisible.isTrue - ? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor, - )); + return Obx(() => _IconMenuButton( + assetName: 'assets/actions_mobile.svg', + tooltip: 'Mobile Actions', + onPressed: () => + ffi.dialogManager.toggleMobileActionsOverlay(ffi: ffi), + color: ffi.dialogManager.mobileActionsOverlayVisible.isTrue + ? _ToolbarTheme.blueColor + : _ToolbarTheme.inactiveColor, + hoverColor: ffi.dialogManager.mobileActionsOverlayVisible.isTrue + ? _ToolbarTheme.hoverBlueColor + : _ToolbarTheme.hoverInactiveColor, + )); } } @@ -1309,7 +1314,7 @@ class _KeyboardMenu extends StatelessWidget { Divider(), viewMode(), Divider(), - scrollMode(), + reverseMouseWheel(), ]); } @@ -1398,37 +1403,29 @@ class _KeyboardMenu extends StatelessWidget { child: Text(translate('View Mode'))); } - scrollMode() { + reverseMouseWheel() { return futureBuilder(future: () async { - final mode = await bind.sessionGetScrollMode(sessionId: ffi.sessionId); - if (mode != null) { - return mode; + final v = + await bind.sessionGetReverseMouseWheel(sessionId: ffi.sessionId); + debugPrint('REMOVE ME ======================== $v'); + if (v != null && v != '') { + return v; } - return bind.mainGetUserDefaultOption(key: 'scroll_mode'); + return bind.mainGetUserDefaultOption(key: 'reverse_mouse_wheel'); }(), hasData: (data) { - final groupValue = data as String; - List modes = [ - InputModeMenu(key: kScrollModeDefault, menu: 'Default mode'), - InputModeMenu(key: kScrollModeReverse, menu: 'Reverse mode'), - ]; - List list = []; + debugPrint('REMOVE ME ======================== data $data'); final enabled = !ffi.ffiModel.viewOnly; - onChanged(String? value) async { + onChanged(bool? value) async { if (value == null) return; - await bind.sessionSetScrollMode(sessionId: ffi.sessionId, value: value); + await bind.sessionSetReverseMouseWheel( + sessionId: ffi.sessionId, value: value ? 'Y' : 'N'); } - for (InputModeMenu mode in modes) { - var text = translate(mode.menu); - list.add(RdoMenuButton( - child: Text(text), - value: mode.key, - groupValue: groupValue, + return CkbMenuButton( + value: data == 'Y', onChanged: enabled ? onChanged : null, - ffi: ffi, - )); - } - return Column(children: list); + child: Text(translate('Reverse mouse wheel')), + ffi: ffi); }); } } @@ -1628,26 +1625,26 @@ class _IconMenuButtonState extends State<_IconMenuButton> { width: _ToolbarTheme.buttonSize, height: _ToolbarTheme.buttonSize, child: MenuItemButton( - style: ButtonStyle( - backgroundColor: MaterialStatePropertyAll(Colors.transparent), - padding: MaterialStatePropertyAll(EdgeInsets.zero), - overlayColor: MaterialStatePropertyAll(Colors.transparent)), - onHover: (value) => setState(() { - hover = value; - }), - onPressed: widget.onPressed, - child: Tooltip( - message: translate(widget.tooltip), - child: Material( - type: MaterialType.transparency, - child: Ink( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(_ToolbarTheme.iconRadius), - color: hover ? widget.hoverColor : widget.color, - ), - child: icon)), - ) - ), + style: ButtonStyle( + backgroundColor: MaterialStatePropertyAll(Colors.transparent), + padding: MaterialStatePropertyAll(EdgeInsets.zero), + overlayColor: MaterialStatePropertyAll(Colors.transparent)), + onHover: (value) => setState(() { + hover = value; + }), + onPressed: widget.onPressed, + child: Tooltip( + message: translate(widget.tooltip), + child: Material( + type: MaterialType.transparency, + child: Ink( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(_ToolbarTheme.iconRadius), + color: hover ? widget.hoverColor : widget.color, + ), + child: icon)), + )), ).marginSymmetric( horizontal: widget.hMargin ?? _ToolbarTheme.buttonHMargin, vertical: widget.vMargin ?? _ToolbarTheme.buttonVMargin); diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index 4d89d06cd..82174754c 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -277,13 +277,13 @@ pub struct PeerConfig { pub keyboard_mode: String, #[serde(flatten)] pub view_only: ViewOnly, - // Mouse wheel or touchpad scroll mode, default or reverse + // Mouse wheel or touchpad scroll mode #[serde( - default = "PeerConfig::default_scroll_mode", - deserialize_with = "PeerConfig::deserialize_scroll_mode", + default = "PeerConfig::default_reverse_mouse_wheel", + deserialize_with = "PeerConfig::deserialize_reverse_mouse_wheel", skip_serializing_if = "String::is_empty" )] - pub scroll_mode: String, + pub reverse_mouse_wheel: String, #[serde( default, @@ -327,7 +327,7 @@ impl Default for PeerConfig { show_quality_monitor: Default::default(), keyboard_mode: Default::default(), view_only: Default::default(), - scroll_mode: Self::default_scroll_mode(), + reverse_mouse_wheel: Self::default_reverse_mouse_wheel(), custom_resolutions: Default::default(), options: Self::default_options(), ui_flutter: Default::default(), @@ -1140,9 +1140,9 @@ impl PeerConfig { UserDefaultConfig::read().get("image_quality") ); serde_field_string!( - default_scroll_mode, - deserialize_scroll_mode, - UserDefaultConfig::read().get("scroll_mode") + default_reverse_mouse_wheel, + deserialize_reverse_mouse_wheel, + UserDefaultConfig::read().get("reverse_mouse_wheel") ); fn default_custom_image_quality() -> Vec { @@ -1488,7 +1488,6 @@ impl UserDefaultConfig { } "custom_image_quality" => self.get_double_string(key, 50.0, 10.0, 0xFFF as f64), "custom-fps" => self.get_double_string(key, 30.0, 5.0, 120.0), - "scroll_mode" => self.get_string(key, "default", vec!["reverse"]), _ => self .options .get(key) @@ -1498,7 +1497,11 @@ impl UserDefaultConfig { } pub fn set(&mut self, key: String, value: String) { - self.options.insert(key, value); + if value.is_empty() { + self.options.remove(&key); + } else { + self.options.insert(key, value); + } self.store(); } diff --git a/src/client.rs b/src/client.rs index f23a2c512..85b6fc0f4 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1195,14 +1195,14 @@ impl LoginConfigHandler { self.save_config(config); } - /// Save mouse scroll mode("default", "reverse") to the current config. + /// Save reverse mouse wheel ("", "Y") to the current config. /// /// # Arguments /// - /// * `value` - The view style to be saved. - pub fn save_scroll_mode(&mut self, value: String) { + /// * `value` - The reverse mouse wheel ("", "Y"). + pub fn save_reverse_mouse_wheel(&mut self, value: String) { let mut config = self.load_config(); - config.scroll_mode = value; + config.reverse_mouse_wheel = value; self.save_config(config); } diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 05dcf0343..69f6f507c 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -300,17 +300,17 @@ pub fn session_set_keyboard_mode(session_id: SessionID, value: String) { } } -pub fn session_get_scroll_mode(session_id: SessionID) -> Option { +pub fn session_get_reverse_mouse_wheel(session_id: SessionID) -> Option { if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { - Some(session.get_scroll_mode()) + Some(session.get_reverse_mouse_wheel()) } else { None } } -pub fn session_set_scroll_mode(session_id: SessionID, value: String) { +pub fn session_set_reverse_mouse_wheel(session_id: SessionID, value: String) { if let Some(session) = SESSIONS.write().unwrap().get_mut(&session_id) { - session.save_scroll_mode(value); + session.save_reverse_mouse_wheel(value); } } diff --git a/src/lang/ar.rs b/src/lang/ar.rs index a1ba011ea..4a1f8486c 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 27925a847..55e01fefa 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 1367b290a..5fdfa460e 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV 色"), ("Installation Successful!", "安装成功!"), ("Installation failed!", "安装失败!"), - ("Input", "输入"), - ("Default Scroll Mode", "默认滚动模式"), - ("Default mode", "默认模式"), - ("Reverse mode", "反向模式"), + ("Reverse mouse wheel", "鼠标滚轮反向"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 0ef2dc12d..37473e0b6 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 7e4dd064f..9a9ecdfe1 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index e292ea0c0..cc0ae6af9 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV-Farbe"), ("Installation Successful!", "Installation erfolgreich!"), ("Installation failed!", "Installation fehlgeschlagen!"), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index a2eec30b1..d2ae3eb5c 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/en.rs b/src/lang/en.rs index c949575c2..dc17ac7eb 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -77,5 +77,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("pull_ab_failed_tip", "Failed to refresh address book"), ("push_ab_failed_tip", "Failed to sync address book to server"), ("synced_peer_readded_tip", "The devices that were present in the recent sessions will be synchronized back to the address book."), + ("View Mode", "View mode"), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 9374b652c..90144c694 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index d859cae31..779135f00 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Color HSV"), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index a276ae718..ab1d7ab12 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index a126e1582..3ce8bca02 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Couleur TSL"), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 3dcba4992..50ca96792 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 06fa9584a..5f802e44b 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Warna HSV"), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 0c1524109..493e62d18 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Colore HSV"), ("Installation Successful!", "Installazione completata"), ("Installation failed!", "Installazione fallita"), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index b75af8315..015ee7af3 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index af849fc02..2897ed5f8 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index c4199b2ac..5a0c14871 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index f9c9cd7ec..100e22955 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index e625fbd6a..7503831bf 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV Kleur"), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index c17af1ce0..d488f681d 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index cb57a1766..91a85a3b1 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index a0284535f..7ca81495d 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index 291489494..bcc13a0df 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index 17ff0ae5e..ee5467af2 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Цвет HSV"), ("Installation Successful!", "Установка выполнена успешно!"), ("Installation failed!", "Установка не выполнена!"), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index e0386ee3c..003b2cabc 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 1ace96c0b..80b9aed1d 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index c6fca4d57..fd2db0c83 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 9a3407ec7..9092d453d 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 4333f78ce..ed8c3697a 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 8b9bf3a91..6b4d176d2 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index 220250d9b..a5e193a00 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index e05fecc21..0fe1369df 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV Rengi"), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 69c5c4d21..5e533e9bc 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV 色"), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 54585793b..7cc885f56 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 17e8a48f3..e65fab66b 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -543,9 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", ""), ("Installation Successful!", ""), ("Installation failed!", ""), - ("Input", ""), - ("Default Scroll Mode", ""), - ("Default mode", ""), - ("Reverse mode", ""), + ("Reverse mouse wheel", ""), ].iter().cloned().collect(); } diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index fe1603601..dae85fe5f 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -175,12 +175,12 @@ impl Session { self.lc.write().unwrap().save_keyboard_mode(value); } - pub fn get_scroll_mode(&self) -> String { - self.lc.read().unwrap().scroll_mode.clone() + pub fn get_reverse_mouse_wheel(&self) -> String { + self.lc.read().unwrap().reverse_mouse_wheel.clone() } - pub fn save_scroll_mode(&mut self, value: String) { - self.lc.write().unwrap().save_scroll_mode(value); + pub fn save_reverse_mouse_wheel(&mut self, value: String) { + self.lc.write().unwrap().save_reverse_mouse_wheel(value); } pub fn save_view_style(&mut self, value: String) { @@ -765,7 +765,7 @@ impl Session { #[inline] #[cfg(not(any(target_os = "android", target_os = "ios")))] fn is_scroll_reverse_mode(&self) -> bool { - self.lc.read().unwrap().scroll_mode.eq("reverse") + self.lc.read().unwrap().reverse_mouse_wheel.eq("Y") } #[inline] From 759bbeac06f21af2cdfef39703389962b657c1c2 Mon Sep 17 00:00:00 2001 From: solokot Date: Sun, 10 Sep 2023 16:47:50 +0300 Subject: [PATCH 09/90] Update ru.rs --- src/lang/ru.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/ru.rs b/src/lang/ru.rs index ee5467af2..eb9f8161b 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -543,6 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Цвет HSV"), ("Installation Successful!", "Установка выполнена успешно!"), ("Installation failed!", "Установка не выполнена!"), - ("Reverse mouse wheel", ""), + ("Reverse mouse wheel", "Реверсировать колесо мыши"), ].iter().cloned().collect(); } From 1a6ef23ee775fbdd371f2465cc052890a6e5b1e6 Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 10 Sep 2023 22:59:45 +0800 Subject: [PATCH 10/90] fix, some capitalization style mismatch in the same option group Signed-off-by: fufesou --- flutter/lib/desktop/widgets/remote_toolbar.dart | 2 -- src/lang/en.rs | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index a03fc7047..a8bacfca3 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -1407,13 +1407,11 @@ class _KeyboardMenu extends StatelessWidget { return futureBuilder(future: () async { final v = await bind.sessionGetReverseMouseWheel(sessionId: ffi.sessionId); - debugPrint('REMOVE ME ======================== $v'); if (v != null && v != '') { return v; } return bind.mainGetUserDefaultOption(key: 'reverse_mouse_wheel'); }(), hasData: (data) { - debugPrint('REMOVE ME ======================== data $data'); final enabled = !ffi.ffiModel.viewOnly; onChanged(bool? value) async { if (value == null) return; diff --git a/src/lang/en.rs b/src/lang/en.rs index dc17ac7eb..a69164a3b 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -78,5 +78,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("push_ab_failed_tip", "Failed to sync address book to server"), ("synced_peer_readded_tip", "The devices that were present in the recent sessions will be synchronized back to the address book."), ("View Mode", "View mode"), + ("Block user input", "Block User Input"), + ("Start session recording", "Start Session Recording"), + ("Stop session recording", "Stop Session Recording"), + ("Enable remote configuration modification", "Enable Remote Configuration Modification"), ].iter().cloned().collect(); } From 852bab6e0b790c939dfcb7493a536f8427cb0a97 Mon Sep 17 00:00:00 2001 From: "Miguel F. G" <116861809+flusheDData@users.noreply.github.com> Date: Sun, 10 Sep 2023 20:34:26 +0200 Subject: [PATCH 11/90] Update es.rs Some corrections plus new terms --- src/lang/es.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lang/es.rs b/src/lang/es.rs index 779135f00..4589844c2 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -253,7 +253,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Touch mode", "Modo táctil"), ("Mouse mode", "Modo ratón"), ("One-Finger Tap", "Toque con un dedo"), - ("Left Mouse", "Ratón izquierdo"), + ("Left Mouse", "Botón izquierdo"), ("One-Long Tap", "Un toque largo"), ("Two-Finger Tap", "Toque con dos dedos"), ("Right Mouse", "Botón derecho"), @@ -283,7 +283,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Do you accept?", "¿Aceptas?"), ("Open System Setting", "Configuración del sistema abierto"), ("How to get Android input permission?", "¿Cómo obtener el permiso de entrada de Android?"), - ("android_input_permission_tip1", "Para que un dispositivo remoto controle su dispositivo Android a través del mouse o toque, debe permitir que RustDesk use el servicio de \"Accesibilidad\"."), + ("android_input_permission_tip1", "Para que un dispositivo remoto controle su dispositivo Android a través del ratón o toque, debe permitir que RustDesk use el servicio de \"Accesibilidad\"."), ("android_input_permission_tip2", "Vaya a la página de configuración del sistema que se abrirá a continuación, busque y acceda a [Servicios instalados], active el servicio [RustDesk Input]."), ("android_new_connection_tip", "Se recibió una nueva solicitud de control para el dispositivo actual."), ("android_service_will_start_tip", "Habilitar la captura de pantalla iniciará automáticamente el servicio, lo que permitirá que otros dispositivos soliciten una conexión desde este dispositivo."), @@ -541,8 +541,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Change Color", "Cambiar Color"), ("Primary Color", "Color Primario"), ("HSV Color", "Color HSV"), - ("Installation Successful!", ""), - ("Installation failed!", ""), - ("Reverse mouse wheel", ""), + ("Installation Successful!", "Instalación exitosa"), + ("Installation failed!", "La instalación ha fallado"), + ("Reverse mouse wheel", "Invertir rueda del ratón"), ].iter().cloned().collect(); } From f5fe6a36eb4969b07b1ad5da8a065078b50dae68 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Sun, 10 Sep 2023 21:42:22 +0200 Subject: [PATCH 12/90] Update italian language @rustdesk Please merge. Thanks. --- src/lang/it.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/it.rs b/src/lang/it.rs index 493e62d18..9b708ca39 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -543,6 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "Colore HSV"), ("Installation Successful!", "Installazione completata"), ("Installation failed!", "Installazione fallita"), - ("Reverse mouse wheel", ""), + ("Reverse mouse wheel", "Rotella mouse inversa"), ].iter().cloned().collect(); } From a5dcac137f18b0ef34ddf115f11c5aea9406b211 Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 11 Sep 2023 11:18:26 +0800 Subject: [PATCH 13/90] fix dark theme error banner background color Signed-off-by: 21pages --- flutter/lib/common.dart | 7 +++++++ flutter/lib/common/widgets/address_book.dart | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 33321c81a..fbbe6e254 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -101,6 +101,7 @@ class ColorThemeExtension extends ThemeExtension { required this.highlight, required this.drag_indicator, required this.shadow, + required this.errorBannerBg, }); final Color? border; @@ -108,6 +109,7 @@ class ColorThemeExtension extends ThemeExtension { final Color? highlight; final Color? drag_indicator; final Color? shadow; + final Color? errorBannerBg; static final light = ColorThemeExtension( border: Color(0xFFCCCCCC), @@ -115,6 +117,7 @@ class ColorThemeExtension extends ThemeExtension { highlight: Color(0xFFE5E5E5), drag_indicator: Colors.grey[800], shadow: Colors.black, + errorBannerBg: Color(0xFFFDEEEB), ); static final dark = ColorThemeExtension( @@ -123,6 +126,7 @@ class ColorThemeExtension extends ThemeExtension { highlight: Color(0xFF3F3F3F), drag_indicator: Colors.grey, shadow: Colors.grey, + errorBannerBg: Color(0xFF470F2D), ); @override @@ -132,6 +136,7 @@ class ColorThemeExtension extends ThemeExtension { Color? highlight, Color? drag_indicator, Color? shadow, + Color? errorBannerBg, }) { return ColorThemeExtension( border: border ?? this.border, @@ -139,6 +144,7 @@ class ColorThemeExtension extends ThemeExtension { highlight: highlight ?? this.highlight, drag_indicator: drag_indicator ?? this.drag_indicator, shadow: shadow ?? this.shadow, + errorBannerBg: errorBannerBg ?? this.errorBannerBg, ); } @@ -154,6 +160,7 @@ class ColorThemeExtension extends ThemeExtension { highlight: Color.lerp(highlight, other.highlight, t), drag_indicator: Color.lerp(drag_indicator, other.drag_indicator, t), shadow: Color.lerp(shadow, other.shadow, t), + errorBannerBg: Color.lerp(shadow, other.errorBannerBg, t), ); } } diff --git a/flutter/lib/common/widgets/address_book.dart b/flutter/lib/common/widgets/address_book.dart index 4af74e319..070c44126 100644 --- a/flutter/lib/common/widgets/address_book.dart +++ b/flutter/lib/common/widgets/address_book.dart @@ -76,7 +76,7 @@ class _AddressBookState extends State { child: Center( child: Container( height: height, - color: Color.fromARGB(255, 253, 238, 235), + color: MyTheme.color(context).errorBannerBg, child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, From e98aa8179486bc303f744159b1fa31137ffb4c58 Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 11 Sep 2023 11:21:42 +0800 Subject: [PATCH 14/90] remove sciter keep cm open for file log Signed-off-by: 21pages --- src/server/connection.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/connection.rs b/src/server/connection.rs index c9f07eb78..fbf89e76e 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -2278,7 +2278,7 @@ impl Connection { lock_screen().await; } #[cfg(not(any(target_os = "android", target_os = "ios")))] - let data = if self.chat_unanswered || self.file_transferred { + let data = if self.chat_unanswered || self.file_transferred && cfg!(feature = "flutter") { ipc::Data::Disconnected } else { ipc::Data::Close From 62ae4aeac9368d9941389ddc5f7940da8c23c5c1 Mon Sep 17 00:00:00 2001 From: Mr-Update <37781396+Mr-Update@users.noreply.github.com> Date: Mon, 11 Sep 2023 08:45:49 +0200 Subject: [PATCH 15/90] Update de.rs --- src/lang/de.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/de.rs b/src/lang/de.rs index cc0ae6af9..c307281ee 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -543,6 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("HSV Color", "HSV-Farbe"), ("Installation Successful!", "Installation erfolgreich!"), ("Installation failed!", "Installation fehlgeschlagen!"), - ("Reverse mouse wheel", ""), + ("Reverse mouse wheel", "Mausrad rückwärts drehen"), ].iter().cloned().collect(); } From d0173fbdc58f39bddbf8188e8e1e3d4892f4873e Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 11 Sep 2023 16:04:51 +0800 Subject: [PATCH 16/90] install service period protection how to reproduce: install, click stop service, click start service and click no on uac, it'll show "Service is not running" but can be connected. Signed-off-by: 21pages --- src/platform/linux.rs | 3 ++- src/platform/mod.rs | 24 ++++++++++++++++++++++++ src/platform/windows.rs | 1 + src/rendezvous_mediator.rs | 4 +++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/platform/linux.rs b/src/platform/linux.rs index 944e24c15..fb48a9307 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -1074,7 +1074,7 @@ mod desktop { pub fn refresh(&mut self) { if !self.sid.is_empty() && is_active_and_seat0(&self.sid) { - return; + return; } let seat0_values = get_values_of_seat0(&[0, 1, 2]); @@ -1183,6 +1183,7 @@ pub fn uninstall_service(show_new_window: bool) -> bool { } pub fn install_service() -> bool { + let _installing = crate::platform::InstallingService::new(); if !has_cmd("systemctl") { return false; } diff --git a/src/platform/mod.rs b/src/platform/mod.rs index e962ef9d5..6a428d9c3 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -23,9 +23,18 @@ pub mod linux_desktop_manager; #[cfg(not(any(target_os = "android", target_os = "ios")))] use hbb_common::{message_proto::CursorData, ResultType}; +use std::sync::{Arc, Mutex}; #[cfg(not(any(target_os = "macos", target_os = "android", target_os = "ios")))] const SERVICE_INTERVAL: u64 = 300; +lazy_static::lazy_static! { + static ref INSTALLING_SERVICE: Arc>= Default::default(); +} + +pub fn installing_service() -> bool { + INSTALLING_SERVICE.lock().unwrap().clone() +} + pub fn is_xfce() -> bool { #[cfg(target_os = "linux")] { @@ -71,6 +80,21 @@ pub fn get_active_username() -> String { #[cfg(target_os = "android")] pub const PA_SAMPLE_RATE: u32 = 48000; +pub(crate) struct InstallingService; // please use new + +impl InstallingService { + pub fn new() -> Self { + *INSTALLING_SERVICE.lock().unwrap() = true; + Self + } +} + +impl Drop for InstallingService { + fn drop(&mut self) { + *INSTALLING_SERVICE.lock().unwrap() = false; + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/platform/windows.rs b/src/platform/windows.rs index feadffb2c..41ac9e5ea 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -2167,6 +2167,7 @@ pub fn uninstall_service(show_new_window: bool) -> bool { pub fn install_service() -> bool { log::info!("Installing service..."); + let _installing = crate::platform::InstallingService::new(); let (_, _, _, exe) = get_install_info(); let tmp_path = std::env::temp_dir().to_string_lossy().to_string(); let tray_shortcut = get_tray_shortcut(&exe, &tmp_path).unwrap_or_default(); diff --git a/src/rendezvous_mediator.rs b/src/rendezvous_mediator.rs index 924c0c709..20219cc89 100644 --- a/src/rendezvous_mediator.rs +++ b/src/rendezvous_mediator.rs @@ -79,7 +79,9 @@ impl RendezvousMediator { crate::platform::linux_desktop_manager::start_xdesktop(); loop { Config::reset_online(); - if Config::get_option("stop-service").is_empty() { + if Config::get_option("stop-service").is_empty() + && !crate::platform::installing_service() + { if !nat_tested { crate::test_nat_type(); nat_tested = true; From 4d0b660c73ddca3e82c089b0e8af5fc1ff5284f3 Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 11 Sep 2023 16:42:01 +0800 Subject: [PATCH 17/90] fix lan option reaction Signed-off-by: 21pages --- flutter/lib/desktop/pages/desktop_setting_page.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 468886cb8..2da6ab1e7 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -1537,9 +1537,14 @@ Widget _OptionCheckBox(BuildContext context, String label, String key, isServer ? await mainSetBoolOption(key, option) : await mainSetLocalBoolOption(key, option); - ref.value = isServer + final readOption = isServer ? mainGetBoolOptionSync(key) : mainGetLocalBoolOptionSync(key); + if (reverse) { + ref.value = !readOption; + } else { + ref.value = readOption; + } update?.call(); } } From 754fea538a3856d6884f5d7cacce33b9ab28d5d3 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Mon, 11 Sep 2023 21:48:36 +0530 Subject: [PATCH 18/90] add scam warning window Signed-off-by: Sahil Yeole --- flutter/lib/mobile/pages/server_page.dart | 191 +++++++++++++++++++++- 1 file changed, 190 insertions(+), 1 deletion(-) diff --git a/flutter/lib/mobile/pages/server_page.dart b/flutter/lib/mobile/pages/server_page.dart index a8255180b..f34fda733 100644 --- a/flutter/lib/mobile/pages/server_page.dart +++ b/flutter/lib/mobile/pages/server_page.dart @@ -210,11 +210,200 @@ class ServiceNotRunningNotification extends StatelessWidget { .marginOnly(bottom: 8), ElevatedButton.icon( icon: const Icon(Icons.play_arrow), - onPressed: serverModel.toggleService, + onPressed: () { + if (gFFI.userModel.userName.value.isEmpty && bind.mainGetLocalOption(key: "show-scam-warning") != "N") { + _showScamWarning(context, serverModel); + } else { + serverModel.toggleService(); + } + }, label: Text(translate("Start Service"))) ], )); } + + void _showScamWarning(BuildContext context, ServerModel serverModel) { + showDialog( + context: context, + builder: (BuildContext context) { + return ScamWarningDialog(serverModel: serverModel); + }, + ); + } + +} + +class ScamWarningDialog extends StatefulWidget { + final ServerModel serverModel; + + ScamWarningDialog({required this.serverModel}); + + @override + _ScamWarningDialogState createState() => _ScamWarningDialogState(); +} + +class _ScamWarningDialogState extends State { + int _countdown = 6; + bool show_warning = false; + late Timer _timer; + late ServerModel _serverModel; + + @override + void initState() { + super.initState(); + _serverModel = widget.serverModel; + startCountdown(); + } + + void startCountdown() { + const oneSecond = Duration(seconds: 1); + _timer = Timer.periodic(oneSecond, (timer) { + setState(() { + _countdown--; + if (_countdown <= 0) { + timer.cancel(); + } + }); + }); + } + + @override + void dispose() { + _timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final isButtonLocked = _countdown > 0; + + return AlertDialog( + content: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topRight, + end: Alignment.bottomLeft, + colors: [ + Color(0xffe242bc), + Color(0xfff4727c), + ], + ), + borderRadius: BorderRadius.circular(20.0), + ), + padding: EdgeInsets.all(25.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.warning_amber_sharp, + color: Colors.white, + ), + SizedBox(width: 10), + Text( + translate("Warning"), + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 20.0, + ), + ), + ], + ), + SizedBox(height: 20), + Center( + child: Image.asset('assets/scam.png', + width: 180, + ), + ), + SizedBox(height: 18), + Text( + translate("You May Be Being SCAMMED!"), + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 22.0, + ), + ), + SizedBox(height: 18), + Text( + translate("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.")+"\n\n" + +translate("They are likely a scammer trying to steal your money or other private information.")+"\n", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 16.0, + ), + ), + Row( + children: [ + Checkbox( + value: show_warning, + onChanged: (value) { + setState((){ + show_warning = value!; + }); + }, + ), + Text( + translate("Don't show again"), + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15.0, + ), + ), + ], + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + ElevatedButton( + onPressed: isButtonLocked + ? null + : () { + Navigator.of(context).pop(); + _serverModel.toggleService(); + if (show_warning) { + bind.mainSetLocalOption(key: "show-scam-warning", value: "N"); + } + }, + style: ElevatedButton.styleFrom( + primary: Colors.blueAccent, + ), + child: Text( + isButtonLocked ? translate("I Agree")+" (${_countdown}s)" : translate("I Agree"), + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13.0, + ), + ), + ), + SizedBox(width: 15), + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + style: ElevatedButton.styleFrom( + primary: Colors.blueAccent, + ), + child: Text( + translate("Decline"), + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13.0, + ), + ), + ), + ], + )])), + contentPadding: EdgeInsets.all(0.0), + ); + } } class ServerInfo extends StatelessWidget { From 6a8d755b27a870218849ad2fa8b5799d19574758 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Mon, 11 Sep 2023 21:53:57 +0530 Subject: [PATCH 19/90] add scam warning lang Signed-off-by: Sahil Yeole --- src/lang/ar.rs | 6 ++++++ src/lang/ca.rs | 6 ++++++ src/lang/cn.rs | 6 ++++++ src/lang/cs.rs | 6 ++++++ src/lang/da.rs | 6 ++++++ src/lang/de.rs | 6 ++++++ src/lang/el.rs | 6 ++++++ src/lang/eo.rs | 6 ++++++ src/lang/es.rs | 6 ++++++ src/lang/fa.rs | 6 ++++++ src/lang/fr.rs | 6 ++++++ src/lang/hu.rs | 6 ++++++ src/lang/id.rs | 6 ++++++ src/lang/it.rs | 6 ++++++ src/lang/ja.rs | 6 ++++++ src/lang/ko.rs | 6 ++++++ src/lang/kz.rs | 6 ++++++ src/lang/lt.rs | 6 ++++++ src/lang/nl.rs | 6 ++++++ src/lang/pl.rs | 6 ++++++ src/lang/pt_PT.rs | 6 ++++++ src/lang/ptbr.rs | 6 ++++++ src/lang/ro.rs | 6 ++++++ src/lang/ru.rs | 6 ++++++ src/lang/sk.rs | 6 ++++++ src/lang/sl.rs | 6 ++++++ src/lang/sq.rs | 6 ++++++ src/lang/sr.rs | 6 ++++++ src/lang/sv.rs | 6 ++++++ src/lang/template.rs | 6 ++++++ src/lang/th.rs | 6 ++++++ src/lang/tr.rs | 6 ++++++ src/lang/tw.rs | 6 ++++++ src/lang/ua.rs | 6 ++++++ src/lang/vn.rs | 6 ++++++ 35 files changed, 210 insertions(+) diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 4a1f8486c..69a0242f3 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 55e01fefa..ba8ef4b9c 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 5fdfa460e..03169c606 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "安装成功!"), ("Installation failed!", "安装失败!"), ("Reverse mouse wheel", "鼠标滚轮反向"), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 37473e0b6..8ac9bc6a2 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 9a9ecdfe1..1a5279f91 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index cc0ae6af9..5b35cf8b4 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Installation erfolgreich!"), ("Installation failed!", "Installation fehlgeschlagen!"), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index d2ae3eb5c..f82880014 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 90144c694..4f9930460 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 4589844c2..17afe267f 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalación exitosa"), ("Installation failed!", "La instalación ha fallado"), ("Reverse mouse wheel", "Invertir rueda del ratón"), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index ab1d7ab12..cdd23dc77 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 3ce8bca02..42b661544 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 50ca96792..169f302a5 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 5f802e44b..2603ea922 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 9b708ca39..fe0f416cf 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Installazione completata"), ("Installation failed!", "Installazione fallita"), ("Reverse mouse wheel", "Rotella mouse inversa"), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 015ee7af3..41a46e962 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 2897ed5f8..ecb0c0281 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 5a0c14871..e36230c30 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 100e22955..38304ee64 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 7503831bf..5fda39918 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index d488f681d..693925c70 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 91a85a3b1..db35c810e 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 7ca81495d..aeb37fdd1 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index bcc13a0df..017bc3bf3 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index eb9f8161b..a7a4a5820 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Установка выполнена успешно!"), ("Installation failed!", "Установка не выполнена!"), ("Reverse mouse wheel", "Реверсировать колесо мыши"), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 003b2cabc..3f9d7ba79 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 80b9aed1d..c21793171 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index fd2db0c83..490c8b0dd 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 9092d453d..31c461d9e 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index ed8c3697a..804b61b51 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 6b4d176d2..96ad0b0a8 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index a5e193a00..fdb60af9b 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 0fe1369df..1a91f30cb 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 5e533e9bc..6d644f0f7 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 7cc885f56..e03c4fbf0 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index e65fab66b..2171f6f67 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -544,5 +544,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("You May Be Being SCAMMED!", ""), + ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), + ("They are likely a scammer trying to steal your money or other private information.", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } From 2b4a51ba240fa594a3cb19f8eba6c6cb1186828b Mon Sep 17 00:00:00 2001 From: Sahil Yeole <73148455+sahilyeole@users.noreply.github.com> Date: Mon, 11 Sep 2023 21:55:06 +0530 Subject: [PATCH 20/90] Add scam image --- flutter/assets/scam.png | Bin 0 -> 642146 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 flutter/assets/scam.png diff --git a/flutter/assets/scam.png b/flutter/assets/scam.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccad3343b8cf542427220cfa719d1bd92f5d426 GIT binary patch literal 642146 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

g)EFFnCa3(+UN9yMtCaDhgaP^xITK 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

&+QP8&-Dd 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

A5RuDa{R(?a@4E4_xgJk_xJDI^7 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%0D51rXtcIzHk+y(7~j@cdIy|UtsQwgZ$$3&rew7L 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 z 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�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

usc4t9I&F4!0GF1~a>y#H7H3|d8|=R`W|7!u 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 literal 0 HcmV?d00001 From d4f4a649371f88a24fa6033fc4c86218b8b0cec4 Mon Sep 17 00:00:00 2001 From: Sahil Yeole <73148455+sahilyeole@users.noreply.github.com> Date: Mon, 11 Sep 2023 21:57:45 +0530 Subject: [PATCH 21/90] remove empty line --- flutter/lib/mobile/pages/server_page.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/flutter/lib/mobile/pages/server_page.dart b/flutter/lib/mobile/pages/server_page.dart index f34fda733..113b75e2b 100644 --- a/flutter/lib/mobile/pages/server_page.dart +++ b/flutter/lib/mobile/pages/server_page.dart @@ -230,7 +230,6 @@ class ServiceNotRunningNotification extends StatelessWidget { }, ); } - } class ScamWarningDialog extends StatefulWidget { From 9129e82804b14adcefbb882648cbc8cedaeeaef3 Mon Sep 17 00:00:00 2001 From: Andrzej Rudnik Date: Mon, 11 Sep 2023 20:54:33 +0200 Subject: [PATCH 22/90] Update pl.rs --- src/lang/pl.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/lang/pl.rs b/src/lang/pl.rs index d488f681d..cea9b69bd 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -528,21 +528,21 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Move tab to new window", "Przenieś zakładkę do nowego okna"), ("Can not be empty", "Nie może być puste"), ("Already exists", "Już istnieje"), - ("Change Password", ""), - ("Refresh Password", ""), - ("ID", ""), - ("Grid View", ""), - ("List View", ""), - ("Select", ""), - ("Toggle Tags", ""), - ("pull_ab_failed_tip", ""), - ("push_ab_failed_tip", ""), - ("synced_peer_readded_tip", ""), - ("Change Color", ""), - ("Primary Color", ""), - ("HSV Color", ""), - ("Installation Successful!", ""), - ("Installation failed!", ""), - ("Reverse mouse wheel", ""), + ("Change Password", "Zmień hasło"), + ("Refresh Password", "Odśwież hasło"), + ("ID", "ID"), + ("Grid View", "Widok siatki"), + ("List View", "Widok listy"), + ("Select", "Wybierz"), + ("Toggle Tags", "Przełącz tagi"), + ("pull_ab_failed_tip", "Aktualizacja książki adresowej nie powiodła się"), + ("push_ab_failed_tip", "Nie udało się zsynchronizować książki adresowej z serwerem"), + ("synced_peer_readded_tip", "Urządzenia, które były obecne w ostatnich sesjach, zostaną ponownie dodane do książki adresowej"), + ("Change Color", "Zmień kolor"), + ("Primary Color", "Kolor podstawowy"), + ("HSV Color", "Kolor HSV"), + ("Installation Successful!", "Instalacja zakończona!"), + ("Installation failed!", "Instalacja nie powiodła się"), + ("Reverse mouse wheel", "Odwróć rolkę myszki"), ].iter().cloned().collect(); } From e3d34c46c79bd21012c092011833d9859662c147 Mon Sep 17 00:00:00 2001 From: Ibnul Mutaki Date: Tue, 12 Sep 2023 13:08:19 +0700 Subject: [PATCH 23/90] update text indo --- src/lang/id.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lang/id.rs b/src/lang/id.rs index 5f802e44b..e85811772 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -541,8 +541,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Change Color", "Ganti warna"), ("Primary Color", "Warna utama"), ("HSV Color", "Warna HSV"), - ("Installation Successful!", ""), - ("Installation failed!", ""), - ("Reverse mouse wheel", ""), + ("Installation Successful!", "Instalasi berhasil!"), + ("Installation failed!", "Instalasi gagal!"), + ("Reverse mouse wheel", "Balikkan arah scroll mouse!"), ].iter().cloned().collect(); } From 4c4c62c7e57f523578017ac48f155d1e05d05880 Mon Sep 17 00:00:00 2001 From: RustDesk <71636191+rustdesk@users.noreply.github.com> Date: Wed, 13 Sep 2023 10:19:43 +0800 Subject: [PATCH 24/90] Update server_page.dart change countdown to 12 --- flutter/lib/mobile/pages/server_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/lib/mobile/pages/server_page.dart b/flutter/lib/mobile/pages/server_page.dart index 113b75e2b..bebfc2354 100644 --- a/flutter/lib/mobile/pages/server_page.dart +++ b/flutter/lib/mobile/pages/server_page.dart @@ -242,7 +242,7 @@ class ScamWarningDialog extends StatefulWidget { } class _ScamWarningDialogState extends State { - int _countdown = 6; + int _countdown = 12; bool show_warning = false; late Timer _timer; late ServerModel _serverModel; From 45b0e7dc0186022ec28076cee9dbadf65e3d5948 Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 11 Sep 2023 19:51:58 +0800 Subject: [PATCH 25/90] translate placeholders ui:{value}, translation: {} Signed-off-by: 21pages --- src/lang.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/src/lang.rs b/src/lang.rs index 75c067e14..fb10230c4 100644 --- a/src/lang.rs +++ b/src/lang.rs @@ -1,5 +1,7 @@ +use hbb_common::regex::Regex; use std::ops::Deref; +mod ar; mod ca; mod cn; mod cs; @@ -17,6 +19,7 @@ mod it; mod ja; mod ko; mod kz; +mod lt; mod nl; mod pl; mod ptbr; @@ -32,8 +35,6 @@ mod tr; mod tw; mod ua; mod vn; -mod lt; -mod ar; pub const LANGS: &[(&str, &str)] = &[ ("en", "English"), @@ -137,16 +138,67 @@ pub fn translate_locale(name: String, locale: &str) -> String { "ar" => ar::T.deref(), _ => en::T.deref(), }; + let (name, placeholder_value) = extract_placeholder(&name); + let replace = |s: &&str| { + let mut s = s.to_string(); + if let Some(value) = placeholder_value.as_ref() { + s = s.replace("{}", &value); + } + s + }; if let Some(v) = m.get(&name as &str) { if v.is_empty() { if lang != "en" { if let Some(v) = en::T.get(&name as &str) { - return v.to_string(); + return replace(v); } } } else { - return v.to_string(); + return replace(v); } } - name + replace(&name.as_str()) +} + +// Matching pattern is {} +// Write {value} in the UI and {} in the translation file +// +// Example: +// Write in the UI: translate("There are {24} hours in a day") +// Write in the translation file: ("There are {} hours in a day", "{} hours make up a day") +fn extract_placeholder(input: &str) -> (String, Option) { + if let Ok(re) = Regex::new(r#"\{(.*?)\}"#) { + if let Some(captures) = re.captures(input) { + if let Some(inner_match) = captures.get(1) { + let name = re.replace(input, "{}").to_string(); + let value = inner_match.as_str().to_string(); + return (name, Some(value)); + } + } + } + (input.to_string(), None) +} + +mod test { + #[test] + fn test_extract_placeholders() { + use super::extract_placeholder as f; + + assert_eq!(f(""), ("".to_string(), None)); + assert_eq!( + f("{3} sessions"), + ("{} sessions".to_string(), Some("3".to_string())) + ); + assert_eq!(f(" } { "), (" } { ".to_string(), None)); + // Allow empty value + assert_eq!( + f("{} sessions"), + ("{} sessions".to_string(), Some("".to_string())) + ); + // Match only the first one + assert_eq!( + f("{2} times {4} makes {8}"), + ("{} times {4} makes {8}".to_string(), Some("2".to_string())) + ); + } } From c254eebea233da2a0e3b16db33f6f5dca1a48824 Mon Sep 17 00:00:00 2001 From: 21pages Date: Sat, 9 Sep 2023 09:45:05 +0800 Subject: [PATCH 26/90] windows/mac tray tooltip show controlled session count * ubuntu 22.04 can't see tooltip Signed-off-by: 21pages --- src/ipc.rs | 12 +++++ src/lang/ar.rs | 1 + src/lang/ca.rs | 1 + src/lang/cn.rs | 1 + src/lang/cs.rs | 1 + src/lang/da.rs | 1 + src/lang/de.rs | 1 + src/lang/el.rs | 1 + src/lang/eo.rs | 1 + src/lang/es.rs | 1 + src/lang/fa.rs | 1 + src/lang/fr.rs | 1 + src/lang/hu.rs | 1 + src/lang/id.rs | 1 + src/lang/it.rs | 1 + src/lang/ja.rs | 1 + src/lang/ko.rs | 1 + src/lang/kz.rs | 1 + src/lang/lt.rs | 1 + src/lang/nl.rs | 1 + src/lang/pl.rs | 1 + src/lang/pt_PT.rs | 1 + src/lang/ptbr.rs | 1 + src/lang/ro.rs | 1 + src/lang/ru.rs | 1 + src/lang/sk.rs | 1 + src/lang/sl.rs | 1 + src/lang/sq.rs | 1 + src/lang/sr.rs | 1 + src/lang/sv.rs | 1 + src/lang/template.rs | 1 + src/lang/th.rs | 1 + src/lang/tr.rs | 1 + src/lang/tw.rs | 1 + src/lang/ua.rs | 1 + src/lang/vn.rs | 1 + src/tray.rs | 102 +++++++++++++++++++++++++++++++++++++------ 37 files changed, 135 insertions(+), 14 deletions(-) diff --git a/src/ipc.rs b/src/ipc.rs index 1cbd994bb..db41b8649 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -234,6 +234,8 @@ pub enum Data { #[cfg(windows)] SyncWinCpuUsage(Option), FileTransferLog(String), + #[cfg(any(windows, target_os = "macos"))] + ControlledSessionCount(usize), } #[tokio::main(flavor = "current_thread")] @@ -482,6 +484,16 @@ async fn handle(data: Data, stream: &mut Connection) { #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] Data::Plugin(plugin) => crate::plugin::ipc::handle_plugin(plugin, stream).await, + #[cfg(any(windows, target_os = "macos"))] + Data::ControlledSessionCount(_) => { + allow_err!( + stream + .send(&Data::ControlledSessionCount( + crate::Connection::alive_conns().len() + )) + .await + ); + } _ => {} } } diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 4a1f8486c..33782738f 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 55e01fefa..65c4ea9ce 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 5fdfa460e..006edd270 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "安装成功!"), ("Installation failed!", "安装失败!"), ("Reverse mouse wheel", "鼠标滚轮反向"), + ("{} sessions", "{}个会话"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 37473e0b6..45e224d81 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 9a9ecdfe1..889f82634 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index c307281ee..9185f3288 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Installation erfolgreich!"), ("Installation failed!", "Installation fehlgeschlagen!"), ("Reverse mouse wheel", "Mausrad rückwärts drehen"), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index d2ae3eb5c..3440486f7 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 90144c694..5a8c4da1f 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 4589844c2..484d6fe5b 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalación exitosa"), ("Installation failed!", "La instalación ha fallado"), ("Reverse mouse wheel", "Invertir rueda del ratón"), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index ab1d7ab12..86dbbe013 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 3ce8bca02..9dc310940 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 50ca96792..4a24572cd 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index e85811772..d7c8aed82 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalasi berhasil!"), ("Installation failed!", "Instalasi gagal!"), ("Reverse mouse wheel", "Balikkan arah scroll mouse!"), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 9b708ca39..dc1d09020 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Installazione completata"), ("Installation failed!", "Installazione fallita"), ("Reverse mouse wheel", "Rotella mouse inversa"), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 015ee7af3..1e2829bd4 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 2897ed5f8..a3c251e86 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 5a0c14871..0b956d66c 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 100e22955..c64554239 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 7503831bf..d4038e2ed 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index cea9b69bd..5a727cfa1 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalacja zakończona!"), ("Installation failed!", "Instalacja nie powiodła się"), ("Reverse mouse wheel", "Odwróć rolkę myszki"), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 91a85a3b1..7b31cc813 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 7ca81495d..c5134e9dd 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index bcc13a0df..23fc8bf82 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index eb9f8161b..d231d3ef0 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Установка выполнена успешно!"), ("Installation failed!", "Установка не выполнена!"), ("Reverse mouse wheel", "Реверсировать колесо мыши"), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 003b2cabc..16b33ee44 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 80b9aed1d..7cb0c677d 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index fd2db0c83..028096c6d 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 9092d453d..55ae4022c 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index ed8c3697a..ca4adea6b 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 6b4d176d2..48a710e5d 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index a5e193a00..abe318b18 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 0fe1369df..b38c3e497 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 5e533e9bc..22cd296c9 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 7cc885f56..dba9b625b 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index e65fab66b..6a6b8366b 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -544,5 +544,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), + ("{} sessions", ""), ].iter().cloned().collect(); } diff --git a/src/tray.rs b/src/tray.rs index 2f4aae93a..8dac19bab 100644 --- a/src/tray.rs +++ b/src/tray.rs @@ -1,5 +1,11 @@ +use crate::{client::translate, ipc::Data}; +use hbb_common::{allow_err, log, tokio}; +use std::{ + sync::{Arc, Mutex}, + time::Duration, +}; + pub fn start_tray() { - use hbb_common::{allow_err, log}; allow_err!(make_tray()); } @@ -40,31 +46,44 @@ pub fn make_tray() -> hbb_common::ResultType<()> { let event_loop = EventLoopBuilder::new().build(); let tray_menu = Menu::new(); - let quit_i = MenuItem::new(crate::client::translate("Exit".to_owned()), true, None); - let open_i = MenuItem::new(crate::client::translate("Open".to_owned()), true, None); + let quit_i = MenuItem::new(translate("Exit".to_owned()), true, None); + let open_i = MenuItem::new(translate("Open".to_owned()), true, None); tray_menu.append_items(&[&open_i, &quit_i]); - - let _tray_icon = Some( - TrayIconBuilder::new() - .with_menu(Box::new(tray_menu)) - .with_tooltip(format!( + let tooltip = |count: usize| { + if count == 0 { + format!( "{} {}", crate::get_app_name(), - crate::lang::translate("Service is running".to_owned()) - )) + translate("Service is running".to_owned()), + ) + } else { + format!( + "{} - {}\n{}", + crate::get_app_name(), + translate("Ready".to_owned()), + translate("{".to_string() + &format!("{count}") + "} sessions"), + ) + } + }; + let tray_icon = Some( + TrayIconBuilder::new() + .with_menu(Box::new(tray_menu)) + .with_tooltip(tooltip(0)) .with_icon(icon) .build()?, ); + let tray_icon = Arc::new(Mutex::new(tray_icon)); let menu_channel = MenuEvent::receiver(); let tray_channel = TrayEvent::receiver(); + #[cfg(not(target_os = "linux"))] + let (ipc_sender, ipc_receiver) = std::sync::mpsc::channel::(); let mut docker_hiden = false; let open_func = move || { - if cfg!(not(feature = "flutter")) - { - crate::run_me::<&str>(vec![]).ok(); - return; + if cfg!(not(feature = "flutter")) { + crate::run_me::<&str>(vec![]).ok(); + return; } #[cfg(target_os = "macos")] crate::platform::macos::handle_application_should_open_untitled_file(); @@ -89,6 +108,11 @@ pub fn make_tray() -> hbb_common::ResultType<()> { } }; + // ubuntu 22.04 can't see tooltip + #[cfg(not(target_os = "linux"))] + std::thread::spawn(move || { + start_query_session_count(ipc_sender.clone()); + }); event_loop.run(move |_event, _, control_flow| { if !docker_hiden { #[cfg(target_os = "macos")] @@ -121,5 +145,55 @@ pub fn make_tray() -> hbb_common::ResultType<()> { open_func(); } } + + #[cfg(not(target_os = "linux"))] + if let Ok(data) = ipc_receiver.try_recv() { + match data { + Data::ControlledSessionCount(count) => { + tray_icon + .lock() + .unwrap() + .as_mut() + .map(|t| t.set_tooltip(Some(tooltip(count)))); + } + _ => {} + } + } }); } + +#[cfg(not(target_os = "linux"))] +#[tokio::main(flavor = "current_thread")] +async fn start_query_session_count(sender: std::sync::mpsc::Sender) { + let mut last_count = 0; + loop { + if let Ok(mut c) = crate::ipc::connect(1000, "").await { + let mut timer = tokio::time::interval(Duration::from_secs(1)); + loop { + tokio::select! { + res = c.next() => { + match res { + Err(err) => { + log::error!("ipc connection closed: {}", err); + break; + } + + Ok(Some(Data::ControlledSessionCount(count))) => { + if count != last_count { + last_count = count; + sender.send(Data::ControlledSessionCount(count)).ok(); + } + } + _ => {} + } + } + + _ = timer.tick() => { + c.send(&Data::ControlledSessionCount(0)).await.ok(); + } + } + } + } + hbb_common::sleep(1.).await; + } +} From db0ab2e4a9e226da23416d45ff64ca168ef58c47 Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 11 Sep 2023 15:19:07 +0800 Subject: [PATCH 27/90] try start tray when a new controlled connection is established for windows flutter Signed-off-by: 21pages --- src/server/connection.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/connection.rs b/src/server/connection.rs index c9f07eb78..85db55136 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -1351,6 +1351,12 @@ impl Connection { log::error!("ipc to connection manager exit: {}", err); } }); + #[cfg(all(windows, feature = "flutter"))] + std::thread::spawn(|| { + if crate::is_server() && !crate::check_process("--tray", false) { + crate::platform::run_as_user(vec!["--tray"]).ok(); + } + }); } } From 55dbcb646b5baef799b11172ffc08d3c033fb988 Mon Sep 17 00:00:00 2001 From: 21pages Date: Sat, 9 Sep 2023 15:23:26 +0800 Subject: [PATCH 28/90] windows remove "--cm-no-ui", "--cm --hide" Signed-off-by: 21pages --- src/core_main.rs | 2 +- src/hbbs_http/sync.rs | 1 + src/server/connection.rs | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/core_main.rs b/src/core_main.rs index 3fe1a1630..e7bb4d0f6 100644 --- a/src/core_main.rs +++ b/src/core_main.rs @@ -404,7 +404,7 @@ pub fn core_main() -> Option> { crate::ui_interface::start_option_status_sync(); } else if args[0] == "--cm-no-ui" { #[cfg(feature = "flutter")] - #[cfg(not(any(target_os = "android", target_os = "ios")))] + #[cfg(not(any(target_os = "android", target_os = "ios", target_os = "windows")))] crate::flutter::connection_manager::start_cm_no_ui(); return None; } else { diff --git a/src/hbbs_http/sync.rs b/src/hbbs_http/sync.rs index 9db6c1c93..e997a2794 100644 --- a/src/hbbs_http/sync.rs +++ b/src/hbbs_http/sync.rs @@ -157,6 +157,7 @@ fn handle_config_options(config_options: HashMap) { Config::set_options(options); } +#[allow(unused)] #[cfg(not(any(target_os = "ios")))] pub fn is_pro() -> bool { PRO.lock().unwrap().clone() diff --git a/src/server/connection.rs b/src/server/connection.rs index 85db55136..969eb47a1 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -2412,7 +2412,10 @@ async fn start_ipc( if let Ok(s) = crate::ipc::connect(1000, "_cm").await { stream = Some(s); } else { + #[allow(unused_mut)] + #[allow(unused_assignments)] let mut args = vec!["--cm"]; + #[cfg(not(windows))] if crate::hbbs_http::sync::is_pro() && password::hide_cm() { args.push("--hide"); } From 18c9ad25be240e46c0ca8cdd9adc0d78c9119ff4 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Wed, 13 Sep 2023 10:41:48 +0530 Subject: [PATCH 29/90] remove lang Signed-off-by: Sahil Yeole --- src/lang/ar.rs | 6 ------ src/lang/ca.rs | 6 ------ src/lang/cn.rs | 6 ------ src/lang/cs.rs | 6 ------ src/lang/da.rs | 6 ------ src/lang/de.rs | 6 ------ src/lang/el.rs | 6 ------ src/lang/eo.rs | 6 ------ src/lang/es.rs | 6 ------ src/lang/fa.rs | 6 ------ src/lang/fr.rs | 6 ------ src/lang/hu.rs | 6 ------ src/lang/id.rs | 6 ------ src/lang/it.rs | 6 ------ src/lang/ja.rs | 6 ------ src/lang/ko.rs | 6 ------ src/lang/kz.rs | 6 ------ src/lang/lt.rs | 6 ------ src/lang/nl.rs | 6 ------ src/lang/pl.rs | 6 ------ src/lang/pt_PT.rs | 6 ------ src/lang/ptbr.rs | 6 ------ src/lang/ro.rs | 6 ------ src/lang/ru.rs | 6 ------ src/lang/sk.rs | 6 ------ src/lang/sl.rs | 6 ------ src/lang/sq.rs | 6 ------ src/lang/sr.rs | 6 ------ src/lang/sv.rs | 6 ------ src/lang/template.rs | 6 ------ src/lang/th.rs | 6 ------ src/lang/tr.rs | 6 ------ src/lang/tw.rs | 6 ------ src/lang/ua.rs | 6 ------ src/lang/vn.rs | 6 ------ 35 files changed, 210 deletions(-) diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 69a0242f3..4a1f8486c 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index ba8ef4b9c..55e01fefa 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 03169c606..5fdfa460e 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "安装成功!"), ("Installation failed!", "安装失败!"), ("Reverse mouse wheel", "鼠标滚轮反向"), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 8ac9bc6a2..37473e0b6 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 1a5279f91..9a9ecdfe1 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 5b35cf8b4..cc0ae6af9 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Installation erfolgreich!"), ("Installation failed!", "Installation fehlgeschlagen!"), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index f82880014..d2ae3eb5c 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 4f9930460..90144c694 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 17afe267f..4589844c2 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalación exitosa"), ("Installation failed!", "La instalación ha fallado"), ("Reverse mouse wheel", "Invertir rueda del ratón"), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index cdd23dc77..ab1d7ab12 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 42b661544..3ce8bca02 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 169f302a5..50ca96792 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 2603ea922..5f802e44b 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index fe0f416cf..9b708ca39 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Installazione completata"), ("Installation failed!", "Installazione fallita"), ("Reverse mouse wheel", "Rotella mouse inversa"), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 41a46e962..015ee7af3 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index ecb0c0281..2897ed5f8 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index e36230c30..5a0c14871 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 38304ee64..100e22955 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 5fda39918..7503831bf 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 693925c70..d488f681d 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index db35c810e..91a85a3b1 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index aeb37fdd1..7ca81495d 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index 017bc3bf3..bcc13a0df 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index a7a4a5820..eb9f8161b 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Установка выполнена успешно!"), ("Installation failed!", "Установка не выполнена!"), ("Reverse mouse wheel", "Реверсировать колесо мыши"), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 3f9d7ba79..003b2cabc 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index c21793171..80b9aed1d 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 490c8b0dd..fd2db0c83 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 31c461d9e..9092d453d 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 804b61b51..ed8c3697a 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 96ad0b0a8..6b4d176d2 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index fdb60af9b..a5e193a00 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 1a91f30cb..0fe1369df 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 6d644f0f7..5e533e9bc 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index e03c4fbf0..7cc885f56 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 2171f6f67..e65fab66b 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -544,11 +544,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", ""), ("Installation failed!", ""), ("Reverse mouse wheel", ""), - ("You May Be Being SCAMMED!", ""), - ("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.", ""), - ("They are likely a scammer trying to steal your money or other private information.", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), ].iter().cloned().collect(); } From 1e548af9879596aab7b5e8add05dc4ffa14b1fbd Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Wed, 13 Sep 2023 11:00:07 +0530 Subject: [PATCH 30/90] update lang Signed-off-by: Sahil Yeole --- flutter/lib/mobile/pages/server_page.dart | 6 +++--- src/lang/ar.rs | 6 ++++++ src/lang/ca.rs | 6 ++++++ src/lang/cn.rs | 6 ++++++ src/lang/cs.rs | 6 ++++++ src/lang/da.rs | 6 ++++++ src/lang/de.rs | 6 ++++++ src/lang/el.rs | 6 ++++++ src/lang/en.rs | 6 ++++++ src/lang/eo.rs | 6 ++++++ src/lang/es.rs | 6 ++++++ src/lang/fa.rs | 6 ++++++ src/lang/fr.rs | 6 ++++++ src/lang/hu.rs | 6 ++++++ src/lang/id.rs | 6 ++++++ src/lang/it.rs | 6 ++++++ src/lang/ja.rs | 6 ++++++ src/lang/ko.rs | 6 ++++++ src/lang/kz.rs | 6 ++++++ src/lang/lt.rs | 6 ++++++ src/lang/nl.rs | 6 ++++++ src/lang/pl.rs | 6 ++++++ src/lang/pt_PT.rs | 6 ++++++ src/lang/ptbr.rs | 6 ++++++ src/lang/ro.rs | 6 ++++++ src/lang/ru.rs | 6 ++++++ src/lang/sk.rs | 6 ++++++ src/lang/sl.rs | 6 ++++++ src/lang/sq.rs | 6 ++++++ src/lang/sr.rs | 6 ++++++ src/lang/sv.rs | 6 ++++++ src/lang/template.rs | 6 ++++++ src/lang/th.rs | 6 ++++++ src/lang/tr.rs | 6 ++++++ src/lang/tw.rs | 6 ++++++ src/lang/ua.rs | 6 ++++++ src/lang/vn.rs | 6 ++++++ 37 files changed, 219 insertions(+), 3 deletions(-) diff --git a/flutter/lib/mobile/pages/server_page.dart b/flutter/lib/mobile/pages/server_page.dart index bebfc2354..e31312905 100644 --- a/flutter/lib/mobile/pages/server_page.dart +++ b/flutter/lib/mobile/pages/server_page.dart @@ -319,7 +319,7 @@ class _ScamWarningDialogState extends State { ), SizedBox(height: 18), Text( - translate("You May Be Being SCAMMED!"), + translate("scam_title"), textAlign: TextAlign.center, style: TextStyle( color: Colors.white, @@ -329,8 +329,8 @@ class _ScamWarningDialogState extends State { ), SizedBox(height: 18), Text( - translate("If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately.")+"\n\n" - +translate("They are likely a scammer trying to steal your money or other private information.")+"\n", + translate("scam_text1")+"\n\n" + +translate("scam_text2")+"\n", style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 33782738f..52f859c75 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 65c4ea9ce..2abbde617 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 006edd270..4fd3db18a 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", "安装失败!"), ("Reverse mouse wheel", "鼠标滚轮反向"), ("{} sessions", "{}个会话"), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 45e224d81..90a1482fb 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 889f82634..7af1c2282 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 9185f3288..d72f51a06 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", "Installation fehlgeschlagen!"), ("Reverse mouse wheel", "Mausrad rückwärts drehen"), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index 3440486f7..177d731b2 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/en.rs b/src/lang/en.rs index a69164a3b..3384f7e8a 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -82,5 +82,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Start session recording", "Start Session Recording"), ("Stop session recording", "Stop Session Recording"), ("Enable remote configuration modification", "Enable Remote Configuration Modification"), + ("scam_title", "You May Be Being SCAMMED!"), + ("scam_text1", "If you are on the phone with someone you DON'T know AND TRUST who has asked you to use RustDesk and start the service, do not proceed and hang up immediately."), + ("scam_text2", "They are likely a scammer trying to steal your money or other private information."), + ("Don't show again", "Don't show again"), + ("I Agree", "I Agree"), + ("Decline", "Decline"), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 5a8c4da1f..ecf1fe00f 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 484d6fe5b..36b909f8f 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", "La instalación ha fallado"), ("Reverse mouse wheel", "Invertir rueda del ratón"), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 86dbbe013..39169d816 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 9dc310940..ea9dcef50 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 4a24572cd..62a41b96a 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index d7c8aed82..35da2fd89 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", "Instalasi gagal!"), ("Reverse mouse wheel", "Balikkan arah scroll mouse!"), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index dc1d09020..f27e5ec51 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", "Installazione fallita"), ("Reverse mouse wheel", "Rotella mouse inversa"), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 1e2829bd4..af74fc4ed 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index a3c251e86..7fe3da853 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 0b956d66c..eb8b7df61 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index c64554239..53ce2a23f 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index d4038e2ed..d74957aea 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 5a727cfa1..58650a593 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", "Instalacja nie powiodła się"), ("Reverse mouse wheel", "Odwróć rolkę myszki"), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 7b31cc813..18736a1bc 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index c5134e9dd..b77862054 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index 23fc8bf82..8be7a1600 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index d231d3ef0..d4effc6d6 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", "Установка не выполнена!"), ("Reverse mouse wheel", "Реверсировать колесо мыши"), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 16b33ee44..f7620c7c7 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 7cb0c677d..20b6cc819 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 028096c6d..809b55a2a 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 55ae4022c..4b927e917 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index ca4adea6b..b048b9c8e 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 48a710e5d..08f7254c9 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree",""), + ("Decline",""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index abe318b18..c1e963461 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index b38c3e497..ecf9ea5d9 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 22cd296c9..e55552f8e 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index dba9b625b..aaee1a82b 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 6a6b8366b..2116400ab 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -545,5 +545,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", ""), ("Reverse mouse wheel", ""), ("{} sessions", ""), + ("scam_title", ""), + ("scam_text1", ""), + ("scam_text2", ""), + ("Don't show again", ""), + ("I Agree", ""), + ("Decline", ""), ].iter().cloned().collect(); } From e2ccaf2c91b01fc662fd6d00ff96ed2a61d07c54 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Wed, 13 Sep 2023 13:54:02 +0800 Subject: [PATCH 31/90] allow hide cm for self-host pro --- src/server/connection.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/connection.rs b/src/server/connection.rs index 8ba8fdc15..add13e3df 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -2415,7 +2415,6 @@ async fn start_ipc( #[allow(unused_mut)] #[allow(unused_assignments)] let mut args = vec!["--cm"]; - #[cfg(not(windows))] if crate::hbbs_http::sync::is_pro() && password::hide_cm() { args.push("--hide"); } From 0a0653358cc0b36ded927d096598cc2169e1ce71 Mon Sep 17 00:00:00 2001 From: 21pages Date: Wed, 13 Sep 2023 13:45:40 +0800 Subject: [PATCH 32/90] auto disconnect Signed-off-by: 21pages --- flutter/lib/common/widgets/dialog.dart | 47 +++++++++++++++ .../desktop/pages/desktop_setting_page.dart | 58 +++++++++++++++++++ flutter/lib/mobile/pages/settings_page.dart | 58 +++++++++++++++++++ src/lang/ar.rs | 3 + src/lang/ca.rs | 3 + src/lang/cn.rs | 3 + src/lang/cs.rs | 3 + src/lang/da.rs | 3 + src/lang/de.rs | 3 + src/lang/el.rs | 3 + src/lang/en.rs | 2 + src/lang/eo.rs | 3 + src/lang/es.rs | 3 + src/lang/fa.rs | 3 + src/lang/fr.rs | 3 + src/lang/hu.rs | 3 + src/lang/id.rs | 3 + src/lang/it.rs | 3 + src/lang/ja.rs | 3 + src/lang/ko.rs | 3 + src/lang/kz.rs | 3 + src/lang/lt.rs | 3 + src/lang/nl.rs | 3 + src/lang/pl.rs | 3 + src/lang/pt_PT.rs | 3 + src/lang/ptbr.rs | 3 + src/lang/ro.rs | 3 + src/lang/ru.rs | 3 + src/lang/sk.rs | 3 + src/lang/sl.rs | 3 + src/lang/sq.rs | 3 + src/lang/sr.rs | 3 + src/lang/sv.rs | 3 + src/lang/template.rs | 7 ++- src/lang/th.rs | 3 + src/lang/tr.rs | 3 + src/lang/tw.rs | 3 + src/lang/ua.rs | 3 + src/lang/vn.rs | 3 + src/server/connection.rs | 36 ++++++++++++ 40 files changed, 308 insertions(+), 2 deletions(-) diff --git a/flutter/lib/common/widgets/dialog.dart b/flutter/lib/common/widgets/dialog.dart index a2a4e2b23..0cb2741be 100644 --- a/flutter/lib/common/widgets/dialog.dart +++ b/flutter/lib/common/widgets/dialog.dart @@ -302,6 +302,53 @@ Future changeDirectAccessPort( return controller.text; } +Future changeAutoDisconnectTimeout(String old) async { + final controller = TextEditingController(text: old); + await gFFI.dialogManager.show((setState, close, context) { + return CustomAlertDialog( + title: Text(translate("Timeout in minutes")), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 8.0), + Row( + children: [ + Expanded( + child: TextField( + maxLines: null, + keyboardType: TextInputType.number, + decoration: InputDecoration( + hintText: '10', + isCollapsed: true, + suffix: IconButton( + padding: EdgeInsets.zero, + icon: const Icon(Icons.clear, size: 16), + onPressed: () => controller.clear())), + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp( + r'^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$')), + ], + controller: controller, + autofocus: true), + ), + ], + ), + ], + ), + actions: [ + dialogButton("Cancel", onPressed: close, isOutline: true), + dialogButton("OK", onPressed: () async { + await bind.mainSetOption( + key: 'auto-disconnect-timeout', value: controller.text); + close(); + }), + ], + onCancel: close, + ); + }); + return controller.text; +} + class DialogTextField extends StatelessWidget { final String title; final String? hintText; diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 2da6ab1e7..2f5180bf6 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -728,6 +728,7 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin { reverse: true, enabled: enabled), ...directIp(context), whitelist(), + ...autoDisconnect(context), ]); } @@ -906,6 +907,63 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin { )); })); } + + List autoDisconnect(BuildContext context) { + TextEditingController controller = TextEditingController(); + update() => setState(() {}); + RxBool applyEnabled = false.obs; + final optionKey = 'allow-auto-disconnect'; + final timeoutKey = 'auto-disconnect-timeout'; + return [ + _OptionCheckBox(context, 'auto_disconnect_option_tip', optionKey, + update: update, enabled: !locked), + () { + bool enabled = + option2bool(optionKey, bind.mainGetOptionSync(key: optionKey)); + if (!enabled) applyEnabled.value = false; + controller.text = bind.mainGetOptionSync(key: timeoutKey); + return Offstage( + offstage: !enabled, + child: _SubLabeledWidget( + context, + 'Timeout in minutes', + Row(children: [ + SizedBox( + width: 95, + child: TextField( + controller: controller, + enabled: enabled && !locked, + onChanged: (_) => applyEnabled.value = true, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp( + r'^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$')), + ], + decoration: const InputDecoration( + hintText: '10', + contentPadding: + EdgeInsets.symmetric(vertical: 12, horizontal: 12), + ), + ).marginOnly(right: 15), + ), + Obx(() => ElevatedButton( + onPressed: applyEnabled.value && enabled && !locked + ? () async { + applyEnabled.value = false; + await bind.mainSetOption( + key: timeoutKey, value: controller.text); + } + : null, + child: Text( + translate('Apply'), + ), + )) + ]), + enabled: enabled && !locked, + ), + ); + }(), + ]; + } } class _Network extends StatefulWidget { diff --git a/flutter/lib/mobile/pages/settings_page.dart b/flutter/lib/mobile/pages/settings_page.dart index 1cdfa9609..87d2eb8a1 100644 --- a/flutter/lib/mobile/pages/settings_page.dart +++ b/flutter/lib/mobile/pages/settings_page.dart @@ -45,10 +45,12 @@ class _SettingsState extends State with WidgetsBindingObserver { var _enableDirectIPAccess = false; var _enableRecordSession = false; var _autoRecordIncomingSession = false; + var _allowAutoDisconnect = false; var _localIP = ""; var _directAccessPort = ""; var _fingerprint = ""; var _buildDate = ""; + var _autoDisconnectTimeout = ""; @override void initState() { @@ -151,6 +153,20 @@ class _SettingsState extends State with WidgetsBindingObserver { _buildDate = buildDate; } + final allowAutoDisconnect = option2bool('allow-auto-disconnect', + await bind.mainGetOption(key: 'allow-auto-disconnect')); + if (allowAutoDisconnect != _allowAutoDisconnect) { + update = true; + _allowAutoDisconnect = allowAutoDisconnect; + } + + final autoDisconnectTimeout = + await bind.mainGetOption(key: 'auto-disconnect-timeout'); + if (autoDisconnectTimeout != _autoDisconnectTimeout) { + update = true; + _autoDisconnectTimeout = autoDisconnectTimeout; + } + if (update) { setState(() {}); } @@ -306,6 +322,48 @@ class _SettingsState extends State with WidgetsBindingObserver { await bind.mainSetOption(key: 'direct-server', value: value); setState(() {}); }, + ), + SettingsTile.switchTile( + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(translate("auto_disconnect_option_tip")), + Offstage( + offstage: !_allowAutoDisconnect, + child: Text( + '${_autoDisconnectTimeout.isEmpty ? '10' : _autoDisconnectTimeout} min', + style: Theme.of(context).textTheme.bodySmall, + )), + ])), + Offstage( + offstage: !_allowAutoDisconnect, + child: IconButton( + padding: EdgeInsets.zero, + icon: Icon( + Icons.edit, + size: 20, + ), + onPressed: () async { + final timeout = await changeAutoDisconnectTimeout( + _autoDisconnectTimeout); + setState(() { + _autoDisconnectTimeout = timeout; + }); + })) + ]), + initialValue: _allowAutoDisconnect, + onToggle: (_) async { + _allowAutoDisconnect = !_allowAutoDisconnect; + String value = + bool2option('allow-auto-disconnect', _allowAutoDisconnect); + await bind.mainSetOption(key: 'allow-auto-disconnect', value: value); + setState(() {}); + }, ) ]; if (_hasIgnoreBattery) { diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 52f859c75..c65adef0a 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 2abbde617..1d01bea6b 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 4fd3db18a..1a10b8bd1 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", "超时(分钟)"), + ("auto_disconnect_option_tip", "自动关闭不活跃的会话"), + ("Connection failed due to inactivity", "由于长时间无操作, 连接被自动断开"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 90a1482fb..457dae517 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 7af1c2282..6ea628cee 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index d72f51a06..cb44d7935 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index 177d731b2..710751331 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/en.rs b/src/lang/en.rs index 3384f7e8a..825698385 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -88,5 +88,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", "Don't show again"), ("I Agree", "I Agree"), ("Decline", "Decline"), + ("auto_disconnect_option_tip", "Automatically close incoming sessions on user inactivity"), + ("Connection failed due to inactivity", "Automatically disconnected due to inactivity"), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index ecf1fe00f..7df5c3fa7 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 36b909f8f..1053dcf73 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 39169d816..1fd0be295 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index ea9dcef50..565bd5d42 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 62a41b96a..df19e7bbe 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 35da2fd89..1d4b3b4cf 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index f27e5ec51..33acdbe7d 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index af74fc4ed..1ecb8d9e2 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 7fe3da853..ad05b326f 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index eb8b7df61..e3fec6c5e 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 53ce2a23f..4c9cae2b7 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index d74957aea..43f277a0a 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 58650a593..ec370706e 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 18736a1bc..72a16d62b 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index b77862054..f11435d67 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index 8be7a1600..d4cccc796 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index d4effc6d6..6be1274fd 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index f7620c7c7..0b58db74d 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 20b6cc819..2c82b35da 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 809b55a2a..32dc09f05 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 4b927e917..43ead1444 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index b048b9c8e..867fa9fcc 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 08f7254c9..397d6d380 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -549,7 +549,10 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("scam_text1", ""), ("scam_text2", ""), ("Don't show again", ""), - ("I Agree",""), - ("Decline",""), + ("I Agree", ""), + ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index c1e963461..c5e4d5fbb 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index ecf9ea5d9..28b8d385a 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index e55552f8e..104370258 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index aaee1a82b..7147445e0 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 2116400ab..9b910955e 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -551,5 +551,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Don't show again", ""), ("I Agree", ""), ("Decline", ""), + ("Timeout in minutes", ""), + ("auto_disconnect_option_tip", ""), + ("Connection failed due to inactivity", ""), ].iter().cloned().collect(); } diff --git a/src/server/connection.rs b/src/server/connection.rs index 8ba8fdc15..1c5e45d08 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -204,6 +204,7 @@ pub struct Connection { delay_response_instant: Instant, #[cfg(not(any(target_os = "android", target_os = "ios")))] start_cm_ipc_para: Option, + auto_disconnect_timer: Option<(Instant, u64)>, } impl ConnInner { @@ -343,6 +344,7 @@ impl Connection { rx_desktop_ready, tx_cm_stream_ready, }), + auto_disconnect_timer: None, }; let addr = hbb_common::try_into_v4(addr); if !conn.on_open(addr).await { @@ -605,6 +607,13 @@ impl Connection { _ = second_timer.tick() => { #[cfg(windows)] conn.portable_check(); + if let Some((instant, minute)) = conn.auto_disconnect_timer.as_ref() { + if instant.elapsed().as_secs() > minute * 60 { + conn.send_close_reason_no_retry("Connection failed due to inactivity").await; + conn.on_close("auto disconnect", true).await; + break; + } + } } _ = test_delay_timer.tick() => { if last_recv_time.elapsed() >= SEC30 { @@ -1139,6 +1148,7 @@ impl Connection { let mut s = s.write().unwrap(); #[cfg(not(any(target_os = "android", target_os = "ios")))] let _h = try_start_record_cursor_pos(); + self.auto_disconnect_timer = Self::get_auto_disconenct_timer(); s.add_connection(self.inner.clone(), &noperms); } } @@ -1612,6 +1622,7 @@ impl Connection { } self.input_mouse(me, self.inner.id()); } + self.update_auto_disconnect_timer(); } Some(message::Union::PointerDeviceEvent(pde)) => { #[cfg(any(target_os = "android", target_os = "ios"))] @@ -1647,6 +1658,7 @@ impl Connection { MOUSE_MOVE_TIME.store(get_time(), Ordering::SeqCst); self.input_pointer(pde, self.inner.id()); } + self.update_auto_disconnect_timer(); } #[cfg(any(target_os = "android", target_os = "ios"))] Some(message::Union::KeyEvent(..)) => {} @@ -1702,6 +1714,7 @@ impl Connection { self.input_key(me, false); } } + self.update_auto_disconnect_timer(); } Some(message::Union::Clipboard(_cb)) => { @@ -1890,6 +1903,7 @@ impl Connection { Some(misc::Union::ChatMessage(c)) => { self.send_to_cm(ipc::Data::ChatMessage { text: c.text }); self.chat_unanswered = true; + self.update_auto_disconnect_timer(); } Some(misc::Union::Option(o)) => { self.update_options(&o).await; @@ -1898,6 +1912,7 @@ impl Connection { if r { super::video_service::refresh(); } + self.update_auto_disconnect_timer(); } Some(misc::Union::VideoReceived(_)) => { video_service::notify_video_frame_fetched( @@ -2027,6 +2042,7 @@ impl Connection { let mut msg = Message::new(); msg.set_misc(misc); self.send(msg).await; + self.update_auto_disconnect_timer(); } #[cfg(not(any(target_os = "android", target_os = "ios")))] @@ -2384,6 +2400,26 @@ impl Connection { } self.pressed_modifiers.clear(); } + + fn get_auto_disconenct_timer() -> Option<(Instant, u64)> { + if Config::get_option("allow-auto-disconnect") == "Y" { + let mut minute: u64 = Config::get_option("auto-disconnect-timeout") + .parse() + .unwrap_or(10); + if minute == 0 { + minute = 10; + } + Some((Instant::now(), minute)) + } else { + None + } + } + + fn update_auto_disconnect_timer(&mut self) { + self.auto_disconnect_timer + .as_mut() + .map(|t| t.0 = Instant::now()); + } } pub fn insert_switch_sides_uuid(id: String, uuid: uuid::Uuid) { From b35df54c819103826936ffce3522eccd16e886be Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Wed, 13 Sep 2023 13:59:38 +0200 Subject: [PATCH 33/90] Update Italian language --- src/lang/it.rs | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/lang/it.rs b/src/lang/it.rs index 33acdbe7d..54a96a18d 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -75,9 +75,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Do you want to enter again?", "Vuoi riprovare?"), ("Connection Error", "Errore di connessione"), ("Error", "Errore"), - ("Reset by the peer", "Reimpostata dal peer"), + ("Reset by the peer", "Reimpostata dal dispositivo remoto"), ("Connecting...", "Connessione..."), - ("Connection in progress. Please wait.", "Connessione in corso..."), + ("Connection in progress. Please wait.", "Connessione..."), ("Please try 1 minute later", "Riprova fra 1 minuto"), ("Login Error", "Errore accesso"), ("Successful", "Completato"), @@ -210,7 +210,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Settings", "Impostazioni"), ("Username", "Nome utente"), ("Invalid port", "Numero porta non valido"), - ("Closed manually by the peer", "Chiuso manualmente dal peer"), + ("Closed manually by the peer", "Chiuso manualmente dal dispositivo remoto"), ("Enable remote configuration modification", "Abilita la modifica remota della configurazione"), ("Run without install", "Esegui senza installare"), ("Connect via relay", "Collegati tramite relay"), @@ -301,9 +301,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Succeeded", "Completato"), ("Someone turns on privacy mode, exit", "Qualcuno ha attivato la modalità privacy, uscita"), ("Unsupported", "Non supportato"), - ("Peer denied", "Peer negato"), + ("Peer denied", "Acvesso negato al dispositivo remoto"), ("Please install plugins", "Installa i plugin"), - ("Peer exit", "Uscita peer"), + ("Peer exit", "Uscita dal dispostivo remoto"), ("Failed to turn off", "Impossibile spegnere"), ("Turned off", "Spegni"), ("In privacy mode", "In modalità privacy"), @@ -392,7 +392,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wayland requires Ubuntu 21.04 or higher version.", "Wayland richiede Ubuntu 21.04 o versione successiva."), ("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland richiede una versione superiore della distribuzione Linux.\nProva X11 desktop o cambia il sistema operativo."), ("JumpLink", "Vai a"), - ("Please Select the screen to be shared(Operate on the peer side).", "Seleziona lo schermo da condividere (opera sul lato peer)."), + ("Please Select the screen to be shared(Operate on the peer side).", "Seleziona lo schermo da condividere (opera sul lato dispositivo remoto)."), ("Show RustDesk", "Visualizza RustDesk"), ("This PC", "Questo PC"), ("or", "O"), @@ -477,7 +477,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Empty Username", "Nome utente vuoto"), ("Empty Password", "Password vuota"), ("Me", "Io"), - ("identical_file_tip", "Questo file è identico a quello del peer."), + ("identical_file_tip", "Questo file è identico a quello nel dispositivo remoto."), ("show_monitors_tip", "Visualizza schermi nella barra strumenti"), ("View Mode", "Modalità visualizzazione"), ("login_linux_tip", "Accedi all'account Linux remoto"), @@ -498,8 +498,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "Firma digitale"), ("Copy Fingerprint", "Copia firma digitale"), ("no fingerprints", "Nessuna firma digitale"), - ("Select a peer", "Seleziona un peer"), - ("Select peers", "Seleziona peer"), + ("Select a peer", "Seleziona dispositivo remoto"), + ("Select peers", "Seleziona dispositivi remoti"), ("Plugins", "Plugin"), ("Uninstall", "Disinstalla"), ("Update", "Aggiorna"), @@ -544,15 +544,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Installazione completata"), ("Installation failed!", "Installazione fallita"), ("Reverse mouse wheel", "Rotella mouse inversa"), - ("{} sessions", ""), - ("scam_title", ""), - ("scam_text1", ""), - ("scam_text2", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), - ("Timeout in minutes", ""), + ("{} sessions", "{} sessioni"), + ("scam_title", "Potresti essere stato TRUFFATO!"), + ("scam_text1", "Se sei al telefono con qualcuno che NON conosci NON DI TUA FIDUCIA che ti ha chiesto di usare RustDesk e di avviare il servizio, non procedere e riattacca subito."), + ("scam_text2", "Probabilmente è un truffatore che cerca di rubare i tuoi soldi o altre informazioni private."), + ("Don't show again", "Non visualizzare più"), + ("I Agree", "Accetto"), + ("Decline", "Non accetto"), + ("Timeout in minutes", "Timeout in minuti"), ("auto_disconnect_option_tip", ""), - ("Connection failed due to inactivity", ""), + ("Connection failed due to inactivity", "Connessione non riuscita a causa di inattività"), ].iter().cloned().collect(); } From 88e1245d101cdb595997d3a9f832f406bb4c8e51 Mon Sep 17 00:00:00 2001 From: dignow Date: Wed, 13 Sep 2023 21:02:21 +0800 Subject: [PATCH 34/90] fix, set scrollbar thickness to 12 Signed-off-by: dignow --- flutter/lib/common.dart | 13 ++++++++++--- flutter/lib/consts.dart | 2 ++ flutter/lib/desktop/pages/remote_page.dart | 2 ++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index fbbe6e254..a71bd12b9 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -265,6 +265,14 @@ class MyTheme { ? EdgeInsets.only(left: dialogPadding) : EdgeInsets.only(left: dialogPadding / 3); + static ScrollbarThemeData scrollbarTheme = ScrollbarThemeData( + thickness: MaterialStateProperty.all(kScrollbarThickness), + ); + + static ScrollbarThemeData scrollbarThemeDark = scrollbarTheme.copyWith( + thumbColor: MaterialStateProperty.all(Colors.grey[500]), + ); + static ThemeData lightTheme = ThemeData( brightness: Brightness.light, hoverColor: Color.fromARGB(255, 224, 224, 224), @@ -280,6 +288,7 @@ class MyTheme { ), ), ), + scrollbarTheme: scrollbarTheme, inputDecorationTheme: isDesktop ? InputDecorationTheme( fillColor: grayBg, @@ -364,6 +373,7 @@ class MyTheme { ), ), ), + scrollbarTheme: scrollbarThemeDark, inputDecorationTheme: isDesktop ? InputDecorationTheme( fillColor: Color(0xFF24252B), @@ -390,9 +400,6 @@ class MyTheme { tabBarTheme: const TabBarTheme( labelColor: Colors.white70, ), - scrollbarTheme: ScrollbarThemeData( - thumbColor: MaterialStateProperty.all(Colors.grey[500]), - ), tooltipTheme: tooltipTheme(), splashColor: isDesktop ? Colors.transparent : null, highlightColor: isDesktop ? Colors.transparent : null, diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index 24a9b3fad..c682f9fac 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -13,6 +13,8 @@ const String kPeerPlatformLinux = "Linux"; const String kPeerPlatformMacOS = "Mac OS"; const String kPeerPlatformAndroid = "Android"; +const double kScrollbarThickness = 12.0; + /// [kAppTypeMain] used by 'Desktop Main Page' , 'Mobile (Client and Server)', "Install Page" const String kAppTypeMain = "main"; diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index f265f1895..86d4b05bb 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -694,6 +694,7 @@ class _ImagePaintState extends State { enableCustomMouseWheelScrolling: cursorOverImage.isFalse, customMouseWheelScrollConfig: scrollConfig, child: RawScrollbar( + thickness: kScrollbarThickness, thumbColor: Colors.grey, controller: _horizontal, thumbVisibility: false, @@ -711,6 +712,7 @@ class _ImagePaintState extends State { enableCustomMouseWheelScrolling: cursorOverImage.isFalse, customMouseWheelScrollConfig: scrollConfig, child: RawScrollbar( + thickness: kScrollbarThickness, thumbColor: Colors.grey, controller: _vertical, thumbVisibility: false, From 0b4aad4931a8877c18725e9338cf7e3cda22fffe Mon Sep 17 00:00:00 2001 From: Mr-Update <37781396+Mr-Update@users.noreply.github.com> Date: Wed, 13 Sep 2023 20:44:32 +0200 Subject: [PATCH 35/90] Update de.rs --- src/lang/de.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lang/de.rs b/src/lang/de.rs index cb44d7935..d44a1e98c 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -544,15 +544,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Installation erfolgreich!"), ("Installation failed!", "Installation fehlgeschlagen!"), ("Reverse mouse wheel", "Mausrad rückwärts drehen"), - ("{} sessions", ""), - ("scam_title", ""), - ("scam_text1", ""), - ("scam_text2", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), - ("Timeout in minutes", ""), - ("auto_disconnect_option_tip", ""), - ("Connection failed due to inactivity", ""), + ("{} sessions", "{} Sitzungen"), + ("scam_title", "Sie werden möglicherweise BETROGEN!"), + ("scam_text1", "Wenn Sie mit jemandem telefonieren, den Sie NICHT KENNEN, dem Sie NICHT VERTRAUEN und der Sie gebeten hat, RustDesk zu benutzen und den Dienst zu starten, fahren Sie nicht fort und legen Sie sofort auf."), + ("scam_text2", "Es handelt sich wahrscheinlich um einen Betrüger, der versucht, Ihr Geld oder andere private Informationen zu stehlen."), + ("Don't show again", "Nicht mehr anzeigen"), + ("I Agree", "Ich bin einverstanden"), + ("Decline", "Ablehnen"), + ("Timeout in minutes", "Zeitüberschreitung in Minuten"), + ("auto_disconnect_option_tip", "Automatisches Schließen eingehender Sitzungen bei Inaktivität des Benutzers"), + ("Connection failed due to inactivity", "Automatische Trennung der Verbindung aufgrund von Inaktivität"), ].iter().cloned().collect(); } From 0fb84ccc490d506998cbfaf623e4f0e15998706a Mon Sep 17 00:00:00 2001 From: Andrzej Rudnik Date: Wed, 13 Sep 2023 21:10:19 +0200 Subject: [PATCH 36/90] Update pl.rs --- src/lang/pl.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lang/pl.rs b/src/lang/pl.rs index ec370706e..c85c93407 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -544,15 +544,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalacja zakończona!"), ("Installation failed!", "Instalacja nie powiodła się"), ("Reverse mouse wheel", "Odwróć rolkę myszki"), - ("{} sessions", ""), - ("scam_title", ""), - ("scam_text1", ""), - ("scam_text2", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), - ("Timeout in minutes", ""), - ("auto_disconnect_option_tip", ""), - ("Connection failed due to inactivity", ""), + ("{} sessions", "sesji"), + ("scam_title", "Prawdopodobnie zostałeś OSZUKANY!"), + ("scam_text1", "Jeżeli rozmawiasz przez telefon z osobą której NIE ZNASZ i NIE UFASZ, która prosi Cię o uruchomienie programu RustDesk i uruchomienia usługi - nie rób tego i natychmiast się rozłącz."), + ("scam_text2", "Wygląda to na oszusta, który próbuje ukraść Twoje pieniądze lub inne prywatne informacje."), + ("Don't show again", "Nie pokazuj więcej"), + ("I Agree", "Zgadzam się"), + ("Decline", "Odmawiam"), + ("Timeout in minutes", "Czas bezczynności w minutach"), + ("auto_disconnect_option_tip", "Automatycznie rozłącz sesje przychodzące przy braku aktywności użytkownika"), + ("Connection failed due to inactivity", "Automatycznie rozłącz przy bezczynności"), ].iter().cloned().collect(); } From ec544436743da9d56b412469ad59335ef0a3c9b3 Mon Sep 17 00:00:00 2001 From: RustDesk <71636191+rustdesk@users.noreply.github.com> Date: Thu, 14 Sep 2023 09:33:25 +0800 Subject: [PATCH 37/90] Update pl.rs --- src/lang/pl.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/pl.rs b/src/lang/pl.rs index c85c93407..71c216429 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -544,7 +544,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalacja zakończona!"), ("Installation failed!", "Instalacja nie powiodła się"), ("Reverse mouse wheel", "Odwróć rolkę myszki"), - ("{} sessions", "sesji"), + ("{} sessions", "{} sesji"), ("scam_title", "Prawdopodobnie zostałeś OSZUKANY!"), ("scam_text1", "Jeżeli rozmawiasz przez telefon z osobą której NIE ZNASZ i NIE UFASZ, która prosi Cię o uruchomienie programu RustDesk i uruchomienia usługi - nie rób tego i natychmiast się rozłącz."), ("scam_text2", "Wygląda to na oszusta, który próbuje ukraść Twoje pieniądze lub inne prywatne informacje."), From 98364e83b6dd2d7269e3a4ccc185037806ecbeb8 Mon Sep 17 00:00:00 2001 From: RustDesk <71636191+rustdesk@users.noreply.github.com> Date: Thu, 14 Sep 2023 11:32:58 +0800 Subject: [PATCH 38/90] Update vcpkg-deps-linux.yml --- .github/workflows/vcpkg-deps-linux.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/vcpkg-deps-linux.yml b/.github/workflows/vcpkg-deps-linux.yml index f07621cbb..16b1258c5 100644 --- a/.github/workflows/vcpkg-deps-linux.yml +++ b/.github/workflows/vcpkg-deps-linux.yml @@ -24,7 +24,7 @@ jobs: path: /opt/artifacts key: vcpkg-${{ matrix.job.arch }} - - uses: Kingtous/run-on-arch-action@amd64-support + - uses: rustdesk-org/run-on-arch-action@amd64-support name: Run vcpkg install on ${{ matrix.job.arch }} id: vcpkg with: @@ -85,4 +85,4 @@ jobs: with: name: vcpkg-artifact-${{ matrix.job.arch }} path: | - /opt/artifacts/vcpkg/installed \ No newline at end of file + /opt/artifacts/vcpkg/installed From 7a9f1e9c6cdf8be2538116f3734b192c674ed5d9 Mon Sep 17 00:00:00 2001 From: RustDesk <71636191+rustdesk@users.noreply.github.com> Date: Thu, 14 Sep 2023 12:03:14 +0800 Subject: [PATCH 39/90] Update vcpkg-deps-linux.yml --- .github/workflows/vcpkg-deps-linux.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/vcpkg-deps-linux.yml b/.github/workflows/vcpkg-deps-linux.yml index 16b1258c5..16ed2425b 100644 --- a/.github/workflows/vcpkg-deps-linux.yml +++ b/.github/workflows/vcpkg-deps-linux.yml @@ -40,12 +40,16 @@ jobs: apt update -y case "${{ matrix.job.arch }}" in x86_64) - # CMake 3.15+ - apt install -y gpg wget ca-certificates - echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ bionic main' | tee /etc/apt/sources.list.d/kitware.list >/dev/null - wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null apt update -y - apt install -y curl zip unzip tar git cmake g++ gcc build-essential pkg-config wget nasm yasm ninja-build libjpeg8-dev + apt install -y curl zip unzip tar git g++ gcc build-essential pkg-config wget nasm yasm ninja-build libjpeg8-dev libssl-dev + wget https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2.tar.gz + apt remove -y --purge cmake + tar -zxvf cmake-3.20.2.tar.gz + cd cmake-3.20.2 + ./bootstrap + make + make install + cd - cmake --version gcc -v ;; From 474d2402b72f7967d6a389f0d963ba0dcdc64e12 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 14 Sep 2023 13:57:58 +0530 Subject: [PATCH 40/90] add checkbox for update check on startup Signed-off-by: Sahil Yeole --- flutter/lib/desktop/pages/desktop_setting_page.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 468886cb8..1a31001dc 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -329,6 +329,10 @@ class _GeneralState extends State<_General> { message: translate('software_render_tip'), child: _OptionCheckBox(context, "Always use software rendering", 'allow-always-software-render'), + )); + children.add( + _OptionCheckBox(context, 'Check for software update on startup.','enable-check-update', + isServer: false, )); if (bind.mainShowOption(key: 'allow-linux-headless')) { children.add(_OptionCheckBox( From b88f1dc79a4f26222c85995cce692de1c742c9f8 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 14 Sep 2023 14:26:09 +0530 Subject: [PATCH 41/90] fix flutter check for update Signed-off-by: Sahil Yeole --- src/flutter_ffi.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 69f6f507c..cac47b5ad 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1074,6 +1074,7 @@ pub fn main_get_last_remote_id() -> String { } pub fn main_get_software_update_url() -> String { + crate::common::check_software_update(); crate::common::SOFTWARE_UPDATE_URL.lock().unwrap().clone() } From e8d014d80d976faeb81b451e9f8b878c476bed67 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 14 Sep 2023 16:31:17 +0530 Subject: [PATCH 42/90] feat optional update check Signed-off-by: Sahil Yeole --- src/flutter_ffi.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index cac47b5ad..dbbe0d707 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1,3 +1,5 @@ +use hbb_common::config::Config; + #[cfg(not(any(target_os = "android", target_os = "ios")))] use crate::common::get_default_sound_input; use crate::{ @@ -1074,7 +1076,9 @@ pub fn main_get_last_remote_id() -> String { } pub fn main_get_software_update_url() -> String { - crate::common::check_software_update(); + if (get_local_option("enable-check-update".to_string()) != "N") { + crate::common::check_software_update(); + } crate::common::SOFTWARE_UPDATE_URL.lock().unwrap().clone() } From ae37c2ab2a10341561fdee6622aa1ec4ead05587 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 14 Sep 2023 19:02:53 +0530 Subject: [PATCH 43/90] update checkbox text Signed-off-by: Sahil Yeole --- flutter/lib/desktop/pages/desktop_setting_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index de0d0523f..035a21f41 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -331,7 +331,7 @@ class _GeneralState extends State<_General> { 'allow-always-software-render'), )); children.add( - _OptionCheckBox(context, 'Check for software update on startup.','enable-check-update', + _OptionCheckBox(context, 'Check for software update on startup','enable-check-update', isServer: false, )); if (bind.mainShowOption(key: 'allow-linux-headless')) { From 31101221e0e0cc22d8b9d20d6418d5c7023f3ab0 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 14 Sep 2023 20:41:25 +0530 Subject: [PATCH 44/90] feat closable update card Signed-off-by: Sahil Yeole --- .../lib/desktop/pages/desktop_home_page.dart | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index d458402d3..e48dda51d 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -48,6 +48,7 @@ class _DesktopHomePageState extends State var watchIsInputMonitoring = false; var watchIsCanRecordAudio = false; Timer? _updateTimer; + bool isCardClosed = false; @override Widget build(BuildContext context) { @@ -321,14 +322,15 @@ class _DesktopHomePageState extends State } Future buildHelpCards() async { - if (updateUrl.isNotEmpty) { + if (updateUrl.isNotEmpty && !isCardClosed) { return buildInstallCard( "Status", "There is a newer version of ${bind.mainGetAppNameSync()} ${bind.mainGetNewVersion()} available.", "Click to download", () async { final Uri url = Uri.parse('https://rustdesk.com/download'); await launchUrl(url); - }); + }, + closeButton: true); } if (systemError.isNotEmpty) { return buildInstallCard("", systemError, "", () {}); @@ -394,11 +396,20 @@ class _DesktopHomePageState extends State Widget buildInstallCard(String title, String content, String btnText, GestureTapCallback onPressed, - {String? help, String? link}) { - return Container( - margin: EdgeInsets.only(top: 20), - child: Container( - decoration: BoxDecoration( + {String? help, String? link, bool? closeButton}) { + + void closeCard() { + setState(() { + isCardClosed = true; + }); + } + + return Stack( + children: [ + Container( + margin: EdgeInsets.only(top: 20), + child: Container( + decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.centerLeft, end: Alignment.centerRight, @@ -467,6 +478,21 @@ class _DesktopHomePageState extends State )).marginOnly(top: 6)), ] : []))), + ), + if (closeButton != null && closeButton == true) + Positioned( + top: 18, + right: 0, + child: IconButton( + icon: Icon( + Icons.close, + color: Colors.white, + size: 20, + ), + onPressed: closeCard, + ), + ), + ], ); } From 52ec2c25384f49266e92ca05829558869fd051b2 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 14 Sep 2023 23:57:17 +0530 Subject: [PATCH 45/90] add lang Signed-off-by: Sahil Yeole --- src/lang/ar.rs | 1 + src/lang/ca.rs | 1 + src/lang/cn.rs | 1 + src/lang/cs.rs | 1 + src/lang/da.rs | 1 + src/lang/de.rs | 1 + src/lang/el.rs | 1 + src/lang/eo.rs | 1 + src/lang/es.rs | 1 + src/lang/fa.rs | 1 + src/lang/fr.rs | 1 + src/lang/hu.rs | 1 + src/lang/id.rs | 1 + src/lang/it.rs | 1 + src/lang/ja.rs | 1 + src/lang/ko.rs | 1 + src/lang/kz.rs | 1 + src/lang/lt.rs | 1 + src/lang/nl.rs | 1 + src/lang/pl.rs | 1 + src/lang/pt_PT.rs | 1 + src/lang/ptbr.rs | 1 + src/lang/ro.rs | 1 + src/lang/ru.rs | 1 + src/lang/sk.rs | 1 + src/lang/sl.rs | 1 + src/lang/sq.rs | 1 + src/lang/sr.rs | 1 + src/lang/sv.rs | 1 + src/lang/template.rs | 1 + src/lang/th.rs | 1 + src/lang/tr.rs | 1 + src/lang/tw.rs | 1 + src/lang/ua.rs | 1 + src/lang/vn.rs | 1 + 35 files changed, 35 insertions(+) diff --git a/src/lang/ar.rs b/src/lang/ar.rs index c65adef0a..9b00da2a6 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 1d01bea6b..868440bfa 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 1a10b8bd1..0d9e5a29d 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "超时(分钟)"), ("auto_disconnect_option_tip", "自动关闭不活跃的会话"), ("Connection failed due to inactivity", "由于长时间无操作, 连接被自动断开"), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 457dae517..857672eff 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 6ea628cee..d7151ee2f 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index d44a1e98c..70a1e81ef 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "Zeitüberschreitung in Minuten"), ("auto_disconnect_option_tip", "Automatisches Schließen eingehender Sitzungen bei Inaktivität des Benutzers"), ("Connection failed due to inactivity", "Automatische Trennung der Verbindung aufgrund von Inaktivität"), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index 710751331..b098452f6 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 7df5c3fa7..ea1d597d4 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 1053dcf73..8299e609e 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 1fd0be295..98d0c4087 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 565bd5d42..51d690bf3 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index df19e7bbe..5ee56c422 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 1d4b3b4cf..9f5a97397 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 54a96a18d..4b22c87a6 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "Timeout in minuti"), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", "Connessione non riuscita a causa di inattività"), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 1ecb8d9e2..017637e48 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index ad05b326f..f1f6c7311 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index e3fec6c5e..53fa177df 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 4c9cae2b7..465508005 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 43f277a0a..4ae999878 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 71c216429..e9b03faea 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "Czas bezczynności w minutach"), ("auto_disconnect_option_tip", "Automatycznie rozłącz sesje przychodzące przy braku aktywności użytkownika"), ("Connection failed due to inactivity", "Automatycznie rozłącz przy bezczynności"), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 72a16d62b..6a3f43800 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index f11435d67..7a58fc4bc 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index d4cccc796..9557a4031 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index 6be1274fd..fad79043f 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 0b58db74d..c7d68b4fe 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 2c82b35da..cf2e29428 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 32dc09f05..30cb24abe 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 43ead1444..f193a720b 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 867fa9fcc..a0fb40efe 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 397d6d380..03b69bcf6 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index c5e4d5fbb..dc430be2b 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 28b8d385a..2bce33d47 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 104370258..b13c024a8 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 7147445e0..4301b3b1d 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 9b910955e..3d0f5c455 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -554,5 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", ""), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), + ("Check for software update on startup", ""), ].iter().cloned().collect(); } From 900f9ec9a90718f51cfd84e8269d84c53f0a4527 Mon Sep 17 00:00:00 2001 From: solokot Date: Thu, 14 Sep 2023 23:53:05 +0300 Subject: [PATCH 46/90] Update ru.rs --- src/lang/ru.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lang/ru.rs b/src/lang/ru.rs index 6be1274fd..3fa19af22 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -544,15 +544,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Установка выполнена успешно!"), ("Installation failed!", "Установка не выполнена!"), ("Reverse mouse wheel", "Реверсировать колесо мыши"), - ("{} sessions", ""), - ("scam_title", ""), - ("scam_text1", ""), - ("scam_text2", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), - ("Timeout in minutes", ""), - ("auto_disconnect_option_tip", ""), - ("Connection failed due to inactivity", ""), + ("{} sessions", "{} сеансов"), + ("scam_title", "Вы можете быть ОБМАНУТЫ!"), + ("scam_text1", "Если вы разговариваете по телефону с кем-то, кого вы НЕ ЗНАЕТЕ и НЕ ДОВЕРЯЕТЕ, и он просит вас использовать RustDesk и запустить его службу, не продолжайте и немедленно прервите разговор."), + ("scam_text2", "Скорее всего, это мошенник, пытающийся украсть ваши деньги или другую личную информацию."), + ("Don't show again", "Больше не показывать"), + ("I Agree", "Принимаю"), + ("Decline", "Отказ"), + ("Timeout in minutes", "Время ожидания (минут)"), + ("auto_disconnect_option_tip", "Автоматически закрывать входящие сеансы при неактивности пользователя"), + ("Connection failed due to inactivity", "Подключение не выполнено из-за неактивности"), ].iter().cloned().collect(); } From 5220157b01836d3e409e24516053e486eae9684f Mon Sep 17 00:00:00 2001 From: Ibnul Mutaki Date: Fri, 15 Sep 2023 07:42:45 +0700 Subject: [PATCH 47/90] add indonesia translation --- src/lang/id.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lang/id.rs b/src/lang/id.rs index 1d4b3b4cf..8f4bd7a08 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -544,15 +544,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalasi berhasil!"), ("Installation failed!", "Instalasi gagal!"), ("Reverse mouse wheel", "Balikkan arah scroll mouse!"), - ("{} sessions", ""), - ("scam_title", ""), - ("scam_text1", ""), - ("scam_text2", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), - ("Timeout in minutes", ""), - ("auto_disconnect_option_tip", ""), - ("Connection failed due to inactivity", ""), + ("{} sessions", "{} sesi"), + ("scam_title", "Kemungkinan Anda Sedang DITIPU!"), + ("scam_text1", "Jika Anda sedang berbicara di telepon dengan seseorang yang TIDAK dikenal dan mereka meminta anda untuk menggunakan RustDesk, jangan lanjutkan dan segera tutup panggilan."), + ("scam_text2", "Kemungkinan besar mereka adalah komplotan penipu yang berusaha mencuri uang atau informasi pribadi anda."), + ("Don't show again", "Jangan tampilkan lagi"), + ("I Agree", "Saya setuju"), + ("Decline", "Tolak"), + ("Timeout in minutes", "Batasan Waktu dalam Menit"), + ("auto_disconnect_option_tip", "Secara otomatis akan menutup sesi ketika pengguna tidak beraktivitas"), + ("Connection failed due to inactivity", "Secara otomatis akan terputus ketik tidak ada aktivitas."), ].iter().cloned().collect(); } From 97f757540996f58fde9b7abed1c48b332c8ed339 Mon Sep 17 00:00:00 2001 From: Ibnul Mutaki Date: Fri, 15 Sep 2023 07:44:25 +0700 Subject: [PATCH 48/90] improve indo translation --- src/lang/id.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/id.rs b/src/lang/id.rs index 8f4bd7a08..663fd87f3 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -544,7 +544,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalasi berhasil!"), ("Installation failed!", "Instalasi gagal!"), ("Reverse mouse wheel", "Balikkan arah scroll mouse!"), - ("{} sessions", "{} sesi"), + ("{} sessions", "sesi {}"), ("scam_title", "Kemungkinan Anda Sedang DITIPU!"), ("scam_text1", "Jika Anda sedang berbicara di telepon dengan seseorang yang TIDAK dikenal dan mereka meminta anda untuk menggunakan RustDesk, jangan lanjutkan dan segera tutup panggilan."), ("scam_text2", "Kemungkinan besar mereka adalah komplotan penipu yang berusaha mencuri uang atau informasi pribadi anda."), From 45aea4176f02c10720994202ea10dc495c1dfe70 Mon Sep 17 00:00:00 2001 From: Integral Date: Fri, 15 Sep 2023 11:56:04 +0800 Subject: [PATCH 49/90] Update cn.rs --- src/lang/cn.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 0d9e5a29d..b22b6494d 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -545,15 +545,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", "安装失败!"), ("Reverse mouse wheel", "鼠标滚轮反向"), ("{} sessions", "{}个会话"), - ("scam_title", ""), - ("scam_text1", ""), - ("scam_text2", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), + ("scam_title", "你可能被骗了!"), + ("scam_text1", "如果你正在和素不相识的人通话,而对方要求你使用 Rustdesk 启动服务,请勿继续操作并立刻挂断电话。"), + ("scam_text2", "他们很可能是骗子,试图窃取您的钱财或其他个人信息。"), + ("Don't show again", "下次不再显示"), + ("I Agree", "同意"), + ("Decline", "拒绝"), ("Timeout in minutes", "超时(分钟)"), ("auto_disconnect_option_tip", "自动关闭不活跃的会话"), ("Connection failed due to inactivity", "由于长时间无操作, 连接被自动断开"), - ("Check for software update on startup", ""), + ("Check for software update on startup", "启动时检查软件更新"), ].iter().cloned().collect(); } From 3dd329a99961c8ba76fb078868d1e686b3ea9e3b Mon Sep 17 00:00:00 2001 From: solokot Date: Fri, 15 Sep 2023 08:37:08 +0300 Subject: [PATCH 50/90] Update ru.rs --- src/lang/ru.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/ru.rs b/src/lang/ru.rs index c7e28f271..0bcc11897 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -554,6 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "Время ожидания (минут)"), ("auto_disconnect_option_tip", "Автоматически закрывать входящие сеансы при неактивности пользователя"), ("Connection failed due to inactivity", "Подключение не выполнено из-за неактивности"), - ("Check for software update on startup", ""), + ("Check for software update on startup", "Проверять обновления программы при запуске"), ].iter().cloned().collect(); } From 7b37e5183cd9a3378b97ed06da20e82d598d6e93 Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 15 Sep 2023 15:34:02 +0800 Subject: [PATCH 51/90] update rdev, fix grab system utf8, fallback on linux Signed-off-by: fufesou --- Cargo.lock | 2 +- libs/enigo/src/lib.rs | 2 ++ libs/enigo/src/macos/macos_impl.rs | 4 ++++ libs/enigo/src/macos/mod.rs | 2 +- libs/enigo/src/win/mod.rs | 3 +-- src/keyboard.rs | 2 ++ src/server/connection.rs | 6 +++--- src/server/input_service.rs | 3 +++ src/ui_session_interface.rs | 2 ++ 9 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f11db81d5..0655e5e4d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4881,7 +4881,7 @@ dependencies = [ [[package]] name = "rdev" version = "0.5.0-2" -source = "git+https://github.com/fufesou/rdev#ee3057bd97c91529e8b9daf2ca133a5c49f0c0eb" +source = "git+https://github.com/fufesou/rdev#bec664ee8743ade8d2fdd099b114c9eeacd9cfba" dependencies = [ "cocoa", "core-foundation", diff --git a/libs/enigo/src/lib.rs b/libs/enigo/src/lib.rs index 509bbf97c..397081c51 100644 --- a/libs/enigo/src/lib.rs +++ b/libs/enigo/src/lib.rs @@ -70,6 +70,8 @@ pub use win::ENIGO_INPUT_EXTRA_VALUE; mod macos; #[cfg(target_os = "macos")] pub use macos::Enigo; +#[cfg(target_os = "macos")] +pub use macos::ENIGO_INPUT_EXTRA_VALUE; #[cfg(target_os = "linux")] mod linux; diff --git a/libs/enigo/src/macos/macos_impl.rs b/libs/enigo/src/macos/macos_impl.rs index 992269085..b56beff12 100644 --- a/libs/enigo/src/macos/macos_impl.rs +++ b/libs/enigo/src/macos/macos_impl.rs @@ -37,6 +37,9 @@ const kUCKeyActionDisplay: u16 = 3; const kUCKeyTranslateDeadKeysBit: OptionBits = 1 << 31; const BUF_LEN: usize = 4; +/// The event source user data value of cgevent. +pub const ENIGO_INPUT_EXTRA_VALUE: i64 = 100; + #[allow(improper_ctypes)] #[allow(non_snake_case)] #[link(name = "ApplicationServices", kind = "framework")] @@ -131,6 +134,7 @@ impl Enigo { fn post(&self, event: CGEvent) { event.set_flags(self.flags); + event.set_integer_value_field(EventField::EVENT_SOURCE_USER_DATA, ENIGO_INPUT_EXTRA_VALUE); event.post(CGEventTapLocation::HID); } } diff --git a/libs/enigo/src/macos/mod.rs b/libs/enigo/src/macos/mod.rs index 286bd7483..f9aebb511 100644 --- a/libs/enigo/src/macos/mod.rs +++ b/libs/enigo/src/macos/mod.rs @@ -1,4 +1,4 @@ mod macos_impl; pub mod keycodes; -pub use self::macos_impl::Enigo; +pub use self::macos_impl::{Enigo, ENIGO_INPUT_EXTRA_VALUE}; diff --git a/libs/enigo/src/win/mod.rs b/libs/enigo/src/win/mod.rs index 62cdbd6e6..4ec95ee39 100644 --- a/libs/enigo/src/win/mod.rs +++ b/libs/enigo/src/win/mod.rs @@ -1,5 +1,4 @@ mod win_impl; pub mod keycodes; -pub use self::win_impl::Enigo; -pub use self::win_impl::ENIGO_INPUT_EXTRA_VALUE; +pub use self::win_impl::{Enigo, ENIGO_INPUT_EXTRA_VALUE}; diff --git a/src/keyboard.rs b/src/keyboard.rs index ca12cf4a1..d9b562ed3 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -583,6 +583,8 @@ pub fn event_type_to_event(event_type: EventType) -> Event { unicode: None, platform_code: 0, position_code: 0, + #[cfg(any(target_os = "windows", target_os = "macos"))] + extra_data: 0, } } diff --git a/src/server/connection.rs b/src/server/connection.rs index 2eebd54cf..517e7d4e3 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -676,10 +676,10 @@ impl Connection { #[cfg(not(any(target_os = "android", target_os = "ios")))] fn handle_input(receiver: std_mpsc::Receiver, tx: Sender) { let mut block_input_mode = false; - #[cfg(target_os = "windows")] + #[cfg(any(target_os = "windows", target_os = "macos"))] { - rdev::set_dw_mouse_extra_info(enigo::ENIGO_INPUT_EXTRA_VALUE); - rdev::set_dw_keyboard_extra_info(enigo::ENIGO_INPUT_EXTRA_VALUE); + rdev::set_mouse_extra_info(enigo::ENIGO_INPUT_EXTRA_VALUE); + rdev::set_keyboard_extra_info(enigo::ENIGO_INPUT_EXTRA_VALUE); } #[cfg(target_os = "macos")] reset_input_ondisconn(); diff --git a/src/server/input_service.rs b/src/server/input_service.rs index b721149e9..fd3a7cd24 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -380,6 +380,9 @@ pub fn try_stop_record_cursor_pos() { return; } RECORD_CURSOR_POS_RUNNING.store(false, Ordering::SeqCst); + + #[cfg(any(target_os = "windows", target_os = "macos"))] + let _r = rdev::exit_grab(); } // mac key input must be run in main thread, otherwise crash on >= osx 10.15 diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index dae85fe5f..6d12e7a1e 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -660,6 +660,8 @@ impl Session { platform_code, position_code: position_code as _, event_type, + #[cfg(any(target_os = "windows", target_os = "macos"))] + extra_data: 0, }; keyboard::client::process_event(&event, Some(lock_modes)); } From 73414f2ee13926024291622006e3ea98e49ff6c8 Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 15 Sep 2023 15:38:42 +0800 Subject: [PATCH 52/90] simple remove parentheses Signed-off-by: fufesou --- src/flutter_ffi.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index dbbe0d707..c9da2cde2 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1076,7 +1076,7 @@ pub fn main_get_last_remote_id() -> String { } pub fn main_get_software_update_url() -> String { - if (get_local_option("enable-check-update".to_string()) != "N") { + if get_local_option("enable-check-update".to_string()) != "N" { crate::common::check_software_update(); } crate::common::SOFTWARE_UPDATE_URL.lock().unwrap().clone() From f1e2aa8c963f2a0130a13714e043a90afbef61ce Mon Sep 17 00:00:00 2001 From: Kleofass Date: Fri, 15 Sep 2023 14:58:10 +0300 Subject: [PATCH 53/90] Update latvian lang.rs --- src/lang.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lang.rs b/src/lang.rs index fb10230c4..d25deb2a2 100644 --- a/src/lang.rs +++ b/src/lang.rs @@ -20,6 +20,7 @@ mod ja; mod ko; mod kz; mod lt; +mod lv; mod nl; mod pl; mod ptbr; @@ -70,6 +71,7 @@ pub const LANGS: &[(&str, &str)] = &[ ("sl", "Slovenščina"), ("ro", "Română"), ("lt", "Lietuvių"), + ("lv", "Latviešu"), ("ar", "العربية"), ]; @@ -135,6 +137,7 @@ pub fn translate_locale(name: String, locale: &str) -> String { "sl" => sl::T.deref(), "ro" => ro::T.deref(), "lt" => lt::T.deref(), + "lv" => lv::T.deref(), "ar" => ar::T.deref(), _ => en::T.deref(), }; From fa815af7986c03a17cd1dead0fd49cbbb9f1e097 Mon Sep 17 00:00:00 2001 From: Kleofass Date: Fri, 15 Sep 2023 14:58:37 +0300 Subject: [PATCH 54/90] Update latvian lv.rs --- src/lang/lv.rs | 561 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 561 insertions(+) create mode 100644 src/lang/lv.rs diff --git a/src/lang/lv.rs b/src/lang/lv.rs new file mode 100644 index 000000000..4501aec3e --- /dev/null +++ b/src/lang/lv.rs @@ -0,0 +1,561 @@ +lazy_static::lazy_static! { +pub static ref T: std::collections::HashMap<&'static str, &'static str> = + [ + ("Status", "Statuss"), + ("Your Desktop", "Jūsu darbvirsma"), + ("desk_tip", "Jūsu darbvirsmai var piekļūt ar šo ID un paroli."), + ("Password", "Parole"), + ("Ready", "Gatavs"), + ("Established", "Izveidots"), + ("connecting_status", "Notiek savienojuma izveide ar RustDesk tīklu..."), + ("Enable Service", "Iespējot servisu"), + ("Start Service", "Sākt servisu"), + ("Service is running", "Pakalpojums darbojas"), + ("Service is not running", "Pakalpojums nedarbojas"), + ("not_ready_status", "Nav gatavs. Lūdzu, pārbaudiet savienojumu"), + ("Control Remote Desktop", "Vadīt attālo darbvirsmu"), + ("Transfer File", "Pārsūtīt failu"), + ("Connect", "Savienoties"), + ("Recent Sessions", "Pēdējās sesijas"), + ("Address Book", "Adrešu grāmata"), + ("Confirmation", "Apstiprinājums"), + ("TCP Tunneling", "TCP tunelēšana"), + ("Remove", "Noņemt"), + ("Refresh random password", "Atsvaidzināt nejaušu paroli"), + ("Set your own password", "Iestatiet savu paroli"), + ("Enable Keyboard/Mouse", "Iespējot tastatūru/peli"), + ("Enable Clipboard", "Iespējot starpliktuvi"), + ("Enable File Transfer", "Iespējot failu pārsūtīšanu"), + ("Enable TCP Tunneling", "Iespējot TCP tunelēšanu"), + ("IP Whitelisting", "IP baltais saraksts"), + ("ID/Relay Server", "ID/releja serveris"), + ("Import Server Config", "Importēt servera konfigurāciju"), + ("Export Server Config", "Eksportēt servera konfigurāciju"), + ("Import server configuration successfully", "Servera konfigurācija veiksmīgi importēta"), + ("Export server configuration successfully", "Servera konfigurācija veiksmīgi eksportēta"), + ("Invalid server configuration", "Nederīga servera konfigurācija"), + ("Clipboard is empty", "Starpliktuve ir tukša"), + ("Stop service", "Apturēt servisu"), + ("Change ID", "Mainīt ID"), + ("Your new ID", "Jūsu jaunais ID"), + ("length %min% to %max%", "garums %min% līdz %max%"), + ("starts with a letter", "sākas ar burtu"), + ("allowed characters", "atļautās rakstzīmes"), + ("id_change_tip", "Atļautas tikai rakstzīmes a-z, A-Z, 0-9 un _ (pasvītrojums). Pirmajam burtam ir jābūt a-z, A-Z. Garums no 6 līdz 16."), + ("Website", "Tīmekļa vietne"), + ("About", "Par"), + ("Slogan_tip", "Radīts ar sirdi šajā haotiskajā pasaulē!"), + ("Privacy Statement", "Paziņojums par konfidencialitāti"), + ("Mute", "Izslēgt skaņu"), + ("Build Date", "Būvēšanas datums"), + ("Version", "Versija"), + ("Home", "Sākums"), + ("Audio Input", "Audio ievade"), + ("Enhancements", "Uzlabojumi"), + ("Hardware Codec", "Aparatūras kodeks"), + ("Adaptive bitrate", "Adaptīvais bitu pārraides ātrums"), + ("ID Server", "ID serveris"), + ("Relay Server", "Releja serveris"), + ("API Server", "API serveris"), + ("invalid_http", "jāsākas ar http:// vai https://"), + ("Invalid IP", "Nederīga IP"), + ("Invalid format", "Nederīgs formāts"), + ("server_not_support", "Serveris vēl neatbalsta"), + ("Not available", "Nav pieejams"), + ("Too frequent", "Pārāk bieži"), + ("Cancel", "Atcelt"), + ("Skip", "Izlaist"), + ("Close", "Aizvērt"), + ("Retry", "Mēģināt vēlreiz"), + ("OK", "Labi"), + ("Password Required", "Nepieciešama parole"), + ("Please enter your password", "Lūdzu, ievadiet paroli"), + ("Remember password", "Atcerēties paroli"), + ("Wrong Password", "Nepareiza parole"), + ("Do you want to enter again?", "Vai vēlaties ievadīt vēlreiz?"), + ("Connection Error", "Savienojuma kļūda"), + ("Error", "Kļūda"), + ("Reset by the peer", "Atiestatīts ar sesiju"), + ("Connecting...", "Notiek savienojuma izveide..."), + ("Connection in progress. Please wait.", "Notiek savienošanās. Lūdzu, uzgaidiet."), + ("Please try 1 minute later", "Lūdzu, mēģiniet 1 minūti vēlāk"), + ("Login Error", "Pieteikšanās kļūda"), + ("Successful", "Veiksmīgi"), + ("Connected, waiting for image...", "Savienots, gaida attēlu..."), + ("Name", "Nosaukums"), + ("Type", "Tips"), + ("Modified", "Modificēšanas dat."), + ("Size", "Lielums"), + ("Show Hidden Files", "Rādīt slēptos failus"), + ("Receive", "Saņemt"), + ("Send", "Sūtīt"), + ("Refresh File", "Atsvaidzināt failu"), + ("Local", "Vietējais"), + ("Remote", "Attālais"), + ("Remote Computer", "Attālais dators"), + ("Local Computer", "Vietējais dators"), + ("Confirm Delete", "Apstiprināt dzēšanu"), + ("Delete", "Dzēst"), + ("Properties", "Rekvizīti"), + ("Multi Select", "Vairākatlase"), + ("Select All", "Atlasīt visu"), + ("Unselect All", "Noņemt atlasi visiem"), + ("Empty Directory", "Tukša direktorija"), + ("Not an empty directory", "Nav tukša direktorija"), + ("Are you sure you want to delete this file?", "Vai tiešām vēlaties dzēst šo failu?"), + ("Are you sure you want to delete this empty directory?", "Vai tiešām vēlaties dzēst šo tukšo direktoriju?"), + ("Are you sure you want to delete the file of this directory?", "Vai tiešām vēlaties dzēst šī direktorija failu?"), + ("Do this for all conflicts", "Pielietot visiem konfliktiem"), + ("This is irreversible!", "Tas ir neatgriezeniski!"), + ("Deleting", "Dzēšana"), + ("files", "faili"), + ("Waiting", "Gaida"), + ("Finished", "Pabeigts"), + ("Speed", "Ātrums"), + ("Custom Image Quality", "Pielāgota attēla kvalitāte"), + ("Privacy mode", "Privātuma režīms"), + ("Block user input", "Bloķēt lietotāja ievadi"), + ("Unblock user input", "Atbloķēt lietotāja ievadi"), + ("Adjust Window", "Pielāgot logu"), + ("Original", "Oriģināls"), + ("Shrink", "Saraut"), + ("Stretch", "Izstiept"), + ("Scrollbar", "Ritjosla"), + ("ScrollAuto", "Ritināt automātiski"), + ("Good image quality", "Laba attēla kvalitāte"), + ("Balanced", "Sabalansēts"), + ("Optimize reaction time", "Optimizēt reakcijas laiku"), + ("Custom", "Pielāgots"), + ("Show remote cursor", "Rādīt attālo kursoru"), + ("Show quality monitor", "Rādīt kvalitātes monitoru"), + ("Disable clipboard", "Atspējot starpliktuvi"), + ("Lock after session end", "Bloķēt pēc sesijas beigām"), + ("Insert", "Ievietot"), + ("Insert Lock", "Ievietot Bloķēt"), + ("Refresh", "Atsvaidzināt"), + ("ID does not exist", "ID neeksistē"), + ("Failed to connect to rendezvous server", "Neizdevās izveidot savienojumu ar starpposma serveri"), + ("Please try later", "Lūdzu, mēģiniet vēlāk"), + ("Remote desktop is offline", "Attālā darbvirsma ir bezsaistē"), + ("Key mismatch", "Atslēgu neatbilstība"), + ("Timeout", "Noildze"), + ("Failed to connect to relay server", "Neizdevās izveidot savienojumu ar releja serveri"), + ("Failed to connect via rendezvous server", "Neizdevās izveidot savienojumu, izmantojot starpposma serveri"), + ("Failed to connect via relay server", "Neizdevās izveidot savienojumu, izmantojot releja serveri"), + ("Failed to make direct connection to remote desktop", "Neizdevās izveidot tiešu savienojumu ar attālo darbvirsmu"), + ("Set Password", "Uzstādīt paroli"), + ("OS Password", "OS parole"), + ("install_tip", "UAC dēļ RustDesk dažos gadījumos nevar pareizi darboties kā attālā puse. Lai izvairītos no UAC, lūdzu, noklikšķiniet uz tālāk esošās pogas, lai instalētu RustDesk sistēmā."), + ("Click to upgrade", "Noklikšķiniet, lai jauninātu"), + ("Click to download", "Noklikšķiniet, lai lejupielādētu"), + ("Click to update", "Noklikšķiniet, lai atjauninātu"), + ("Configure", "Konfigurēt"), + ("config_acc", "Lai attālināti vadītu savu darbvirsmu, jums ir jāpiešķir RustDesk \"Accessibility\" atļaujas."), + ("config_screen", "Lai attālināti piekļūtu darbvirsmai, jums ir jāpiešķir RustDesk \"Screen Recording\" atļaujas."), + ("Installing ...", "Notiek instalēšana..."), + ("Install", "Uzstādīt"), + ("Installation", "Instalēšana"), + ("Installation Path", "Instalācijas ceļš"), + ("Create start menu shortcuts", "Izveidot sākuma izvēlnes īsceļus"), + ("Create desktop icon", "Izveidot darbvirsmas ikonu"), + ("agreement_tip", "Sākot instalēšanu, jūs piekrītat licences līgumam."), + ("Accept and Install", "Pieņemt un instalēt"), + ("End-user license agreement", "Gala lietotāja licences līgums"), + ("Generating ...", "Ģenerēšana..."), + ("Your installation is lower version.", "Jūsu instalācijai ir veca versija."), + ("not_close_tcp_tip", "Neaizveriet šo logu, kamēr izmantojat tuneli"), + ("Listening ...", "Klausās..."), + ("Remote Host", "Attālais resursdators"), + ("Remote Port", "Attālais ports"), + ("Action", "Darbība"), + ("Add", "Pievienot"), + ("Local Port", "Vietējais ports"), + ("Local Address", "Vietējā adrese"), + ("Change Local Port", "Mainīt vietējo portu"), + ("setup_server_tip", "Lai iegūtu ātrāku savienojumu, lūdzu, iestatiet savu serveri"), + ("Too short, at least 6 characters.", "Pārāk īss, vismaz 6 rakstzīmes."), + ("The confirmation is not identical.", "Apstiprinājums nav identisks."), + ("Permissions", "Atļaujas"), + ("Accept", "Pieņemt"), + ("Dismiss", "Noraidīt"), + ("Disconnect", "Atvienot"), + ("Allow using keyboard and mouse", "Atļaut izmantot tastatūru un peli"), + ("Allow using clipboard", "Atļaut izmantot starpliktuvi"), + ("Allow hearing sound", "Atļaut klausīties skaņu"), + ("Allow file copy and paste", "Atļaut failu kopēšanu un ielīmēšanu"), + ("Connected", "Savienots"), + ("Direct and encrypted connection", "Tiešs un šifrēts savienojums"), + ("Relayed and encrypted connection", "Pārslēgts un šifrēts savienojums"), + ("Direct and unencrypted connection", "Tiešs un nešifrēts savienojums"), + ("Relayed and unencrypted connection", "Pārslēgts un nešifrēts savienojums"), + ("Enter Remote ID", "Ievadiet attālo ID"), + ("Enter your password", "Ievadiet savu paroli"), + ("Logging in...", "Ielogoties..."), + ("Enable RDP session sharing", "Iespējot RDP sesiju koplietošanu"), + ("Auto Login", "Automātiskā pieteikšanās (derīga tikai tad, ja esat iestatījis \"Bloķēt pēc sesijas beigām\")"), + ("Enable Direct IP Access", "Iespējot tiešo IP piekļuvi"), + ("Rename", "Pārdēvēt"), + ("Space", "Vieta"), + ("Create Desktop Shortcut", "Izveidot saīsni uz darbvirsmas"), + ("Change Path", "Mainīt ceļu"), + ("Create Folder", "Izveidot mapi"), + ("Please enter the folder name", "Lūdzu, ievadiet mapes nosaukumu"), + ("Fix it", "Salabot to"), + ("Warning", "Brīdinājums"), + ("Login screen using Wayland is not supported", "Pieteikšanās ekrāns, izmantojot Wayland netiek atbalstīts"), + ("Reboot required", "Nepieciešama restartēšana"), + ("Unsupported display server", "Neatbalstīts displeja serveris"), + ("x11 expected", "x11 paredzams"), + ("Port", "Ports"), + ("Settings", "Iestatījumi"), + ("Username", "Lietotājvārds"), + ("Invalid port", "Nederīgs ports"), + ("Closed manually by the peer", "Sesija aizvērta manuāli"), + ("Enable remote configuration modification", "Iespējot attālās konfigurācijas modifikāciju"), + ("Run without install", "Palaist bez instalēšanas"), + ("Connect via relay", "Savienot, izmantojot releju"), + ("Always connect via relay", "Vienmēr izveidot savienojumu, izmantojot releju"), + ("whitelist_tip", "Man var piekļūt tikai baltajā sarakstā iekļautās IP adreses"), + ("Login", "Pieslēgties"), + ("Verify", "Pārbaudīt"), + ("Remember me", "Atceries mani"), + ("Trust this device", "Uzticēties šai ierīcei"), + ("Verification code", "Verifikācijas kods"), + ("verification_tip", "Verifikācijas kods ir nosūtīts uz reģistrēto e-pasta adresi, ievadiet verifikācijas kodu, lai turpinātu pieslēgšanos."), + ("Logout", "Izlogoties"), + ("Tags", "Tagi"), + ("Search ID", "Meklēt ID"), + ("whitelist_sep", "Atdalīts ar komatu, semikolu, atstarpēm vai jaunu rindiņu"), + ("Add ID", "Pievienot ID"), + ("Add Tag", "Pievienot tagu"), + ("Unselect all tags", "Noņemt visu tagu atlasi"), + ("Network error", "Tīkla kļūda"), + ("Username missed", "Lietotājvārds ir izlaists"), + ("Password missed", "Parole nav ievadīta"), + ("Wrong credentials", "Nepareizs lietotājvārds vai parole"), + ("The verification code is incorrect or has expired", "Verifikācijas kods ir nepareizs vai tam ir beidzies derīguma termiņš"), + ("Edit Tag", "Rediģēt tagu"), + ("Unremember Password", "Neatcerēties paroli"), + ("Favorites", "Izlase"), + ("Add to Favorites", "Pievienot pie izlases"), + ("Remove from Favorites", "Noņemt no izlases"), + ("Empty", "Tukšs"), + ("Invalid folder name", "Nederīgs mapes nosaukums"), + ("Socks5 Proxy", "Socks5 starpniekserveris"), + ("Hostname", "Resursdatora nosaukums"), + ("Discovered", "Atklāts"), + ("install_daemon_tip", "Lai startētu sāknēšanu, ir jāinstalē sistēmas serviss."), + ("Remote ID", "Attālais ID"), + ("Paste", "Ielīmēt"), + ("Paste here?", "Ielīmēt šeit?"), + ("Are you sure to close the connection?", "Vai tiešām vēlaties aizvērt savienojumu?"), + ("Download new version", "Lejupielādēt jauno versiju"), + ("Touch mode", "Skārienrežīms"), + ("Mouse mode", "Peles režīms"), + ("One-Finger Tap", "Pieskāriens ar vienu pirkstu"), + ("Left Mouse", "Kreisā pele"), + ("One-Long Tap", "Viens garš pieskāriens"), + ("Two-Finger Tap", "Pieskāriens ar diviem pirkstiem"), + ("Right Mouse", "Labā pele"), + ("One-Finger Move", "Viena pirksta pārvietošana"), + ("Double Tap & Move", "Dubultskāriens & pārvietošana"), + ("Mouse Drag", "Peles vilkšana"), + ("Three-Finger vertically", "Trīs pirksti vertikāli"), + ("Mouse Wheel", "Peles ritenis"), + ("Two-Finger Move", "Divu pirkstu pārvietošana"), + ("Canvas Move", "Audekla pārvietošana"), + ("Pinch to Zoom", "Saspiediet, lai tuvinātu"), + ("Canvas Zoom", "Audekla tālummaiņa"), + ("Reset canvas", "Atiestatīt audeklu"), + ("No permission of file transfer", "Nav atļaujas failu pārsūtīšanai"), + ("Note", "Piezīme"), + ("Connection", "Savienojums"), + ("Share Screen", "Koplietot ekrānu"), + ("Chat", "Tērzēšana"), + ("Total", "Kopā"), + ("items", "vienumi"), + ("Selected", "Atlasīts"), + ("Screen Capture", "Ekrāna tveršana"), + ("Input Control", "Ievades vadība"), + ("Audio Capture", "Audio tveršana"), + ("File Connection", "Failu savienojums"), + ("Screen Connection", "Ekrāna savienojums"), + ("Do you accept?", "Vai Jūs pieņemat?"), + ("Open System Setting", "Atvērt sistēmas iestatījumus"), + ("How to get Android input permission?", "Kā iegūt Android ievades atļauju?"), + ("android_input_permission_tip1", "Lai attālā ierīce varētu vadīt jūsu Android ierīci, izmantojot peli vai pieskārienu, jums ir jāatļauj RustDesk izmantot servisu \"Accessibility\"."), + ("android_input_permission_tip2", "Lūdzu, dodieties uz nākamo sistēmas iestatījumu lapu, atrodiet un ievadiet [Installed Services], ieslēdziet servisu [RustDesk Input]."), + ("android_new_connection_tip", "Ir saņemts jauns vadības pieprasījums, kas vēlas kontrolēt jūsu pašreizējo ierīci."), + ("android_service_will_start_tip", "Ieslēdzot \"Screen Capture\", serviss tiks automātiski startēts, ļaujot citām ierīcēm pieprasīt savienojumu ar jūsu ierīci."), + ("android_stop_service_tip", "Pakalpojuma aizvēršana automātiski aizvērs visus izveidotos savienojumus."), + ("android_version_audio_tip", "Pašreizējā Android versija neatbalsta audio uztveršanu, lūdzu, jauniniet uz Android 10 vai jaunāku versiju."), + ("android_start_service_tip", "Pieskarieties [Start Service] vai iespējojiet [Screen Capture] atļauju, lai sāktu ekrāna koplietošanas servisu."), + ("android_permission_may_not_change_tip", "Izveidoto savienojumu atļaujas nevar mainīt uzreiz, kamēr nav atkārtoti izveidots savienojums."), + ("Account", "Konts"), + ("Overwrite", "Pārrakstīt"), + ("This file exists, skip or overwrite this file?", "Šis fails pastāv, izlaist vai pārrakstīt šo failu?"), + ("Quit", "Iziet"), + ("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"), + ("doc_fix_wayland", "https://rustdesk.com/docs/en/manual/linux/#x11-required"), + ("Help", "Palīdzība"), + ("Failed", "Neizdevās"), + ("Succeeded", "Izdevās"), + ("Someone turns on privacy mode, exit", "Kāds ieslēdza privātuma režīmu, iziet"), + ("Unsupported", "Neatbalstīts"), + ("Peer denied", "Sesija noraidīta"), + ("Please install plugins", "Lūdzu, instalējiet spraudņus"), + ("Peer exit", "Vienādranga izeja"), + ("Failed to turn off", "Neizdevās izslēgt"), + ("Turned off", "Izslēgts"), + ("In privacy mode", "Privātuma režīmā"), + ("Out privacy mode", "Izslēgts privātuma režīms"), + ("Language", "Valoda"), + ("Keep RustDesk background service", "Saglabāt RustDesk fona servisu"), + ("Ignore Battery Optimizations", "Ignorēt akumulatora optimizāciju"), + ("android_open_battery_optimizations_tip", "Ja vēlaties atspējot šo funkciju, lūdzu, dodieties uz nākamo RustDesk lietojumprogrammas iestatījumu lapu, atrodiet un ievadiet [Battery], noņemiet atzīmi no [Unrestricted]"), + ("Start on Boot", "Sāciet ar sāknēšanu"), + ("Start the screen sharing service on boot, requires special permissions", "Startējiet ekrāna koplietošanas pakalpojumu sāknēšanas laikā, nepieciešamas īpašas atļaujas"), + ("Connection not allowed", "Savienojums nav atļauts"), + ("Legacy mode", "Novecojis režīms"), + ("Map mode", "Kartēšanas režīms"), + ("Translate mode", "Tulkošanas režīms"), + ("Use permanent password", "Izmantot pastāvīgo paroli"), + ("Use both passwords", "Izmantot abas paroles"), + ("Set permanent password", "Iestatīt pastāvīgo paroli"), + ("Enable Remote Restart", "Iespējot attālo restartēšanu"), + ("Allow remote restart", "Atļaut attālo restartēšanu"), + ("Restart Remote Device", "Restartēt attālo ierīci"), + ("Are you sure you want to restart", "Vai tiešām vēlaties restartēt"), + ("Restarting Remote Device", "Attālās ierīces restartēšana"), + ("remote_restarting_tip", "Attālā ierīce tiek restartēta, lūdzu, aizveriet šo ziņojuma lodziņu un pēc kāda laika izveidojiet savienojumu ar pastāvīgo paroli"), + ("Copied", "Kopēts"), + ("Exit Fullscreen", "Iziet no pilnekrāna"), + ("Fullscreen", "Pilnekrāna režīms"), + ("Mobile Actions", "Mobilās darbības"), + ("Select Monitor", "Atlasīt monitoru"), + ("Control Actions", "Kontroles darbības"), + ("Display Settings", "Displeja iestatījumi"), + ("Ratio", "Attiecība"), + ("Image Quality", "Attēla kvalitāte"), + ("Scroll Style", "Ritināšanas stils"), + ("Show Toolbar", "Rādīt rīkjoslu"), + ("Hide Toolbar", "Slēpt rīkjoslu"), + ("Direct Connection", "Tiešais savienojums"), + ("Relay Connection", "Releja savienojums"), + ("Secure Connection", "Drošs savienojums"), + ("Insecure Connection", "Nedrošs savienojums"), + ("Scale original", "Mērogs oriģināls"), + ("Scale adaptive", "Mērogs adaptīvs"), + ("General", "Vispārīgi"), + ("Security", "Drošība"), + ("Theme", "Motīvs"), + ("Dark Theme", "Tumšais motīvs"), + ("Light Theme", "Gaišais motīvs"), + ("Dark", "Tumšs"), + ("Light", "Gaišs"), + ("Follow System", "Sekot sistēmai"), + ("Enable hardware codec", "Iespējot aparatūras kodeku"), + ("Unlock Security Settings", "Atbloķēt drošības iestatījumus"), + ("Enable Audio", "Iespējot audio"), + ("Unlock Network Settings", "Atbloķēt tīkla iestatījumus"), + ("Server", "Serveris"), + ("Direct IP Access", "Tiešā IP piekļuve"), + ("Proxy", "Starpniekserveris"), + ("Apply", "Lietot"), + ("Disconnect all devices?", "Atvienot visas ierīces?"), + ("Clear", "Notīrīt"), + ("Audio Input Device", "Audio ievades ierīce"), + ("Use IP Whitelisting", "Izmantot IP balto sarakstu"), + ("Network", "Tīkls"), + ("Enable RDP", "Iespējot RDP"), + ("Pin Toolbar", "Piespraust rīkjoslu"), + ("Unpin Toolbar", "Atspraust rīkjoslu"), + ("Recording", "Ierakstīšana"), + ("Directory", "Direktorija"), + ("Automatically record incoming sessions", "Automātiski ierakstīt ienākošās sesijas"), + ("Change", "Mainīt"), + ("Start session recording", "Sākt sesijas ierakstīšanu"), + ("Stop session recording", "Apturēt sesijas ierakstīšanu"), + ("Enable Recording Session", "Iespējot sesijas ierakstīšanu"), + ("Allow recording session", "Atļaut sesijas ierakstīšanu"), + ("Enable LAN Discovery", "Iespējot LAN atklāšanu"), + ("Deny LAN Discovery", "Liegt LAN atklāšanu"), + ("Write a message", "Rakstīt ziņojumu"), + ("Prompt", "Uzvedne"), + ("Please wait for confirmation of UAC...", "Lūdzu, uzgaidiet UAC apstiprinājumu..."), + ("elevated_foreground_window_tip", "Pašreizējā attālās darbvirsmas loga darbībai ir nepieciešamas lielākas tiesības, tāpēc tas īslaicīgi nevar izmantot peli un tastatūru. Varat pieprasīt attālajam lietotājam samazināt pašreizējo logu vai noklikšķināt uz pacēluma pogas savienojuma pārvaldības logā. Lai izvairītos no šīs problēmas, ieteicams instalēt programmatūru attālajā ierīcē."), + ("Disconnected", "Atvienots"), + ("Other", "Cits"), + ("Confirm before closing multiple tabs", "Apstiprināt pirms vairāku cilņu aizvēršanas"), + ("Keyboard Settings", "Tastatūras iestatījumi"), + ("Full Access", "Pilna piekļuve"), + ("Screen Share", "Ekrāna kopīgošana"), + ("Wayland requires Ubuntu 21.04 or higher version.", "Wayland nepieciešama Ubuntu 21.04 vai jaunāka versija."), + ("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland nepieciešama augstāka Linux distro versija. Lūdzu, izmēģiniet X11 desktop vai mainiet savu OS."), + ("JumpLink", "Skatīt"), + ("Please Select the screen to be shared(Operate on the peer side).", "Lūdzu, atlasiet kopīgojamo ekrānu (darbojieties sesijas pusē)."), + ("Show RustDesk", "Rādīt RustDesk"), + ("This PC", "Šis dators"), + ("or", "vai"), + ("Continue with", "Turpināt ar"), + ("Elevate", "Pacelt"), + ("Zoom cursor", "Tālummaiņas kursors"), + ("Accept sessions via password", "Pieņemt sesijas, izmantojot paroli"), + ("Accept sessions via click", "Pieņemt sesijas, noklikšķinot"), + ("Accept sessions via both", "Pieņemt sesijas, izmantojot abus"), + ("Please wait for the remote side to accept your session request...", "Lūdzu, uzgaidiet, kamēr attālā puse pieņems jūsu sesijas pieprasījumu..."), + ("One-time Password", "Vienreizēja parole"), + ("Use one-time password", "Izmantot vienreizējo paroli"), + ("One-time password length", "Vienreizējas paroles garums"), + ("Request access to your device", "Pieprasīt piekļuvi savai ierīcei"), + ("Hide connection management window", "Slēpt savienojuma pārvaldības logu"), + ("hide_cm_tip", "Atļaut paslēpšanu tikai tad, ja akceptējat sesijas, izmantojot paroli un pastāvīgo paroli"), + ("wayland_experiment_tip", "Wayland atbalsts ir eksperimentālā stadijā. Ja nepieciešama neuzraudzīta piekļuve, lūdzu, izmantojiet X11."), + ("Right click to select tabs", "Ar peles labo pogu noklikšķiniet, lai atlasītu cilnes"), + ("Skipped", "Izlaists"), + ("Add to Address Book", "Pievienot adrešu grāmatai"), + ("Group", "Grupa"), + ("Search", "Meklēt"), + ("Closed manually by web console", "Manuāli aizvērta tīmekļa konsole"), + ("Local keyboard type", "Vietējais tastatūras veids"), + ("Select local keyboard type", "Izvēlēties vietējās tastatūras veidu"), + ("software_render_tip", "Ja izmantojat Nvidia grafikas karti operētājsistēmā Linux un attālais logs tiek aizvērts uzreiz pēc savienojuma izveides, var palīdzēt pārslēgšanās uz atvērtā koda Nouveau draiveri un izvēle izmantot programmatūras renderēšanu. Nepieciešama programmatūras restartēšana."), + ("Always use software rendering", "Vienmēr izmantot programmatūras renderēšanu"), + ("config_input", "Lai vadītu attālo darbvirsmu ar tastatūru, jums ir jāpiešķir RustDesk \"Input Monitoring\" atļaujas."), + ("config_microphone", "Lai runātu attālināti, jums ir jāpiešķir RustDesk \"Record Audio\" atļaujas."), + ("request_elevation_tip", "Paaugstinājumu var pieprasīt arī tad, ja attālajā pusē ir kāds cilvēks."), + ("Wait", "Pagaidiet"), + ("Elevation Error", "Paaugstinājuma kļūda"), + ("Ask the remote user for authentication", "Lūdziet attālajam lietotājam autentifikāciju"), + ("Choose this if the remote account is administrator", "Izvēlieties šo, ja attālais konts ir administrators"), + ("Transmit the username and password of administrator", "Pārsūtīt administratora lietotājvārdu un paroli"), + ("still_click_uac_tip", "Joprojām attālajam lietotājam ir jānoklikšķina uz Labi UAC logā, kurā darbojas RustDesk."), + ("Request Elevation", "Pieprasīt paaugstinājumu"), + ("wait_accept_uac_tip", "Lūdzu, uzgaidiet, līdz attālais lietotājs pieņems UAC dialoglodziņu."), + ("Elevate successfully", "Paaugstināšana veiksmīga"), + ("uppercase", "lielie burti"), + ("lowercase", "mazie burti"), + ("digit", "cipars"), + ("special character", "speciāla rakstzīme"), + ("length>=8", "garums>=8"), + ("Weak", "Vāji"), + ("Medium", "Vidējs"), + ("Strong", "Spēcīgs"), + ("Switch Sides", "Pārslēgt puses"), + ("Please confirm if you want to share your desktop?", "Lūdzu, apstipriniet, vai vēlaties koplietot savu darbvirsmu?"), + ("Display", "Displejs"), + ("Default View Style", "Noklusējuma skata stils"), + ("Default Scroll Style", "Noklusējuma ritināšanas stils"), + ("Default Image Quality", "Noklusējuma attēla kvalitāte"), + ("Default Codec", "Noklusējuma kodeks"), + ("Bitrate", "Bitu pārraides ātrums"), + ("FPS", "FPS"), + ("Auto", "Auto"), + ("Other Default Options", "Citas noklusējuma opcijas"), + ("Voice call", "Balss zvans"), + ("Text chat", "Teksta tērzēšana"), + ("Stop voice call", "Apturēt balss zvanu"), + ("relay_hint_tip", "Iespējams, nav iespējams izveidot savienojumu tieši; varat mēģināt izveidot savienojumu, izmantojot releju. Turklāt, ja vēlaties izmantot releju pirmajā mēģinājumā, ID varat pievienot sufiksu \"/r\". vai pēdējo sesiju kartē atlasiet opciju \"Vienmēr izveidot savienojumu, izmantojot releju\", ja tāda pastāv."), + ("Reconnect", "Atkārtoti savienot"), + ("Codec", "Kodeks"), + ("Resolution", "Izšķirtspēja"), + ("No transfers in progress", "Notiek pārsūtīšana"), + ("Set one-time password length", "Iestatīt vienreizējas paroles garumu"), + ("install_cert_tip", "Instalēt RustDesk sertifikātu"), + ("confirm_install_cert_tip", "Šis ir RustDesk testēšanas sertifikāts, kuram var uzticēties. Sertifikāts tiks izmantots, lai uzticētos un vajadzības gadījumā instalētu RustDesk draiverus."), + ("RDP Settings", "RDP iestatījumi"), + ("Sort by", "Kārtot pēc"), + ("New Connection", "Jauns savienojums"), + ("Restore", "Atjaun. uz leju"), + ("Minimize", "Minimizēt"), + ("Maximize", "Maksimizēt"), + ("Your Device", "Jūsu ierīce"), + ("empty_recent_tip", "Hmm, pēdējo sesiju nav!\nLaiks plānot jaunu."), + ("empty_favorite_tip", "Vēl nav iecienītākās sesijas?\nAtradīsim kādu, ar ko sazināties, un pievienosim to jūsu izlasei!"), + ("empty_lan_tip", "Ak nē! Šķiet, ka mēs vēl neesam atklājuši nevienu sesiju."), + ("empty_address_book_tip", "Ak vai, izskatās, ka jūsu adrešu grāmatā šobrīd nav neviena sesija."), + ("eg: admin", "piemēram: admin"), + ("Empty Username", "Tukšs lietotājvārds"), + ("Empty Password", "Tukša parole"), + ("Me", "Es"), + ("identical_file_tip", "Šis fails ir identisks sesijas failam."), + ("show_monitors_tip", "Rādīt monitorus rīkjoslā"), + ("enter_rustdesk_passwd_tip", "Ievadiet RustDesk paroli"), + ("View Mode", "Skatīšanas režīms"), + ("login_linux_tip", "Jums ir jāpiesakās attālajā Linux kontā, lai iespējotu X darbvirsmas sesiju"), + ("verify_rustdesk_password_tip", "Pārbaudīt RustDesk paroli"), + ("remember_account_tip", "Atcerēties šo kontu"), + ("os_account_desk_tip", "Šis konts tiek izmantots, lai pieteiktos attālajā operētājsistēmā un iespējotu darbvirsmas sesiju fonā"), + ("OS Account", "OS konts"), + ("another_user_login_title_tip", "Cits lietotājs jau ir pieteicies"), + ("another_user_login_text_tip", "Atvienot"), + ("xorg_not_found_title_tip", "Xorg nav atrasts"), + ("xorg_not_found_text_tip", "Lūdzu, instalējiet Xorg"), + ("no_desktop_title_tip", "Nav pieejama darbvirsma"), + ("no_desktop_text_tip", "Lūdzu, instalējiet GNOME darbvirsmu"), + ("No need to elevate", "Nav nepieciešams paaugstināt"), + ("System Sound", "Sistēmas skaņa"), + ("Default", "Noklusējums"), + ("New RDP", "Jauns RDP"), + ("Fingerprint", "Pirkstu nospiedums"), + ("Copy Fingerprint", "Kopēt pirkstu nospiedumu"), + ("no fingerprints", "nav pirkstu nospiedumu"), + ("Select a peer", "Atlasīt līdzīgu"), + ("Select peers", "Atlasīt līdzīgus"), + ("Plugins", "Spraudņi"), + ("Uninstall", "Atinstalēt"), + ("Update", "Atjaunināt"), + ("Enable", "Iespējot"), + ("Disable", "Atspējot"), + ("Options", "Opcijas"), + ("resolution_original_tip", "Sākotnējā izšķirtspēja"), + ("resolution_fit_local_tip", "Atbilst vietējai izšķirtspējai"), + ("resolution_custom_tip", "Pielāgota izšķirtspēja"), + ("Collapse toolbar", "Sakļaut rīkjoslu"), + ("Accept and Elevate", "Pieņemt un paaugstināt"), + ("accept_and_elevate_btn_tooltip", "Pieņemt savienojumu un paaugstināt UAC atļaujas."), + ("clipboard_wait_response_timeout_tip", "Noildze gaidot atbildi uz kopiju."), + ("Incoming connection", "Ienākošais savienojums"), + ("Outgoing connection", "Izejošais savienojums"), + ("Exit", "Iziet"), + ("Open", "Atvērt"), + ("logout_tip", "Vai tiešām vēlaties iziet?"), + ("Service", "Serviss"), + ("Start", "Sākt"), + ("Stop", "Apturēt"), + ("exceed_max_devices", "Esat sasniedzis maksimālo pārvaldāmo ierīču skaitu."), + ("Sync with recent sessions", "Sinhronizācija ar pēdējām sesijām"), + ("Sort tags", "Kārtot tagus"), + ("Open connection in new tab", "Atvērt savienojumu jaunā cilnē"), + ("Move tab to new window", "Pārvietot cilni uz jaunu logu"), + ("Can not be empty", "Nevar būt tukšs"), + ("Already exists", "Jau eksistē"), + ("Change Password", "Mainīt paroli"), + ("Refresh Password", "Atsvaidzināt paroli"), + ("ID", "ID"), + ("Grid View", "Režģa skats"), + ("List View", "Saraksta skats"), + ("Select", "Atlasīt"), + ("Toggle Tags", "Pārslēgt tagus"), + ("pull_ab_failed_tip", "Neizdevās atsvaidzināt adrešu grāmatu"), + ("push_ab_failed_tip", "Neizdevās sinhronizēt adrešu grāmatu ar serveri"), + ("synced_peer_readded_tip", "Ierīces, kas bija pēdējās sesijās, tiks sinhronizētas atpakaļ ar adrešu grāmatu."), + ("Change Color", "Mainīt krāsu"), + ("Primary Color", "Primārā krāsa"), + ("HSV Color", "HSV krāsa"), + ("Installation Successful!", "Instalēšana veiksmīga!"), + ("Installation failed!", "Instalēšana neizdevās!"), + ("Reverse mouse wheel", "Reversīvs peles ritenis"), + ("{} sessions", "{} sesijas"), + ("scam_title", "Tevi var APKRĀPT!"), + ("scam_text1", "Ja sarunājaties ar kādu, kuru nepazīstat un kurš ir lūdzis izmantot RustDesk, lai sāktu pakalpojumu, neturpiniet un nekavējoties nolieciet klausuli."), + ("scam_text2", "Viņi, visticamāk, ir krāpnieki, kas mēģina nozagt tavu naudu vai citu privātu informāciju."), + ("Don't show again", "Vairs nerādīt"), + ("I Agree", "Es piekrītu"), + ("Decline", "Noraidīt"), + ("Timeout in minutes", "Noildze minūtēs"), + ("auto_disconnect_option_tip", "Automātiski aizvērt ienākošās sesijas lietotāja neaktivitātes gadījumā"), + ("Connection failed due to inactivity", "Automātiski atvienots neaktivitātes dēļ"), + ("Check for software update on startup", "Startējot pārbaudīt, vai nav programmatūras atjauninājumu"), + ].iter().cloned().collect(); +} From 19444353b466773aedc303e3ef6a6681f5160948 Mon Sep 17 00:00:00 2001 From: Mr-Update <37781396+Mr-Update@users.noreply.github.com> Date: Fri, 15 Sep 2023 21:36:08 +0200 Subject: [PATCH 55/90] Update de.rs --- src/lang/de.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lang/de.rs b/src/lang/de.rs index 70a1e81ef..5b4ffd9e9 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -146,9 +146,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Set Password", "Passwort festlegen"), ("OS Password", "Betriebssystem-Passwort"), ("install_tip", "Aufgrund der Benutzerkontensteuerung (UAC) kann RustDesk in manchen Fällen nicht ordnungsgemäß funktionieren. Um die Benutzerkontensteuerung zu umgehen, klicken Sie bitte auf die Schaltfläche unten und installieren RustDesk auf dem System."), - ("Click to upgrade", "Upgrade"), + ("Click to upgrade", "Zum Upgraden klicken"), ("Click to download", "Zum Herunterladen klicken"), - ("Click to update", "Update"), + ("Click to update", "Zum Aktualisieren klicken"), ("Configure", "Konfigurieren"), ("config_acc", "Um Ihren PC aus der Ferne zu steuern, müssen Sie RustDesk Zugriffsrechte erteilen."), ("config_screen", "Um aus der Ferne auf Ihren PC zugreifen zu können, müssen Sie RustDesk die Berechtigung \"Bildschirmaufnahme\" erteilen."), @@ -554,6 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "Zeitüberschreitung in Minuten"), ("auto_disconnect_option_tip", "Automatisches Schließen eingehender Sitzungen bei Inaktivität des Benutzers"), ("Connection failed due to inactivity", "Automatische Trennung der Verbindung aufgrund von Inaktivität"), - ("Check for software update on startup", ""), + ("Check for software update on startup", "Beim Start auf Softwareaktualisierung prüfen"), ].iter().cloned().collect(); } From 34f20f914a7888a91c2eafd9f86e1ff00f2ba789 Mon Sep 17 00:00:00 2001 From: Ibnul Mutaki Date: Sat, 16 Sep 2023 08:36:39 +0700 Subject: [PATCH 56/90] update indo translation --- src/lang/id.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/id.rs b/src/lang/id.rs index cd4d2dc74..f3ba76299 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -554,6 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "Batasan Waktu dalam Menit"), ("auto_disconnect_option_tip", "Secara otomatis akan menutup sesi ketika pengguna tidak beraktivitas"), ("Connection failed due to inactivity", "Secara otomatis akan terputus ketik tidak ada aktivitas."), - ("Check for software update on startup", ""), + ("Check for software update on startup", "Periksa pembaruan aplikasi saat sistem dinyalakan."), ].iter().cloned().collect(); } From 3766d2b97b934f69883f42bdc25fd1e40f024074 Mon Sep 17 00:00:00 2001 From: RustDesk <71636191+rustdesk@users.noreply.github.com> Date: Sat, 16 Sep 2023 15:04:06 +0800 Subject: [PATCH 57/90] Update vcpkg-deps-linux.yml --- .github/workflows/vcpkg-deps-linux.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/vcpkg-deps-linux.yml b/.github/workflows/vcpkg-deps-linux.yml index 16ed2425b..9801764e4 100644 --- a/.github/workflows/vcpkg-deps-linux.yml +++ b/.github/workflows/vcpkg-deps-linux.yml @@ -42,10 +42,10 @@ jobs: x86_64) apt update -y apt install -y curl zip unzip tar git g++ gcc build-essential pkg-config wget nasm yasm ninja-build libjpeg8-dev libssl-dev - wget https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2.tar.gz + wget https://github.com/Kitware/CMake/releases/download/v3.27.5/cmake-3.27.5.tar.gz apt remove -y --purge cmake - tar -zxvf cmake-3.20.2.tar.gz - cd cmake-3.20.2 + tar -zxvf cmake-3.27.5.tar.gz + cd cmake-3.27.5 ./bootstrap make make install From 0097f5fc8d0338c5198af8b2bb5a65d4754ca708 Mon Sep 17 00:00:00 2001 From: Kleofass Date: Sat, 16 Sep 2023 12:42:03 +0300 Subject: [PATCH 58/90] Update lv.rs --- src/lang/lv.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lang/lv.rs b/src/lang/lv.rs index 4501aec3e..cc0297297 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -57,6 +57,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("ID Server", "ID serveris"), ("Relay Server", "Releja serveris"), ("API Server", "API serveris"), + ("Key", "Atslēga"), ("invalid_http", "jāsākas ar http:// vai https://"), ("Invalid IP", "Nederīga IP"), ("Invalid format", "Nederīgs formāts"), @@ -146,9 +147,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Set Password", "Uzstādīt paroli"), ("OS Password", "OS parole"), ("install_tip", "UAC dēļ RustDesk dažos gadījumos nevar pareizi darboties kā attālā puse. Lai izvairītos no UAC, lūdzu, noklikšķiniet uz tālāk esošās pogas, lai instalētu RustDesk sistēmā."), - ("Click to upgrade", "Noklikšķiniet, lai jauninātu"), - ("Click to download", "Noklikšķiniet, lai lejupielādētu"), - ("Click to update", "Noklikšķiniet, lai atjauninātu"), + ("Click to upgrade", "Jaunināt"), + ("Click to download", "Lejupielādēt"), + ("Click to update", "Atjaunināt"), ("Configure", "Konfigurēt"), ("config_acc", "Lai attālināti vadītu savu darbvirsmu, jums ir jāpiešķir RustDesk \"Accessibility\" atļaujas."), ("config_screen", "Lai attālināti piekļūtu darbvirsmai, jums ir jāpiešķir RustDesk \"Screen Recording\" atļaujas."), @@ -162,7 +163,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Accept and Install", "Pieņemt un instalēt"), ("End-user license agreement", "Gala lietotāja licences līgums"), ("Generating ...", "Ģenerēšana..."), - ("Your installation is lower version.", "Jūsu instalācijai ir veca versija."), + ("Your installation is lower version.", "Jūsu instalācijai ir zemāka versija."), ("not_close_tcp_tip", "Neaizveriet šo logu, kamēr izmantojat tuneli"), ("Listening ...", "Klausās..."), ("Remote Host", "Attālais resursdators"), From bcd1827d8a4db6d2c232815d6dd3462807b01e96 Mon Sep 17 00:00:00 2001 From: NicKoehler Date: Sat, 16 Sep 2023 11:54:17 +0200 Subject: [PATCH 59/90] Changed columns and window behaviour when resized --- flutter/lib/consts.dart | 5 +- .../lib/desktop/pages/file_manager_page.dart | 86 ++++++++++++++----- 2 files changed, 66 insertions(+), 25 deletions(-) diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index c682f9fac..e0fffb27d 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -74,10 +74,6 @@ const int kDesktopDefaultDisplayHeight = 720; const int kMobileMaxDisplaySize = 1280; const int kDesktopMaxDisplaySize = 3840; -const double kDesktopFileTransferNameColWidth = 200; -const double kDesktopFileTransferModifiedColWidth = 120; -const double kDesktopFileTransferMinimumWidth = 100; -const double kDesktopFileTransferMaximumWidth = 300; const double kDesktopFileTransferRowHeight = 30.0; const double kDesktopFileTransferHeaderHeight = 25.0; @@ -142,6 +138,7 @@ const kRemoteScrollStyleBar = 'scrollbar'; /// [kScrollModeDefault] Mouse or touchpad, the default scroll mode. const kScrollModeDefault = 'default'; + /// [kScrollModeReverse] Mouse or touchpad, the reverse scroll mode. const kScrollModeReverse = 'reverse'; diff --git a/flutter/lib/desktop/pages/file_manager_page.dart b/flutter/lib/desktop/pages/file_manager_page.dart index d684d1535..3a42d2191 100644 --- a/flutter/lib/desktop/pages/file_manager_page.dart +++ b/flutter/lib/desktop/pages/file_manager_page.dart @@ -364,15 +364,20 @@ class _FileManagerViewState extends State { final _breadCrumbScroller = ScrollController(); final _keyboardNode = FocusNode(); final _listSearchBuffer = TimeoutStringBuffer(); - final _nameColWidth = kDesktopFileTransferNameColWidth.obs; - final _modifiedColWidth = kDesktopFileTransferModifiedColWidth.obs; + final _nameColWidth = 0.0.obs; + final _modifiedColWidth = 0.0.obs; + final _sizeColWidth = 0.0.obs; final _fileListScrollController = ScrollController(); + final _globalHeaderKey = GlobalKey(); /// [_lastClickTime], [_lastClickEntry] help to handle double click var _lastClickTime = DateTime.now().millisecondsSinceEpoch - bind.getDoubleClickTime() - 1000; Entry? _lastClickEntry; + double? _windowWidthPrev; + double _fileTransferMinimumWidth = 0.0; + FileController get controller => widget.controller; bool get isLocal => widget.controller.isLocal; FFI get _ffi => widget._ffi; @@ -1145,7 +1150,27 @@ class _FileManagerViewState extends State { Widget _buildFileBrowserHeader(BuildContext context) { final padding = EdgeInsets.all(1.0); + final windowWidthNow = MediaQuery.of(context).size.width; + if (_windowWidthPrev == null) { + _windowWidthPrev = windowWidthNow; + final defaultColumnWidth = windowWidthNow * 0.34 / 3; + _fileTransferMinimumWidth = defaultColumnWidth / 3; + _nameColWidth.value = defaultColumnWidth; + _modifiedColWidth.value = defaultColumnWidth; + _sizeColWidth.value = defaultColumnWidth; + } + + if (_windowWidthPrev != windowWidthNow) { + final difference = windowWidthNow / _windowWidthPrev!; + _windowWidthPrev = windowWidthNow; + _fileTransferMinimumWidth *= difference; + _nameColWidth.value *= difference; + _modifiedColWidth.value *= difference; + _sizeColWidth.value *= difference; + } + return SizedBox( + key: _globalHeaderKey, height: kDesktopFileTransferHeaderHeight, child: Row( children: [ @@ -1156,9 +1181,20 @@ class _FileManagerViewState extends State { DraggableDivider( axis: Axis.vertical, onPointerMove: (dx) { + if (_nameColWidth.value + dx <= _fileTransferMinimumWidth) { + return; + } + + if (_modifiedColWidth.value - dx <= _fileTransferMinimumWidth) { + return; + } + _nameColWidth.value += dx; - _nameColWidth.value = min(kDesktopFileTransferMaximumWidth, - max(kDesktopFileTransferMinimumWidth, _nameColWidth.value)); + _nameColWidth.value = + max(_fileTransferMinimumWidth, _nameColWidth.value); + _modifiedColWidth.value -= dx; + _modifiedColWidth.value = + max(_fileTransferMinimumWidth, _modifiedColWidth.value); }, padding: padding, ), @@ -1169,14 +1205,25 @@ class _FileManagerViewState extends State { DraggableDivider( axis: Axis.vertical, onPointerMove: (dx) { + if (_modifiedColWidth.value + dx <= _fileTransferMinimumWidth) { + return; + } + + if (_sizeColWidth.value - dx <= _fileTransferMinimumWidth) { + return; + } + _modifiedColWidth.value += dx; - _modifiedColWidth.value = min( - kDesktopFileTransferMaximumWidth, - max(kDesktopFileTransferMinimumWidth, - _modifiedColWidth.value)); + _modifiedColWidth.value = + max(_fileTransferMinimumWidth, _modifiedColWidth.value); + _sizeColWidth.value -= dx; + _sizeColWidth.value = + max(_fileTransferMinimumWidth, _sizeColWidth.value); }, padding: padding), - Expanded(child: headerItemFunc(null, SortBy.size, translate("Size"))) + Expanded( + child: headerItemFunc( + _sizeColWidth.value, SortBy.size, translate("Size"))) ], ), ); @@ -1201,23 +1248,20 @@ class _FileManagerViewState extends State { height: kDesktopFileTransferHeaderHeight, child: Row( children: [ - Flexible( - flex: 2, + Expanded( child: Text( name, style: headerTextStyle, overflow: TextOverflow.ellipsis, - ).marginSymmetric(horizontal: 4), + ).marginOnly(left: 4), ), - Flexible( - flex: 1, - child: ascending.value != null - ? Icon( - ascending.value! - ? Icons.keyboard_arrow_up_rounded - : Icons.keyboard_arrow_down_rounded, - ) - : const Offstage()) + ascending.value != null + ? Icon( + ascending.value! + ? Icons.keyboard_arrow_up_rounded + : Icons.keyboard_arrow_down_rounded, + ) + : SizedBox() ], ), ), From 780d64a34946fc202e25299cbd72cd0ded76157e Mon Sep 17 00:00:00 2001 From: NicKoehler Date: Sat, 16 Sep 2023 12:28:00 +0200 Subject: [PATCH 60/90] refactor functions --- .../lib/desktop/pages/file_manager_page.dart | 88 ++++++++----------- 1 file changed, 37 insertions(+), 51 deletions(-) diff --git a/flutter/lib/desktop/pages/file_manager_page.dart b/flutter/lib/desktop/pages/file_manager_page.dart index 3a42d2191..1ac7987d7 100644 --- a/flutter/lib/desktop/pages/file_manager_page.dart +++ b/flutter/lib/desktop/pages/file_manager_page.dart @@ -403,6 +403,7 @@ class _FileManagerViewState extends State { @override Widget build(BuildContext context) { + _handleColumnPorportions(); return Container( margin: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(8.0), @@ -434,6 +435,27 @@ class _FileManagerViewState extends State { ); } + void _handleColumnPorportions() { + final windowWidthNow = MediaQuery.of(context).size.width; + if (_windowWidthPrev == null) { + _windowWidthPrev = windowWidthNow; + final defaultColumnWidth = windowWidthNow * 0.115; + _fileTransferMinimumWidth = defaultColumnWidth / 3; + _nameColWidth.value = defaultColumnWidth; + _modifiedColWidth.value = defaultColumnWidth; + _sizeColWidth.value = defaultColumnWidth; + } + + if (_windowWidthPrev != windowWidthNow) { + final difference = windowWidthNow / _windowWidthPrev!; + _windowWidthPrev = windowWidthNow; + _fileTransferMinimumWidth *= difference; + _nameColWidth.value *= difference; + _modifiedColWidth.value *= difference; + _sizeColWidth.value *= difference; + } + } + void onLocationFocusChanged() { debugPrint("focus changed on local"); if (_locationNode.hasFocus) { @@ -1148,27 +1170,19 @@ class _FileManagerViewState extends State { return false; } + void _onDrag(double dx, RxDouble column1, RxDouble column2) { + if (column1.value + dx <= _fileTransferMinimumWidth || + column2.value - dx <= _fileTransferMinimumWidth) { + return; + } + column1.value += dx; + column2.value -= dx; + column1.value = max(_fileTransferMinimumWidth, column1.value); + column2.value = max(_fileTransferMinimumWidth, column2.value); + } + Widget _buildFileBrowserHeader(BuildContext context) { final padding = EdgeInsets.all(1.0); - final windowWidthNow = MediaQuery.of(context).size.width; - if (_windowWidthPrev == null) { - _windowWidthPrev = windowWidthNow; - final defaultColumnWidth = windowWidthNow * 0.34 / 3; - _fileTransferMinimumWidth = defaultColumnWidth / 3; - _nameColWidth.value = defaultColumnWidth; - _modifiedColWidth.value = defaultColumnWidth; - _sizeColWidth.value = defaultColumnWidth; - } - - if (_windowWidthPrev != windowWidthNow) { - final difference = windowWidthNow / _windowWidthPrev!; - _windowWidthPrev = windowWidthNow; - _fileTransferMinimumWidth *= difference; - _nameColWidth.value *= difference; - _modifiedColWidth.value *= difference; - _sizeColWidth.value *= difference; - } - return SizedBox( key: _globalHeaderKey, height: kDesktopFileTransferHeaderHeight, @@ -1180,22 +1194,8 @@ class _FileManagerViewState extends State { ), DraggableDivider( axis: Axis.vertical, - onPointerMove: (dx) { - if (_nameColWidth.value + dx <= _fileTransferMinimumWidth) { - return; - } - - if (_modifiedColWidth.value - dx <= _fileTransferMinimumWidth) { - return; - } - - _nameColWidth.value += dx; - _nameColWidth.value = - max(_fileTransferMinimumWidth, _nameColWidth.value); - _modifiedColWidth.value -= dx; - _modifiedColWidth.value = - max(_fileTransferMinimumWidth, _modifiedColWidth.value); - }, + onPointerMove: (dx) => + _onDrag(dx, _nameColWidth, _modifiedColWidth), padding: padding, ), Obx( @@ -1204,22 +1204,8 @@ class _FileManagerViewState extends State { ), DraggableDivider( axis: Axis.vertical, - onPointerMove: (dx) { - if (_modifiedColWidth.value + dx <= _fileTransferMinimumWidth) { - return; - } - - if (_sizeColWidth.value - dx <= _fileTransferMinimumWidth) { - return; - } - - _modifiedColWidth.value += dx; - _modifiedColWidth.value = - max(_fileTransferMinimumWidth, _modifiedColWidth.value); - _sizeColWidth.value -= dx; - _sizeColWidth.value = - max(_fileTransferMinimumWidth, _sizeColWidth.value); - }, + onPointerMove: (dx) => + _onDrag(dx, _modifiedColWidth, _sizeColWidth), padding: padding), Expanded( child: headerItemFunc( From 8657381dce0b9ba7b7ecfe117d7e9233f0910a2f Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Sat, 16 Sep 2023 15:48:00 +0200 Subject: [PATCH 61/90] Update italian language --- src/lang/it.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/it.rs b/src/lang/it.rs index 4b22c87a6..6b6f31510 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -554,6 +554,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "Timeout in minuti"), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", "Connessione non riuscita a causa di inattività"), - ("Check for software update on startup", ""), + ("Check for software update on startup", "All'avvio programma verifica presenza di aggiornamenti"), ].iter().cloned().collect(); } From 7ffe11b00075858c40dcca8c1e2a0fecd05d6704 Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 17 Sep 2023 09:17:51 +0800 Subject: [PATCH 62/90] fix, macos as the controlled side, crash on disconnect Signed-off-by: fufesou --- Cargo.lock | 2 +- src/server/input_service.rs | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0655e5e4d..3a8adbda2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4881,7 +4881,7 @@ dependencies = [ [[package]] name = "rdev" version = "0.5.0-2" -source = "git+https://github.com/fufesou/rdev#bec664ee8743ade8d2fdd099b114c9eeacd9cfba" +source = "git+https://github.com/fufesou/rdev#2e8221d653f4995c831ad52966e79a514516b1fa" dependencies = [ "cocoa", "core-foundation", diff --git a/src/server/input_service.rs b/src/server/input_service.rs index fd3a7cd24..b721149e9 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -380,9 +380,6 @@ pub fn try_stop_record_cursor_pos() { return; } RECORD_CURSOR_POS_RUNNING.store(false, Ordering::SeqCst); - - #[cfg(any(target_os = "windows", target_os = "macos"))] - let _r = rdev::exit_grab(); } // mac key input must be run in main thread, otherwise crash on >= osx 10.15 From db2e4f30a7665e7c23176736acc4d6b4a4f6b193 Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 17 Sep 2023 10:53:04 +0800 Subject: [PATCH 63/90] Privacy mode, msgbox, add details Signed-off-by: fufesou --- libs/hbb_common/protos/message.proto | 2 + src/client/io_loop.rs | 57 +++++++++++++++++++++++----- src/common.rs | 12 +++++- src/ipc.rs | 3 +- src/platform/linux.rs | 4 +- src/platform/macos.rs | 4 +- src/platform/windows.rs | 10 ++++- src/server/connection.rs | 41 ++++++++++++-------- src/server/video_service.rs | 20 ++++++---- 9 files changed, 112 insertions(+), 41 deletions(-) diff --git a/libs/hbb_common/protos/message.proto b/libs/hbb_common/protos/message.proto index 47de31e45..9cf464547 100644 --- a/libs/hbb_common/protos/message.proto +++ b/libs/hbb_common/protos/message.proto @@ -624,6 +624,8 @@ message BackNotification { PrivacyModeState privacy_mode_state = 1; BlockInputState block_input_state = 2; } + // Supplementary message, for "PrvOnFailed" and "PrvOffFailed" + string details = 3; } message ElevationRequestWithLogon { diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index ddf4b64ac..254f72583 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -1485,6 +1485,7 @@ impl Remote { Some(back_notification::Union::BlockInputState(state)) => { self.handle_back_msg_block_input( state.enum_value_or(back_notification::BlockInputState::BlkStateUnknown), + notification.details, ) .await; } @@ -1492,6 +1493,7 @@ impl Remote { if !self .handle_back_msg_privacy_mode( state.enum_value_or(back_notification::PrivacyModeState::PrvStateUnknown), + notification.details, ) .await { @@ -1508,22 +1510,42 @@ impl Remote { self.handler.update_block_input_state(on); } - async fn handle_back_msg_block_input(&mut self, state: back_notification::BlockInputState) { + async fn handle_back_msg_block_input( + &mut self, + state: back_notification::BlockInputState, + details: String, + ) { match state { back_notification::BlockInputState::BlkOnSucceeded => { self.update_block_input_state(true); } back_notification::BlockInputState::BlkOnFailed => { - self.handler - .msgbox("custom-error", "Block user input", "Failed", ""); + self.handler.msgbox( + "custom-error", + "Block user input", + if details.is_empty() { + "Failed" + } else { + &details + }, + "", + ); self.update_block_input_state(false); } back_notification::BlockInputState::BlkOffSucceeded => { self.update_block_input_state(false); } back_notification::BlockInputState::BlkOffFailed => { - self.handler - .msgbox("custom-error", "Unblock user input", "Failed", ""); + self.handler.msgbox( + "custom-error", + "Unblock user input", + if details.is_empty() { + "Failed" + } else { + &details + }, + "", + ); } _ => {} } @@ -1541,6 +1563,7 @@ impl Remote { async fn handle_back_msg_privacy_mode( &mut self, state: back_notification::PrivacyModeState, + details: String, ) -> bool { match state { back_notification::PrivacyModeState::PrvOnByOther => { @@ -1573,8 +1596,16 @@ impl Remote { self.update_privacy_mode(false); } back_notification::PrivacyModeState::PrvOnFailed => { - self.handler - .msgbox("custom-error", "Privacy mode", "Failed", ""); + self.handler.msgbox( + "custom-error", + "Privacy mode", + if details.is_empty() { + "Failed" + } else { + &details + }, + "", + ); self.update_privacy_mode(false); } back_notification::PrivacyModeState::PrvOffSucceeded => { @@ -1588,8 +1619,16 @@ impl Remote { self.update_privacy_mode(false); } back_notification::PrivacyModeState::PrvOffFailed => { - self.handler - .msgbox("custom-error", "Privacy mode", "Failed to turn off", ""); + self.handler.msgbox( + "custom-error", + "Privacy mode", + if details.is_empty() { + "Failed to turn off" + } else { + &details + }, + "", + ); } back_notification::PrivacyModeState::PrvOffUnknown => { self.handler diff --git a/src/common.rs b/src/common.rs index 8477c9e62..35c062139 100644 --- a/src/common.rs +++ b/src/common.rs @@ -940,9 +940,12 @@ pub async fn post_request_sync(url: String, body: String, header: &str) -> Resul } #[inline] -pub fn make_privacy_mode_msg(state: back_notification::PrivacyModeState) -> Message { +pub fn make_privacy_mode_msg_with_details(state: back_notification::PrivacyModeState, details: String) -> Message { let mut misc = Misc::new(); - let mut back_notification = BackNotification::new(); + let mut back_notification = BackNotification { + details, + ..Default::default() + }; back_notification.set_privacy_mode_state(state); misc.set_back_notification(back_notification); let mut msg_out = Message::new(); @@ -950,6 +953,11 @@ pub fn make_privacy_mode_msg(state: back_notification::PrivacyModeState) -> Mess msg_out } +#[inline] +pub fn make_privacy_mode_msg(state: back_notification::PrivacyModeState) -> Message { + make_privacy_mode_msg_with_details(state, "".to_owned()) +} + pub fn is_keyboard_mode_supported(keyboard_mode: &KeyboardMode, version_number: i64) -> bool { match keyboard_mode { KeyboardMode::Legacy => true, diff --git a/src/ipc.rs b/src/ipc.rs index db41b8649..77440d6dd 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -31,11 +31,10 @@ use hbb_common::{ use crate::rendezvous_mediator::RendezvousMediator; // State with timestamp, because std::time::Instant cannot be serialized -#[derive(Debug, Serialize, Deserialize, Copy, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone)] #[serde(tag = "t", content = "c")] pub enum PrivacyModeState { OffSucceeded, - OffFailed, OffByPeer, OffUnknown, } diff --git a/src/platform/linux.rs b/src/platform/linux.rs index fb48a9307..f78f1f87c 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -627,8 +627,8 @@ pub fn toggle_blank_screen(_v: bool) { // https://unix.stackexchange.com/questions/17170/disable-keyboard-mouse-input-on-unix-under-x } -pub fn block_input(_v: bool) -> bool { - true +pub fn block_input(_v: bool) -> (bool, String) { + (true, "".to_owned()) } pub fn is_installed() -> bool { diff --git a/src/platform/macos.rs b/src/platform/macos.rs index 78e52faf4..0731ae87a 100644 --- a/src/platform/macos.rs +++ b/src/platform/macos.rs @@ -572,8 +572,8 @@ pub fn toggle_blank_screen(_v: bool) { // https://unix.stackexchange.com/questions/17115/disable-keyboard-mouse-temporarily } -pub fn block_input(_v: bool) -> bool { - true +pub fn block_input(_v: bool) -> (bool, String) { + (true, "".to_owned()) } pub fn is_installed() -> bool { diff --git a/src/platform/windows.rs b/src/platform/windows.rs index 41ac9e5ea..e4b3c431d 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -1269,9 +1269,15 @@ pub fn toggle_blank_screen(v: bool) { } } -pub fn block_input(v: bool) -> bool { +pub fn block_input(v: bool) -> (bool, String) { let v = if v { TRUE } else { FALSE }; - unsafe { BlockInput(v) == TRUE } + unsafe { + if BlockInput(v) == TRUE { + (true, "".to_owned()) + } else { + (false, format!("Error code: {}", GetLastError())) + } + } } pub fn add_recent_document(path: &str) { diff --git a/src/server/connection.rs b/src/server/connection.rs index 517e7d4e3..bfda275c1 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -471,11 +471,6 @@ impl Connection { back_notification::PrivacyModeState::PrvOffSucceeded, ) } - ipc::PrivacyModeState::OffFailed => { - crate::common::make_privacy_mode_msg( - back_notification::PrivacyModeState::PrvOffFailed, - ) - } ipc::PrivacyModeState::OffByPeer => { video_service::set_privacy_mode_conn_id(0); crate::common::make_privacy_mode_msg( @@ -704,29 +699,34 @@ impl Connection { handle_pointer(&msg, id); } MessageInput::BlockOn => { - if crate::platform::block_input(true) { + let (ok, msg) = crate::platform::block_input(true); + if ok { block_input_mode = true; } else { Self::send_block_input_error( &tx, back_notification::BlockInputState::BlkOnFailed, + msg, ); } } MessageInput::BlockOff => { - if crate::platform::block_input(false) { + let (ok, msg) = crate::platform::block_input(false); + if ok { block_input_mode = false; } else { Self::send_block_input_error( &tx, back_notification::BlockInputState::BlkOffFailed, + msg, ); } } #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] MessageInput::BlockOnPlugin(_peer) => { - if crate::platform::block_input(true) { + let (ok, _msg) = crate::platform::block_input(true); + if ok { block_input_mode = true; } let _r = PLUGIN_BLOCK_INPUT_TX_RX @@ -738,7 +738,8 @@ impl Connection { #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] MessageInput::BlockOffPlugin(_peer) => { - if crate::platform::block_input(false) { + let (ok, _msg) = crate::platform::block_input(false); + if ok { block_input_mode = false; } let _r = PLUGIN_BLOCK_INPUT_TX_RX @@ -1209,7 +1210,11 @@ impl Connection { } #[inline] - pub fn send_block_input_error(s: &Sender, state: back_notification::BlockInputState) { + pub fn send_block_input_error( + s: &Sender, + state: back_notification::BlockInputState, + details: String, + ) { let mut misc = Misc::new(); let mut back_notification = BackNotification::new(); back_notification.set_block_input_state(state); @@ -2221,13 +2226,16 @@ impl Connection { match q { BoolOption::Yes => { let msg_out = if !video_service::is_privacy_mode_supported() { - crate::common::make_privacy_mode_msg( + crate::common::make_privacy_mode_msg_with_details( back_notification::PrivacyModeState::PrvNotSupported, + "Unsupported. 1 Multi-screen is not supported. 2 Please confirm the license is activated.".to_string(), ) } else { match privacy_mode::turn_on_privacy(self.inner.id) { Ok(true) => { - if video_service::test_create_capturer(self.inner.id, 5_000) { + let err_msg = + video_service::test_create_capturer(self.inner.id, 5_000); + if err_msg.is_empty() { video_service::set_privacy_mode_conn_id(self.inner.id); crate::common::make_privacy_mode_msg( back_notification::PrivacyModeState::PrvOnSucceeded, @@ -2238,8 +2246,9 @@ impl Connection { ); video_service::set_privacy_mode_conn_id(0); let _ = privacy_mode::turn_off_privacy(self.inner.id); - crate::common::make_privacy_mode_msg( + crate::common::make_privacy_mode_msg_with_details( back_notification::PrivacyModeState::PrvOnFailed, + err_msg, ) } } @@ -2261,8 +2270,9 @@ impl Connection { } BoolOption::No => { let msg_out = if !video_service::is_privacy_mode_supported() { - crate::common::make_privacy_mode_msg( + crate::common::make_privacy_mode_msg_with_details( back_notification::PrivacyModeState::PrvNotSupported, + "Unsupported. 1 Multi-screen is not supported. 2 Please confirm the license is activated.".to_string(), ) } else { video_service::set_privacy_mode_conn_id(0); @@ -2597,8 +2607,9 @@ mod privacy_mode { ), Err(e) => { log::error!("Failed to turn off privacy mode {}", e); - crate::common::make_privacy_mode_msg( + crate::common::make_privacy_mode_msg_with_details( back_notification::PrivacyModeState::PrvOffFailed, + e.to_string(), ) } } diff --git a/src/server/video_service.rs b/src/server/video_service.rs index e8f6f30c2..07db5e3be 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -317,17 +317,23 @@ fn create_capturer( } // This function works on privacy mode. Windows only for now. -pub fn test_create_capturer(privacy_mode_id: i32, timeout_millis: u64) -> bool { +pub fn test_create_capturer(privacy_mode_id: i32, timeout_millis: u64) -> String { let test_begin = Instant::now(); - while test_begin.elapsed().as_millis() < timeout_millis as _ { - if let Ok((_, current, display)) = get_current_display() { - if let Ok(_) = create_capturer(privacy_mode_id, display, true, current, false) { - return true; + loop { + let err = match get_current_display() { + Ok((_, current, display)) => { + match create_capturer(privacy_mode_id, display, true, current, false) { + Ok(_) => return "".to_owned(), + Err(e) => e, + } } + Err(e) => e, + }; + if test_begin.elapsed().as_millis() >= timeout_millis as _ { + return err.to_string(); } std::thread::sleep(Duration::from_millis(300)); } - false } #[cfg(windows)] @@ -1025,7 +1031,7 @@ fn try_get_displays() -> ResultType> { // displays = Display::all()?; // } // } - Ok( Display::all()?) + Ok(Display::all()?) } pub(super) fn get_current_display_2(mut all: Vec) -> ResultType<(usize, usize, Display)> { From df19ccf99886a461ffb3a3a3a9389d85be40245b Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 17 Sep 2023 11:07:06 +0800 Subject: [PATCH 64/90] Set details for block input back notification Signed-off-by: fufesou --- src/server/connection.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/connection.rs b/src/server/connection.rs index bfda275c1..9c2928e94 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -1216,7 +1216,10 @@ impl Connection { details: String, ) { let mut misc = Misc::new(); - let mut back_notification = BackNotification::new(); + let mut back_notification = BackNotification { + details, + ..Default::default() + }; back_notification.set_block_input_state(state); misc.set_back_notification(back_notification); let mut msg_out = Message::new(); From ae3efa115134aa9a742669f4b67d2d36dcb6be93 Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 17 Sep 2023 13:01:27 +0800 Subject: [PATCH 65/90] fix, RwLock, remove nested read calls Signed-off-by: fufesou --- src/common.rs | 18 --------- src/flutter_ffi.rs | 23 +++++++---- src/keyboard.rs | 79 +++++++++++++++++-------------------- src/ui_session_interface.rs | 36 ++++++++--------- 4 files changed, 69 insertions(+), 87 deletions(-) diff --git a/src/common.rs b/src/common.rs index 8477c9e62..4146827e8 100644 --- a/src/common.rs +++ b/src/common.rs @@ -1042,24 +1042,6 @@ pub async fn get_key(sync: bool) -> String { key } -pub fn is_peer_version_ge(v: &str) -> bool { - #[cfg(not(any(feature = "flutter", feature = "cli")))] - if let Some(session) = crate::ui::CUR_SESSION.lock().unwrap().as_ref() { - return session.get_peer_version() >= hbb_common::get_version_number(v); - } - - #[cfg(feature = "flutter")] - if let Some(session) = crate::flutter::SESSIONS - .read() - .unwrap() - .get(&*crate::flutter::CUR_SESSION_ID.read().unwrap()) - { - return session.get_peer_version() >= hbb_common::get_version_number(v); - } - - false -} - pub fn pk_to_fingerprint(pk: Vec) -> String { let s: String = pk.iter().map(|u| format!("{:02x}", u)).collect(); s.chars() diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index c9da2cde2..2f3280c52 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1,5 +1,3 @@ -use hbb_common::config::Config; - #[cfg(not(any(target_os = "android", target_os = "ios")))] use crate::common::get_default_sound_input; use crate::{ @@ -293,12 +291,12 @@ pub fn session_get_keyboard_mode(session_id: SessionID) -> Option { pub fn session_set_keyboard_mode(session_id: SessionID, value: String) { let mut _mode_updated = false; if let Some(session) = SESSIONS.write().unwrap().get_mut(&session_id) { - session.save_keyboard_mode(value); + session.save_keyboard_mode(value.clone()); _mode_updated = true; } #[cfg(windows)] if _mode_updated { - crate::keyboard::update_grab_get_key_name(); + crate::keyboard::update_grab_get_key_name(&value); } } @@ -378,7 +376,9 @@ pub fn session_handle_flutter_key_event( down_or_up: bool, ) { if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { + let keyboard_mode = session.get_keyboard_mode(); session.handle_flutter_key_event( + &keyboard_mode, &name, platform_code, position_code, @@ -397,11 +397,12 @@ pub fn session_handle_flutter_key_event( pub fn session_enter_or_leave(_session_id: SessionID, _enter: bool) -> SyncReturn<()> { #[cfg(not(any(target_os = "android", target_os = "ios")))] if let Some(session) = SESSIONS.read().unwrap().get(&_session_id) { + let keyboard_mode = session.get_keyboard_mode(); if _enter { - set_cur_session_id(_session_id); - session.enter(); + set_cur_session_id_(_session_id, &keyboard_mode); + session.enter(&keyboard_mode); } else { - session.leave(); + session.leave(&keyboard_mode); } } SyncReturn(()) @@ -1509,9 +1510,15 @@ pub fn main_update_me() -> SyncReturn { } pub fn set_cur_session_id(session_id: SessionID) { + if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { + set_cur_session_id_(session_id, &session.get_keyboard_mode()) + } +} + +fn set_cur_session_id_(session_id: SessionID, keyboard_mode: &str) { super::flutter::set_cur_session_id(session_id); #[cfg(windows)] - crate::keyboard::update_grab_get_key_name(); + crate::keyboard::update_grab_get_key_name(keyboard_mode); } pub fn install_show_run_without_install() -> SyncReturn { diff --git a/src/keyboard.rs b/src/keyboard.rs index d9b562ed3..d79e396bf 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -56,22 +56,6 @@ pub mod client { static ref IS_GRAB_STARTED: Arc> = Arc::new(Mutex::new(false)); } - pub fn get_keyboard_mode() -> String { - #[cfg(not(any(feature = "flutter", feature = "cli")))] - if let Some(session) = CUR_SESSION.lock().unwrap().as_ref() { - return session.get_keyboard_mode(); - } - #[cfg(feature = "flutter")] - if let Some(session) = SESSIONS - .read() - .unwrap() - .get(&*CUR_SESSION_ID.read().unwrap()) - { - return session.get_keyboard_mode(); - } - "legacy".to_string() - } - pub fn start_grab_loop() { let mut lock = IS_GRAB_STARTED.lock().unwrap(); if *lock { @@ -82,12 +66,12 @@ pub mod client { } #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn change_grab_status(state: GrabState) { + pub fn change_grab_status(state: GrabState, keyboard_mode: &str) { match state { GrabState::Ready => {} GrabState::Run => { #[cfg(windows)] - update_grab_get_key_name(); + update_grab_get_key_name(keyboard_mode); #[cfg(any(target_os = "windows", target_os = "macos"))] KEYBOARD_HOOKED.swap(true, Ordering::SeqCst); @@ -95,7 +79,10 @@ pub mod client { rdev::enable_grab(); } GrabState::Wait => { - release_remote_keys(); + #[cfg(windows)] + rdev::set_get_key_unicode(false); + + release_remote_keys(keyboard_mode); #[cfg(any(target_os = "windows", target_os = "macos"))] KEYBOARD_HOOKED.swap(false, Ordering::SeqCst); @@ -110,17 +97,16 @@ pub mod client { } } - pub fn process_event(event: &Event, lock_modes: Option) -> KeyboardMode { - let keyboard_mode = get_keyboard_mode_enum(); + pub fn process_event(keyboard_mode: &str, event: &Event, lock_modes: Option) { + let keyboard_mode = get_keyboard_mode_enum(keyboard_mode); if is_long_press(&event) { - return keyboard_mode; + return; } for key_event in event_to_key_events(&event, keyboard_mode, lock_modes) { send_key_event(&key_event); } - keyboard_mode } pub fn get_modifiers_state( @@ -215,10 +201,11 @@ pub mod client { } #[cfg(windows)] -pub fn update_grab_get_key_name() { - match get_keyboard_mode_enum() { - KeyboardMode::Map => rdev::set_get_key_unicode(false), - KeyboardMode::Translate => rdev::set_get_key_unicode(true), +pub fn update_grab_get_key_name(keyboard_mode: &str) { + match keyboard_mode { + "map" => rdev::set_get_key_unicode(false), + "translate" => rdev::set_get_key_unicode(true), + "legacy" => rdev::set_get_key_unicode(true), _ => {} }; } @@ -229,6 +216,22 @@ static mut IS_0X021D_DOWN: bool = false; #[cfg(target_os = "macos")] static mut IS_LEFT_OPTION_DOWN: bool = false; +fn get_keyboard_mode() -> String { + #[cfg(not(any(feature = "flutter", feature = "cli")))] + if let Some(session) = CUR_SESSION.lock().unwrap().as_ref() { + return session.get_keyboard_mode(); + } + #[cfg(feature = "flutter")] + if let Some(session) = SESSIONS + .read() + .unwrap() + .get(&*CUR_SESSION_ID.read().unwrap()) + { + return session.get_keyboard_mode(); + } + "legacy".to_string() +} + pub fn start_grab_loop() { std::env::set_var("KEYBOARD_ONLY", "y"); #[cfg(any(target_os = "windows", target_os = "macos"))] @@ -239,11 +242,10 @@ pub fn start_grab_loop() { return Some(event); } - let mut _keyboard_mode = KeyboardMode::Map; let _scan_code = event.position_code; let _code = event.platform_code as KeyCode; let res = if KEYBOARD_HOOKED.load(Ordering::SeqCst) { - _keyboard_mode = client::process_event(&event, None); + client::process_event(&get_keyboard_mode(), &event, None); if is_press { None } else { @@ -304,7 +306,7 @@ pub fn start_grab_loop() { if let Key::Unknown(keycode) = key { log::error!("rdev get unknown key, keycode is : {:?}", keycode); } else { - client::process_event(&event, None); + client::process_event(&get_keyboard_mode(), &event, None); } None } @@ -330,7 +332,7 @@ pub fn is_long_press(event: &Event) -> bool { } #[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn release_remote_keys() { +pub fn release_remote_keys(keyboard_mode: &str) { // todo!: client quit suddenly, how to release keys? let to_release = TO_RELEASE.lock().unwrap().clone(); TO_RELEASE.lock().unwrap().clear(); @@ -339,23 +341,16 @@ pub fn release_remote_keys() { let event = event_type_to_event(event_type); // to-do: BUG // Release events should be sent to the corresponding sessions, instead of current session. - client::process_event(&event, None); + client::process_event(keyboard_mode, &event, None); } } -pub fn get_keyboard_mode_enum() -> KeyboardMode { - match client::get_keyboard_mode().as_str() { +pub fn get_keyboard_mode_enum(keyboard_mode: &str) -> KeyboardMode { + match keyboard_mode { "map" => KeyboardMode::Map, "translate" => KeyboardMode::Translate, "legacy" => KeyboardMode::Legacy, - _ => { - // Set "map" as default mode if version >= 1.2.0. - if crate::is_peer_version_ge("1.2.0") { - KeyboardMode::Map - } else { - KeyboardMode::Legacy - } - } + _ => KeyboardMode::Map, } } diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index 6d12e7a1e..7072f75ec 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -168,7 +168,17 @@ impl Session { } pub fn get_keyboard_mode(&self) -> String { - self.lc.read().unwrap().keyboard_mode.clone() + let mode = self.lc.read().unwrap().keyboard_mode.clone(); + if ["map", "translate", "legacy"].contains(&(&mode as &str)) { + mode + } else { + if self.get_peer_version() > hbb_common::get_version_number("1.2.0") { + "map" + } else { + "legacy" + } + .to_string() + } } pub fn save_keyboard_mode(&mut self, value: String) { @@ -562,28 +572,15 @@ impl Session { } #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn enter(&self) { - #[cfg(target_os = "windows")] - { - match &self.lc.read().unwrap().keyboard_mode as _ { - "legacy" => rdev::set_get_key_unicode(true), - "translate" => rdev::set_get_key_unicode(true), - _ => {} - } - } - + pub fn enter(&self, keyboard_mode: &str) { IS_IN.store(true, Ordering::SeqCst); - keyboard::client::change_grab_status(GrabState::Run); + keyboard::client::change_grab_status(GrabState::Run, keyboard_mode); } #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn leave(&self) { - #[cfg(target_os = "windows")] - { - rdev::set_get_key_unicode(false); - } + pub fn leave(&self, keyboard_mode: &str) { IS_IN.store(false, Ordering::SeqCst); - keyboard::client::change_grab_status(GrabState::Wait); + keyboard::client::change_grab_status(GrabState::Wait, keyboard_mode); } // flutter only TODO new input @@ -631,6 +628,7 @@ impl Session { #[cfg(not(any(target_os = "ios")))] pub fn handle_flutter_key_event( &self, + keyboard_mode: &str, _name: &str, platform_code: i32, position_code: i32, @@ -663,7 +661,7 @@ impl Session { #[cfg(any(target_os = "windows", target_os = "macos"))] extra_data: 0, }; - keyboard::client::process_event(&event, Some(lock_modes)); + keyboard::client::process_event(keyboard_mode, &event, Some(lock_modes)); } // flutter only TODO new input From 72f5fbd6adae8c57808c2b3e64605b9b840cd83f Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 17 Sep 2023 13:41:00 +0800 Subject: [PATCH 66/90] fix build sciter Signed-off-by: fufesou --- src/flutter_ffi.rs | 4 ++-- src/ui/remote.rs | 4 ++-- src/ui/remote.tis | 4 ++-- src/ui_session_interface.rs | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 2f3280c52..e8e17b5cc 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -400,9 +400,9 @@ pub fn session_enter_or_leave(_session_id: SessionID, _enter: bool) -> SyncRetur let keyboard_mode = session.get_keyboard_mode(); if _enter { set_cur_session_id_(_session_id, &keyboard_mode); - session.enter(&keyboard_mode); + session.enter(keyboard_mode); } else { - session.leave(&keyboard_mode); + session.leave(keyboard_mode); } } SyncReturn(()) diff --git a/src/ui/remote.rs b/src/ui/remote.rs index 4ec0d5a5c..95ea977e2 100644 --- a/src/ui/remote.rs +++ b/src/ui/remote.rs @@ -409,8 +409,8 @@ impl sciter::EventHandler for SciterSession { fn login(String, String, String, bool); fn new_rdp(); fn send_mouse(i32, i32, i32, bool, bool, bool, bool); - fn enter(); - fn leave(); + fn enter(String); + fn leave(String); fn ctrl_alt_del(); fn transfer_file(); fn tunnel(); diff --git a/src/ui/remote.tis b/src/ui/remote.tis index 2ed436833..e9694ccc2 100644 --- a/src/ui/remote.tis +++ b/src/ui/remote.tis @@ -273,12 +273,12 @@ function handler.onMouse(evt) case Event.MOUSE_ENTER: entered = true; stdout.println("enter"); - handler.enter(); + handler.enter(handler.get_keyboard_mode()); return keyboard_enabled; case Event.MOUSE_LEAVE: entered = false; stdout.println("leave"); - handler.leave(); + handler.leave(handler.get_keyboard_mode()); if (is_left_down && handler.peer_platform() == "Android") { is_left_down = false; handler.send_mouse((1 << 3) | 2, 0, 0, evt.altKey, diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index 7072f75ec..34ab6e775 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -572,15 +572,15 @@ impl Session { } #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn enter(&self, keyboard_mode: &str) { + pub fn enter(&self, keyboard_mode: String) { IS_IN.store(true, Ordering::SeqCst); - keyboard::client::change_grab_status(GrabState::Run, keyboard_mode); + keyboard::client::change_grab_status(GrabState::Run, &keyboard_mode); } #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn leave(&self, keyboard_mode: &str) { + pub fn leave(&self, keyboard_mode: String) { IS_IN.store(false, Ordering::SeqCst); - keyboard::client::change_grab_status(GrabState::Wait, keyboard_mode); + keyboard::client::change_grab_status(GrabState::Wait, &keyboard_mode); } // flutter only TODO new input From b0225880dea65867a169c76f465a6dcd0806abfe Mon Sep 17 00:00:00 2001 From: dignow Date: Sun, 17 Sep 2023 19:49:02 +0800 Subject: [PATCH 67/90] Change the maximized state on 'Adjust Window' Signed-off-by: dignow --- flutter/lib/desktop/widgets/remote_toolbar.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index a8bacfca3..8f668f7ad 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -775,6 +775,7 @@ class ScreenAdjustor { } await WindowController.fromWindowId(windowId) .setFrame(Rect.fromLTWH(left, top, width, height)); + stateGlobal.setMaximized(false); } } From 6f1f07a1c457557cc65a16b373f8bf24de3544b0 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Sun, 17 Sep 2023 22:58:45 +0800 Subject: [PATCH 68/90] update lock for rustdesk_desktop_multi_window --- flutter/pubspec.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock index b6aca5429..0cbbec368 100644 --- a/flutter/pubspec.lock +++ b/flutter/pubspec.lock @@ -328,7 +328,7 @@ packages: description: path: "." ref: HEAD - resolved-ref: "6c4181330f4ed80c1cb5670bd61aa75115f9f748" + resolved-ref: "c13826357e582b8e53d92782dc81aa7f9e5eba4c" url: "https://github.com/rustdesk-org/rustdesk_desktop_multi_window" source: git version: "0.1.0" From b0990ac6eca3f30af0efbff343082d5ffc5e4ec4 Mon Sep 17 00:00:00 2001 From: dignow Date: Sun, 17 Sep 2023 23:39:54 +0800 Subject: [PATCH 69/90] try fix build, ios Signed-off-by: dignow --- src/ui_session_interface.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index 34ab6e775..5d3ecb7a6 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -617,11 +617,12 @@ impl Session { #[cfg(any(target_os = "ios"))] pub fn handle_flutter_key_event( &self, + _keyboard_mode: &str, _name: &str, - platform_code: i32, - position_code: i32, - lock_modes: i32, - down_or_up: bool, + _platform_code: i32, + _position_code: i32, + _lock_modes: i32, + _down_or_up: bool, ) { } From 09d380ba8f04478520087302ed7cb479acd40e25 Mon Sep 17 00:00:00 2001 From: 21pages Date: Thu, 14 Sep 2023 16:30:45 +0800 Subject: [PATCH 70/90] allow hide peer tab Signed-off-by: 21pages --- flutter/lib/common/widgets/peer_tab_page.dart | 116 ++++++++++++++++-- flutter/lib/models/peer_tab_model.dart | 48 ++++++++ src/lang/lv.rs | 3 - 3 files changed, 157 insertions(+), 10 deletions(-) diff --git a/flutter/lib/common/widgets/peer_tab_page.dart b/flutter/lib/common/widgets/peer_tab_page.dart index cb5413ba1..acd98eea0 100644 --- a/flutter/lib/common/widgets/peer_tab_page.dart +++ b/flutter/lib/common/widgets/peer_tab_page.dart @@ -1,3 +1,6 @@ +import 'dart:ui' as ui; + +import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/common/widgets/address_book.dart'; import 'package:flutter_hbb/common/widgets/dialog.dart'; @@ -6,6 +9,9 @@ import 'package:flutter_hbb/common/widgets/peers_view.dart'; import 'package:flutter_hbb/common/widgets/peer_card.dart'; import 'package:flutter_hbb/consts.dart'; import 'package:flutter_hbb/desktop/widgets/popup_menu.dart'; +import 'package:flutter_hbb/desktop/widgets/material_mod_popup_menu.dart' + as mod_menu; +import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; import 'package:flutter_hbb/models/ab_model.dart'; import 'package:flutter_hbb/models/peer_tab_model.dart'; @@ -61,6 +67,7 @@ class _PeerTabPageState extends State ({dynamic hint}) => gFFI.groupModel.pull(force: hint == null), ), ]; + RelativeRect? mobileTabContextMenuPos; @override void initState() { @@ -100,7 +107,9 @@ class _PeerTabPageState extends State child: selectionWrap(Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Expanded(child: _createSwitchBar(context)), + Expanded( + child: + visibleContextMenuListener(_createSwitchBar(context))), const PeerSearchBar().marginOnly(right: isMobile ? 0 : 13), _createRefresh(), _createMultiSelection(), @@ -145,7 +154,7 @@ class _PeerTabPageState extends State return ListView( scrollDirection: Axis.horizontal, physics: NeverScrollableScrollPhysics(), - children: model.indexs.map((t) { + children: model.visibleIndexs.map((t) { final selected = model.currentTab == t; final color = selected ? MyTheme.tabbar(context).selectedTextColor @@ -164,8 +173,10 @@ class _PeerTabPageState extends State decoration: selected ? decoBorder : (hover.value ? deco : null), child: Tooltip( + preferBelow: false, message: model.tabTooltip(t, gFFI.groupModel.groupName.value), + onTriggered: isMobile ? mobileShowTabVisibilityMenu : null, child: Icon(model.tabIcon(t), color: color), ).paddingSymmetric(horizontal: 4), ).paddingSymmetric(horizontal: 4), @@ -182,14 +193,15 @@ class _PeerTabPageState extends State Widget _createPeersView() { final model = Provider.of(context); Widget child; - if (model.indexs.isEmpty) { - child = Center( - child: Text(translate('Right click to select tabs')), - ); + if (model.visibleIndexs.isEmpty) { + child = visibleContextMenuListener(Row( + children: [Expanded(child: InkWell())], + )); } else { - if (model.indexs.contains(model.currentTab)) { + if (model.visibleIndexs.contains(model.currentTab)) { child = entries[model.currentTab].widget; } else { + debugPrint("should not happen! currentTab not in visibleIndexs"); Future.delayed(Duration.zero, () { model.setCurrentTab(model.indexs[0]); }); @@ -268,6 +280,96 @@ class _PeerTabPageState extends State ); } + void mobileShowTabVisibilityMenu() { + final model = gFFI.peerTabModel; + final items = List.empty(growable: true); + for (int i = 0; i < model.tabNames.length; i++) { + items.add(PopupMenuItem( + height: kMinInteractiveDimension * 0.8, + onTap: () => model.setTabVisible(i, !model.isVisible[i]), + child: Row( + children: [ + Checkbox( + value: model.isVisible[i], + onChanged: (_) { + model.setTabVisible(i, !model.isVisible[i]); + if (Navigator.canPop(context)) { + Navigator.pop(context); + } + }), + Expanded( + child: + Text(model.tabTooltip(i, gFFI.groupModel.groupName.value))), + ], + ), + )); + } + if (mobileTabContextMenuPos != null) { + showMenu( + context: context, position: mobileTabContextMenuPos!, items: items); + } + } + + Widget visibleContextMenuListener(Widget child) { + if (isMobile) { + return GestureDetector( + onLongPressDown: (e) { + final x = e.globalPosition.dx; + final y = e.globalPosition.dy; + mobileTabContextMenuPos = RelativeRect.fromLTRB(x, y, x, y); + }, + onLongPressUp: () { + mobileShowTabVisibilityMenu(); + }, + child: child, + ); + } else { + return Listener( + onPointerDown: (e) { + if (e.kind != ui.PointerDeviceKind.mouse) { + return; + } + if (e.buttons == 2) { + showRightMenu( + (CancelFunc cancelFunc) { + return visibleContextMenu(cancelFunc); + }, + target: e.position, + ); + } + }, + child: child); + } + } + + Widget visibleContextMenu(CancelFunc cancelFunc) { + final model = Provider.of(context); + final menu = List.empty(growable: true); + for (int i = 0; i < model.tabNames.length; i++) { + menu.add(MenuEntrySwitch( + switchType: SwitchType.scheckbox, + text: model.tabTooltip(i, gFFI.groupModel.groupName.value), + getter: () async { + return model.isVisible[i]; + }, + setter: (show) async { + model.setTabVisible(i, show); + cancelFunc(); + })); + } + return mod_menu.PopupMenu( + items: menu + .map((entry) => entry.build( + context, + const MenuConfig( + commonColor: MyTheme.accent, + height: 20.0, + dividerHeight: 12.0, + ))) + .expand((i) => i) + .toList()); + } + Widget createMultiSelectionBar() { final model = Provider.of(context); return Row( diff --git a/flutter/lib/models/peer_tab_model.dart b/flutter/lib/models/peer_tab_model.dart index 2e65e64bd..2fdf9b449 100644 --- a/flutter/lib/models/peer_tab_model.dart +++ b/flutter/lib/models/peer_tab_model.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:math'; import 'package:flutter/material.dart'; @@ -36,7 +37,10 @@ class PeerTabModel with ChangeNotifier { IconFont.addressBook, Icons.group, ]; + final List _isVisible = List.filled(4, true, growable: false); + List get isVisible => _isVisible; List get indexs => List.generate(tabNames.length, (index) => index); + List get visibleIndexs => indexs.where((e) => _isVisible[e]).toList(); List _selectedPeers = List.empty(growable: true); List get selectedPeers => _selectedPeers; bool _multiSelectionMode = false; @@ -49,12 +53,29 @@ class PeerTabModel with ChangeNotifier { String get lastId => _lastId; PeerTabModel(this.parent) { + // visible + try { + final option = bind.getLocalFlutterOption(k: 'peer-tab-visible'); + if (option.isNotEmpty) { + List decodeList = jsonDecode(option); + if (decodeList.length == _isVisible.length) { + for (int i = 0; i < _isVisible.length; i++) { + if (decodeList[i] is bool) { + _isVisible[i] = decodeList[i]; + } + } + } + } + } catch (e) { + debugPrint("failed to get peer tab visible list:$e"); + } // init currentTab _currentTab = int.tryParse(bind.getLocalFlutterOption(k: 'peer-tab-index')) ?? 0; if (_currentTab < 0 || _currentTab >= tabNames.length) { _currentTab = 0; } + _trySetCurrentTabToFirstVisible(); } setCurrentTab(int index) { @@ -158,4 +179,31 @@ class PeerTabModel with ChangeNotifier { } } } + + setTabVisible(int index, bool visible) { + if (index >= 0 && index < _isVisible.length) { + if (_isVisible[index] != visible) { + _isVisible[index] = visible; + if (index == _currentTab && !visible) { + _trySetCurrentTabToFirstVisible(); + } else if (visible && visibleIndexs.length == 1) { + _currentTab = index; + } + try { + bind.setLocalFlutterOption( + k: 'peer-tab-visible', v: jsonEncode(_isVisible)); + } catch (_) {} + notifyListeners(); + } + } + } + + _trySetCurrentTabToFirstVisible() { + if (!_isVisible[_currentTab]) { + int firstVisible = _isVisible.indexWhere((e) => e); + if (firstVisible >= 0) { + _currentTab = firstVisible; + } + } + } } diff --git a/src/lang/lv.rs b/src/lang/lv.rs index cc0297297..64987f268 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -57,7 +57,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("ID Server", "ID serveris"), ("Relay Server", "Releja serveris"), ("API Server", "API serveris"), - ("Key", "Atslēga"), ("invalid_http", "jāsākas ar http:// vai https://"), ("Invalid IP", "Nederīga IP"), ("Invalid format", "Nederīgs formāts"), @@ -297,7 +296,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("This file exists, skip or overwrite this file?", "Šis fails pastāv, izlaist vai pārrakstīt šo failu?"), ("Quit", "Iziet"), ("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"), - ("doc_fix_wayland", "https://rustdesk.com/docs/en/manual/linux/#x11-required"), ("Help", "Palīdzība"), ("Failed", "Neizdevās"), ("Succeeded", "Izdevās"), @@ -481,7 +479,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Me", "Es"), ("identical_file_tip", "Šis fails ir identisks sesijas failam."), ("show_monitors_tip", "Rādīt monitorus rīkjoslā"), - ("enter_rustdesk_passwd_tip", "Ievadiet RustDesk paroli"), ("View Mode", "Skatīšanas režīms"), ("login_linux_tip", "Jums ir jāpiesakās attālajā Linux kontā, lai iespējotu X darbvirsmas sesiju"), ("verify_rustdesk_password_tip", "Pārbaudīt RustDesk paroli"), From b2a4f11e0bf23508d492bc7b21492814bdf66d4b Mon Sep 17 00:00:00 2001 From: 21pages Date: Thu, 14 Sep 2023 10:17:03 +0800 Subject: [PATCH 71/90] enable group, show accessible users and peers Signed-off-by: 21pages --- flutter/lib/common.dart | 56 ++++ flutter/lib/common/hbbs/hbbs.dart | 43 ++- flutter/lib/common/widgets/address_book.dart | 72 +---- flutter/lib/common/widgets/my_group.dart | 58 ++-- flutter/lib/common/widgets/peer_card.dart | 13 +- flutter/lib/common/widgets/peer_tab_page.dart | 31 +- flutter/lib/common/widgets/peers_view.dart | 23 +- flutter/lib/main.dart | 2 + flutter/lib/models/ab_model.dart | 18 +- flutter/lib/models/group_model.dart | 270 +++++++++++------- flutter/lib/models/native_model.dart | 10 +- flutter/lib/models/peer_model.dart | 58 ++-- flutter/lib/models/peer_tab_model.dart | 18 +- flutter/lib/models/user_model.dart | 12 +- libs/hbb_common/src/config.rs | 102 +++++++ src/flutter_ffi.rs | 18 ++ src/lang/ar.rs | 1 + src/lang/ca.rs | 1 + src/lang/cn.rs | 1 + src/lang/cs.rs | 1 + src/lang/da.rs | 1 + src/lang/de.rs | 1 + src/lang/el.rs | 1 + src/lang/en.rs | 1 + src/lang/eo.rs | 1 + src/lang/es.rs | 1 + src/lang/fa.rs | 1 + src/lang/fr.rs | 1 + src/lang/hu.rs | 1 + src/lang/id.rs | 1 + src/lang/it.rs | 1 + src/lang/ja.rs | 1 + src/lang/ko.rs | 1 + src/lang/kz.rs | 1 + src/lang/lt.rs | 1 + src/lang/lv.rs | 1 + src/lang/nl.rs | 1 + src/lang/pl.rs | 1 + src/lang/pt_PT.rs | 1 + src/lang/ptbr.rs | 1 + src/lang/ro.rs | 1 + src/lang/ru.rs | 1 + src/lang/sk.rs | 1 + src/lang/sl.rs | 1 + src/lang/sq.rs | 1 + src/lang/sr.rs | 1 + src/lang/sv.rs | 1 + src/lang/template.rs | 1 + src/lang/th.rs | 1 + src/lang/tr.rs | 1 + src/lang/tw.rs | 1 + src/lang/ua.rs | 1 + src/lang/vn.rs | 1 + 53 files changed, 568 insertions(+), 273 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index a71bd12b9..af0be2519 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -2480,3 +2480,59 @@ String toCapitalized(String s) { } return s.substring(0, 1).toUpperCase() + s.substring(1); } + +Widget buildErrorBanner(BuildContext context, + {required RxBool loading, + required RxString err, + required Function? retry, + required Function close}) { + const double height = 25; + return Obx(() => Offstage( + offstage: !(!loading.value && err.value.isNotEmpty), + child: Center( + child: Container( + height: height, + color: MyTheme.color(context).errorBannerBg, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + FittedBox( + child: Icon( + Icons.info, + color: Color.fromARGB(255, 249, 81, 81), + ), + ).marginAll(4), + Flexible( + child: Align( + alignment: Alignment.centerLeft, + child: Tooltip( + message: translate(err.value), + child: Text( + translate(err.value), + overflow: TextOverflow.ellipsis, + ), + )).marginSymmetric(vertical: 2), + ), + if (retry != null) + InkWell( + onTap: () { + retry.call(); + }, + child: Text( + translate("Retry"), + style: TextStyle(color: MyTheme.accent), + )).marginSymmetric(horizontal: 5), + FittedBox( + child: InkWell( + onTap: () { + close.call(); + }, + child: Icon(Icons.close).marginSymmetric(horizontal: 5), + ), + ).marginAll(4) + ], + ), + )).marginOnly(bottom: 14), + )); +} diff --git a/flutter/lib/common/hbbs/hbbs.dart b/flutter/lib/common/hbbs/hbbs.dart index 8e5c2d02a..dabb3be8f 100644 --- a/flutter/lib/common/hbbs/hbbs.dart +++ b/flutter/lib/common/hbbs/hbbs.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:flutter_hbb/consts.dart'; import 'package:flutter_hbb/models/peer_model.dart'; @@ -48,11 +49,18 @@ class UserPayload { }; return map; } + + Map toGroupCacheJson() { + final Map map = { + 'name': name, + }; + return map; + } } class PeerPayload { String id = ''; - String info = ''; + Map info = {}; int? status; String user = ''; String user_name = ''; @@ -67,7 +75,38 @@ class PeerPayload { note = json['note'] ?? ''; static Peer toPeer(PeerPayload p) { - return Peer.fromJson({"id": p.id, "username": p.user_name}); + return Peer.fromJson({ + "id": p.id, + 'loginName': p.user_name, + "username": p.info['username'] ?? '', + "platform": _platform(p.info['os']), + "hostname": p.info['device_name'], + }); + } + + static String? _platform(dynamic field) { + if (field == null) { + return null; + } + final fieldStr = field.toString(); + List list = fieldStr.split(' / '); + if (list.isEmpty) return null; + final os = list[0]; + switch (os.toLowerCase()) { + case 'windows': + return kPeerPlatformWindows; + case 'linux': + return kPeerPlatformLinux; + case 'macos': + return kPeerPlatformMacOS; + case 'android': + return kPeerPlatformAndroid; + default: + if (fieldStr.toLowerCase().contains('linux')) { + return kPeerPlatformLinux; + } + return null; + } } } diff --git a/flutter/lib/common/widgets/address_book.dart b/flutter/lib/common/widgets/address_book.dart index 070c44126..bb5dc5605 100644 --- a/flutter/lib/common/widgets/address_book.dart +++ b/flutter/lib/common/widgets/address_book.dart @@ -35,7 +35,7 @@ class _AddressBookState extends State { @override Widget build(BuildContext context) => Obx(() { - if (gFFI.userModel.userName.value.isEmpty) { + if (!gFFI.userModel.isLogin) { return Center( child: ElevatedButton( onPressed: loginDialog, child: Text(translate("Login")))); @@ -49,11 +49,13 @@ class _AddressBookState extends State { children: [ // NOT use Offstage to wrap LinearProgressIndicator if (gFFI.abModel.retrying.value) LinearProgressIndicator(), - _buildErrorBanner( + buildErrorBanner(context, + loading: gFFI.abModel.abLoading, err: gFFI.abModel.pullError, retry: null, close: () => gFFI.abModel.pullError.value = ''), - _buildErrorBanner( + buildErrorBanner(context, + loading: gFFI.abModel.abLoading, err: gFFI.abModel.pushError, retry: () => gFFI.abModel.pushAb(isRetry: true), close: () => gFFI.abModel.pushError.value = ''), @@ -66,61 +68,6 @@ class _AddressBookState extends State { } }); - Widget _buildErrorBanner( - {required RxString err, - required Function? retry, - required Function close}) { - const double height = 25; - return Obx(() => Offstage( - offstage: !(!gFFI.abModel.abLoading.value && err.value.isNotEmpty), - child: Center( - child: Container( - height: height, - color: MyTheme.color(context).errorBannerBg, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - FittedBox( - child: Icon( - Icons.info, - color: Color.fromARGB(255, 249, 81, 81), - ), - ).marginAll(4), - Flexible( - child: Align( - alignment: Alignment.centerLeft, - child: Tooltip( - message: translate(err.value), - child: Text( - translate(err.value), - overflow: TextOverflow.ellipsis, - ), - )).marginSymmetric(vertical: 2), - ), - if (retry != null) - InkWell( - onTap: () { - retry.call(); - }, - child: Text( - translate("Retry"), - style: TextStyle(color: MyTheme.accent), - )).marginSymmetric(horizontal: 5), - FittedBox( - child: InkWell( - onTap: () { - close.call(); - }, - child: Icon(Icons.close).marginSymmetric(horizontal: 5), - ), - ).marginAll(4) - ], - ), - )).marginOnly(bottom: 14), - )); - } - Widget _buildAddressBookDesktop() { return Row( children: [ @@ -230,11 +177,10 @@ class _AddressBookState extends State { return Expanded( child: Align( alignment: Alignment.topLeft, - child: Obx(() => AddressBookPeersView( - menuPadding: widget.menuPadding, - // ignore: invalid_use_of_protected_member - initPeers: gFFI.abModel.peers.value, - ))), + child: AddressBookPeersView( + menuPadding: widget.menuPadding, + initPeers: gFFI.abModel.peers, + )), ); } diff --git a/flutter/lib/common/widgets/my_group.dart b/flutter/lib/common/widgets/my_group.dart index 2867d3bce..a4d89155a 100644 --- a/flutter/lib/common/widgets/my_group.dart +++ b/flutter/lib/common/widgets/my_group.dart @@ -29,49 +29,28 @@ class _MyGroupState extends State { @override Widget build(BuildContext context) { return Obx(() { - // use username to be same with ab - if (gFFI.userModel.userName.value.isEmpty) { + if (!gFFI.userModel.isLogin) { return Center( child: ElevatedButton( onPressed: loginDialog, child: Text(translate("Login")))); - } - return buildBody(context); - }); - } - - Widget buildBody(BuildContext context) { - return Obx(() { - if (gFFI.groupModel.groupLoading.value) { + } else if (gFFI.groupModel.groupLoading.value && gFFI.groupModel.emtpy) { return const Center( child: CircularProgressIndicator(), ); } - if (gFFI.groupModel.groupLoadError.isNotEmpty) { - return _buildShowError(gFFI.groupModel.groupLoadError.value); - } - if (isDesktop) { - return _buildDesktop(); - } else { - return _buildMobile(); - } + return Column( + children: [ + buildErrorBanner(context, + loading: gFFI.groupModel.groupLoading, + err: gFFI.groupModel.groupLoadError, + retry: null, + close: () => gFFI.groupModel.groupLoadError.value = ''), + Expanded(child: isDesktop ? _buildDesktop() : _buildMobile()) + ], + ); }); } - Widget _buildShowError(String error) { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(translate(error)), - TextButton( - onPressed: () { - gFFI.groupModel.pull(); - }, - child: Text(translate("Retry"))) - ], - )); - } - Widget _buildDesktop() { return Row( children: [ @@ -100,10 +79,9 @@ class _MyGroupState extends State { Expanded( child: Align( alignment: Alignment.topLeft, - child: Obx(() => MyGroupPeerView( + child: MyGroupPeerView( menuPadding: widget.menuPadding, - // ignore: invalid_use_of_protected_member - initPeers: gFFI.groupModel.peersShow.value))), + initPeers: gFFI.groupModel.peers)), ) ], ); @@ -133,10 +111,9 @@ class _MyGroupState extends State { Expanded( child: Align( alignment: Alignment.topLeft, - child: Obx(() => MyGroupPeerView( + child: MyGroupPeerView( menuPadding: widget.menuPadding, - // ignore: invalid_use_of_protected_member - initPeers: gFFI.groupModel.peersShow.value))), + initPeers: gFFI.groupModel.peers)), ) ], ); @@ -195,6 +172,7 @@ class _MyGroupState extends State { }, child: Obx( () { bool selected = selectedUser.value == username; + final isMe = username == gFFI.userModel.userName.value; return Container( decoration: BoxDecoration( color: selected ? MyTheme.color(context).highlight : null, @@ -208,7 +186,7 @@ class _MyGroupState extends State { children: [ Icon(Icons.person_rounded, color: Colors.grey, size: 16) .marginOnly(right: 4), - Expanded(child: Text(username)), + Expanded(child: Text(isMe ? translate('Me') : username)), ], ).paddingSymmetric(vertical: 4), ), diff --git a/flutter/lib/common/widgets/peer_card.dart b/flutter/lib/common/widgets/peer_card.dart index f5af94220..f6a6ef40e 100644 --- a/flutter/lib/common/widgets/peer_card.dart +++ b/flutter/lib/common/widgets/peer_card.dart @@ -1093,7 +1093,7 @@ class MyGroupPeerCard extends BasePeerCard { menuItems.add(_tcpTunnelingAction(context, peer.id)); } // menuItems.add(await _openNewConnInOptAction(peer.id)); - menuItems.add(await _forceAlwaysRelayAction(peer.id)); + // menuItems.add(await _forceAlwaysRelayAction(peer.id)); if (peer.platform == 'Windows') { menuItems.add(_rdpAction(context, peer.id)); } @@ -1101,9 +1101,14 @@ class MyGroupPeerCard extends BasePeerCard { menuItems.add(_createShortCutAction(peer.id)); } menuItems.add(MenuEntryDivider()); - menuItems.add(_renameAction(peer.id)); - if (await bind.mainPeerHasPassword(id: peer.id)) { - menuItems.add(_unrememberPasswordAction(peer.id)); + // menuItems.add(_renameAction(peer.id)); + // if (await bind.mainPeerHasPassword(id: peer.id)) { + // menuItems.add(_unrememberPasswordAction(peer.id)); + // } + if (gFFI.userModel.userName.isNotEmpty) { + if (!gFFI.abModel.idContainBy(peer.id)) { + menuItems.add(_addToAb(peer)); + } } return menuItems; } diff --git a/flutter/lib/common/widgets/peer_tab_page.dart b/flutter/lib/common/widgets/peer_tab_page.dart index acd98eea0..dccf83c7b 100644 --- a/flutter/lib/common/widgets/peer_tab_page.dart +++ b/flutter/lib/common/widgets/peer_tab_page.dart @@ -111,7 +111,11 @@ class _PeerTabPageState extends State child: visibleContextMenuListener(_createSwitchBar(context))), const PeerSearchBar().marginOnly(right: isMobile ? 0 : 13), - _createRefresh(), + _createRefresh( + index: PeerTabIndex.ab, loading: gFFI.abModel.abLoading), + _createRefresh( + index: PeerTabIndex.group, + loading: gFFI.groupModel.groupLoading), _createMultiSelection(), Offstage( offstage: !isDesktop, @@ -170,12 +174,12 @@ class _PeerTabPageState extends State )); return Obx(() => InkWell( child: Container( - decoration: - selected ? decoBorder : (hover.value ? deco : null), + decoration: (hover.value + ? (selected ? decoBorder : deco) + : (selected ? decoBorder : null)), child: Tooltip( preferBelow: false, - message: - model.tabTooltip(t, gFFI.groupModel.groupName.value), + message: model.tabTooltip(t), onTriggered: isMobile ? mobileShowTabVisibilityMenu : null, child: Icon(model.tabIcon(t), color: color), ).paddingSymmetric(horizontal: 4), @@ -212,17 +216,19 @@ class _PeerTabPageState extends State child: child.marginSymmetric(vertical: isDesktop ? 12.0 : 6.0)); } - Widget _createRefresh() { + Widget _createRefresh( + {required PeerTabIndex index, required RxBool loading}) { + final model = Provider.of(context); final textColor = Theme.of(context).textTheme.titleLarge?.color; return Offstage( - offstage: gFFI.peerTabModel.currentTab != PeerTabIndex.ab.index, + offstage: model.currentTab != index.index, child: RefreshWidget( onPressed: () { if (gFFI.peerTabModel.currentTab < entries.length) { entries[gFFI.peerTabModel.currentTab].load(); } }, - spinning: gFFI.abModel.abLoading, + spinning: loading, child: RotatedBox( quarterTurns: 2, child: Tooltip( @@ -297,9 +303,7 @@ class _PeerTabPageState extends State Navigator.pop(context); } }), - Expanded( - child: - Text(model.tabTooltip(i, gFFI.groupModel.groupName.value))), + Expanded(child: Text(model.tabTooltip(i))), ], ), )); @@ -348,7 +352,7 @@ class _PeerTabPageState extends State for (int i = 0; i < model.tabNames.length; i++) { menu.add(MenuEntrySwitch( switchType: SwitchType.scheckbox, - text: model.tabTooltip(i, gFFI.groupModel.groupName.value), + text: model.tabTooltip(i), getter: () async { return model.isVisible[i]; }, @@ -388,6 +392,9 @@ class _PeerTabPageState extends State Widget deleteSelection() { final model = Provider.of(context); + if (model.currentTab == PeerTabIndex.group.index) { + return Offstage(); + } return _hoverAction( context: context, onTap: () { diff --git a/flutter/lib/common/widgets/peers_view.dart b/flutter/lib/common/widgets/peers_view.dart index 0e4898fc2..28bfb6690 100644 --- a/flutter/lib/common/widgets/peers_view.dart +++ b/flutter/lib/common/widgets/peers_view.dart @@ -35,6 +35,7 @@ class LoadEvent { static const String favorite = 'load_fav_peers'; static const String lan = 'load_lan_peers'; static const String addressBook = 'load_address_book_peers'; + static const String group = 'load_group_peers'; } /// for peer search text, global obs value @@ -312,7 +313,7 @@ abstract class BasePeersView extends StatelessWidget { final String loadEvent; final PeerFilter? peerFilter; final PeerCardBuilder peerCardBuilder; - final List initPeers; + final RxList? initPeers; const BasePeersView({ Key? key, @@ -326,7 +327,7 @@ abstract class BasePeersView extends StatelessWidget { @override Widget build(BuildContext context) { return _PeersView( - peers: Peers(name: name, loadEvent: loadEvent, peers: initPeers), + peers: Peers(name: name, loadEvent: loadEvent, initPeers: initPeers), peerFilter: peerFilter, peerCardBuilder: peerCardBuilder); } @@ -343,7 +344,7 @@ class RecentPeersView extends BasePeersView { peer: peer, menuPadding: menuPadding, ), - initPeers: [], + initPeers: null, ); @override @@ -365,7 +366,7 @@ class FavoritePeersView extends BasePeersView { peer: peer, menuPadding: menuPadding, ), - initPeers: [], + initPeers: null, ); @override @@ -387,7 +388,7 @@ class DiscoveredPeersView extends BasePeersView { peer: peer, menuPadding: menuPadding, ), - initPeers: [], + initPeers: null, ); @override @@ -403,7 +404,7 @@ class AddressBookPeersView extends BasePeersView { {Key? key, EdgeInsets? menuPadding, ScrollController? scrollController, - required List initPeers}) + required RxList initPeers}) : super( key: key, name: 'address book peer', @@ -435,11 +436,11 @@ class MyGroupPeerView extends BasePeersView { {Key? key, EdgeInsets? menuPadding, ScrollController? scrollController, - required List initPeers}) + required RxList initPeers}) : super( key: key, - name: 'my group peer', - loadEvent: 'load_my_group_peers', + name: 'group peer', + loadEvent: LoadEvent.group, peerFilter: filter, peerCardBuilder: (Peer peer) => MyGroupPeerCard( peer: peer, @@ -450,12 +451,12 @@ class MyGroupPeerView extends BasePeersView { static bool filter(Peer peer) { if (gFFI.groupModel.searchUserText.isNotEmpty) { - if (!peer.username.contains(gFFI.groupModel.searchUserText)) { + if (!peer.loginName.contains(gFFI.groupModel.searchUserText)) { return false; } } if (gFFI.groupModel.selectedUser.isNotEmpty) { - if (gFFI.groupModel.selectedUser.value != peer.username) { + if (gFFI.groupModel.selectedUser.value != peer.loginName) { return false; } } diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index 43273c547..d4e81a82d 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -126,6 +126,7 @@ void runMainApp(bool startService) async { bind.pluginListReload(); } gFFI.abModel.loadCache(); + gFFI.groupModel.loadCache(); gFFI.userModel.refreshCurrentUser(); runApp(App()); // Set window option. @@ -154,6 +155,7 @@ void runMobileApp() async { if (isAndroid) androidChannelInit(); platformFFI.syncAndroidServiceAppDirConfigPath(); gFFI.abModel.loadCache(); + gFFI.groupModel.loadCache(); gFFI.userModel.refreshCurrentUser(); runApp(App()); } diff --git a/flutter/lib/models/ab_model.dart b/flutter/lib/models/ab_model.dart index cbb7f7471..6968b2f10 100644 --- a/flutter/lib/models/ab_model.dart +++ b/flutter/lib/models/ab_model.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:flutter_hbb/common/widgets/peers_view.dart'; import 'package:flutter_hbb/models/model.dart'; import 'package:flutter_hbb/models/peer_model.dart'; import 'package:flutter_hbb/models/peer_tab_model.dart'; @@ -115,9 +116,10 @@ class AbModel { _timerCounter = 0; if (pullError.isNotEmpty) { if (statusCode == 401) { - gFFI.userModel.reset(clearAbCache: true); + gFFI.userModel.reset(resetOther: true); } } + platformFFI.tryHandle({'name': LoadEvent.addressBook}); } } @@ -241,7 +243,8 @@ class AbModel { ret = true; _saveCache(); } else { - Map json = _jsonDecodeResp(resp.body, resp.statusCode); + Map json = + _jsonDecodeResp(utf8.decode(resp.bodyBytes), resp.statusCode); if (json.containsKey('error')) { throw json['error']; } else if (resp.statusCode == 200) { @@ -479,11 +482,12 @@ class AbModel { loadCache() async { try { - if (_cacheLoadOnceFlag || abLoading.value) return; + if (_cacheLoadOnceFlag || abLoading.value || initialized) return; _cacheLoadOnceFlag = true; final access_token = bind.mainGetLocalOption(key: 'access_token'); if (access_token.isEmpty) return; final cache = await bind.mainLoadAb(); + if (abLoading.value) return; final data = jsonDecode(cache); if (data == null || data['access_token'] != access_token) return; _deserialize(data); @@ -561,4 +565,12 @@ class AbModel { } }); } + + reset() async { + pullError.value = ''; + pushError.value = ''; + tags.clear(); + peers.clear(); + await bind.mainClearAb(); + } } diff --git a/flutter/lib/models/group_model.dart b/flutter/lib/models/group_model.dart index f2592fa2b..6177c5843 100644 --- a/flutter/lib/models/group_model.dart +++ b/flutter/lib/models/group_model.dart @@ -1,6 +1,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/common/hbbs/hbbs.dart'; +import 'package:flutter_hbb/common/widgets/peers_view.dart'; import 'package:flutter_hbb/models/model.dart'; import 'package:flutter_hbb/models/peer_model.dart'; import 'package:flutter_hbb/models/platform_model.dart'; @@ -11,57 +12,74 @@ import 'package:http/http.dart' as http; class GroupModel { final RxBool groupLoading = false.obs; final RxString groupLoadError = "".obs; - final RxString groupId = ''.obs; - RxString groupName = ''.obs; final RxList users = RxList.empty(growable: true); - final RxList peersShow = RxList.empty(growable: true); + final RxList peers = RxList.empty(growable: true); final RxString selectedUser = ''.obs; final RxString searchUserText = ''.obs; WeakReference parent; var initialized = false; + var _cacheLoadOnceFlag = false; + var _statusCode = 200; + + bool get emtpy => users.isEmpty && peers.isEmpty; GroupModel(this.parent); - reset() { - groupName.value = ''; - groupId.value = ''; - users.clear(); - peersShow.clear(); - initialized = false; - } - Future pull({force = true, quiet = false}) async { - /* + if (!gFFI.userModel.isLogin || groupLoading.value) return; if (!force && initialized) return; if (!quiet) { groupLoading.value = true; groupLoadError.value = ""; } - await _pull(); + try { + await _pull(); + } catch (_) {} groupLoading.value = false; initialized = true; - */ + platformFFI.tryHandle({'name': LoadEvent.group}); + if (_statusCode == 401) { + gFFI.userModel.reset(resetOther: true); + } else { + _saveCache(); + } } Future _pull() async { - reset(); - if (bind.mainGetLocalOption(key: 'access_token') == '') { + List tmpUsers = List.empty(growable: true); + if (!await _getUsers(tmpUsers)) { return; } - try { - if (!await _getGroup()) { - reset(); - return; - } - } catch (e) { - debugPrint('$e'); - reset(); + List tmpPeers = List.empty(growable: true); + if (!await _getPeers(tmpPeers)) { return; } + // me first + var index = tmpUsers + .indexWhere((user) => user.name == gFFI.userModel.userName.value); + if (index != -1) { + var user = tmpUsers.removeAt(index); + tmpUsers.insert(0, user); + } + users.value = tmpUsers; + if (!users.any((u) => u.name == selectedUser.value)) { + selectedUser.value = ''; + } + // recover online + final oldOnlineIDs = peers.where((e) => e.online).map((e) => e.id).toList(); + peers.value = tmpPeers; + peers + .where((e) => oldOnlineIDs.contains(e.id)) + .map((e) => e.online = true) + .toList(); + groupLoadError.value = ''; + } + + Future _getUsers(List tmpUsers) async { final api = "${await bind.mainGetApiServer()}/api/users"; try { var uri0 = Uri.parse(api); - final pageSize = 20; + final pageSize = 100; var total = 0; int current = 0; do { @@ -74,84 +92,63 @@ class GroupModel { queryParameters: { 'current': current.toString(), 'pageSize': pageSize.toString(), - if (gFFI.userModel.isAdmin.isFalse) 'grp': groupId.value, + 'accessible': '', + 'status': '1', }); final resp = await http.get(uri, headers: getHttpHeaders()); - if (resp.body.isNotEmpty && resp.body.toLowerCase() != "null") { - Map json = jsonDecode(utf8.decode(resp.bodyBytes)); - if (json.containsKey('error')) { - throw json['error']; + _statusCode = resp.statusCode; + Map json = + _jsonDecodeResp(utf8.decode(resp.bodyBytes), resp.statusCode); + if (json.containsKey('error')) { + if (json['error'] == 'Admin required!') { + throw translate('upgrade_rustdesk_server_pro_to_{1.1.10}_tip'); } else { - if (json.containsKey('total')) { - if (total == 0) total = json['total']; - if (json.containsKey('data')) { - final data = json['data']; - if (data is List) { - for (final user in data) { - final u = UserPayload.fromJson(user); - if (!users.any((e) => e.name == u.name)) { - users.add(u); - } - } + throw json['error']; + } + } + if (resp.statusCode != 200) { + throw 'HTTP ${resp.statusCode}'; + } + if (json.containsKey('total')) { + if (total == 0) total = json['total']; + if (json.containsKey('data')) { + final data = json['data']; + if (data is List) { + for (final user in data) { + final u = UserPayload.fromJson(user); + int index = tmpUsers.indexWhere((e) => e.name == u.name); + if (index < 0) { + tmpUsers.add(u); + } else { + tmpUsers[index] = u; } } } } } } while (current * pageSize < total); + return true; } catch (err) { - debugPrint('$err'); + debugPrint('get accessible users: $err'); groupLoadError.value = err.toString(); - } finally { - _pullUserPeers(); } - } - - Future _getGroup() async { - final url = await bind.mainGetApiServer(); - final body = { - 'id': await bind.mainGetMyId(), - 'uuid': await bind.mainGetUuid() - }; - try { - final response = await http.post(Uri.parse('$url/api/currentGroup'), - headers: getHttpHeaders(), body: json.encode(body)); - final status = response.statusCode; - if (status == 401 || status == 400) { - return false; - } - final data = json.decode(utf8.decode(response.bodyBytes)); - final error = data['error']; - if (error != null) { - throw error; - } - groupName.value = data['name'] ?? ''; - groupId.value = data['guid'] ?? ''; - return groupId.value.isNotEmpty && groupName.isNotEmpty; - } catch (e) { - debugPrint('$e'); - groupLoadError.value = e.toString(); - } finally {} - return false; } - Future _pullUserPeers() async { - peersShow.clear(); - final api = "${await bind.mainGetApiServer()}/api/peers"; + Future _getPeers(List tmpPeers) async { try { + final api = "${await bind.mainGetApiServer()}/api/peers"; var uri0 = Uri.parse(api); - final pageSize = - 20; // ????????????????????????????????????????????????????? stupid stupis, how about >20 peers + final pageSize = 100; var total = 0; int current = 0; var queryParameters = { 'current': current.toString(), 'pageSize': pageSize.toString(), + 'accessible': '', + 'status': '1', + 'user_status': '1', }; - if (!gFFI.userModel.isAdmin.value) { - queryParameters.addAll({'grp': groupId.value}); - } do { current += 1; var uri = Uri( @@ -161,32 +158,107 @@ class GroupModel { port: uri0.port, queryParameters: queryParameters); final resp = await http.get(uri, headers: getHttpHeaders()); - if (resp.body.isNotEmpty && resp.body.toLowerCase() != "null") { - Map json = jsonDecode(utf8.decode(resp.bodyBytes)); - if (json.containsKey('error')) { - throw json['error']; - } else { - if (json.containsKey('total')) { - if (total == 0) total = json['total']; - if (json.containsKey('data')) { - final data = json['data']; - if (data is List) { - for (final p in data) { - final peerPayload = PeerPayload.fromJson(p); - final peer = PeerPayload.toPeer(peerPayload); - if (!peersShow.any((e) => e.id == peer.id)) { - peersShow.add(peer); - } - } + _statusCode = resp.statusCode; + + Map json = + _jsonDecodeResp(utf8.decode(resp.bodyBytes), resp.statusCode); + if (json.containsKey('error')) { + throw json['error']; + } + if (resp.statusCode != 200) { + throw 'HTTP ${resp.statusCode}'; + } + if (json.containsKey('total')) { + if (total == 0) total = json['total']; + if (total > 1000) { + total = 1000; + } + if (json.containsKey('data')) { + final data = json['data']; + if (data is List) { + for (final p in data) { + final peerPayload = PeerPayload.fromJson(p); + final peer = PeerPayload.toPeer(peerPayload); + int index = tmpPeers.indexWhere((e) => e.id == peer.id); + if (index < 0) { + tmpPeers.add(peer); + } else { + tmpPeers[index] = peer; + } + if (tmpPeers.length >= 1000) { + break; } } } } } } while (current * pageSize < total); + return true; } catch (err) { - debugPrint('$err'); + debugPrint('get accessible peers: $err'); groupLoadError.value = err.toString(); - } finally {} + } + return false; + } + + Map _jsonDecodeResp(String body, int statusCode) { + try { + Map json = jsonDecode(body); + return json; + } catch (e) { + final err = body.isNotEmpty && body.length < 128 ? body : e.toString(); + if (statusCode != 200) { + throw 'HTTP $statusCode, $err'; + } + throw err; + } + } + + void _saveCache() { + try { + final map = ({ + "access_token": bind.mainGetLocalOption(key: 'access_token'), + "users": users.map((e) => e.toGroupCacheJson()).toList(), + 'peers': peers.map((e) => e.toGroupCacheJson()).toList() + }); + bind.mainSaveGroup(json: jsonEncode(map)); + } catch (e) { + debugPrint('group save:$e'); + } + } + + loadCache() async { + try { + if (_cacheLoadOnceFlag || groupLoading.value || initialized) return; + _cacheLoadOnceFlag = true; + final access_token = bind.mainGetLocalOption(key: 'access_token'); + if (access_token.isEmpty) return; + final cache = await bind.mainLoadGroup(); + if (groupLoading.value) return; + final data = jsonDecode(cache); + if (data == null || data['access_token'] != access_token) return; + users.clear(); + peers.clear(); + if (data['users'] is List) { + for (var u in data['users']) { + users.add(UserPayload.fromJson(u)); + } + } + if (data['peers'] is List) { + for (final peer in data['peers']) { + peers.add(Peer.fromJson(peer)); + } + } + } catch (e) { + debugPrint("load group cache: $e"); + } + } + + reset() async { + groupLoadError.value = ''; + users.clear(); + peers.clear(); + selectedUser.value = ''; + await bind.mainClearGroup(); } } diff --git a/flutter/lib/models/native_model.dart b/flutter/lib/models/native_model.dart index 80809309a..4b458f962 100644 --- a/flutter/lib/models/native_model.dart +++ b/flutter/lib/models/native_model.dart @@ -98,7 +98,8 @@ class PlatformFFI { int getRgbaSize(SessionID sessionId) => _ffiBind.sessionGetRgbaSize(sessionId: sessionId); - void nextRgba(SessionID sessionId) => _ffiBind.sessionNextRgba(sessionId: sessionId); + void nextRgba(SessionID sessionId) => + _ffiBind.sessionNextRgba(sessionId: sessionId); void registerTexture(SessionID sessionId, int ptr) => _ffiBind.sessionRegisterTexture(sessionId: sessionId, ptr: ptr); @@ -198,7 +199,7 @@ class PlatformFFI { version = await getVersion(); } - Future _tryHandle(Map evt) async { + Future tryHandle(Map evt) async { final name = evt['name']; if (name != null) { final handlers = _eventHandlers[name]; @@ -216,14 +217,15 @@ class PlatformFFI { /// Start listening to the Rust core's events and frames. void _startListenEvent(RustdeskImpl rustdeskImpl) { - final appType = _appType == kAppTypeDesktopRemote ? '$_appType,$kWindowId' : _appType; + final appType = + _appType == kAppTypeDesktopRemote ? '$_appType,$kWindowId' : _appType; var sink = rustdeskImpl.startGlobalEventStream(appType: appType); sink.listen((message) { () async { try { Map event = json.decode(message); // _tryHandle here may be more flexible than _eventCallback - if (!await _tryHandle(event)) { + if (!await tryHandle(event)) { if (_eventCallback != null) { await _eventCallback!(event); } diff --git a/flutter/lib/models/peer_model.dart b/flutter/lib/models/peer_model.dart index 4d7ac3b28..1ce8648ab 100644 --- a/flutter/lib/models/peer_model.dart +++ b/flutter/lib/models/peer_model.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; +import 'package:get/get.dart'; import 'platform_model.dart'; // ignore: depend_on_referenced_packages import 'package:collection/collection.dart'; @@ -7,7 +8,7 @@ import 'package:collection/collection.dart'; class Peer { final String id; String hash; - String username; + String username; // pc username String hostname; String platform; String alias; @@ -16,6 +17,7 @@ class Peer { String rdpPort; String rdpUsername; bool online = false; + String loginName; //login username String getId() { if (alias != '') { @@ -34,7 +36,8 @@ class Peer { tags = json['tags'] ?? [], forceAlwaysRelay = json['forceAlwaysRelay'] == 'true', rdpPort = json['rdpPort'] ?? '', - rdpUsername = json['rdpUsername'] ?? ''; + rdpUsername = json['rdpUsername'] ?? '', + loginName = json['loginName'] ?? ''; Map toJson() { return { @@ -48,6 +51,7 @@ class Peer { "forceAlwaysRelay": forceAlwaysRelay.toString(), "rdpPort": rdpPort, "rdpUsername": rdpUsername, + 'loginName': loginName, }; } @@ -63,6 +67,16 @@ class Peer { }; } + Map toGroupCacheJson() { + return { + "id": id, + "username": username, + "hostname": hostname, + "platform": platform, + "login_name": loginName, + }; + } + Peer({ required this.id, required this.hash, @@ -74,6 +88,7 @@ class Peer { required this.forceAlwaysRelay, required this.rdpPort, required this.rdpUsername, + required this.loginName, }); Peer.loading() @@ -88,6 +103,7 @@ class Peer { forceAlwaysRelay: false, rdpPort: '', rdpUsername: '', + loginName: '', ); bool equal(Peer other) { return id == other.id && @@ -99,21 +115,24 @@ class Peer { tags.equals(other.tags) && forceAlwaysRelay == other.forceAlwaysRelay && rdpPort == other.rdpPort && - rdpUsername == other.rdpUsername; + rdpUsername == other.rdpUsername && + loginName == other.loginName; } Peer.copy(Peer other) : this( - id: other.id, - hash: other.hash, - username: other.username, - hostname: other.hostname, - platform: other.platform, - alias: other.alias, - tags: other.tags.toList(), - forceAlwaysRelay: other.forceAlwaysRelay, - rdpPort: other.rdpPort, - rdpUsername: other.rdpUsername); + id: other.id, + hash: other.hash, + username: other.username, + hostname: other.hostname, + platform: other.platform, + alias: other.alias, + tags: other.tags.toList(), + forceAlwaysRelay: other.forceAlwaysRelay, + rdpPort: other.rdpPort, + rdpUsername: other.rdpUsername, + loginName: other.loginName, + ); } enum UpdateEvent { online, load } @@ -121,11 +140,14 @@ enum UpdateEvent { online, load } class Peers extends ChangeNotifier { final String name; final String loadEvent; - List peers; + List peers = List.empty(growable: true); + final RxList? initPeers; UpdateEvent event = UpdateEvent.load; static const _cbQueryOnlines = 'callback_query_onlines'; - Peers({required this.name, required this.peers, required this.loadEvent}) { + Peers( + {required this.name, required this.initPeers, required this.loadEvent}) { + peers = initPeers ?? []; platformFFI.registerEventHandler(_cbQueryOnlines, name, (evt) async { _updateOnlineState(evt); }); @@ -176,7 +198,11 @@ class Peers extends ChangeNotifier { void _updatePeers(Map evt) { final onlineStates = _getOnlineStates(); - peers = _decodePeers(evt['peers']); + if (initPeers != null) { + peers = initPeers!; + } else { + peers = _decodePeers(evt['peers']); + } for (var peer in peers) { final state = onlineStates[peer.id]; peer.online = state != null && state != false; diff --git a/flutter/lib/models/peer_tab_model.dart b/flutter/lib/models/peer_tab_model.dart index 2fdf9b449..e4971d9ac 100644 --- a/flutter/lib/models/peer_tab_model.dart +++ b/flutter/lib/models/peer_tab_model.dart @@ -17,8 +17,6 @@ enum PeerTabIndex { group, } -const String defaultGroupTabname = 'Group'; - class PeerTabModel with ChangeNotifier { WeakReference parent; int get currentTab => _currentTab; @@ -28,7 +26,7 @@ class PeerTabModel with ChangeNotifier { 'Favorites', 'Discovered', 'Address Book', - //defaultGroupTabname, + 'Group', ]; final List icons = [ Icons.access_time_filled, @@ -37,7 +35,7 @@ class PeerTabModel with ChangeNotifier { IconFont.addressBook, Icons.group, ]; - final List _isVisible = List.filled(4, true, growable: false); + final List _isVisible = List.filled(5, true, growable: false); List get isVisible => _isVisible; List get indexs => List.generate(tabNames.length, (index) => index); List get visibleIndexs => indexs.where((e) => _isVisible[e]).toList(); @@ -85,17 +83,9 @@ class PeerTabModel with ChangeNotifier { } } - String tabTooltip(int index, String groupName) { + String tabTooltip(int index) { if (index >= 0 && index < tabNames.length) { - if (index == PeerTabIndex.group.index) { - if (gFFI.userModel.isAdmin.value || groupName.isEmpty) { - return translate(defaultGroupTabname); - } else { - return '${translate('Group')}: $groupName'; - } - } else { - return translate(tabNames[index]); - } + return translate(tabNames[index]); } assert(false); return index.toString(); diff --git a/flutter/lib/models/user_model.dart b/flutter/lib/models/user_model.dart index 559e8be36..e6cd26fac 100644 --- a/flutter/lib/models/user_model.dart +++ b/flutter/lib/models/user_model.dart @@ -45,7 +45,7 @@ class UserModel { refreshingUser = false; final status = response.statusCode; if (status == 401 || status == 400) { - reset(clearAbCache: status == 401); + reset(resetOther: status == 401); return; } final data = json.decode(utf8.decode(response.bodyBytes)); @@ -84,11 +84,13 @@ class UserModel { } } - Future reset({bool clearAbCache = false}) async { + Future reset({bool resetOther = false}) async { await bind.mainSetLocalOption(key: 'access_token', value: ''); await bind.mainSetLocalOption(key: 'user_info', value: ''); - if (clearAbCache) await bind.mainClearAb(); - await gFFI.groupModel.reset(); + if (resetOther) { + await gFFI.abModel.reset(); + await gFFI.groupModel.reset(); + } userName.value = ''; } @@ -120,7 +122,7 @@ class UserModel { } catch (e) { debugPrint("request /api/logout failed: err=$e"); } finally { - await reset(clearAbCache: true); + await reset(resetOther: true); gFFI.dialogManager.dismissByTag(tag); } } diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index 82174754c..5a7c7d4b4 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -1650,6 +1650,106 @@ macro_rules! deserialize_default { }; } +#[derive(Debug, Default, Serialize, Deserialize, Clone)] +pub struct GroupPeer { + #[serde( + default, + deserialize_with = "deserialize_string", + skip_serializing_if = "String::is_empty" + )] + pub id: String, + #[serde( + default, + deserialize_with = "deserialize_string", + skip_serializing_if = "String::is_empty" + )] + pub username: String, + #[serde( + default, + deserialize_with = "deserialize_string", + skip_serializing_if = "String::is_empty" + )] + pub hostname: String, + #[serde( + default, + deserialize_with = "deserialize_string", + skip_serializing_if = "String::is_empty" + )] + pub platform: String, + #[serde( + default, + deserialize_with = "deserialize_string", + skip_serializing_if = "String::is_empty" + )] + pub login_name: String, +} + +#[derive(Debug, Default, Serialize, Deserialize, Clone)] +pub struct GroupUser { + #[serde( + default, + deserialize_with = "deserialize_string", + skip_serializing_if = "String::is_empty" + )] + pub name: String, +} + +#[derive(Debug, Default, Serialize, Deserialize, Clone)] +pub struct Group { + #[serde( + default, + deserialize_with = "deserialize_string", + skip_serializing_if = "String::is_empty" + )] + pub access_token: String, + #[serde(default, deserialize_with = "deserialize_vec_groupuser")] + pub users: Vec, + #[serde(default, deserialize_with = "deserialize_vec_grouppeer")] + pub peers: Vec, +} + +impl Group { + fn path() -> PathBuf { + let filename = format!("{}_group", APP_NAME.read().unwrap().clone()); + Config::path(filename) + } + + pub fn store(json: String) { + if let Ok(mut file) = std::fs::File::create(Self::path()) { + let data = compress(json.as_bytes()); + let max_len = 64 * 1024 * 1024; + if data.len() > max_len { + // maxlen of function decompress + return; + } + if let Ok(data) = symmetric_crypt(&data, true) { + file.write_all(&data).ok(); + } + }; + } + + pub fn load() -> Self { + if let Ok(mut file) = std::fs::File::open(Self::path()) { + let mut data = vec![]; + if file.read_to_end(&mut data).is_ok() { + if let Ok(data) = symmetric_crypt(&data, false) { + let data = decompress(&data); + if let Ok(group) = serde_json::from_str::(&String::from_utf8_lossy(&data)) + { + return group; + } + } + } + }; + Self::remove(); + Self::default() + } + + pub fn remove() { + std::fs::remove_file(Self::path()).ok(); + } +} + deserialize_default!(deserialize_string, String); deserialize_default!(deserialize_bool, bool); deserialize_default!(deserialize_i32, i32); @@ -1658,6 +1758,8 @@ deserialize_default!(deserialize_vec_string, Vec); deserialize_default!(deserialize_vec_i32_string_i32, Vec<(i32, String, i32)>); deserialize_default!(deserialize_vec_discoverypeer, Vec); deserialize_default!(deserialize_vec_abpeer, Vec); +deserialize_default!(deserialize_vec_groupuser, Vec); +deserialize_default!(deserialize_vec_grouppeer, Vec); deserialize_default!(deserialize_keypair, KeyPair); deserialize_default!(deserialize_size, Size); deserialize_default!(deserialize_hashmap_string_string, HashMap); diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index c9da2cde2..41262a891 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1187,6 +1187,24 @@ pub fn main_load_ab() -> String { serde_json::to_string(&config::Ab::load()).unwrap_or_default() } +pub fn main_save_group(json: String) { + if json.len() > 1024 { + std::thread::spawn(|| { + config::Group::store(json); + }); + } else { + config::Group::store(json); + } +} + +pub fn main_clear_group() { + config::Group::remove(); +} + +pub fn main_load_group() -> String { + serde_json::to_string(&config::Group::load()).unwrap_or_default() +} + pub fn session_send_pointer(session_id: SessionID, msg: String) { super::flutter::session_send_pointer(session_id, msg); } diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 9b00da2a6..58056fb8d 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 868440bfa..d17601d92 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index b22b6494d..360c259bf 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", "自动关闭不活跃的会话"), ("Connection failed due to inactivity", "由于长时间无操作, 连接被自动断开"), ("Check for software update on startup", "启动时检查软件更新"), + ("upgrade_rustdesk_server_pro_to_{}_tip", "请升级专业版服务器到{}或更高版本!"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 857672eff..823d4f2e2 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index d7151ee2f..7794803da 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 5b4ffd9e9..c05369cbf 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", "Automatisches Schließen eingehender Sitzungen bei Inaktivität des Benutzers"), ("Connection failed due to inactivity", "Automatische Trennung der Verbindung aufgrund von Inaktivität"), ("Check for software update on startup", "Beim Start auf Softwareaktualisierung prüfen"), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index b098452f6..814432d83 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/en.rs b/src/lang/en.rs index 825698385..27e636a9d 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -90,5 +90,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Decline", "Decline"), ("auto_disconnect_option_tip", "Automatically close incoming sessions on user inactivity"), ("Connection failed due to inactivity", "Automatically disconnected due to inactivity"), + ("upgrade_rustdesk_server_pro_to_{}_tip", "Please upgrade RustDesk Server Pro to version {} or newer!") ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index ea1d597d4..f8deef4d9 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 8299e609e..9bc8ef13a 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 98d0c4087..aacd05d27 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 51d690bf3..c37d4defb 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 5ee56c422..13bc5854b 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index f3ba76299..6d0dcd406 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", "Secara otomatis akan menutup sesi ketika pengguna tidak beraktivitas"), ("Connection failed due to inactivity", "Secara otomatis akan terputus ketik tidak ada aktivitas."), ("Check for software update on startup", "Periksa pembaruan aplikasi saat sistem dinyalakan."), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 6b6f31510..11c5a10e0 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", "Connessione non riuscita a causa di inattività"), ("Check for software update on startup", "All'avvio programma verifica presenza di aggiornamenti"), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 017637e48..fd7f436b6 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index f1f6c7311..1e457f51c 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 53fa177df..51c42040f 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 465508005..973c69049 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lv.rs b/src/lang/lv.rs index 64987f268..beff69393 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", "Automātiski aizvērt ienākošās sesijas lietotāja neaktivitātes gadījumā"), ("Connection failed due to inactivity", "Automātiski atvienots neaktivitātes dēļ"), ("Check for software update on startup", "Startējot pārbaudīt, vai nav programmatūras atjauninājumu"), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 4ae999878..4cce433bb 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index e9b03faea..ab49e895b 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", "Automatycznie rozłącz sesje przychodzące przy braku aktywności użytkownika"), ("Connection failed due to inactivity", "Automatycznie rozłącz przy bezczynności"), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 6a3f43800..c753b71cb 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 7a58fc4bc..6ecae0f7d 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index 9557a4031..aa3a9dec1 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index 0bcc11897..d1fd25d77 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", "Автоматически закрывать входящие сеансы при неактивности пользователя"), ("Connection failed due to inactivity", "Подключение не выполнено из-за неактивности"), ("Check for software update on startup", "Проверять обновления программы при запуске"), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index c7d68b4fe..5db5d9abf 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index cf2e29428..142a39967 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 30cb24abe..00cb0a0a7 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index f193a720b..921a491b4 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index a0fb40efe..e8bdeb429 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 03b69bcf6..dd6a05a8d 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index dc430be2b..6ce6a2cd5 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 2bce33d47..6929fc431 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index b13c024a8..dfe152789 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 4301b3b1d..8497555f6 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 3d0f5c455..686f55269 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -555,5 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", ""), ("Check for software update on startup", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", ""), ].iter().cloned().collect(); } From 738ad474c1408c7eecfe78c546840e97d62b1aa0 Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 18 Sep 2023 14:36:55 +0800 Subject: [PATCH 72/90] fix upgrade prompt condition Signed-off-by: 21pages --- flutter/lib/models/group_model.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/flutter/lib/models/group_model.dart b/flutter/lib/models/group_model.dart index 6177c5843..2765f36c9 100644 --- a/flutter/lib/models/group_model.dart +++ b/flutter/lib/models/group_model.dart @@ -100,7 +100,10 @@ class GroupModel { Map json = _jsonDecodeResp(utf8.decode(resp.bodyBytes), resp.statusCode); if (json.containsKey('error')) { - if (json['error'] == 'Admin required!') { + if (json['error'] == 'Admin required!' || + json['error'] + .toString() + .contains('ambiguous column name: status')) { throw translate('upgrade_rustdesk_server_pro_to_{1.1.10}_tip'); } else { throw json['error']; From 3389c798f64c08e3a61d0ff17841ea7dfa0ab6b1 Mon Sep 17 00:00:00 2001 From: 21pages Date: Sat, 16 Sep 2023 21:46:44 +0800 Subject: [PATCH 73/90] remove mac tray session count tooltip, which won't be shown Signed-off-by: 21pages --- src/ipc.rs | 4 ++-- src/tray.rs | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/ipc.rs b/src/ipc.rs index 77440d6dd..2a7bf085d 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -233,7 +233,7 @@ pub enum Data { #[cfg(windows)] SyncWinCpuUsage(Option), FileTransferLog(String), - #[cfg(any(windows, target_os = "macos"))] + #[cfg(windows)] ControlledSessionCount(usize), } @@ -483,7 +483,7 @@ async fn handle(data: Data, stream: &mut Connection) { #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] Data::Plugin(plugin) => crate::plugin::ipc::handle_plugin(plugin, stream).await, - #[cfg(any(windows, target_os = "macos"))] + #[cfg(windows)] Data::ControlledSessionCount(_) => { allow_err!( stream diff --git a/src/tray.rs b/src/tray.rs index 8dac19bab..fc124e6c4 100644 --- a/src/tray.rs +++ b/src/tray.rs @@ -76,7 +76,7 @@ pub fn make_tray() -> hbb_common::ResultType<()> { let menu_channel = MenuEvent::receiver(); let tray_channel = TrayEvent::receiver(); - #[cfg(not(target_os = "linux"))] + #[cfg(windows)] let (ipc_sender, ipc_receiver) = std::sync::mpsc::channel::(); let mut docker_hiden = false; @@ -108,8 +108,7 @@ pub fn make_tray() -> hbb_common::ResultType<()> { } }; - // ubuntu 22.04 can't see tooltip - #[cfg(not(target_os = "linux"))] + #[cfg(windows)] std::thread::spawn(move || { start_query_session_count(ipc_sender.clone()); }); @@ -146,7 +145,7 @@ pub fn make_tray() -> hbb_common::ResultType<()> { } } - #[cfg(not(target_os = "linux"))] + #[cfg(windows)] if let Ok(data) = ipc_receiver.try_recv() { match data { Data::ControlledSessionCount(count) => { @@ -162,7 +161,7 @@ pub fn make_tray() -> hbb_common::ResultType<()> { }); } -#[cfg(not(target_os = "linux"))] +#[cfg(windows)] #[tokio::main(flavor = "current_thread")] async fn start_query_session_count(sender: std::sync::mpsc::Sender) { let mut last_count = 0; From f24a8b3918de8da77d1fe19e95bc66cb6a72ac46 Mon Sep 17 00:00:00 2001 From: borondics Date: Mon, 18 Sep 2023 10:00:52 +0200 Subject: [PATCH 74/90] I suggest to change "unremember" to "forget", just like it is in the code. --- src/ui/ab.tis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/ab.tis b/src/ui/ab.tis index acee472a8..70f46e932 100644 --- a/src/ui/ab.tis +++ b/src/ui/ab.tis @@ -334,7 +334,7 @@ class SessionList: Reactor.Component { {this.type != "lan" &&

  • {translate('Rename')}
  • } {this.type != "fav" &&
  • {translate('Remove')}
  • } {is_win &&
  • {translate('Create Desktop Shortcut')}
  • } -
  • {translate('Unremember Password')}
  • +
  • {translate('Forget Password')}
  • {(!this.type || this.type == "fav") &&
  • {translate('Add to Favorites')}
  • } {(!this.type || this.type == "fav") &&
  • {translate('Remove from Favorites')}
  • } {this.type == "ab" &&
  • {translate('Edit Tag')}
  • } From 6d5f044948a01471a56cfb6ff73589087a26faf9 Mon Sep 17 00:00:00 2001 From: borondics Date: Mon, 18 Sep 2023 10:09:06 +0200 Subject: [PATCH 75/90] Changed "unremember" to "forget" everywhere. It sounds better, shorter and it is also used for variable names as 'forget'. --- flutter/lib/common/widgets/peer_card.dart | 2 +- src/lang/ar.rs | 2 +- src/lang/ca.rs | 2 +- src/lang/cn.rs | 2 +- src/lang/cs.rs | 2 +- src/lang/da.rs | 2 +- src/lang/de.rs | 2 +- src/lang/el.rs | 2 +- src/lang/eo.rs | 2 +- src/lang/es.rs | 2 +- src/lang/fa.rs | 2 +- src/lang/fr.rs | 2 +- src/lang/hu.rs | 2 +- src/lang/id.rs | 2 +- src/lang/it.rs | 2 +- src/lang/ja.rs | 2 +- src/lang/ko.rs | 2 +- src/lang/kz.rs | 2 +- src/lang/lt.rs | 2 +- src/lang/lv.rs | 2 +- src/lang/nl.rs | 2 +- src/lang/pl.rs | 2 +- src/lang/pt_PT.rs | 2 +- src/lang/ptbr.rs | 2 +- src/lang/ro.rs | 2 +- src/lang/ru.rs | 2 +- src/lang/sk.rs | 2 +- src/lang/sl.rs | 2 +- src/lang/sq.rs | 2 +- src/lang/sr.rs | 2 +- src/lang/sv.rs | 2 +- src/lang/template.rs | 2 +- src/lang/th.rs | 2 +- src/lang/tr.rs | 2 +- src/lang/tw.rs | 2 +- src/lang/ua.rs | 2 +- src/lang/vn.rs | 2 +- 37 files changed, 37 insertions(+), 37 deletions(-) diff --git a/flutter/lib/common/widgets/peer_card.dart b/flutter/lib/common/widgets/peer_card.dart index f6a6ef40e..def9cbc6f 100644 --- a/flutter/lib/common/widgets/peer_card.dart +++ b/flutter/lib/common/widgets/peer_card.dart @@ -727,7 +727,7 @@ abstract class BasePeerCard extends StatelessWidget { MenuEntryBase _unrememberPasswordAction(String id) { return MenuEntryButton( childBuilder: (TextStyle? style) => Text( - translate('Unremember Password'), + translate('Forget Password'), style: style, ), proc: () async { diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 58056fb8d..d695c2ad5 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "اسم مستخدم او كلمة مرور خاطئة"), ("The verification code is incorrect or has expired", "رمز التحقق غير صحيح او منتهي"), ("Edit Tag", "تحرير علامة"), - ("Unremember Password", "عدم تذكر كلمة المرور"), + ("Forget Password", "عدم تذكر كلمة المرور"), ("Favorites", "المفضلة"), ("Add to Favorites", "اضافة للمفضلة"), ("Remove from Favorites", "ازالة من المفضلة"), diff --git a/src/lang/ca.rs b/src/lang/ca.rs index d17601d92..a047ee501 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Credencials incorrectes"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Editar tag"), - ("Unremember Password", "Contrasenya oblidada"), + ("Forget Password", "Contrasenya oblidada"), ("Favorites", "Preferits"), ("Add to Favorites", "Afegir a preferits"), ("Remove from Favorites", "Treure de preferits"), diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 360c259bf..989e962f3 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "提供的登录信息错误"), ("The verification code is incorrect or has expired", "验证码错误或已超时"), ("Edit Tag", "修改标签"), - ("Unremember Password", "忘记密码"), + ("Forget Password", "忘记密码"), ("Favorites", "收藏"), ("Add to Favorites", "加入到收藏"), ("Remove from Favorites", "从收藏中删除"), diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 823d4f2e2..fe2b9f3d7 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Nesprávné přihlašovací údaje"), ("The verification code is incorrect or has expired", "Ověřovací kód je nesprávný, nebo jeho platnost vypršela"), ("Edit Tag", "Upravit štítek"), - ("Unremember Password", "Přestat si pamatovat heslo"), + ("Forget Password", "Přestat si pamatovat heslo"), ("Favorites", "Oblíbené"), ("Add to Favorites", "Přidat do oblíbených"), ("Remove from Favorites", "Odebrat z oblíbených"), diff --git a/src/lang/da.rs b/src/lang/da.rs index 7794803da..b287056d1 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Forkerte registreringsdata"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Rediger nøgleord"), - ("Unremember Password", "Glem adgangskoden"), + ("Forget Password", "Glem adgangskoden"), ("Favorites", "Favoritter"), ("Add to Favorites", "Tilføj til favoritter"), ("Remove from Favorites", "Fjern favoritter"), diff --git a/src/lang/de.rs b/src/lang/de.rs index c05369cbf..cd4bd3db9 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Falsche Anmeldedaten"), ("The verification code is incorrect or has expired", "Der Verifizierungscode ist falsch oder abgelaufen"), ("Edit Tag", "Tag bearbeiten"), - ("Unremember Password", "Gespeichertes Passwort löschen"), + ("Forget Password", "Gespeichertes Passwort löschen"), ("Favorites", "Favoriten"), ("Add to Favorites", "Zu Favoriten hinzufügen"), ("Remove from Favorites", "Aus Favoriten entfernen"), diff --git a/src/lang/el.rs b/src/lang/el.rs index 814432d83..d58d7b0ad 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Λάθος διαπιστευτήρια"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Επεξεργασία ετικέτας"), - ("Unremember Password", "Διαγραφή απομνημονευμένου κωδικού"), + ("Forget Password", "Διαγραφή απομνημονευμένου κωδικού"), ("Favorites", "Αγαπημένα"), ("Add to Favorites", "Προσθήκη στα αγαπημένα"), ("Remove from Favorites", "Κατάργηση από τα Αγαπημένα"), diff --git a/src/lang/eo.rs b/src/lang/eo.rs index f8deef4d9..49fd95982 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Identigilo aŭ pasvorto erara"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Redakti etikedo"), - ("Unremember Password", "Forgesi pasvorton"), + ("Forget Password", "Forgesi pasvorton"), ("Favorites", "Favorataj"), ("Add to Favorites", "Aldoni al la favorataj"), ("Remove from Favorites", "Forigi el la favorataj"), diff --git a/src/lang/es.rs b/src/lang/es.rs index 9bc8ef13a..4c02b69b1 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Credenciales incorrectas"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Editar tag"), - ("Unremember Password", "Olvidar contraseña"), + ("Forget Password", "Olvidar contraseña"), ("Favorites", "Favoritos"), ("Add to Favorites", "Agregar a favoritos"), ("Remove from Favorites", "Quitar de favoritos"), diff --git a/src/lang/fa.rs b/src/lang/fa.rs index aacd05d27..fca9610ce 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "اعتبارنامه نادرست است"), ("The verification code is incorrect or has expired", "کد تأیید نادرست است یا منقضی شده است"), ("Edit Tag", "ویرایش برچسب"), - ("Unremember Password", "رمز عبور ذخیره نشود"), + ("Forget Password", "رمز عبور ذخیره نشود"), ("Favorites", "اتصالات دلخواه"), ("Add to Favorites", "افزودن به علاقه مندی ها"), ("Remove from Favorites", "از علاقه مندی ها حذف شود"), diff --git a/src/lang/fr.rs b/src/lang/fr.rs index c37d4defb..fec7f5bb7 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Identifiant ou mot de passe erroné"), ("The verification code is incorrect or has expired", "Le code de vérification est incorrect ou a expiré"), ("Edit Tag", "Gestion étiquettes"), - ("Unremember Password", "Oublier le Mot de passe"), + ("Forget Password", "Oublier le Mot de passe"), ("Favorites", "Favoris"), ("Add to Favorites", "Ajouter aux Favoris"), ("Remove from Favorites", "Retirer des favoris"), diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 13bc5854b..bb6d0e2cc 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Hibás felhasználónév vagy jelszó"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Címke szerkesztése"), - ("Unremember Password", "A jelszó megjegyzésének törlése"), + ("Forget Password", "A jelszó megjegyzésének törlése"), ("Favorites", "Kedvencek"), ("Add to Favorites", "Hozzáadás a kedvencekhez"), ("Remove from Favorites", "Eltávolítás a kedvencekből"), diff --git a/src/lang/id.rs b/src/lang/id.rs index 6d0dcd406..99629dfd7 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Nama pengguna atau kata sandi salah"), ("The verification code is incorrect or has expired", "Kode verifikasi salah atau sudah kadaluarsa"), ("Edit Tag", "Ubah Tag"), - ("Unremember Password", "Lupakan Kata Sandi"), + ("Forget Password", "Lupakan Kata Sandi"), ("Favorites", "Favorit"), ("Add to Favorites", "Tambah ke Favorit"), ("Remove from Favorites", "Hapus dari favorit"), diff --git a/src/lang/it.rs b/src/lang/it.rs index 11c5a10e0..ca9d6aa5a 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Credenziali errate"), ("The verification code is incorrect or has expired", "Il codice di verifica non è corretto o è scaduto"), ("Edit Tag", "Modifica etichetta"), - ("Unremember Password", "Dimentica password"), + ("Forget Password", "Dimentica password"), ("Favorites", "Preferiti"), ("Add to Favorites", "Aggiungi ai preferiti"), ("Remove from Favorites", "Rimuovi dai preferiti"), diff --git a/src/lang/ja.rs b/src/lang/ja.rs index fd7f436b6..712f68053 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "資格情報が間違っています"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "タグを編集"), - ("Unremember Password", "パスワードの記憶を解除"), + ("Forget Password", "パスワードの記憶を解除"), ("Favorites", "お気に入り"), ("Add to Favorites", "お気に入りに追加"), ("Remove from Favorites", "お気に入りから削除"), diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 1e457f51c..6d2c4f43c 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "틀린 인증 정보"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "태그 수정"), - ("Unremember Password", "패스워드 기억하지 않기"), + ("Forget Password", "패스워드 기억하지 않기"), ("Favorites", "즐겨찾기"), ("Add to Favorites", "즐겨찾기에 추가"), ("Remove from Favorites", "즐겨찾기에서 삭제"), diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 51c42040f..2a6c3ef51 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Бұрыс тіркелгі деректер"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Тақты Өндеу"), - ("Unremember Password", "Құпия сөзді Ұмыту"), + ("Forget Password", "Құпия сөзді Ұмыту"), ("Favorites", "Таңдаулылар"), ("Add to Favorites", "Таңдаулыларға Қосу"), ("Remove from Favorites", "Таңдаулылардан алып тастау"), diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 973c69049..468396992 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Klaidingi kredencialai"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Redaguoti žymą"), - ("Unremember Password", "Nebeprisiminti slaptažodžio"), + ("Forget Password", "Nebeprisiminti slaptažodžio"), ("Favorites", "Parankiniai"), ("Add to Favorites", "Įtraukti į parankinius"), ("Remove from Favorites", "Pašalinti iš parankinių"), diff --git a/src/lang/lv.rs b/src/lang/lv.rs index beff69393..e70934064 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Nepareizs lietotājvārds vai parole"), ("The verification code is incorrect or has expired", "Verifikācijas kods ir nepareizs vai tam ir beidzies derīguma termiņš"), ("Edit Tag", "Rediģēt tagu"), - ("Unremember Password", "Neatcerēties paroli"), + ("Forget Password", "Neatcerēties paroli"), ("Favorites", "Izlase"), ("Add to Favorites", "Pievienot pie izlases"), ("Remove from Favorites", "Noņemt no izlases"), diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 4cce433bb..33ffb7a8e 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Verkeerde inloggegevens"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Label Bewerken"), - ("Unremember Password", "Wachtwoord vergeten"), + ("Forget Password", "Wachtwoord vergeten"), ("Favorites", "Favorieten"), ("Add to Favorites", "Toevoegen aan Favorieten"), ("Remove from Favorites", "Verwijderen uit Favorieten"), diff --git a/src/lang/pl.rs b/src/lang/pl.rs index ab49e895b..fd35a4cc2 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Błędne dane uwierzytelniające"), ("The verification code is incorrect or has expired", "Kod weryfikacyjny jest niepoprawny lub wygasł"), ("Edit Tag", "Edytuj tag"), - ("Unremember Password", "Zapomnij hasło"), + ("Forget Password", "Zapomnij hasło"), ("Favorites", "Ulubione"), ("Add to Favorites", "Dodaj do ulubionych"), ("Remove from Favorites", "Usuń z ulubionych"), diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index c753b71cb..f0e26387e 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Nome de utilizador ou palavra-chave incorrectos"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Editar Tag"), - ("Unremember Password", "Esquecer Palavra-chave"), + ("Forget Password", "Esquecer Palavra-chave"), ("Favorites", "Favoritos"), ("Add to Favorites", "Adicionar aos Favoritos"), ("Remove from Favorites", "Remover dos Favoritos"), diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 6ecae0f7d..7c76a6507 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Nome de usuário ou senha incorretos"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Editar Tag"), - ("Unremember Password", "Esquecer Senha"), + ("Forget Password", "Esquecer Senha"), ("Favorites", "Favoritos"), ("Add to Favorites", "Adicionar aos Favoritos"), ("Remove from Favorites", "Remover dos Favoritos"), diff --git a/src/lang/ro.rs b/src/lang/ro.rs index aa3a9dec1..35c5358a8 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Nume sau parolă greșită"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Modifică etichetă"), - ("Unremember Password", "Uită parola"), + ("Forget Password", "Uită parola"), ("Favorites", "Favorite"), ("Add to Favorites", "Adaugă la Favorite"), ("Remove from Favorites", "Șterge din Favorite"), diff --git a/src/lang/ru.rs b/src/lang/ru.rs index d1fd25d77..c9a8511fc 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Неправильные учётные данные"), ("The verification code is incorrect or has expired", "Проверочный код неправильный или устарел"), ("Edit Tag", "Изменить метку"), - ("Unremember Password", "Не сохранять пароль"), + ("Forget Password", "Не сохранять пароль"), ("Favorites", "Избранное"), ("Add to Favorites", "Добавить в избранное"), ("Remove from Favorites", "Удалить из избранного"), diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 5db5d9abf..c25dc377c 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Nesprávne prihlasovacie údaje"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Upraviť štítok"), - ("Unremember Password", "Zabudnúť heslo"), + ("Forget Password", "Zabudnúť heslo"), ("Favorites", "Obľúbené"), ("Add to Favorites", "Pridať medzi obľúbené"), ("Remove from Favorites", "Odstrániť z obľúbených"), diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 142a39967..60d8e113b 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Napačne poverilnice"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Uredi oznako"), - ("Unremember Password", "Pozabi geslo"), + ("Forget Password", "Pozabi geslo"), ("Favorites", "Priljubljene"), ("Add to Favorites", "Dodaj med priljubljene"), ("Remove from Favorites", "Odstrani iz priljubljenih"), diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 00cb0a0a7..56a13621e 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Kredinciale të gabuara"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Edito tagun"), - ("Unremember Password", "Fjalëkalim jo i kujtueshëm"), + ("Forget Password", "Fjalëkalim jo i kujtueshëm"), ("Favorites", "Te preferuarat"), ("Add to Favorites", "Shto te të preferuarat"), ("Remove from Favorites", "Hiq nga të preferuarat"), diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 921a491b4..f8d8c4edd 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Pogrešno korisničko ime ili lozinka"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Izmeni oznaku"), - ("Unremember Password", "Zaboravi lozinku"), + ("Forget Password", "Zaboravi lozinku"), ("Favorites", "Favoriti"), ("Add to Favorites", "Dodaj u favorite"), ("Remove from Favorites", "Izbaci iz favorita"), diff --git a/src/lang/sv.rs b/src/lang/sv.rs index e8bdeb429..c09f02a25 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Fel användarnamn eller lösenord"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Ändra Tagg"), - ("Unremember Password", "Glöm lösenord"), + ("Forget Password", "Glöm lösenord"), ("Favorites", "Favoriter"), ("Add to Favorites", "Lägg till favorit"), ("Remove from Favorites", "Ta bort från favoriter"), diff --git a/src/lang/template.rs b/src/lang/template.rs index dd6a05a8d..962cda2d9 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", ""), ("The verification code is incorrect or has expired", ""), ("Edit Tag", ""), - ("Unremember Password", ""), + ("Forget Password", ""), ("Favorites", ""), ("Add to Favorites", ""), ("Remove from Favorites", ""), diff --git a/src/lang/th.rs b/src/lang/th.rs index 6ce6a2cd5..2913ba116 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "ข้อมูลสำหรับเข้าสู่ระบบไม่ถูกต้อง"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "แก้ไขแท็ก"), - ("Unremember Password", "ยกเลิกการจดจำรหัสผ่าน"), + ("Forget Password", "ยกเลิกการจดจำรหัสผ่าน"), ("Favorites", "รายการโปรด"), ("Add to Favorites", "เพิ่มไปยังรายการโปรด"), ("Remove from Favorites", "ลบออกจากรายการโปรด"), diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 6929fc431..3f5c1c56e 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Yanlış kimlik bilgileri"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Etiketi düzenle"), - ("Unremember Password", "Şifreyi Unut"), + ("Forget Password", "Şifreyi Unut"), ("Favorites", "Favoriler"), ("Add to Favorites", "Favorilere ekle"), ("Remove from Favorites", "Favorilerden çıkar"), diff --git a/src/lang/tw.rs b/src/lang/tw.rs index dfe152789..0a8efc8bb 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "登入資訊錯誤"), ("The verification code is incorrect or has expired", "驗證碼錯誤或已過期"), ("Edit Tag", "編輯標籤"), - ("Unremember Password", "忘記密碼"), + ("Forget Password", "忘記密碼"), ("Favorites", "我的最愛"), ("Add to Favorites", "加入我的最愛"), ("Remove from Favorites", "從我的最愛中移除"), diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 8497555f6..8fba30edb 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Неправильні дані"), ("The verification code is incorrect or has expired", "Код підтвердження некоректний або протермінований"), ("Edit Tag", "Редагувати тег"), - ("Unremember Password", "Не зберігати пароль"), + ("Forget Password", "Не зберігати пароль"), ("Favorites", "Вибране"), ("Add to Favorites", "Додати в обране"), ("Remove from Favorites", "Видалити з обраного"), diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 686f55269..4d9fc6f18 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -235,7 +235,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wrong credentials", "Chứng danh bị sai"), ("The verification code is incorrect or has expired", ""), ("Edit Tag", "Chỉnh sửa Tag"), - ("Unremember Password", "Quên mật khẩu"), + ("Forget Password", "Quên mật khẩu"), ("Favorites", "Ưa thích"), ("Add to Favorites", "Thêm vào mục Ưa thích"), ("Remove from Favorites", "Xóa khỏi mục Ưa thích"), From 607c81887986cca51a4f1c5afca98a296ecd52e1 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Mon, 18 Sep 2023 10:52:11 +0200 Subject: [PATCH 76/90] Update Italian language --- src/lang/it.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/it.rs b/src/lang/it.rs index 11c5a10e0..74326184b 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -554,7 +554,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "Timeout in minuti"), ("auto_disconnect_option_tip", ""), ("Connection failed due to inactivity", "Connessione non riuscita a causa di inattività"), - ("Check for software update on startup", "All'avvio programma verifica presenza di aggiornamenti"), - ("upgrade_rustdesk_server_pro_to_{}_tip", ""), + ("Check for software update on startup", "All'avvio verifica presenza aggiornamenti programma"), + ("upgrade_rustdesk_server_pro_to_{}_tip", "Aggiorna RustDesk Server Pro alla versione {} o successiva!"), ].iter().cloned().collect(); } From 4eb76cdc30fd478af14ef743e920487808d6184e Mon Sep 17 00:00:00 2001 From: Kleofass Date: Mon, 18 Sep 2023 15:08:42 +0300 Subject: [PATCH 77/90] Update lv.rs --- src/lang/lv.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lang/lv.rs b/src/lang/lv.rs index e70934064..26751f628 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -57,6 +57,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("ID Server", "ID serveris"), ("Relay Server", "Releja serveris"), ("API Server", "API serveris"), + ("Key", "Atslēga"), ("invalid_http", "jāsākas ar http:// vai https://"), ("Invalid IP", "Nederīga IP"), ("Invalid format", "Nederīgs formāts"), @@ -296,6 +297,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("This file exists, skip or overwrite this file?", "Šis fails pastāv, izlaist vai pārrakstīt šo failu?"), ("Quit", "Iziet"), ("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"), + ("doc_fix_wayland", "https://rustdesk.com/docs/en/manual/linux/#x11-required"), ("Help", "Palīdzība"), ("Failed", "Neizdevās"), ("Succeeded", "Izdevās"), @@ -479,6 +481,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Me", "Es"), ("identical_file_tip", "Šis fails ir identisks sesijas failam."), ("show_monitors_tip", "Rādīt monitorus rīkjoslā"), + ("enter_rustdesk_passwd_tip", "Ievadiet RustDesk paroli"), ("View Mode", "Skatīšanas režīms"), ("login_linux_tip", "Jums ir jāpiesakās attālajā Linux kontā, lai iespējotu X darbvirsmas sesiju"), ("verify_rustdesk_password_tip", "Pārbaudīt RustDesk paroli"), @@ -555,6 +558,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", "Automātiski aizvērt ienākošās sesijas lietotāja neaktivitātes gadījumā"), ("Connection failed due to inactivity", "Automātiski atvienots neaktivitātes dēļ"), ("Check for software update on startup", "Startējot pārbaudīt, vai nav programmatūras atjauninājumu"), - ("upgrade_rustdesk_server_pro_to_{}_tip", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", "Lūdzu, jauniniet RustDesk Server Pro uz versiju {} vai jaunāku!"), ].iter().cloned().collect(); } From 201c7a7e49fc061ca0f5715bd542a38a9aa772f9 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Mon, 18 Sep 2023 22:03:37 +0800 Subject: [PATCH 78/90] https://github.com/rustdesk-org/rustdesk_desktop_multi_window/commit/e51fddf7f3b46d4423b7aa79ba824a45a1ea1b7a --- flutter/pubspec.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock index 0cbbec368..6c18736d1 100644 --- a/flutter/pubspec.lock +++ b/flutter/pubspec.lock @@ -328,7 +328,7 @@ packages: description: path: "." ref: HEAD - resolved-ref: "c13826357e582b8e53d92782dc81aa7f9e5eba4c" + resolved-ref: "e51fddf7f3b46d4423b7aa79ba824a45a1ea1b7a" url: "https://github.com/rustdesk-org/rustdesk_desktop_multi_window" source: git version: "0.1.0" From 2b72622fe882e2a8b852e521c43b78085063e463 Mon Sep 17 00:00:00 2001 From: fufesou Date: Mon, 18 Sep 2023 22:12:11 +0800 Subject: [PATCH 79/90] Fix, privacy on, missing failed details Signed-off-by: fufesou --- src/server/connection.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/connection.rs b/src/server/connection.rs index 9c2928e94..4b6b92f2b 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -2263,8 +2263,9 @@ impl Connection { if video_service::get_privacy_mode_conn_id() == 0 { let _ = privacy_mode::turn_off_privacy(0); } - crate::common::make_privacy_mode_msg( + crate::common::make_privacy_mode_msg_with_details( back_notification::PrivacyModeState::PrvOnFailed, + e.to_string(), ) } } From 635f346b120a9632e60d21ef75a42201c2e991ae Mon Sep 17 00:00:00 2001 From: Ibnul Mutaki Date: Tue, 19 Sep 2023 07:52:25 +0700 Subject: [PATCH 80/90] update id.rs --- src/lang/id.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/id.rs b/src/lang/id.rs index 99629dfd7..5b513530a 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -555,6 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", "Secara otomatis akan menutup sesi ketika pengguna tidak beraktivitas"), ("Connection failed due to inactivity", "Secara otomatis akan terputus ketik tidak ada aktivitas."), ("Check for software update on startup", "Periksa pembaruan aplikasi saat sistem dinyalakan."), - ("upgrade_rustdesk_server_pro_to_{}_tip", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", "Silahkan perbarui RustDesk Server Pro ke versi {} atau yang lebih baru!"), ].iter().cloned().collect(); } From 800f3f765f6f3e91c23c92f52cdc67fb133bea96 Mon Sep 17 00:00:00 2001 From: Ibnul Mutaki Date: Tue, 19 Sep 2023 07:59:07 +0700 Subject: [PATCH 81/90] upadte ud.rs --- src/lang/id.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/id.rs b/src/lang/id.rs index 5b513530a..cce9df03b 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -473,7 +473,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("empty_favorite_tip", "Belum ada rekan favorit?\nTemukan seseorang untuk terhubung dan tambahkan ke favorit!"), ("empty_lan_tip", "Sepertinya kami belum menemukan rekan"), ("empty_address_book_tip", "Tampaknya saat ini tidak ada rekan yang terdaftar dalam buku alamat Anda"), - ("eg: admin", ""), + ("eg: admin", "contoh: admin"), ("Empty Username", "Nama pengguna kosong"), ("Empty Password", "Kata sandi kosong"), ("Me", "Saya"), From 0246f050e28da9980c78ae791747d9a778668b4b Mon Sep 17 00:00:00 2001 From: 21pages Date: Tue, 19 Sep 2023 12:03:45 +0800 Subject: [PATCH 82/90] fix group peers read Signed-off-by: 21pages --- flutter/lib/common/hbbs/hbbs.dart | 2 +- flutter/lib/models/group_model.dart | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/flutter/lib/common/hbbs/hbbs.dart b/flutter/lib/common/hbbs/hbbs.dart index dabb3be8f..013ce8919 100644 --- a/flutter/lib/common/hbbs/hbbs.dart +++ b/flutter/lib/common/hbbs/hbbs.dart @@ -68,7 +68,7 @@ class PeerPayload { PeerPayload.fromJson(Map json) : id = json['id'] ?? '', - info = json['info'] ?? '', + info = (json['info'] is Map) ? json['info'] : {}, status = json['status'], user = json['user'] ?? '', user_name = json['user_name'] ?? '', diff --git a/flutter/lib/models/group_model.dart b/flutter/lib/models/group_model.dart index 2765f36c9..0b2174f9f 100644 --- a/flutter/lib/models/group_model.dart +++ b/flutter/lib/models/group_model.dart @@ -145,15 +145,14 @@ class GroupModel { final pageSize = 100; var total = 0; int current = 0; - var queryParameters = { - 'current': current.toString(), - 'pageSize': pageSize.toString(), - 'accessible': '', - 'status': '1', - 'user_status': '1', - }; do { current += 1; + var queryParameters = { + 'current': current.toString(), + 'pageSize': pageSize.toString(), + 'accessible': '', + 'status': '1', + }; var uri = Uri( scheme: uri0.scheme, host: uri0.host, From 0c6aa381c5d16afed677e7a6ec3b8d19c2755c39 Mon Sep 17 00:00:00 2001 From: 21pages Date: Tue, 19 Sep 2023 15:01:16 +0800 Subject: [PATCH 83/90] replace Wrap with builder in PeerView for efficiency Signed-off-by: 21pages --- .github/workflows/flutter-build.yml | 1 + flutter/lib/common/widgets/peers_view.dart | 44 ++++++++++--------- .../lib/desktop/pages/connection_page.dart | 2 +- flutter/pubspec.lock | 11 ++++- flutter/pubspec.yaml | 5 +++ 5 files changed, 41 insertions(+), 22 deletions(-) diff --git a/.github/workflows/flutter-build.yml b/.github/workflows/flutter-build.yml index f6609ce4f..7c5fc4ba1 100644 --- a/.github/workflows/flutter-build.yml +++ b/.github/workflows/flutter-build.yml @@ -82,6 +82,7 @@ jobs: - name: Install flutter rust bridge deps run: | + git config --global core.longpaths true cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" Push-Location flutter ; flutter pub get ; Pop-Location ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart diff --git a/flutter/lib/common/widgets/peers_view.dart b/flutter/lib/common/widgets/peers_view.dart index 28bfb6690..845b10cd3 100644 --- a/flutter/lib/common/widgets/peers_view.dart +++ b/flutter/lib/common/widgets/peers_view.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:collection'; +import 'package:dynamic_layouts/dynamic_layouts.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -177,26 +178,29 @@ class _PeersViewState extends State<_PeersView> with WindowListener { if (snapshot.hasData) { final peers = snapshot.data!; gFFI.peerTabModel.setCurrentTabCachedPeers(peers); - final cards = []; - for (final peer in peers) { - final visibilityChild = VisibilityDetector( - key: ValueKey(_cardId(peer.id)), - onVisibilityChanged: onVisibilityChanged, - child: widget.peerCardBuilder(peer), - ); - cards.add(isDesktop - ? Obx( - () => SizedBox( - width: 220, - height: - peerCardUiType.value == PeerUiType.grid ? 140 : 42, - child: visibilityChild, - ), - ) - : SizedBox(width: mobileWidth, child: visibilityChild)); - } - final child = - Wrap(spacing: space, runSpacing: space, children: cards); + final child = DynamicGridView.builder( + gridDelegate: SliverGridDelegateWithWrapping( + mainAxisSpacing: space / 2, crossAxisSpacing: space), + itemCount: peers.length, + itemBuilder: (BuildContext context, int index) { + final visibilityChild = VisibilityDetector( + key: ValueKey(_cardId(peers[index].id)), + onVisibilityChanged: onVisibilityChanged, + child: widget.peerCardBuilder(peers[index]), + ); + return isDesktop + ? Obx( + () => SizedBox( + width: 220, + height: peerCardUiType.value == PeerUiType.grid + ? 140 + : 42, + child: visibilityChild, + ), + ) + : SizedBox(width: mobileWidth, child: visibilityChild); + }, + ); if (updateEvent == UpdateEvent.load) { _curPeers.clear(); _curPeers.addAll(peers.map((e) => e.id)); diff --git a/flutter/lib/desktop/pages/connection_page.dart b/flutter/lib/desktop/pages/connection_page.dart index 6d53ecc78..5990d11bb 100644 --- a/flutter/lib/desktop/pages/connection_page.dart +++ b/flutter/lib/desktop/pages/connection_page.dart @@ -138,7 +138,7 @@ class _ConnectionPageState extends State Divider().paddingOnly(right: 12), ])), SliverFillRemaining( - hasScrollBody: false, + hasScrollBody: true, child: PeerTabPage().paddingOnly(right: 12.0), ) ], diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock index 6c18736d1..7cd9680f0 100644 --- a/flutter/pubspec.lock +++ b/flutter/pubspec.lock @@ -328,7 +328,7 @@ packages: description: path: "." ref: HEAD - resolved-ref: "e51fddf7f3b46d4423b7aa79ba824a45a1ea1b7a" + resolved-ref: e51fddf7f3b46d4423b7aa79ba824a45a1ea1b7a url: "https://github.com/rustdesk-org/rustdesk_desktop_multi_window" source: git version: "0.1.0" @@ -396,6 +396,15 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + dynamic_layouts: + dependency: "direct main" + description: + path: "packages/dynamic_layouts" + ref: "0023d01996576e494094793a6552463f01c5627a" + resolved-ref: "0023d01996576e494094793a6552463f01c5627a" + url: "https://github.com/flutter/packages.git" + source: git + version: "0.0.1+1" event_bus: dependency: transitive description: diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index ba90bef3c..9c06d0bbf 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -100,6 +100,11 @@ dependencies: uuid: ^3.0.7 auto_size_text_field: ^2.2.1 flex_color_picker: ^3.3.0 + dynamic_layouts: + git: + url: https://github.com/flutter/packages.git + path: packages/dynamic_layouts + ref: 0023d01996576e494094793a6552463f01c5627a dev_dependencies: icons_launcher: ^2.0.4 From 6014dd05a0a3dd887944920bd0a652671207506b Mon Sep 17 00:00:00 2001 From: dignow Date: Tue, 19 Sep 2023 21:32:50 +0800 Subject: [PATCH 84/90] fix, texture render widget, blurry image Signed-off-by: dignow --- flutter/lib/desktop/pages/remote_page.dart | 16 +++++++++++----- flutter/lib/models/desktop_render_texture.dart | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 86d4b05bb..f38e7d16c 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -409,7 +409,7 @@ class _RemotePageState extends State keyboardEnabled: _keyboardEnabled, remoteCursorMoved: _remoteCursorMoved, textureId: _renderTexture.textureId, - useTextureRender: _renderTexture.useTextureRender, + useTextureRender: RenderTexture.useTextureRender, listenerBuilder: (child) => _buildRawTouchAndPointerRegion(child, enterView, leaveView), ); @@ -539,7 +539,10 @@ class _ImagePaintState extends State { imageWidget = SizedBox( width: imageWidth, height: imageHeight, - child: Obx(() => Texture(textureId: widget.textureId.value)), + child: Obx(() => Texture( + textureId: widget.textureId.value, + filterQuality: FilterQuality.none, + )), ); } else { imageWidget = CustomPaint( @@ -576,11 +579,14 @@ class _ImagePaintState extends State { imageWidget = Stack( children: [ Positioned( - left: c.x.toInt().toDouble(), - top: c.y.toInt().toDouble(), + left: c.x, + top: c.y, width: c.getDisplayWidth() * s, height: c.getDisplayHeight() * s, - child: Texture(textureId: widget.textureId.value), + child: Texture( + textureId: widget.textureId.value, + filterQuality: FilterQuality.none, + ), ) ], ); diff --git a/flutter/lib/models/desktop_render_texture.dart b/flutter/lib/models/desktop_render_texture.dart index f8456e339..b18d97b82 100644 --- a/flutter/lib/models/desktop_render_texture.dart +++ b/flutter/lib/models/desktop_render_texture.dart @@ -8,7 +8,7 @@ class RenderTexture { final RxInt textureId = RxInt(-1); int _textureKey = -1; SessionID? _sessionId; - final useTextureRender = bind.mainUseTextureRender(); + static final useTextureRender = bind.mainUseTextureRender(); final textureRenderer = TextureRgbaRenderer(); From 2dc8f3b3e453dc5ae16ac4e1b9535a6216f9dd7a Mon Sep 17 00:00:00 2001 From: "Miguel F. G" <116861809+flusheDData@users.noreply.github.com> Date: Tue, 19 Sep 2023 16:18:21 +0200 Subject: [PATCH 85/90] Update es.rs New terms added --- src/lang/es.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lang/es.rs b/src/lang/es.rs index 4c02b69b1..7c8241682 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -545,16 +545,16 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation failed!", "La instalación ha fallado"), ("Reverse mouse wheel", "Invertir rueda del ratón"), ("{} sessions", ""), - ("scam_title", ""), - ("scam_text1", ""), - ("scam_text2", ""), - ("Don't show again", ""), - ("I Agree", ""), - ("Decline", ""), - ("Timeout in minutes", ""), - ("auto_disconnect_option_tip", ""), - ("Connection failed due to inactivity", ""), - ("Check for software update on startup", ""), - ("upgrade_rustdesk_server_pro_to_{}_tip", ""), + ("scam_title", "Podrías estar siendo ESTAFADO!"), + ("scam_text1", "Si estás al teléfono con alguien a quien NO conoces y en quien NO confías y te ha pedido que uses RustDesk e inicies el servicio, no lo hagas y cuelga inmediatamente."), + ("scam_text2", "Probablemente son estafadores tratando de robar tu dinero o información privada."), + ("Don't show again", "No mostrar de nuevo"), + ("I Agree", "Estoy de acuerdo"), + ("Decline", "Rechazar"), + ("Timeout in minutes", "Tiempo de espera en minutos"), + ("auto_disconnect_option_tip", "Cerrar sesiones entrantes automáticamente por inactividad del usuario."), + ("Connection failed due to inactivity", "Desconectar automáticamente por inactividad."), + ("Check for software update on startup", "Comprobar actualización al iniciar"), + ("upgrade_rustdesk_server_pro_to_{}_tip", "¡Por favor, actualiza RustDesk Server Pro a la versión {} o superior"), ].iter().cloned().collect(); } From fd34f9712089a029222cc1b48f8028ca1e2e96d3 Mon Sep 17 00:00:00 2001 From: "Miguel F. G" <116861809+flusheDData@users.noreply.github.com> Date: Tue, 19 Sep 2023 16:21:31 +0200 Subject: [PATCH 86/90] Update es.rs new term added --- src/lang/es.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/es.rs b/src/lang/es.rs index 7c8241682..2ac738e4a 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -544,7 +544,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Installation Successful!", "Instalación exitosa"), ("Installation failed!", "La instalación ha fallado"), ("Reverse mouse wheel", "Invertir rueda del ratón"), - ("{} sessions", ""), + ("{} sessions", "{} sesiones"), ("scam_title", "Podrías estar siendo ESTAFADO!"), ("scam_text1", "Si estás al teléfono con alguien a quien NO conoces y en quien NO confías y te ha pedido que uses RustDesk e inicies el servicio, no lo hagas y cuelga inmediatamente."), ("scam_text2", "Probablemente son estafadores tratando de robar tu dinero o información privada."), From cb1a06270e263174d9b675516196c26509fe36ed Mon Sep 17 00:00:00 2001 From: dignow Date: Tue, 19 Sep 2023 22:57:53 +0800 Subject: [PATCH 87/90] fix, set texture widget offset to int on linux Signed-off-by: dignow --- flutter/lib/desktop/pages/remote_page.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index f38e7d16c..d2d7534ab 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -576,11 +576,13 @@ class _ImagePaintState extends State { late final Widget imageWidget; if (c.size.width > 0 && c.size.height > 0) { if (widget.useTextureRender) { + final x = Platform.isLinux ? c.x.toInt().toDouble() : c.x; + final y = Platform.isLinux ? c.y.toInt().toDouble() : c.y; imageWidget = Stack( children: [ Positioned( - left: c.x, - top: c.y, + left: x, + top: y, width: c.getDisplayWidth() * s, height: c.getDisplayHeight() * s, child: Texture( From c2ff269b5f41a6b8ec7556ec86ef7f6eeb6fe635 Mon Sep 17 00:00:00 2001 From: dignow Date: Tue, 19 Sep 2023 23:49:17 +0800 Subject: [PATCH 88/90] fix, scale adaptive blurry Signed-off-by: dignow --- flutter/lib/desktop/pages/remote_page.dart | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index d2d7534ab..305782e7a 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -485,21 +485,20 @@ class _ImagePaintState extends State { var c = Provider.of(context); final s = c.scale; + bool isViewAdaptive() => c.viewStyle.style == kRemoteViewStyleAdaptive; + bool isViewOriginal() => c.viewStyle.style == kRemoteViewStyleOriginal; + mouseRegion({child}) => Obx(() { double getCursorScale() { var c = Provider.of(context); var cursorScale = 1.0; if (Platform.isWindows) { // debug win10 - final isViewAdaptive = - c.viewStyle.style == kRemoteViewStyleAdaptive; - if (zoomCursor.value && isViewAdaptive) { + if (zoomCursor.value && isViewAdaptive()) { cursorScale = s * c.devicePixelRatio; } } else { - final isViewOriginal = - c.viewStyle.style == kRemoteViewStyleOriginal; - if (zoomCursor.value || isViewOriginal) { + if (zoomCursor.value || isViewOriginal()) { cursorScale = s; } } @@ -541,7 +540,8 @@ class _ImagePaintState extends State { height: imageHeight, child: Obx(() => Texture( textureId: widget.textureId.value, - filterQuality: FilterQuality.none, + filterQuality: + isViewOriginal() ? FilterQuality.none : FilterQuality.low, )), ); } else { @@ -587,7 +587,8 @@ class _ImagePaintState extends State { height: c.getDisplayHeight() * s, child: Texture( textureId: widget.textureId.value, - filterQuality: FilterQuality.none, + filterQuality: + isViewOriginal() ? FilterQuality.none : FilterQuality.low, ), ) ], From 73e4006447ae8279bb6eb6998057cc82659b20bb Mon Sep 17 00:00:00 2001 From: Mr-Update <37781396+Mr-Update@users.noreply.github.com> Date: Tue, 19 Sep 2023 22:15:50 +0200 Subject: [PATCH 89/90] Update de.rs --- src/lang/de.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/de.rs b/src/lang/de.rs index cd4bd3db9..6bca2eefe 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -555,6 +555,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("auto_disconnect_option_tip", "Automatisches Schließen eingehender Sitzungen bei Inaktivität des Benutzers"), ("Connection failed due to inactivity", "Automatische Trennung der Verbindung aufgrund von Inaktivität"), ("Check for software update on startup", "Beim Start auf Softwareaktualisierung prüfen"), - ("upgrade_rustdesk_server_pro_to_{}_tip", ""), + ("upgrade_rustdesk_server_pro_to_{}_tip", "Bitte aktualisieren Sie RustDesk Server Pro auf die Version {} oder neuer!"), ].iter().cloned().collect(); } From 53fb48fe7d41e599dde1f6fc5bbc4ee6367074fe Mon Sep 17 00:00:00 2001 From: Andrzej Rudnik Date: Tue, 19 Sep 2023 23:12:47 +0200 Subject: [PATCH 90/90] Update pl.rs --- src/lang/pl.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/pl.rs b/src/lang/pl.rs index fd35a4cc2..db2db9366 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -554,7 +554,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Timeout in minutes", "Czas bezczynności w minutach"), ("auto_disconnect_option_tip", "Automatycznie rozłącz sesje przychodzące przy braku aktywności użytkownika"), ("Connection failed due to inactivity", "Automatycznie rozłącz przy bezczynności"), - ("Check for software update on startup", ""), - ("upgrade_rustdesk_server_pro_to_{}_tip", ""), + ("Check for software update on startup", "Sprawdź aktualizacje przy starcie programu"), + ("upgrade_rustdesk_server_pro_to_{}_tip", "Proszę zaktualizować RustDesk Server Pro do wersji {} lub nowszej!"), ].iter().cloned().collect(); }