mirror of
https://github.com/rustdesk/rustdesk.git
synced 2025-01-19 08:23:01 +08:00
refact, separate remote window, connect(separate window)
Signed-off-by: dignow <linlong1265@gmail.com>
This commit is contained in:
parent
688ecef4cc
commit
1a8463015f
@ -1515,7 +1515,8 @@ Future<Offset?> _adjustRestoreMainWindowOffset(
|
|||||||
|
|
||||||
/// Restore window position and size on start
|
/// Restore window position and size on start
|
||||||
/// Note that windowId must be provided if it's subwindow
|
/// Note that windowId must be provided if it's subwindow
|
||||||
Future<bool> restoreWindowPosition(WindowType type, {int? windowId, String? peerId}) async {
|
Future<bool> restoreWindowPosition(WindowType type,
|
||||||
|
{int? windowId, String? peerId}) async {
|
||||||
if (bind
|
if (bind
|
||||||
.mainGetEnv(key: "DISABLE_RUSTDESK_RESTORE_WINDOW_POSITION")
|
.mainGetEnv(key: "DISABLE_RUSTDESK_RESTORE_WINDOW_POSITION")
|
||||||
.isNotEmpty) {
|
.isNotEmpty) {
|
||||||
@ -1529,11 +1530,11 @@ Future<bool> restoreWindowPosition(WindowType type, {int? windowId, String? peer
|
|||||||
|
|
||||||
String? pos;
|
String? pos;
|
||||||
if (type == WindowType.RemoteDesktop && windowId != null && peerId != null) {
|
if (type == WindowType.RemoteDesktop && windowId != null && peerId != null) {
|
||||||
pos = await bind.sessionGetFlutterConfigByPeerId(id: peerId, k: kWindowPrefix);
|
pos = await bind.sessionGetFlutterConfigByPeerId(
|
||||||
|
id: peerId, k: kWindowPrefix);
|
||||||
}
|
}
|
||||||
pos ??= bind.getLocalFlutterConfig(k: kWindowPrefix + type.name);
|
pos ??= bind.getLocalFlutterConfig(k: kWindowPrefix + type.name);
|
||||||
|
|
||||||
|
|
||||||
var lpos = LastWindowPosition.loadFromString(pos);
|
var lpos = LastWindowPosition.loadFromString(pos);
|
||||||
if (lpos == null) {
|
if (lpos == null) {
|
||||||
debugPrint("no window position saved, ignoring position restoration");
|
debugPrint("no window position saved, ignoring position restoration");
|
||||||
@ -1781,17 +1782,20 @@ List<String>? urlLinkToCmdArgs(Uri uri) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
connectMainDesktop(String id,
|
connectMainDesktop(
|
||||||
{required bool isFileTransfer,
|
String id, {
|
||||||
|
required bool isFileTransfer,
|
||||||
required bool isTcpTunneling,
|
required bool isTcpTunneling,
|
||||||
required bool isRDP,
|
required bool isRDP,
|
||||||
bool? forceRelay}) async {
|
bool? forceRelay,
|
||||||
|
bool forceSeparateWindow = false,
|
||||||
|
}) async {
|
||||||
if (isFileTransfer) {
|
if (isFileTransfer) {
|
||||||
await rustDeskWinManager.newFileTransfer(id, forceRelay: forceRelay);
|
await rustDeskWinManager.newFileTransfer(id, forceRelay: forceRelay);
|
||||||
} else if (isTcpTunneling || isRDP) {
|
} else if (isTcpTunneling || isRDP) {
|
||||||
await rustDeskWinManager.newPortForward(id, isRDP, forceRelay: forceRelay);
|
await rustDeskWinManager.newPortForward(id, isRDP, forceRelay: forceRelay);
|
||||||
} else {
|
} else {
|
||||||
await rustDeskWinManager.newRemoteDesktop(id, forceRelay: forceRelay);
|
await rustDeskWinManager.newRemoteDesktop(id, forceRelay: forceRelay, forceSeparateWindow: forceSeparateWindow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1799,10 +1803,14 @@ connectMainDesktop(String id,
|
|||||||
/// If [isFileTransfer], starts a session only for file transfer.
|
/// If [isFileTransfer], starts a session only for file transfer.
|
||||||
/// If [isTcpTunneling], starts a session only for tcp tunneling.
|
/// If [isTcpTunneling], starts a session only for tcp tunneling.
|
||||||
/// If [isRDP], starts a session only for rdp.
|
/// If [isRDP], starts a session only for rdp.
|
||||||
connect(BuildContext context, String id,
|
connect(
|
||||||
{bool isFileTransfer = false,
|
BuildContext context,
|
||||||
|
String id, {
|
||||||
|
bool isFileTransfer = false,
|
||||||
bool isTcpTunneling = false,
|
bool isTcpTunneling = false,
|
||||||
bool isRDP = false}) async {
|
bool isRDP = false,
|
||||||
|
bool forceSeparateWindow = false,
|
||||||
|
}) async {
|
||||||
if (id == '') return;
|
if (id == '') return;
|
||||||
id = id.replaceAll(' ', '');
|
id = id.replaceAll(' ', '');
|
||||||
final oldId = id;
|
final oldId = id;
|
||||||
@ -1813,18 +1821,22 @@ connect(BuildContext context, String id,
|
|||||||
|
|
||||||
if (isDesktop) {
|
if (isDesktop) {
|
||||||
if (desktopType == DesktopType.main) {
|
if (desktopType == DesktopType.main) {
|
||||||
await connectMainDesktop(id,
|
await connectMainDesktop(
|
||||||
|
id,
|
||||||
isFileTransfer: isFileTransfer,
|
isFileTransfer: isFileTransfer,
|
||||||
isTcpTunneling: isTcpTunneling,
|
isTcpTunneling: isTcpTunneling,
|
||||||
isRDP: isRDP,
|
isRDP: isRDP,
|
||||||
forceRelay: forceRelay);
|
forceRelay: forceRelay,
|
||||||
|
forceSeparateWindow: forceSeparateWindow,
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
await rustDeskWinManager.call(WindowType.Main, kWindowConnect, {
|
await rustDeskWinManager.call(WindowType.Main, kWindowConnect, {
|
||||||
'id': id,
|
'id': id,
|
||||||
'isFileTransfer': isFileTransfer,
|
'isFileTransfer': isFileTransfer,
|
||||||
'isTcpTunneling': isTcpTunneling,
|
'isTcpTunneling': isTcpTunneling,
|
||||||
'isRDP': isRDP,
|
'isRDP': isRDP,
|
||||||
"forceRelay": forceRelay,
|
'forceRelay': forceRelay,
|
||||||
|
'forceSeparateWindow': forceSeparateWindow,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -399,10 +399,14 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(BuildContext context);
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(BuildContext context);
|
||||||
|
|
||||||
MenuEntryBase<String> _connectCommonAction(
|
MenuEntryBase<String> _connectCommonAction(
|
||||||
BuildContext context, String id, String title,
|
BuildContext context,
|
||||||
{bool isFileTransfer = false,
|
String id,
|
||||||
|
String title, {
|
||||||
|
bool isFileTransfer = false,
|
||||||
bool isTcpTunneling = false,
|
bool isTcpTunneling = false,
|
||||||
bool isRDP = false}) {
|
bool isRDP = false,
|
||||||
|
bool forceSeparateWindow = false,
|
||||||
|
}) {
|
||||||
return MenuEntryButton<String>(
|
return MenuEntryButton<String>(
|
||||||
childBuilder: (TextStyle? style) => Text(
|
childBuilder: (TextStyle? style) => Text(
|
||||||
title,
|
title,
|
||||||
@ -415,6 +419,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
isFileTransfer: isFileTransfer,
|
isFileTransfer: isFileTransfer,
|
||||||
isTcpTunneling: isTcpTunneling,
|
isTcpTunneling: isTcpTunneling,
|
||||||
isRDP: isRDP,
|
isRDP: isRDP,
|
||||||
|
forceSeparateWindow: forceSeparateWindow,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
padding: menuPadding,
|
padding: menuPadding,
|
||||||
@ -423,13 +428,26 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
MenuEntryBase<String> _connectAction(BuildContext context, Peer peer) {
|
List<MenuEntryBase<String>> _connectActions(BuildContext context, Peer peer) {
|
||||||
|
final actions = [_connectAction(context, peer, false)];
|
||||||
|
if (!mainGetLocalBoolOptionSync(kOptionSeparateRemoteWindow)) {
|
||||||
|
actions.add(_connectAction(context, peer, true));
|
||||||
|
}
|
||||||
|
return actions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
MenuEntryBase<String> _connectAction(
|
||||||
|
BuildContext context, Peer peer, bool forceSeparateWindow) {
|
||||||
return _connectCommonAction(
|
return _connectCommonAction(
|
||||||
context,
|
context,
|
||||||
peer.id,
|
peer.id,
|
||||||
peer.alias.isEmpty
|
(peer.alias.isEmpty
|
||||||
? translate('Connect')
|
? translate('Connect')
|
||||||
: "${translate('Connect')} ${peer.id}");
|
: '${translate('Connect')} ${peer.id}') +
|
||||||
|
(forceSeparateWindow ? ' (${translate('separate window')})' : ''),
|
||||||
|
forceSeparateWindow: forceSeparateWindow,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
@ -796,7 +814,7 @@ class RecentPeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
..._connectActions(context, peer),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context, peer.id),
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -852,7 +870,7 @@ class FavoritePeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
..._connectActions(context, peer),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context, peer.id),
|
||||||
];
|
];
|
||||||
if (isDesktop && peer.platform != 'Android') {
|
if (isDesktop && peer.platform != 'Android') {
|
||||||
@ -902,7 +920,7 @@ class DiscoveredPeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
..._connectActions(context, peer),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context, peer.id),
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -954,7 +972,7 @@ class AddressBookPeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
..._connectActions(context, peer),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context, peer.id),
|
||||||
];
|
];
|
||||||
if (isDesktop && peer.platform != 'Android') {
|
if (isDesktop && peer.platform != 'Android') {
|
||||||
@ -1016,7 +1034,7 @@ class MyGroupPeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
..._connectActions(context, peer),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context, peer.id),
|
||||||
];
|
];
|
||||||
if (isDesktop && peer.platform != 'Android') {
|
if (isDesktop && peer.platform != 'Android') {
|
||||||
|
@ -556,7 +556,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
|||||||
} else if (call.method == kWindowEventHide) {
|
} else if (call.method == kWindowEventHide) {
|
||||||
final wId = call.arguments['id'];
|
final wId = call.arguments['id'];
|
||||||
final isSeparateWindowEnabled =
|
final isSeparateWindowEnabled =
|
||||||
mainGetBoolOptionSync(kOptionSeparateRemoteWindow);
|
mainGetLocalBoolOptionSync(kOptionSeparateRemoteWindow);
|
||||||
if (isSeparateWindowEnabled && !kCloseMultiWindowByHide) {
|
if (isSeparateWindowEnabled && !kCloseMultiWindowByHide) {
|
||||||
await rustDeskWinManager.destroyWindow(wId);
|
await rustDeskWinManager.destroyWindow(wId);
|
||||||
}
|
}
|
||||||
@ -568,6 +568,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
|||||||
isTcpTunneling: call.arguments['isTcpTunneling'],
|
isTcpTunneling: call.arguments['isTcpTunneling'],
|
||||||
isRDP: call.arguments['isRDP'],
|
isRDP: call.arguments['isRDP'],
|
||||||
forceRelay: call.arguments['forceRelay'],
|
forceRelay: call.arguments['forceRelay'],
|
||||||
|
forceSeparateWindow: call.arguments['forceSeparateWindow'],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -112,7 +112,7 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
Wakelock.enable();
|
Wakelock.enable();
|
||||||
}
|
}
|
||||||
// Register texture.
|
// Register texture.
|
||||||
if (mainGetBoolOptionSync(kOptionSeparateRemoteWindow)) {
|
if (mainGetLocalBoolOptionSync(kOptionSeparateRemoteWindow)) {
|
||||||
_renderTexture = renderTexture;
|
_renderTexture = renderTexture;
|
||||||
} else {
|
} else {
|
||||||
_renderTexture = RenderTexture();
|
_renderTexture = RenderTexture();
|
||||||
|
@ -52,6 +52,7 @@ class RustDeskMultiWindowManager {
|
|||||||
bool? forceRelay,
|
bool? forceRelay,
|
||||||
String? switchUuid,
|
String? switchUuid,
|
||||||
bool? isRDP,
|
bool? isRDP,
|
||||||
|
bool forceSeparateWindow = false,
|
||||||
}) async {
|
}) async {
|
||||||
var params = {
|
var params = {
|
||||||
"type": type.index,
|
"type": type.index,
|
||||||
@ -70,7 +71,9 @@ class RustDeskMultiWindowManager {
|
|||||||
newSessionWindow() async {
|
newSessionWindow() async {
|
||||||
final windowController = await DesktopMultiWindow.createWindow(msg);
|
final windowController = await DesktopMultiWindow.createWindow(msg);
|
||||||
windowController
|
windowController
|
||||||
..setFrame(const Offset(0, 0) & Size(1280 + windowController.windowId * 20, 720 + windowController.windowId * 20))
|
..setFrame(const Offset(0, 0) &
|
||||||
|
Size(1280 + windowController.windowId * 20,
|
||||||
|
720 + windowController.windowId * 20))
|
||||||
..center()
|
..center()
|
||||||
..setTitle(getWindowNameWithId(
|
..setTitle(getWindowNameWithId(
|
||||||
remoteId,
|
remoteId,
|
||||||
@ -84,8 +87,9 @@ class RustDeskMultiWindowManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// separate window for file transfer is not supported
|
// separate window for file transfer is not supported
|
||||||
bool separateWindow = type != WindowType.FileTransfer &&
|
bool separateWindow = forceSeparateWindow ||
|
||||||
mainGetBoolOptionSync(kOptionSeparateRemoteWindow);
|
(type != WindowType.FileTransfer &&
|
||||||
|
mainGetLocalBoolOptionSync(kOptionSeparateRemoteWindow));
|
||||||
|
|
||||||
if (windows.length > 1 || separateWindow) {
|
if (windows.length > 1 || separateWindow) {
|
||||||
for (final windowId in windows) {
|
for (final windowId in windows) {
|
||||||
@ -123,6 +127,7 @@ class RustDeskMultiWindowManager {
|
|||||||
String? password,
|
String? password,
|
||||||
String? switchUuid,
|
String? switchUuid,
|
||||||
bool? forceRelay,
|
bool? forceRelay,
|
||||||
|
bool forceSeparateWindow = false,
|
||||||
}) async {
|
}) async {
|
||||||
return await newSession(
|
return await newSession(
|
||||||
WindowType.RemoteDesktop,
|
WindowType.RemoteDesktop,
|
||||||
@ -132,6 +137,7 @@ class RustDeskMultiWindowManager {
|
|||||||
password: password,
|
password: password,
|
||||||
forceRelay: forceRelay,
|
forceRelay: forceRelay,
|
||||||
switchUuid: switchUuid,
|
switchUuid: switchUuid,
|
||||||
|
forceSeparateWindow: forceSeparateWindow,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,8 +171,7 @@ class RustDeskMultiWindowManager {
|
|||||||
if (wnds.isEmpty) {
|
if (wnds.isEmpty) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
return await DesktopMultiWindow.invokeMethod(
|
return await DesktopMultiWindow.invokeMethod(wnds[0], methodName, args);
|
||||||
wnds[0], methodName, args);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<int> _findWindowsByType(WindowType type) {
|
List<int> _findWindowsByType(WindowType type) {
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", "管理的设备数已达到最大值"),
|
("exceed_max_devices", "管理的设备数已达到最大值"),
|
||||||
("Sync with recent sessions", "同步最近会话"),
|
("Sync with recent sessions", "同步最近会话"),
|
||||||
("Sort tags", "对标签进行排序"),
|
("Sort tags", "对标签进行排序"),
|
||||||
|
("Separate remote window", "使用独立远程窗口"),
|
||||||
|
("separate window", "独立窗口"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", "Sie haben die maximale Anzahl der verwalteten Geräte erreicht."),
|
("exceed_max_devices", "Sie haben die maximale Anzahl der verwalteten Geräte erreicht."),
|
||||||
("Sync with recent sessions", "Synchronisierung mit den letzten Sitzungen"),
|
("Sync with recent sessions", "Synchronisierung mit den letzten Sitzungen"),
|
||||||
("Sort tags", "Tags sortieren"),
|
("Sort tags", "Tags sortieren"),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", "Has alcanzado el máximo número de dispositivos administrados."),
|
("exceed_max_devices", "Has alcanzado el máximo número de dispositivos administrados."),
|
||||||
("Sync with recent sessions", "Sincronizar con sesiones recientes"),
|
("Sync with recent sessions", "Sincronizar con sesiones recientes"),
|
||||||
("Sort tags", "Ordenar etiquetas"),
|
("Sort tags", "Ordenar etiquetas"),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", "Hai raggiunto il numero massimo di dispositivi gestibili."),
|
("exceed_max_devices", "Hai raggiunto il numero massimo di dispositivi gestibili."),
|
||||||
("Sync with recent sessions", "Sincronizza con le sessioni recenti"),
|
("Sync with recent sessions", "Sincronizza con le sessioni recenti"),
|
||||||
("Sort tags", "Ordina etichette"),
|
("Sort tags", "Ordina etichette"),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", "Het maximum aantal gecontroleerde apparaten is bereikt."),
|
("exceed_max_devices", "Het maximum aantal gecontroleerde apparaten is bereikt."),
|
||||||
("Sync with recent sessions", "Recente sessies synchroniseren"),
|
("Sync with recent sessions", "Recente sessies synchroniseren"),
|
||||||
("Sort tags", "Labels sorteren"),
|
("Sort tags", "Labels sorteren"),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", "Достигнуто максимальне количество управляемых устройств."),
|
("exceed_max_devices", "Достигнуто максимальне количество управляемых устройств."),
|
||||||
("Sync with recent sessions", "Синхронизация последних сессий"),
|
("Sync with recent sessions", "Синхронизация последних сессий"),
|
||||||
("Sort tags", "Сортировка меток"),
|
("Sort tags", "Сортировка меток"),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -524,5 +524,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("exceed_max_devices", ""),
|
("exceed_max_devices", ""),
|
||||||
("Sync with recent sessions", ""),
|
("Sync with recent sessions", ""),
|
||||||
("Sort tags", ""),
|
("Sort tags", ""),
|
||||||
|
("Separate remote window", ""),
|
||||||
|
("separate window", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user