diff --git a/ClashX.xcodeproj/project.pbxproj b/ClashX.xcodeproj/project.pbxproj index e292831..b99851f 100644 --- a/ClashX.xcodeproj/project.pbxproj +++ b/ClashX.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ 01E33AB229B5BF4200FD1006 /* NSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01E33AB129B5BF4200FD1006 /* NSColor+Extension.swift */; }; 01E33AB529B5C5E400FD1006 /* menu_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 01E33AB429B5C5E300FD1006 /* menu_icon@2x.png */; }; 185CBAEDFE986E6E1B836359 /* libPods-ClashX Meta.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AA63125BBF03DC1A291D3351 /* libPods-ClashX Meta.a */; }; + 27F9A6282A1FB25500C50C38 /* TunModeSettingCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27F9A6272A1FB25500C50C38 /* TunModeSettingCommand.swift */; }; 4908087B29F8F405007A4944 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4908087A29F8F3FF007A4944 /* libresolv.tbd */; }; 4913C82321157D0200F6B87C /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4913C82221157D0200F6B87C /* Notification.swift */; }; 491E6203258A424D00313AEF /* CommonUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 491E61FD258A424500313AEF /* CommonUtils.m */; }; @@ -156,6 +157,7 @@ 01C1462928962E4E00346AF3 /* com.metacubex.ClashX.ProxyConfigHelper.meta.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = com.metacubex.ClashX.ProxyConfigHelper.meta.gz; sourceTree = ""; }; 01E33AB129B5BF4200FD1006 /* NSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSColor+Extension.swift"; sourceTree = ""; }; 01E33AB429B5C5E300FD1006 /* menu_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_icon@2x.png"; sourceTree = ""; }; + 27F9A6272A1FB25500C50C38 /* TunModeSettingCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TunModeSettingCommand.swift; sourceTree = ""; }; 3F86DA2DA3CC14731BE1ABF7 /* Pods-ClashX Meta.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ClashX Meta.release.xcconfig"; path = "Pods/Target Support Files/Pods-ClashX Meta/Pods-ClashX Meta.release.xcconfig"; sourceTree = ""; }; 4908087A29F8F3FF007A4944 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; }; 4913C82221157D0200F6B87C /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = ""; }; @@ -539,6 +541,7 @@ children = ( 8A2BBEA627A03ACB0081EBEF /* ProxySetting.sdef */, 8ACD21BA27A04C7800BC4632 /* ProxySettingCommand.swift */, + 27F9A6272A1FB25500C50C38 /* TunModeSettingCommand.swift */, 8ACD21BC27A04ED500BC4632 /* ProxyModeChangeCommand.swift */, ); path = AppleScript; @@ -629,8 +632,9 @@ 49CF3B1520CD7463001EBF94 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1030; - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = west2online; TargetAttributes = { 49CF3B1C20CD7463001EBF94 = { @@ -759,6 +763,7 @@ 49722FEF211F338B00650A41 /* FileEvent.swift in Sources */, 016BEAB029D80103001586C5 /* AlphaMetaDownloader.swift in Sources */, 49D176A72355FE680093DD7B /* NetworkChangeNotifier.swift in Sources */, + 27F9A6282A1FB25500C50C38 /* TunModeSettingCommand.swift in Sources */, 4913C82321157D0200F6B87C /* Notification.swift in Sources */, 015F1E91288E42A50052B20A /* ClashMetaConfig.swift in Sources */, 8ACD21BD27A04ED500BC4632 /* ProxyModeChangeCommand.swift in Sources */, @@ -888,6 +893,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -896,6 +902,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -949,6 +956,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -957,6 +965,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -986,9 +995,11 @@ CODE_SIGN_ENTITLEMENTS = ClashX/ClashX.entitlements; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; COMPRESS_PNG_FILES = YES; CURRENT_PROJECT_VERSION = 0; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -1008,12 +1019,11 @@ "$(inherited)", "$(PROJECT_DIR)/ClashX", ); - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = v1.0; PRODUCT_BUNDLE_IDENTIFIER = com.metacubex.ClashX.meta; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - STRIP_INSTALLED_PRODUCT = NO; STRIP_PNG_TEXT = YES; SWIFT_OBJC_BRIDGING_HEADER = "ClashX/ClashX-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1031,10 +1041,12 @@ CODE_SIGN_ENTITLEMENTS = ClashX/ClashX.entitlements; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; COMPRESS_PNG_FILES = YES; COPY_PHASE_STRIP = YES; CURRENT_PROJECT_VERSION = 0; + DEAD_CODE_STRIPPING = YES; DEPLOYMENT_POSTPROCESSING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -1055,13 +1067,12 @@ "$(inherited)", "$(PROJECT_DIR)/ClashX", ); - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = v1.0; OTHER_CODE_SIGN_FLAGS = "--timestamp"; PRODUCT_BUNDLE_IDENTIFIER = com.metacubex.ClashX.meta; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - STRIP_INSTALLED_PRODUCT = YES; STRIP_PNG_TEXT = YES; SWIFT_OBJC_BRIDGING_HEADER = "ClashX/ClashX-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -1077,6 +1088,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = "$(SRCROOT)/ProxyConfigHelper/Helper-Info.plist"; @@ -1086,7 +1098,7 @@ "@loader_path/../Frameworks", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -1119,6 +1131,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3; + DEAD_CODE_STRIPPING = YES; DEPLOYMENT_POSTPROCESSING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -1129,7 +1142,7 @@ "@loader_path/../Frameworks", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.2; MTL_FAST_MATH = YES; OTHER_LDFLAGS = ( diff --git a/ClashX/AppleScript/ProxyModeChangeCommand.swift b/ClashX/AppleScript/ProxyModeChangeCommand.swift index 0c195c6..884ce72 100644 --- a/ClashX/AppleScript/ProxyModeChangeCommand.swift +++ b/ClashX/AppleScript/ProxyModeChangeCommand.swift @@ -1,6 +1,6 @@ // // ProxyModeChangeCommand.swift -// ClashX +// ClashX.Meta // // Created by Vince-hz on 2022/1/25. // Copyright © 2022 west2online. All rights reserved. diff --git a/ClashX/AppleScript/ProxySetting.sdef b/ClashX/AppleScript/ProxySetting.sdef index 3478187..8cf3ec8 100644 --- a/ClashX/AppleScript/ProxySetting.sdef +++ b/ClashX/AppleScript/ProxySetting.sdef @@ -3,10 +3,13 @@ - + + + + - + diff --git a/ClashX/AppleScript/ProxySettingCommand.swift b/ClashX/AppleScript/ProxySettingCommand.swift index dccaf65..9b1f1fb 100644 --- a/ClashX/AppleScript/ProxySettingCommand.swift +++ b/ClashX/AppleScript/ProxySettingCommand.swift @@ -1,6 +1,6 @@ // // ProxySettingCommand.swift -// ClashXX +// ClashX.Meta // // Created by Vince-hz on 2022/1/25. // Copyright © 2022 west2online. All rights reserved. diff --git a/ClashX/AppleScript/TunModeSettingCommand.swift b/ClashX/AppleScript/TunModeSettingCommand.swift new file mode 100644 index 0000000..dcaecbd --- /dev/null +++ b/ClashX/AppleScript/TunModeSettingCommand.swift @@ -0,0 +1,29 @@ +// +// TunModeSettingCommand.swift +// ClashX.Meta +// +// Created by hbsgithub on 2023/5/26. +// Copyright © 2023 west2online. All rights reserved. +// + +import Foundation +import AppKit + +@objc class TunModeSettingCommand: NSScriptCommand { + override func performDefaultImplementation() -> Any? { + guard let delegate = NSApplication.shared.delegate as? AppDelegate else { + scriptErrorNumber = -2 + scriptErrorString = "can't get application, try again later" + return nil + } + let menuItem: NSMenuItem + menuItem = delegate.tunModeMenuItem + if menuItem.state == .on { + menuItem.state = .on + } else { + menuItem.state = .off + } + delegate.tunMode(menuItem) + return nil + } +} diff --git a/Shortcuts.md b/Shortcuts.md index fa34c70..faa8ac5 100644 --- a/Shortcuts.md +++ b/Shortcuts.md @@ -1,42 +1,51 @@ # 全局快捷键 -ClashX的全局快捷键是通过支持 AppleScript,并以系统的 Automator 程序调用 AppleScript 来完成全局快捷键的实现。 +ClashX Meta的全局快捷键是通过支持 AppleScript,并以系统的 Automator 程序或者Alfred Workflow调用 AppleScript 来完成全局快捷键的实现。 -ClashX目前仅支持以下功能的AppleScript +ClashX Meta目前仅支持以下功能的AppleScript 1. 打开(关闭)系统代理 2. 切换出站模式 +3. 打开(关闭)Tun模式 ## 通过 Automator 创建全局快捷键 [Mac新建全局快捷键](https://www.jianshu.com/p/afee9aeb41a8) +## 使用Alfred Workflow + +[Alfred-Workflow-for-ClashX-Meta](https://github.com/hbsgithub/Alfred-Workflow-for-ClashX-Meta) + ## 可用的 AppleScript 你可以在这里选择你需要的 AppleScript 代码,以此创建你需要的快捷键。 -**以下示例代码为ClashX程序。如果你正在用ClashX Pro,那么请将ClashX替换为 ClashX Pro** +**以下示例代码为ClashX Meta程序。如果你正在用ClashX或ClashX Pro,那么请将ClashX Meta替换为 ClashX或ClashX Pro** --- 打开(关闭)系统代理 -`tell application "ClashX" to toggleProxy` +`tell application "ClashX Meta" to toggleProxy` 切换出站模式为全局代理 -`tell application "ClashX" to proxyMode 'global'` +`tell application "ClashX Meta" to proxyMode 'global'` 切换出站模式为直连 -`tell application "ClashX" to proxyMode 'direct'` +`tell application "ClashX Meta" to proxyMode 'direct'` 切换出站模式为规则代理 -`tell application "ClashX" to proxyMode 'rule'` +`tell application "ClashX Meta" to proxyMode 'rule'` + +打开(关闭)Tun模式 + +`tell application "ClashX Meta" to TunMode` ## 已知缺陷 -1. 无法直接在桌面使用快捷键,你需要进入任意程序中才能启动快捷键 +1. 通过 Automator 创建全局快捷键的方式无法直接在桌面使用快捷键,你需要进入任意程序中才能启动快捷键 2. 在任何程序中第一次启用该快捷键都要点击一次确认授权才能启动快捷键 \ No newline at end of file