From c6439673b823445003c81fee7fc5abee47cf706a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lollipopkit=F0=9F=8F=B3=EF=B8=8F=E2=80=8D=E2=9A=A7?= =?UTF-8?q?=EF=B8=8F?= <10864310+lollipopkit@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:18:18 +0800 Subject: [PATCH] feat: shift key in ssh term (#819) --- ios/Runner.xcodeproj/project.pbxproj | 36 ++++++++++++------------- lib/data/model/ssh/virtual_key.dart | 5 +++- lib/data/provider/virtual_keyboard.dart | 13 +++++++++ lib/data/res/build_data.dart | 2 +- lib/hive/hive_adapters.g.dart | 4 +++ lib/hive/hive_adapters.g.yaml | 4 ++- lib/view/page/ssh/page/keyboard.dart | 7 +++++ lib/view/page/ssh/page/page.dart | 3 +++ lib/view/page/ssh/page/virt_key.dart | 3 +++ macos/Runner.xcodeproj/project.pbxproj | 12 ++++----- pubspec.yaml | 2 +- 11 files changed, 63 insertions(+), 28 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index e10e439d..5a8315c9 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -672,7 +672,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -682,7 +682,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -808,7 +808,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -818,7 +818,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -836,7 +836,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -846,7 +846,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -867,7 +867,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -880,7 +880,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -906,7 +906,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -919,7 +919,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -942,7 +942,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -955,7 +955,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -978,7 +978,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -990,7 +990,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; @@ -1019,7 +1019,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1031,7 +1031,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; @@ -1057,7 +1057,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1069,7 +1069,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; diff --git a/lib/data/model/ssh/virtual_key.dart b/lib/data/model/ssh/virtual_key.dart index 522ec733..f46cc058 100644 --- a/lib/data/model/ssh/virtual_key.dart +++ b/lib/data/model/ssh/virtual_key.dart @@ -21,6 +21,7 @@ enum VirtKey { right, clipboard, ime, + shift, pgup, pgdn, slash, @@ -105,6 +106,7 @@ extension VirtKeyX on VirtKey { VirtKey.right, VirtKey.clipboard, VirtKey.ime, + VirtKey.shift, ]; /// Corresponding [TerminalKey] @@ -119,6 +121,7 @@ extension VirtKeyX on VirtKey { VirtKey.left => TerminalKey.arrowLeft, VirtKey.down => TerminalKey.arrowDown, VirtKey.right => TerminalKey.arrowRight, + VirtKey.shift => TerminalKey.shift, VirtKey.pgup => TerminalKey.pageUp, VirtKey.pgdn => TerminalKey.pageDown, VirtKey.f1 => TerminalKey.f1, @@ -161,7 +164,7 @@ extension VirtKeyX on VirtKey { }; bool get toggleable => switch (this) { - VirtKey.alt || VirtKey.ctrl => true, + VirtKey.alt || VirtKey.ctrl || VirtKey.shift => true, _ => false, }; diff --git a/lib/data/provider/virtual_keyboard.dart b/lib/data/provider/virtual_keyboard.dart index fcfb3b8e..8538da33 100644 --- a/lib/data/provider/virtual_keyboard.dart +++ b/lib/data/provider/virtual_keyboard.dart @@ -23,6 +23,15 @@ class VirtKeyProvider extends TerminalInputHandler with ChangeNotifier { } } + bool _shift = false; + bool get shift => _shift; + set shift(bool value) { + if (value != _shift) { + _shift = value; + notifyListeners(); + } + } + void reset(TerminalKeyboardEvent e) { if (e.ctrl) { ctrl = false; @@ -30,6 +39,9 @@ class VirtKeyProvider extends TerminalInputHandler with ChangeNotifier { if (e.alt) { alt = false; } + if (e.shift) { + shift = false; + } notifyListeners(); } @@ -38,6 +50,7 @@ class VirtKeyProvider extends TerminalInputHandler with ChangeNotifier { final e = event.copyWith( ctrl: event.ctrl || ctrl, alt: event.alt || alt, + shift: event.shift || shift, ); if (Stores.setting.sshVirtualKeyAutoOff.fetch()) { reset(e); diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index f13c3a0c..2cd643c3 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -3,6 +3,6 @@ abstract class BuildData { static const String name = "ServerBox"; - static const int build = 1189; + static const int build = 1195; static const int script = 64; } diff --git a/lib/hive/hive_adapters.g.dart b/lib/hive/hive_adapters.g.dart index 4d31598d..323edd21 100644 --- a/lib/hive/hive_adapters.g.dart +++ b/lib/hive/hive_adapters.g.dart @@ -254,6 +254,8 @@ class VirtKeyAdapter extends TypeAdapter { return VirtKey.f11; case 43: return VirtKey.f12; + case 44: + return VirtKey.shift; default: return VirtKey.esc; } @@ -350,6 +352,8 @@ class VirtKeyAdapter extends TypeAdapter { writer.writeByte(42); case VirtKey.f12: writer.writeByte(43); + case VirtKey.shift: + writer.writeByte(44); } } diff --git a/lib/hive/hive_adapters.g.yaml b/lib/hive/hive_adapters.g.yaml index 74f1669a..1a678928 100644 --- a/lib/hive/hive_adapters.g.yaml +++ b/lib/hive/hive_adapters.g.yaml @@ -59,7 +59,7 @@ types: index: 13 VirtKey: typeId: 4 - nextIndex: 44 + nextIndex: 45 fields: esc: index: 0 @@ -149,6 +149,8 @@ types: index: 42 f12: index: 43 + shift: + index: 44 NetViewType: typeId: 5 nextIndex: 3 diff --git a/lib/view/page/ssh/page/keyboard.dart b/lib/view/page/ssh/page/keyboard.dart index 8afbfa1c..8d2d25fb 100644 --- a/lib/view/page/ssh/page/keyboard.dart +++ b/lib/view/page/ssh/page/keyboard.dart @@ -13,6 +13,13 @@ extension _Keyboard on SSHPageState { _handleEscKeyOrBackButton(); return true; // Mark as handled so it doesn't propagate } + if (event.logicalKey == LogicalKeyboardKey.shiftLeft || + event.logicalKey == LogicalKeyboardKey.shiftRight) { + // Handle shift key press + _terminal.keyInput(TerminalKey.shift); + HapticFeedback.lightImpact(); + return true; + } } return false; // Let other handlers process this event } diff --git a/lib/view/page/ssh/page/page.dart b/lib/view/page/ssh/page/page.dart index 72d6b617..e2ebc51c 100644 --- a/lib/view/page/ssh/page/page.dart +++ b/lib/view/page/ssh/page/page.dart @@ -291,6 +291,9 @@ class SSHPageState extends State case TerminalKey.alt: selected = _keyboard.alt; break; + case TerminalKey.shift: + selected = _keyboard.shift; + break; default: break; } diff --git a/lib/view/page/ssh/page/virt_key.dart b/lib/view/page/ssh/page/virt_key.dart index 3b3bb53d..b5710523 100644 --- a/lib/view/page/ssh/page/virt_key.dart +++ b/lib/view/page/ssh/page/virt_key.dart @@ -26,6 +26,9 @@ extension _VirtKey on SSHPageState { case TerminalKey.alt: _keyboard.alt = !_keyboard.alt; break; + case TerminalKey.shift: + _keyboard.shift = !_keyboard.shift; + break; default: _terminal.keyInput(key); break; diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index a2d5e76f..137efa70 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -471,7 +471,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -481,7 +481,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -608,7 +608,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -618,7 +618,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -638,7 +638,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1189; + CURRENT_PROJECT_VERSION = 1195; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=macosx*]" = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; @@ -649,7 +649,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.1189; + MARKETING_VERSION = 1.0.1195; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/pubspec.yaml b/pubspec.yaml index a8beea71..3eab6427 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: server_box description: server status & toolbox app. publish_to: "none" -version: 1.0.1189+1189 +version: 1.0.1195+1195 environment: sdk: ">=3.8.0"