From c62c8e2c4326f354d0ba01d8329a32d01ca6a924 Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Tue, 15 Aug 2023 23:05:51 +0800 Subject: [PATCH] #135 opt. --- ios/Runner.xcodeproj/project.pbxproj | 24 ++++++------ lib/data/res/build_data.dart | 6 +-- lib/data/res/server_cmd.dart | 2 - lib/view/page/ssh/term.dart | 52 +++++++++++++++++++++++++- macos/Runner.xcodeproj/project.pbxproj | 12 +++--- pubspec.lock | 2 +- 6 files changed, 72 insertions(+), 26 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 98650021..ef6c22a8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -470,7 +470,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 471; + CURRENT_PROJECT_VERSION = 472; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -478,7 +478,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.471; + MARKETING_VERSION = 1.0.472; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -602,7 +602,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 471; + CURRENT_PROJECT_VERSION = 472; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -610,7 +610,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.471; + MARKETING_VERSION = 1.0.472; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -628,7 +628,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 471; + CURRENT_PROJECT_VERSION = 472; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -636,7 +636,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.471; + MARKETING_VERSION = 1.0.472; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -657,7 +657,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 471; + CURRENT_PROJECT_VERSION = 472; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -670,7 +670,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.471; + MARKETING_VERSION = 1.0.472; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -696,7 +696,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 471; + CURRENT_PROJECT_VERSION = 472; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -709,7 +709,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.471; + MARKETING_VERSION = 1.0.472; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -732,7 +732,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 471; + CURRENT_PROJECT_VERSION = 472; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -745,7 +745,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.471; + MARKETING_VERSION = 1.0.472; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index a320407e..aabdf6d8 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,8 +2,8 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 471; + static const int build = 472; static const String engine = "3.10.6"; - static const String buildAt = "2023-08-13 22:48:32.724672"; - static const int modifications = 6; + static const String buildAt = "2023-08-14 11:11:21.335805"; + static const int modifications = 2; } diff --git a/lib/data/res/server_cmd.dart b/lib/data/res/server_cmd.dart index 092c14ac..004cd46c 100644 --- a/lib/data/res/server_cmd.dart +++ b/lib/data/res/server_cmd.dart @@ -5,8 +5,6 @@ const seperator = 'SrvBoxSep'; const serverBoxDir = r'$HOME/.config/server_box'; const shellPath = '$serverBoxDir/mobile_app.sh'; -const echoPWD = 'echo \$PWD'; - const statusCmds = [ 'cat /proc/net/dev && date +%s', 'cat /etc/os-release | grep PRETTY_NAME', diff --git a/lib/view/page/ssh/term.dart b/lib/view/page/ssh/term.dart index 4a1b1d52..6b20d0d3 100644 --- a/lib/view/page/ssh/term.dart +++ b/lib/view/page/ssh/term.dart @@ -8,7 +8,6 @@ import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:provider/provider.dart'; import 'package:toolbox/core/extension/navigator.dart'; -import 'package:toolbox/data/res/server_cmd.dart'; import 'package:xterm/xterm.dart'; import '../../../core/route.dart'; @@ -25,6 +24,8 @@ import '../../../data/store/setting.dart'; import '../../../locator.dart'; import '../storage/sftp.dart'; +const echoPWD = 'echo \$PWD'; + class SSHPage extends StatefulWidget { final ServerPrivateInfo spi; final String? initCmd; @@ -39,6 +40,7 @@ class _SSHPageState extends State { final _setting = locator(); late final _terminal = Terminal(inputHandler: _keyboard); final TerminalController _terminalController = TerminalController(); + final ContextMenuController _menuController = ContextMenuController(); final List> _virtKeysList = []; late MediaQueryData _media; @@ -97,7 +99,7 @@ class _SSHPageState extends State { Widget child = Scaffold( backgroundColor: _terminalTheme.background, body: _buildBody(), - bottomNavigationBar: _buildBottom(), + bottomNavigationBar: isDesktop ? null : _buildBottom(), ); if (isIOS) { child = AnnotatedRegion( @@ -116,6 +118,7 @@ class _SSHPageState extends State { _media.padding.top, child: TerminalView( _terminal, + onTapUp: _onTapUp, controller: _terminalController, keyboardType: _keyboardType, textStyle: _terminalStyle, @@ -362,4 +365,49 @@ class _SSHPageState extends State { .transform(const Utf8Decoder()) .listen(_terminal.write); } + + void _onTapUp(TapUpDetails details, CellOffset offset) { + if (_menuController.isShown) { + _menuController.remove(); + return; + } + final selected = terminalSelected; + final children = [ + // TextButton( + // onPressed: () { + // _paste(); + // }, + // child: Text(_s.paste), + // ), + ]; + if (selected?.trim().isNotEmpty ?? false) { + children.add( + TextButton( + child: Text( + _s.copy, + ), + onPressed: () { + _terminalController.setSelection(CellAnchor(0), CellAnchor(0)); + if (selected != null) { + copy2Clipboard(selected); + } + _menuController.remove(); + }, + ), + ); + } + if (children.isEmpty) { + return; + } + _menuController.show( + context: context, + contextMenuBuilder: (context) { + return TextSelectionToolbar( + anchorAbove: details.globalPosition, + anchorBelow: details.globalPosition, + children: children, + ); + }, + ); + } } diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 948eeba3..bf23c952 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -475,9 +475,9 @@ baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 471; + CURRENT_PROJECT_VERSION = 472; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.471; + MARKETING_VERSION = 1.0.472; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -490,9 +490,9 @@ baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 471; + CURRENT_PROJECT_VERSION = 472; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.471; + MARKETING_VERSION = 1.0.472; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -505,9 +505,9 @@ baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 471; + CURRENT_PROJECT_VERSION = 472; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.471; + MARKETING_VERSION = 1.0.472; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/pubspec.lock b/pubspec.lock index 47dae241..d6e8bd58 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1048,7 +1048,7 @@ packages: description: path: "." ref: master - resolved-ref: "475bd72d5e3f75d7c2323225e931f71145cafc2e" + resolved-ref: "132bbb310c6026ba1f5f2ef4eac81f874ee06774" url: "https://github.com/lollipopkit/xterm.dart" source: git version: "3.6.1-pre"