terminal works basically. (#12189)

* terminal works basically.
todo:
- persistent
- sessions restore
- web
- mobile

* missed terminal persistent option change

* android sdk 34 -> 35

* +#![cfg_attr(lt_1_77, feature(c_str_literals))]

* fixing ci

* fix ci

* fix ci for android

* try "Fix Android SDK Platform 35"

* fix android 34

* revert flutter_plugin_android_lifecycle to 2.0.17 which used in rustdesk 1.4.0

* refactor, but break something of desktop terminal (new tab showing loading)

* fix connecting...
This commit is contained in:
RustDesk
2025-07-01 13:12:55 +08:00
committed by GitHub
parent ee5cdc3155
commit 5faf0ad3cf
130 changed files with 4064 additions and 4247 deletions

View File

@@ -17,6 +17,7 @@ enum WindowType {
FileTransfer,
ViewCamera,
PortForward,
Terminal,
Unknown
}
@@ -33,6 +34,8 @@ extension Index on int {
return WindowType.ViewCamera;
case 4:
return WindowType.PortForward;
case 5:
return WindowType.Terminal;
default:
return WindowType.Unknown;
}
@@ -61,6 +64,7 @@ class RustDeskMultiWindowManager {
final List<int> _fileTransferWindows = List.empty(growable: true);
final List<int> _viewCameraWindows = List.empty(growable: true);
final List<int> _portForwardWindows = List.empty(growable: true);
final List<int> _terminalWindows = List.empty(growable: true);
moveTabToNewWindow(int windowId, String peerId, String sessionId,
WindowType windowType) async {
@@ -343,6 +347,32 @@ class RustDeskMultiWindowManager {
);
}
Future<MultiWindowCallResult> newTerminal(
String remoteId, {
String? password,
bool? isSharedPassword,
bool? forceRelay,
String? connToken,
}) async {
// Terminal windows should always create new windows, not reuse
// This avoids the MissingPluginException when trying to invoke
// new_terminal on an inactive window
var params = {
"type": WindowType.Terminal.index,
"id": remoteId,
"password": password,
"forceRelay": forceRelay,
"isSharedPassword": isSharedPassword,
"connToken": connToken,
};
final msg = jsonEncode(params);
// Always create a new window for terminal
final windowId = await newSessionWindow(
WindowType.Terminal, remoteId, msg, _terminalWindows, false);
return MultiWindowCallResult(windowId, null);
}
Future<MultiWindowCallResult> call(
WindowType type, String methodName, dynamic args) async {
final wnds = _findWindowsByType(type);
@@ -373,6 +403,8 @@ class RustDeskMultiWindowManager {
return _viewCameraWindows;
case WindowType.PortForward:
return _portForwardWindows;
case WindowType.Terminal:
return _terminalWindows;
case WindowType.Unknown:
break;
}
@@ -395,6 +427,8 @@ class RustDeskMultiWindowManager {
case WindowType.PortForward:
_portForwardWindows.clear();
break;
case WindowType.Terminal:
_terminalWindows.clear();
case WindowType.Unknown:
break;
}