From fd0971d88de927f744096651e4fafd4fabf7a75a Mon Sep 17 00:00:00 2001 From: Qiu Yuzhou Date: Fri, 17 Mar 2017 23:11:12 +0800 Subject: [PATCH] All in one preferences window. --- ShadowsocksX-NG.xcodeproj/project.pbxproj | 94 +-- .../xcschemes/ShadowsocksX-NG.xcscheme | 171 ----- .../xcschemes/ShadowsocksX-NGTests.xcscheme | 56 -- .../xcschemes/proxy_conf_helper.xcscheme | 97 --- .../AdvPreferencesWindowController.swift | 27 - ShadowsocksX-NG/AppDelegate.swift | 285 +++---- .../AdvPreferencesWindowController.xib | 298 -------- .../HTTPPreferencesWindowController.xib | 123 ---- ShadowsocksX-NG/Base.lproj/MainMenu.xib | 87 +-- .../Base.lproj/ProxyPreferencesController.xib | 139 ---- .../HTTPPreferencesWindowController.swift | 30 - ShadowsocksX-NG/LaunchAtLoginController.h | 1 + ShadowsocksX-NG/LaunchAtLoginController.m | 19 +- ShadowsocksX-NG/Notifications.swift | 13 +- .../PreferencesWinController.swift | 34 + ShadowsocksX-NG/PreferencesWinController.xib | 697 ++++++++++++++++++ ...er.swift => ProxyInterfacesViewCtrl.swift} | 47 +- .../ShadowsocksX-NG-Bridging-Header.h | 1 - ShadowsocksX-NG/ShortcutsController.m | 6 +- .../ShortcutsPreferencesWindowController.h | 22 - .../ShortcutsPreferencesWindowController.m | 26 - .../ShortcutsPreferencesWindowController.xib | 75 -- ShadowsocksX-NG/command-512.png | Bin 0 -> 24660 bytes ShadowsocksX-NG/http.png | Bin 0 -> 19196 bytes ShadowsocksX-NG/kcptun_1.png | Bin 0 -> 10708 bytes ShadowsocksX-NG/virtual-server-icon-3.png | Bin 0 -> 62827 bytes .../AdvPreferencesWindowController.strings | 39 - .../HTTPPreferencesWindowController.strings | 18 - .../ProxyPreferencesController.strings | 13 - 29 files changed, 932 insertions(+), 1486 deletions(-) delete mode 100644 ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme delete mode 100644 ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NGTests.xcscheme delete mode 100644 ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/proxy_conf_helper.xcscheme delete mode 100644 ShadowsocksX-NG/AdvPreferencesWindowController.swift delete mode 100644 ShadowsocksX-NG/Base.lproj/AdvPreferencesWindowController.xib delete mode 100644 ShadowsocksX-NG/Base.lproj/HTTPPreferencesWindowController.xib delete mode 100644 ShadowsocksX-NG/Base.lproj/ProxyPreferencesController.xib delete mode 100644 ShadowsocksX-NG/HTTPPreferencesWindowController.swift create mode 100644 ShadowsocksX-NG/PreferencesWinController.swift create mode 100644 ShadowsocksX-NG/PreferencesWinController.xib rename ShadowsocksX-NG/{ProxyPreferencesController.swift => ProxyInterfacesViewCtrl.swift} (57%) delete mode 100644 ShadowsocksX-NG/ShortcutsPreferencesWindowController.h delete mode 100644 ShadowsocksX-NG/ShortcutsPreferencesWindowController.m delete mode 100644 ShadowsocksX-NG/ShortcutsPreferencesWindowController.xib create mode 100644 ShadowsocksX-NG/command-512.png create mode 100644 ShadowsocksX-NG/http.png create mode 100644 ShadowsocksX-NG/kcptun_1.png create mode 100644 ShadowsocksX-NG/virtual-server-icon-3.png delete mode 100644 ShadowsocksX-NG/zh-Hans.lproj/AdvPreferencesWindowController.strings delete mode 100644 ShadowsocksX-NG/zh-Hans.lproj/HTTPPreferencesWindowController.strings delete mode 100644 ShadowsocksX-NG/zh-Hans.lproj/ProxyPreferencesController.strings diff --git a/ShadowsocksX-NG.xcodeproj/project.pbxproj b/ShadowsocksX-NG.xcodeproj/project.pbxproj index 6959389..1ca3363 100755 --- a/ShadowsocksX-NG.xcodeproj/project.pbxproj +++ b/ShadowsocksX-NG.xcodeproj/project.pbxproj @@ -18,9 +18,7 @@ 9B0BFFEB1D0460A70040E62B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9B0BFFEA1D0460A70040E62B /* Assets.xcassets */; }; 9B0BFFEE1D0460A70040E62B /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B0BFFEC1D0460A70040E62B /* MainMenu.xib */; }; 9B0BFFF91D0460A70040E62B /* ShadowsocksX_NGTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B0BFFF81D0460A70040E62B /* ShadowsocksX_NGTests.swift */; }; - 9B0D55461D2CC85400A4A8E2 /* ProxyPreferencesController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B0D55481D2CC85400A4A8E2 /* ProxyPreferencesController.xib */; }; 9B2491B41D0ACC3A003BBECC /* PreferencesWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B2491B61D0ACC3A003BBECC /* PreferencesWindowController.xib */; }; - 9B2491B71D0ACC3E003BBECC /* AdvPreferencesWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B2491B91D0ACC3E003BBECC /* AdvPreferencesWindowController.xib */; }; 9B3FFF0D1D05FEB30019A709 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF0C1D05FEB30019A709 /* Utils.swift */; }; 9B3FFF141D0705810019A709 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF131D0705810019A709 /* Notifications.swift */; }; 9B3FFF171D072FDE0019A709 /* LaunchAtLoginController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF161D072FDE0019A709 /* LaunchAtLoginController.m */; }; @@ -36,12 +34,16 @@ 9B3FFF4C1D09D8F70019A709 /* install_helper.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B3FFF4B1D09D8F70019A709 /* install_helper.sh */; }; 9B3FFF4F1D09D9D50019A709 /* ProxyConfHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF4E1D09D9D50019A709 /* ProxyConfHelper.m */; }; 9B3FFF541D09E2D10019A709 /* proxy_conf_helper in Resources */ = {isa = PBXBuildFile; fileRef = 9B3FFF441D09CD3B0019A709 /* proxy_conf_helper */; }; - 9B5831EE1E72EBF9009D5B7D /* ShortcutsPreferencesWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B5831EC1E72EBF9009D5B7D /* ShortcutsPreferencesWindowController.xib */; }; - 9B5831F31E72FA63009D5B7D /* ShortcutsPreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B5831F21E72FA63009D5B7D /* ShortcutsPreferencesWindowController.m */; }; 9B5831F61E7302F8009D5B7D /* ShortcutsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B5831F51E7302F8009D5B7D /* ShortcutsController.m */; }; - 9B5831FB1E73098F009D5B7D /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 9B5831FA1E73098F009D5B7D /* README.md */; }; + 9B5831FF1E741969009D5B7D /* PreferencesWinController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B5831FD1E741969009D5B7D /* PreferencesWinController.swift */; }; + 9B5832001E741969009D5B7D /* PreferencesWinController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B5831FE1E741969009D5B7D /* PreferencesWinController.xib */; }; + 9B5832031E741F8D009D5B7D /* command-512.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B5832021E741F8D009D5B7D /* command-512.png */; }; + 9B5832071E7421B2009D5B7D /* virtual-server-icon-3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B5832061E7421B2009D5B7D /* virtual-server-icon-3.png */; }; + 9B58320B1E7422DB009D5B7D /* http.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B58320A1E7422DB009D5B7D /* http.png */; }; + 9B5832111E742632009D5B7D /* kcptun_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B5832101E742632009D5B7D /* kcptun_1.png */; }; 9B6BF9521E27B23F0061B9A7 /* LaunchHelper.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9B6BF9501E27B1F20061B9A7 /* LaunchHelper.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 9B6BF9541E27B2570061B9A7 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B6BF9531E27B2570061B9A7 /* ServiceManagement.framework */; }; + 9B86459D1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B86459C1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift */; }; 9B9CBCA61E25E1DB00FC61AA /* KcptunProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B9CBCA51E25E1DB00FC61AA /* KcptunProfile.swift */; }; 9B9CBCA81E26312E00FC61AA /* install_kcptun.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B9CBCA71E26310E00FC61AA /* install_kcptun.sh */; }; 9B9CBCAA1E2633CB00FC61AA /* kcptun_client in Resources */ = {isa = PBXBuildFile; fileRef = 9B9CBCA91E2633CB00FC61AA /* kcptun_client */; }; @@ -49,7 +51,6 @@ 9B9CBCB41E26453C00FC61AA /* start_kcptun.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B9CBCB01E2644DC00FC61AA /* start_kcptun.sh */; }; 9B9CBCB51E26453C00FC61AA /* stop_kcptun.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B9CBCB11E26450D00FC61AA /* stop_kcptun.sh */; }; 9BA04B231D23D5A5005AAD7F /* ProxyConfTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BA04B221D23D5A5005AAD7F /* ProxyConfTool.m */; }; - 9BA04B261D24044D005AAD7F /* ProxyPreferencesController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA04B241D24044D005AAD7F /* ProxyPreferencesController.swift */; }; 9BB706A71D1B982300551F0E /* SWBApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BB706A51D1B982300551F0E /* SWBApplication.m */; }; 9BC70EDC1D2E3E3100EDA4CA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9B172A6C1D0ADDDD00B87B9A /* Localizable.strings */; }; 9BE8FBBF1D0B211600CAFD01 /* libcrypto.1.0.0.dylib in Resources */ = {isa = PBXBuildFile; fileRef = 9BE8FBBD1D0B1FB900CAFD01 /* libcrypto.1.0.0.dylib */; }; @@ -60,14 +61,11 @@ 9BEEF0701D04DDB100FC52B3 /* ServerProfileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEEF06F1D04DDB100FC52B3 /* ServerProfileManager.swift */; }; 9BEEF0751D04EF3E00FC52B3 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEEF0731D04EF3E00FC52B3 /* PreferencesWindowController.swift */; }; 9BEEF0781D04FE8A00FC52B3 /* LaunchAgentUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEEF0771D04FE8A00FC52B3 /* LaunchAgentUtils.swift */; }; - 9BEEF07B1D05631500FC52B3 /* AdvPreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEEF0791D05631500FC52B3 /* AdvPreferencesWindowController.swift */; }; C6D429931DA75988002A5711 /* install_privoxy.sh in Resources */ = {isa = PBXBuildFile; fileRef = C6D4298E1DA75988002A5711 /* install_privoxy.sh */; }; C6D429941DA75988002A5711 /* privoxy in Resources */ = {isa = PBXBuildFile; fileRef = C6D4298F1DA75988002A5711 /* privoxy */; }; C6D429961DA75988002A5711 /* start_privoxy.sh in Resources */ = {isa = PBXBuildFile; fileRef = C6D429911DA75988002A5711 /* start_privoxy.sh */; }; C6D429971DA75988002A5711 /* stop_privoxy.sh in Resources */ = {isa = PBXBuildFile; fileRef = C6D429921DA75988002A5711 /* stop_privoxy.sh */; }; C6D429991DA76FBC002A5711 /* privoxy.config.example in Resources */ = {isa = PBXBuildFile; fileRef = C6D429981DA76FBC002A5711 /* privoxy.config.example */; }; - C6E28E921DA79380004F8330 /* HTTPPreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6E28E911DA79380004F8330 /* HTTPPreferencesWindowController.swift */; }; - C6E28E951DA79705004F8330 /* HTTPPreferencesWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C6E28E971DA79705004F8330 /* HTTPPreferencesWindowController.xib */; }; C8E42A6C1D4F270A0074C7EA /* UserRulesController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E42A6A1D4F270A0074C7EA /* UserRulesController.swift */; }; C8E42A6E1D4F2CAF0074C7EA /* UserRulesController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C8E42A701D4F2CAF0074C7EA /* UserRulesController.xib */; }; D8E3630B1E2072980027449B /* ServerProfileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8E3630A1E2072980027449B /* ServerProfileTests.swift */; }; @@ -145,14 +143,10 @@ 9B0BFFF41D0460A70040E62B /* ShadowsocksX-NGTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ShadowsocksX-NGTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 9B0BFFF81D0460A70040E62B /* ShadowsocksX_NGTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksX_NGTests.swift; sourceTree = ""; }; 9B0BFFFA1D0460A70040E62B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9B0D554A1D2CC85E00A4A8E2 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/ProxyPreferencesController.strings"; sourceTree = ""; }; - 9B0D554B1D2CC87400A4A8E2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ProxyPreferencesController.xib; sourceTree = ""; }; - 9B172A5D1D0ACEA100B87B9A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/AdvPreferencesWindowController.strings"; sourceTree = ""; }; 9B172A601D0ADA5B00B87B9A /* genstrings.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = genstrings.py; sourceTree = ""; }; 9B172A6B1D0ADDDD00B87B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; 9B172A6D1D0ADDE800B87B9A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 9B2491B51D0ACC3A003BBECC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PreferencesWindowController.xib; sourceTree = ""; }; - 9B2491B81D0ACC3E003BBECC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AdvPreferencesWindowController.xib; sourceTree = ""; }; 9B3FFF0C1D05FEB30019A709 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; 9B3FFF131D0705810019A709 /* Notifications.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Notifications.swift; sourceTree = ""; }; 9B3FFF151D072FDE0019A709 /* LaunchAtLoginController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LaunchAtLoginController.h; sourceTree = ""; }; @@ -175,14 +169,18 @@ 9B3FFF4E1D09D9D50019A709 /* ProxyConfHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProxyConfHelper.m; sourceTree = ""; }; 9B3FFF501D09DAEA0019A709 /* proxy_conf_helper_version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = proxy_conf_helper_version.h; sourceTree = ""; }; 9B3FFF511D09DBA20019A709 /* ShadowsocksX-NG-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ShadowsocksX-NG-Bridging-Header.h"; sourceTree = ""; }; - 9B5831EC1E72EBF9009D5B7D /* ShortcutsPreferencesWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ShortcutsPreferencesWindowController.xib; sourceTree = ""; }; - 9B5831F11E72FA63009D5B7D /* ShortcutsPreferencesWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShortcutsPreferencesWindowController.h; sourceTree = ""; }; - 9B5831F21E72FA63009D5B7D /* ShortcutsPreferencesWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShortcutsPreferencesWindowController.m; sourceTree = ""; }; 9B5831F41E7302F8009D5B7D /* ShortcutsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShortcutsController.h; sourceTree = ""; }; 9B5831F51E7302F8009D5B7D /* ShortcutsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShortcutsController.m; sourceTree = ""; }; 9B5831FA1E73098F009D5B7D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 9B5831FD1E741969009D5B7D /* PreferencesWinController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesWinController.swift; sourceTree = ""; }; + 9B5831FE1E741969009D5B7D /* PreferencesWinController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesWinController.xib; sourceTree = ""; }; + 9B5832021E741F8D009D5B7D /* command-512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "command-512.png"; sourceTree = ""; }; + 9B5832061E7421B2009D5B7D /* virtual-server-icon-3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "virtual-server-icon-3.png"; sourceTree = ""; }; + 9B58320A1E7422DB009D5B7D /* http.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = http.png; sourceTree = ""; }; + 9B5832101E742632009D5B7D /* kcptun_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = kcptun_1.png; sourceTree = ""; }; 9B6BF94B1E27B1F10061B9A7 /* LaunchHelper.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = LaunchHelper.xcodeproj; path = LaunchHelper/LaunchHelper.xcodeproj; sourceTree = ""; }; 9B6BF9531E27B2570061B9A7 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; }; + 9B86459C1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxyInterfacesViewCtrl.swift; sourceTree = ""; }; 9B9CBCA51E25E1DB00FC61AA /* KcptunProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KcptunProfile.swift; sourceTree = ""; }; 9B9CBCA71E26310E00FC61AA /* install_kcptun.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = install_kcptun.sh; sourceTree = ""; }; 9B9CBCA91E2633CB00FC61AA /* kcptun_client */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = kcptun_client; sourceTree = ""; }; @@ -191,7 +189,6 @@ 9B9CBCB11E26450D00FC61AA /* stop_kcptun.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = stop_kcptun.sh; sourceTree = ""; }; 9BA04B211D23D5A5005AAD7F /* ProxyConfTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProxyConfTool.h; sourceTree = ""; }; 9BA04B221D23D5A5005AAD7F /* ProxyConfTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProxyConfTool.m; sourceTree = ""; }; - 9BA04B241D24044D005AAD7F /* ProxyPreferencesController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxyPreferencesController.swift; sourceTree = ""; }; 9BB706A51D1B982300551F0E /* SWBApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SWBApplication.m; sourceTree = ""; }; 9BB706A61D1B982300551F0E /* SWBApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SWBApplication.h; sourceTree = ""; }; 9BE8FBBD1D0B1FB900CAFD01 /* libcrypto.1.0.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libcrypto.1.0.0.dylib; sourceTree = ""; }; @@ -203,16 +200,12 @@ 9BEEF06F1D04DDB100FC52B3 /* ServerProfileManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerProfileManager.swift; sourceTree = ""; }; 9BEEF0731D04EF3E00FC52B3 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = ""; }; 9BEEF0771D04FE8A00FC52B3 /* LaunchAgentUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchAgentUtils.swift; sourceTree = ""; }; - 9BEEF0791D05631500FC52B3 /* AdvPreferencesWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdvPreferencesWindowController.swift; sourceTree = ""; }; B4E6A97CA843F3943524B686 /* Pods-proxy_conf_helper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-proxy_conf_helper.debug.xcconfig"; path = "Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig"; sourceTree = ""; }; C6D4298E1DA75988002A5711 /* install_privoxy.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = install_privoxy.sh; sourceTree = ""; }; C6D4298F1DA75988002A5711 /* privoxy */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = privoxy; sourceTree = ""; }; C6D429911DA75988002A5711 /* start_privoxy.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = start_privoxy.sh; sourceTree = ""; }; C6D429921DA75988002A5711 /* stop_privoxy.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = stop_privoxy.sh; sourceTree = ""; }; C6D429981DA76FBC002A5711 /* privoxy.config.example */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = privoxy.config.example; sourceTree = ""; }; - C6E28E911DA79380004F8330 /* HTTPPreferencesWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPPreferencesWindowController.swift; sourceTree = ""; }; - C6E28E961DA79705004F8330 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/HTTPPreferencesWindowController.xib; sourceTree = ""; }; - C6E28E991DA79709004F8330 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/HTTPPreferencesWindowController.strings"; sourceTree = ""; }; C6E28E9B1DA79FB9004F8330 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/MainMenu.strings"; sourceTree = ""; }; C8E42A6A1D4F270A0074C7EA /* UserRulesController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserRulesController.swift; sourceTree = ""; }; C8E42A6F1D4F2CAF0074C7EA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UserRulesController.xib; sourceTree = ""; }; @@ -270,6 +263,10 @@ 9B07EFB01D048E900052D9DF /* Support Files */ = { isa = PBXGroup; children = ( + 9B5832101E742632009D5B7D /* kcptun_1.png */, + 9B58320A1E7422DB009D5B7D /* http.png */, + 9B5832061E7421B2009D5B7D /* virtual-server-icon-3.png */, + 9B5832021E741F8D009D5B7D /* command-512.png */, 9B9CBCAD1E263A6600FC61AA /* libpcre.1.dylib */, 9B9CBCA91E2633CB00FC61AA /* kcptun_client */, 08FCA0FE1E24BE1A0070984F /* example-gui-config.json */, @@ -376,17 +373,11 @@ 9B3FFF311D08CEE40019A709 /* SWBQRCodeWindowController.m */, 9BEEF0731D04EF3E00FC52B3 /* PreferencesWindowController.swift */, 9B2491B61D0ACC3A003BBECC /* PreferencesWindowController.xib */, - 9BEEF0791D05631500FC52B3 /* AdvPreferencesWindowController.swift */, - 9B2491B91D0ACC3E003BBECC /* AdvPreferencesWindowController.xib */, - 9BA04B241D24044D005AAD7F /* ProxyPreferencesController.swift */, - 9B0D55481D2CC85400A4A8E2 /* ProxyPreferencesController.xib */, C8E42A6A1D4F270A0074C7EA /* UserRulesController.swift */, C8E42A701D4F2CAF0074C7EA /* UserRulesController.xib */, - C6E28E911DA79380004F8330 /* HTTPPreferencesWindowController.swift */, - C6E28E971DA79705004F8330 /* HTTPPreferencesWindowController.xib */, - 9B5831EC1E72EBF9009D5B7D /* ShortcutsPreferencesWindowController.xib */, - 9B5831F11E72FA63009D5B7D /* ShortcutsPreferencesWindowController.h */, - 9B5831F21E72FA63009D5B7D /* ShortcutsPreferencesWindowController.m */, + 9B5831FD1E741969009D5B7D /* PreferencesWinController.swift */, + 9B5831FE1E741969009D5B7D /* PreferencesWinController.xib */, + 9B86459C1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift */, ); name = UI; sourceTree = ""; @@ -556,28 +547,30 @@ 9B9CBCB51E26453C00FC61AA /* stop_kcptun.sh in Resources */, 9B9CBCAF1E263B1600FC61AA /* libpcre.1.dylib in Resources */, 9B9CBCA81E26312E00FC61AA /* install_kcptun.sh in Resources */, + 9B5832031E741F8D009D5B7D /* command-512.png in Resources */, 9B9CBCAA1E2633CB00FC61AA /* kcptun_client in Resources */, 9BE8FBBF1D0B211600CAFD01 /* libcrypto.1.0.0.dylib in Resources */, 9B3FFF541D09E2D10019A709 /* proxy_conf_helper in Resources */, - C6E28E951DA79705004F8330 /* HTTPPreferencesWindowController.xib in Resources */, + 9B5832071E7421B2009D5B7D /* virtual-server-icon-3.png in Resources */, 9BEEF0691D04D4D500FC52B3 /* install_ss_local.sh in Resources */, - 9B0D55461D2CC85400A4A8E2 /* ProxyPreferencesController.xib in Resources */, 9B2491B41D0ACC3A003BBECC /* PreferencesWindowController.xib in Resources */, 9B3FFF291D08A1DF0019A709 /* user-rule.txt in Resources */, C6D429971DA75988002A5711 /* stop_privoxy.sh in Resources */, C8E42A6E1D4F2CAF0074C7EA /* UserRulesController.xib in Resources */, 9BEEF06A1D04D4D500FC52B3 /* start_ss_local.sh in Resources */, + 9B5832111E742632009D5B7D /* kcptun_1.png in Resources */, C6D429941DA75988002A5711 /* privoxy in Resources */, C6D429991DA76FBC002A5711 /* privoxy.config.example in Resources */, 9BEEF06B1D04D4D500FC52B3 /* stop_ss_local.sh in Resources */, 9B3FFF341D08CEF70019A709 /* SWBQRCodeWindowController.xib in Resources */, 9B3FFF231D088E8D0019A709 /* abp.js in Resources */, 9B07EFAD1D048E880052D9DF /* menu_icon.png in Resources */, + 9B5832001E741969009D5B7D /* PreferencesWinController.xib in Resources */, 9B0BFFEB1D0460A70040E62B /* Assets.xcassets in Resources */, - 9B2491B71D0ACC3E003BBECC /* AdvPreferencesWindowController.xib in Resources */, 08FCA0FF1E24BE1A0070984F /* example-gui-config.json in Resources */, 9B3FFF271D0898EB0019A709 /* gfwlist.txt in Resources */, C6D429931DA75988002A5711 /* install_privoxy.sh in Resources */, + 9B58320B1E7422DB009D5B7D /* http.png in Resources */, 9BC70EDC1D2E3E3100EDA4CA /* Localizable.strings in Resources */, 9B0BFFEE1D0460A70040E62B /* MainMenu.xib in Resources */, 9B3FFF4C1D09D8F70019A709 /* install_helper.sh in Resources */, @@ -585,7 +578,6 @@ 9B07EFAC1D048E880052D9DF /* menu_icon@2x.png in Resources */, 9B07EFA71D048BBB0052D9DF /* ss-local in Resources */, 9B07EFAF1D048E880052D9DF /* menu_icon_disabled@2x.png in Resources */, - 9B5831EE1E72EBF9009D5B7D /* ShortcutsPreferencesWindowController.xib in Resources */, 9B07EFAE1D048E880052D9DF /* menu_icon_disabled.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -728,26 +720,23 @@ buildActionMask = 2147483647; files = ( 9B3FFF171D072FDE0019A709 /* LaunchAtLoginController.m in Sources */, + 9B86459D1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift in Sources */, 9B3FFF4F1D09D9D50019A709 /* ProxyConfHelper.m in Sources */, 9B5831F61E7302F8009D5B7D /* ShortcutsController.m in Sources */, - 9B5831F31E72FA63009D5B7D /* ShortcutsPreferencesWindowController.m in Sources */, 9BB706A71D1B982300551F0E /* SWBApplication.m in Sources */, 9B3FFF1E1D0732660019A709 /* Utils.m in Sources */, 9B3FFF321D08CEE40019A709 /* SWBQRCodeWindowController.m in Sources */, 9B3FFF211D08826E0019A709 /* PACUtils.swift in Sources */, - 9BA04B261D24044D005AAD7F /* ProxyPreferencesController.swift in Sources */, 9B3FFF141D0705810019A709 /* Notifications.swift in Sources */, 9BEEF0701D04DDB100FC52B3 /* ServerProfileManager.swift in Sources */, - 9BEEF07B1D05631500FC52B3 /* AdvPreferencesWindowController.swift in Sources */, 9BEEF06E1D04DCE400FC52B3 /* ServerProfile.swift in Sources */, 9B3FFF0D1D05FEB30019A709 /* Utils.swift in Sources */, 9BEEF0751D04EF3E00FC52B3 /* PreferencesWindowController.swift in Sources */, 9B0BFFE91D0460A70040E62B /* AppDelegate.swift in Sources */, 9BA04B231D23D5A5005AAD7F /* ProxyConfTool.m in Sources */, + 9B5831FF1E741969009D5B7D /* PreferencesWinController.swift in Sources */, 9BEEF0781D04FE8A00FC52B3 /* LaunchAgentUtils.swift in Sources */, - C6E28E921DA79380004F8330 /* HTTPPreferencesWindowController.swift in Sources */, 9B9CBCA61E25E1DB00FC61AA /* KcptunProfile.swift in Sources */, - 9B5831FB1E73098F009D5B7D /* README.md in Sources */, C8E42A6C1D4F270A0074C7EA /* UserRulesController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -794,15 +783,6 @@ name = MainMenu.xib; sourceTree = ""; }; - 9B0D55481D2CC85400A4A8E2 /* ProxyPreferencesController.xib */ = { - isa = PBXVariantGroup; - children = ( - 9B0D554A1D2CC85E00A4A8E2 /* zh-Hans */, - 9B0D554B1D2CC87400A4A8E2 /* Base */, - ); - name = ProxyPreferencesController.xib; - sourceTree = ""; - }; 9B172A6C1D0ADDDD00B87B9A /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( @@ -821,24 +801,6 @@ name = PreferencesWindowController.xib; sourceTree = ""; }; - 9B2491B91D0ACC3E003BBECC /* AdvPreferencesWindowController.xib */ = { - isa = PBXVariantGroup; - children = ( - 9B2491B81D0ACC3E003BBECC /* Base */, - 9B172A5D1D0ACEA100B87B9A /* zh-Hans */, - ); - name = AdvPreferencesWindowController.xib; - sourceTree = ""; - }; - C6E28E971DA79705004F8330 /* HTTPPreferencesWindowController.xib */ = { - isa = PBXVariantGroup; - children = ( - C6E28E961DA79705004F8330 /* Base */, - C6E28E991DA79709004F8330 /* zh-Hans */, - ); - name = HTTPPreferencesWindowController.xib; - sourceTree = ""; - }; C8E42A701D4F2CAF0074C7EA /* UserRulesController.xib */ = { isa = PBXVariantGroup; children = ( diff --git a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme b/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme deleted file mode 100644 index 9e5d441..0000000 --- a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NGTests.xcscheme b/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NGTests.xcscheme deleted file mode 100644 index f5d83b6..0000000 --- a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NGTests.xcscheme +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/proxy_conf_helper.xcscheme b/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/proxy_conf_helper.xcscheme deleted file mode 100644 index 68efd69..0000000 --- a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/proxy_conf_helper.xcscheme +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ShadowsocksX-NG/AdvPreferencesWindowController.swift b/ShadowsocksX-NG/AdvPreferencesWindowController.swift deleted file mode 100644 index e53a707..0000000 --- a/ShadowsocksX-NG/AdvPreferencesWindowController.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// AdvPreferencesWindowController.swift -// ShadowsocksX-NG -// -// Created by 邱宇舟 on 16/6/6. -// Copyright © 2016年 qiuyuzhou. All rights reserved. -// - -import Cocoa - -class AdvPreferencesWindowController: NSWindowController, NSWindowDelegate { - - override func windowDidLoad() { - super.windowDidLoad() - - // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. - self.window?.delegate = self - } - - //------------------------------------------------------------ - // NSWindowDelegate - func windowWillClose(_ notification: Notification) { - NotificationCenter.default - .post(name: Notification.Name(rawValue: NOTIFY_ADV_CONF_CHANGED), object: nil) - } - -} diff --git a/ShadowsocksX-NG/AppDelegate.swift b/ShadowsocksX-NG/AppDelegate.swift index 35bcd59..091458c 100755 --- a/ShadowsocksX-NG/AppDelegate.swift +++ b/ShadowsocksX-NG/AppDelegate.swift @@ -8,22 +8,16 @@ import Cocoa import Carbon +import RxCocoa +import RxSwift @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate { var qrcodeWinCtrl: SWBQRCodeWindowController! var preferencesWinCtrl: PreferencesWindowController! - var advPreferencesWinCtrl: AdvPreferencesWindowController! - var proxyPreferencesWinCtrl: ProxyPreferencesController! var editUserRulesWinCtrl: UserRulesController! - var httpPreferencesWinCtrl : HTTPPreferencesWindowController! - var shortcutsPreferencesWinCtrl: ShortcutsPreferencesWindowController! - - let keyCodeP = kVK_ANSI_P - let keyCodeS = kVK_ANSI_S - let modifierKeys = cmdKey+controlKey - var hotKeyRef: EventHotKeyRef? + var allInOnePreferencesWinCtrl: PreferencesWinController! var launchAtLoginController: LaunchAtLoginController = LaunchAtLoginController() @@ -35,7 +29,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele @IBOutlet weak var autoModeMenuItem: NSMenuItem! @IBOutlet weak var globalModeMenuItem: NSMenuItem! @IBOutlet weak var manualModeMenuItem: NSMenuItem! - @IBOutlet weak var showRunningModeMenuItem: NSMenuItem! @IBOutlet weak var serversMenuItem: NSMenuItem! @IBOutlet var showQRCodeMenuItem: NSMenuItem! @@ -100,6 +93,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele "Kcptun.LocalHost": "127.0.0.1", "Kcptun.LocalPort": NSNumber(value: 8388), "Kcptun.Conn": NSNumber(value: 1), + "ShowRunningModeOnStatusBar": true, ]) statusItem = NSStatusBar.system().statusItem(withLength: AppDelegate.StatusItemIconWidth) @@ -109,13 +103,23 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele statusItem.menu = statusMenu + _ = defaults.rx.observe(Bool.self, "ShowRunningModeOnStatusBar") +// .distinctUntilChanged() + .subscribe(onNext: { value in + if let enabled = value { + self.updateStatusItemUI(isShownnRunningMode: enabled) + } + }) + let notifyCenter = NotificationCenter.default - notifyCenter.addObserver(forName: NSNotification.Name(rawValue: NOTIFY_ADV_PROXY_CONF_CHANGED), object: nil, queue: nil - , using: { - (note) in + + _ = notifyCenter.rx.notification(NOTIFY_CONF_CHANGED) + .subscribe(onNext: { noti in + SyncSSLocal() self.applyConfig() - } - ) + self.updateCopyHttpProxyExportMenu() + }) + notifyCenter.addObserver(forName: NSNotification.Name(rawValue: NOTIFY_SERVER_PROFILES_CHANGED), object: nil, queue: nil , using: { (note) in @@ -131,106 +135,34 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele SyncSSLocal() } ) - notifyCenter.addObserver(forName: NSNotification.Name(rawValue: NOTIFY_ADV_CONF_CHANGED), object: nil, queue: nil - , using: { - (note) in - SyncSSLocal() - self.applyConfig() - } - ) - notifyCenter.addObserver(forName: NSNotification.Name(rawValue: NOTIFY_HTTP_CONF_CHANGED), object: nil, queue: nil - , using: { - (note) in - SyncPrivoxy() - self.applyConfig() - self.updateCopyHttpProxyExportMenu() - } - ) - notifyCenter.addObserver(forName: NSNotification.Name(rawValue: "NOTIFY_TOGGLE_RUNNING"), object: nil, queue: nil - , using: { - (note) in - var isOn = UserDefaults.standard.bool(forKey: "ShadowsocksOn") - isOn = !isOn - if isOn { - self.isNameTextField.stringValue = "Shadowsocks: On".localized - } - else { - self.isNameTextField.stringValue = "Shadowsocks: Off".localized - } - - UserDefaults.standard.set(isOn, forKey: "ShadowsocksOn") - - self.updateMainMenu() - self.applyConfig() - self.fadeInHud() - } - ) - notifyCenter.addObserver(forName: NSNotification.Name(rawValue: "NOTIFY_SWITCH_PROXY_MODE"), object: nil, queue: nil - , using: { - (note) in - - switch Globals.proxyType { - case .pac: - Globals.proxyType = .global - UserDefaults.standard.setValue("global", forKey: "ShadowsocksRunningMode") + _ = notifyCenter.rx.notification(NOTIFY_TOGGLE_RUNNING_SHORTCUT) + .subscribe(onNext: { noti in + self.doToggleRunning(showToast: true) + }) + _ = notifyCenter.rx.notification(NOTIFY_SWITCH_PROXY_MODE_SHORTCUT) + .subscribe(onNext: { noti in + let mode = defaults.string(forKey: "ShadowsocksRunningMode")! + switch mode { + case "auto": + defaults.setValue("global", forKey: "ShadowsocksRunningMode") self.isNameTextField.stringValue = "Global Mode".localized - case .global: - Globals.proxyType = .pac - UserDefaults.standard.setValue("auto", forKey: "ShadowsocksRunningMode") + case "global": + defaults.setValue("auto", forKey: "ShadowsocksRunningMode") + self.isNameTextField.stringValue = "Auto Mode By PAC".localized + default: + defaults.setValue("auto", forKey: "ShadowsocksRunningMode") self.isNameTextField.stringValue = "Auto Mode By PAC".localized } self.updateRunningModeMenu() self.applyConfig() self.fadeInHud() - } - ) - notifyCenter.addObserver(forName: NSNotification.Name(rawValue: "NOTIFY_FOUND_SS_URL"), object: nil, queue: nil) { - (note: Notification) in - - let sendNotify = { - (title: String, subtitle: String, infoText: String) in - - let userNote = NSUserNotification() - userNote.title = title - userNote.subtitle = subtitle - userNote.informativeText = infoText - userNote.soundName = NSUserNotificationDefaultSoundName - - NSUserNotificationCenter.default - .deliver(userNote); - } - - if let userInfo = (note as NSNotification).userInfo { - let urls: [URL] = userInfo["urls"] as! [URL] - - let mgr = ServerProfileManager.instance - var isChanged = false - - for url in urls { - if let profile = ServerProfile(url: url) { - mgr.profiles.append(profile) - isChanged = true - - var subtitle: String = "" - if userInfo["source"] as! String == "qrcode" { - subtitle = "By scan QR Code".localized - } else if userInfo["source"] as! String == "url" { - subtitle = "By Handle SS URL".localized - } - - sendNotify("Add Shadowsocks Server Profile".localized, subtitle, "Host: \(profile.serverHost)") - } - } - - if isChanged { - mgr.save() - self.updateServersMenu() - } else { - sendNotify("Not found valid qrcode of shadowsocks profile.", "", "") - } - } - } + }) + + _ = notifyCenter.rx.notification(NOTIFY_FOUND_SS_URL) + .subscribe(onNext: { noti in + self.handleFoundSSURL(noti) + }) // Handle ss url scheme NSAppleEventManager.shared().setEventHandler(self @@ -241,7 +173,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele updateCopyHttpProxyExportMenu() updateServersMenu() updateRunningModeMenu() - updateLaunchAtLoginMenu() ProxyConfHelper.install() ProxyConfHelper.startMonitorPAC() @@ -258,7 +189,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele StopKcptun() StopPrivoxy() ProxyConfHelper.disableProxy() - if let ref = hotKeyRef { UnregisterEventHotKey(ref) } } func applyConfig() { @@ -287,14 +217,27 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele // MARK: - UI Methods @IBAction func toggleRunning(_ sender: NSMenuItem) { + self.doToggleRunning(showToast: false) + } + + func doToggleRunning(showToast: Bool) { let defaults = UserDefaults.standard - var isOn = defaults.bool(forKey: "ShadowsocksOn") + var isOn = UserDefaults.standard.bool(forKey: "ShadowsocksOn") isOn = !isOn defaults.set(isOn, forKey: "ShadowsocksOn") - updateMainMenu() + self.updateMainMenu() + self.applyConfig() - applyConfig() + if showToast { + if isOn { + self.isNameTextField.stringValue = "Shadowsocks: On".localized + } + else { + self.isNameTextField.stringValue = "Shadowsocks: Off".localized + } + self.fadeInHud() + } } @IBAction func updateGFWList(_ sender: NSMenuItem) { @@ -359,11 +302,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele ServerProfileManager.instance.exportConfigFile() } - @IBAction func toggleLaunghAtLogin(sender: NSMenuItem) { - launchAtLoginController.launchAtLogin = !launchAtLoginController.launchAtLogin; - updateLaunchAtLoginMenu() - } - @IBAction func selectPACMode(_ sender: NSMenuItem) { let defaults = UserDefaults.standard defaults.setValue("auto", forKey: "ShadowsocksRunningMode") @@ -397,51 +335,16 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele ctrl.window?.makeKeyAndOrderFront(self) } - @IBAction func editAdvPreferences(_ sender: NSMenuItem) { - if advPreferencesWinCtrl != nil { - advPreferencesWinCtrl.close() - } - let ctrl = AdvPreferencesWindowController(windowNibName: "AdvPreferencesWindowController") - advPreferencesWinCtrl = ctrl - - ctrl.showWindow(self) - NSApp.activate(ignoringOtherApps: true) - ctrl.window?.makeKeyAndOrderFront(self) - } - - @IBAction func editHTTPPreferences(_ sender: NSMenuItem) { - if httpPreferencesWinCtrl != nil { - httpPreferencesWinCtrl.close() - } - let ctrl = HTTPPreferencesWindowController(windowNibName: "HTTPPreferencesWindowController") - httpPreferencesWinCtrl = ctrl - - ctrl.showWindow(self) - NSApp.activate(ignoringOtherApps: true) - ctrl.window?.makeKeyAndOrderFront(self) - } - - @IBAction func editProxyPreferences(_ sender: NSObject) { - if proxyPreferencesWinCtrl != nil { - proxyPreferencesWinCtrl.close() - } - proxyPreferencesWinCtrl = ProxyPreferencesController(windowNibName: "ProxyPreferencesController") - proxyPreferencesWinCtrl.showWindow(self) - NSApp.activate(ignoringOtherApps: true) - proxyPreferencesWinCtrl.window?.makeKeyAndOrderFront(self) - } - - @IBAction func editShortcutsPreferences(_ sender: NSMenuItem) { - if shortcutsPreferencesWinCtrl != nil { - shortcutsPreferencesWinCtrl.close() + @IBAction func showAllInOnePreferences(_ sender: NSMenuItem) { + if allInOnePreferencesWinCtrl != nil { + allInOnePreferencesWinCtrl.close() } - shortcutsPreferencesWinCtrl = ShortcutsPreferencesWindowController( - windowNibName: "ShortcutsPreferencesWindowController") + allInOnePreferencesWinCtrl = PreferencesWinController(windowNibName: "PreferencesWinController") - shortcutsPreferencesWinCtrl.showWindow(self) + allInOnePreferencesWinCtrl.showWindow(self) NSApp.activate(ignoringOtherApps: true) - shortcutsPreferencesWinCtrl.window?.makeKeyAndOrderFront(self) + allInOnePreferencesWinCtrl.window?.makeKeyAndOrderFront(self) } @IBAction func selectServer(_ sender: NSMenuItem) { @@ -495,29 +398,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele NSApp.activate(ignoringOtherApps: true) } - @IBAction func showRunningMode(_ sender: NSMenuItem) { - sender.state = sender.state == 1 ? 0 : 1 - let defaults = UserDefaults.standard - let isShown = (sender.state == 1) - defaults.set(isShown, forKey: "ShowRunningModeOnStatusBar") - updateStatusItemUI(isShownnRunningMode: isShown) - } - - func updateLaunchAtLoginMenu() { - if launchAtLoginController.launchAtLogin { - lanchAtLoginMenuItem.state = 1 - } else { - lanchAtLoginMenuItem.state = 0 - } - } - func updateRunningModeMenu() { let defaults = UserDefaults.standard let mode = defaults.string(forKey: "ShadowsocksRunningMode") - showRunningModeMenuItem.title = "Show Running Mode On Status Bar".localized - showRunningModeMenuItem.state = defaults.bool(forKey: "ShowRunningModeOnStatusBar") ? 1 : 0 - var serverMenuText = "Servers".localized let mgr = ServerProfileManager.instance @@ -645,6 +529,51 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele } } + func handleFoundSSURL(_ note: Notification) { + let sendNotify = { + (title: String, subtitle: String, infoText: String) in + + let userNote = NSUserNotification() + userNote.title = title + userNote.subtitle = subtitle + userNote.informativeText = infoText + userNote.soundName = NSUserNotificationDefaultSoundName + + NSUserNotificationCenter.default + .deliver(userNote); + } + + if let userInfo = (note as NSNotification).userInfo { + let urls: [URL] = userInfo["urls"] as! [URL] + + let mgr = ServerProfileManager.instance + var isChanged = false + + for url in urls { + if let profile = ServerProfile(url: url) { + mgr.profiles.append(profile) + isChanged = true + + var subtitle: String = "" + if userInfo["source"] as! String == "qrcode" { + subtitle = "By scan QR Code".localized + } else if userInfo["source"] as! String == "url" { + subtitle = "By Handle SS URL".localized + } + + sendNotify("Add Shadowsocks Server Profile".localized, subtitle, "Host: \(profile.serverHost)") + } + } + + if isChanged { + mgr.save() + self.updateServersMenu() + } else { + sendNotify("Not found valid qrcode of shadowsocks profile.", "", "") + } + } + } + //------------------------------------------------------------ // NSUserNotificationCenterDelegate diff --git a/ShadowsocksX-NG/Base.lproj/AdvPreferencesWindowController.xib b/ShadowsocksX-NG/Base.lproj/AdvPreferencesWindowController.xib deleted file mode 100644 index 3a9cd96..0000000 --- a/ShadowsocksX-NG/Base.lproj/AdvPreferencesWindowController.xib +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ShadowsocksX-NG/Base.lproj/HTTPPreferencesWindowController.xib b/ShadowsocksX-NG/Base.lproj/HTTPPreferencesWindowController.xib deleted file mode 100644 index 8845c32..0000000 --- a/ShadowsocksX-NG/Base.lproj/HTTPPreferencesWindowController.xib +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ShadowsocksX-NG/Base.lproj/MainMenu.xib b/ShadowsocksX-NG/Base.lproj/MainMenu.xib index a386884..a881185 100755 --- a/ShadowsocksX-NG/Base.lproj/MainMenu.xib +++ b/ShadowsocksX-NG/Base.lproj/MainMenu.xib @@ -22,7 +22,6 @@ - @@ -31,7 +30,6 @@ - @@ -100,13 +98,6 @@ - - - - - - - @@ -119,63 +110,29 @@ - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/ShadowsocksX-NG/Base.lproj/ProxyPreferencesController.xib b/ShadowsocksX-NG/Base.lproj/ProxyPreferencesController.xib deleted file mode 100644 index 612480c..0000000 --- a/ShadowsocksX-NG/Base.lproj/ProxyPreferencesController.xib +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ShadowsocksX-NG/HTTPPreferencesWindowController.swift b/ShadowsocksX-NG/HTTPPreferencesWindowController.swift deleted file mode 100644 index 6f2c64f..0000000 --- a/ShadowsocksX-NG/HTTPPreferencesWindowController.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// HTTPPreferencesWindowController.swift -// ShadowsocksX-NG -// -// Created by 王晨 on 2016/10/7. -// Copyright © 2016年 qiuyuzhou. All rights reserved. -// - -import Cocoa - -class HTTPPreferencesWindowController: NSWindowController, NSWindowDelegate { - - @IBOutlet weak var address: NSTextField! - @IBOutlet weak var port: NSTextField! - - override func windowDidLoad() { - super.windowDidLoad() - - // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. - self.window?.delegate = self - } - - //------------------------------------------------------------ - // NSWindowDelegate - func windowWillClose(_ notification: Notification) { - NotificationCenter.default - .post(name: Notification.Name(rawValue: NOTIFY_HTTP_CONF_CHANGED), object: nil) - } - -} diff --git a/ShadowsocksX-NG/LaunchAtLoginController.h b/ShadowsocksX-NG/LaunchAtLoginController.h index 144f69e..e9c9dee 100755 --- a/ShadowsocksX-NG/LaunchAtLoginController.h +++ b/ShadowsocksX-NG/LaunchAtLoginController.h @@ -27,5 +27,6 @@ @property(assign) BOOL launchAtLogin; ++ (instancetype) shared; @end diff --git a/ShadowsocksX-NG/LaunchAtLoginController.m b/ShadowsocksX-NG/LaunchAtLoginController.m index 7ba9f7a..f14d0d4 100755 --- a/ShadowsocksX-NG/LaunchAtLoginController.m +++ b/ShadowsocksX-NG/LaunchAtLoginController.m @@ -44,15 +44,26 @@ { self = [super init]; if (self) { - _enabled = [[NSUserDefaults standardUserDefaults] boolForKey: @"LaunchAtLogin"]; + _enabled = NO; + BOOL enabled = [[NSUserDefaults standardUserDefaults] boolForKey: @"LaunchAtLogin"]; + [self setLaunchAtLogin:enabled]; } return self; } - + - (void) dealloc { } ++ (instancetype) shared { + static LaunchAtLoginController* ctrl = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + ctrl = [[self alloc]init]; + }); + return ctrl; +} + - (void) setLaunchAtLogin: (BOOL) enabled { if (SMLoginItemSetEnabled( @@ -61,6 +72,10 @@ _enabled = enabled; NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults setBool: enabled forKey: @"LaunchAtLogin"]; + + NSLog(@"Call SMLoginItemSetEnabled with [%hhd] success", enabled); + } else { + NSLog(@"Call SMLoginItemSetEnabled with [%hhd] failed", enabled); } } diff --git a/ShadowsocksX-NG/Notifications.swift b/ShadowsocksX-NG/Notifications.swift index 09da2db..f855d0d 100644 --- a/ShadowsocksX-NG/Notifications.swift +++ b/ShadowsocksX-NG/Notifications.swift @@ -11,5 +11,16 @@ import Foundation let NOTIFY_SERVER_PROFILES_CHANGED = "NOTIFY_SERVER_PROFILES_CHANGED" let NOTIFY_ADV_PROXY_CONF_CHANGED = "NOTIFY_ADV_PROXY_CONF_CHANGED" let NOTIFY_ADV_CONF_CHANGED = "NOTIFY_ADV_CONF_CHANGED" -let NOTIFY_HTTP_CONF_CHANGED = "NOTIFY_HTTP_CONF_CHANGED" let NOTIFY_INVALIDE_QR = "NOTIFY_INVALIDE_QR" + + +let NOTIFY_CONF_CHANGED = Notification.Name(rawValue: "NOTIFY_CONF_CHANGED") + +//let NOTIFY_SS_CONF_CHANGED = Notification.Name(rawValue: "NOTIFY_SS_CONF_CHANGED") +let NOTIFY_HTTP_CONF_CHANGED = Notification.Name(rawValue: "NOTIFY_HTTP_CONF_CHANGED") +//let NOTIFY_KCPTUN_CONF_CHANGED = Notification.Name(rawValue: "NOTIFY_KCPTUN_CONF_CHANGED") + +let NOTIFY_TOGGLE_RUNNING_SHORTCUT = Notification.Name(rawValue: "NOTIFY_TOGGLE_RUNNING_SHORTCUT") +let NOTIFY_SWITCH_PROXY_MODE_SHORTCUT = Notification.Name(rawValue: "NOTIFY_SWITCH_PROXY_MODE_SHORTCUT") + +let NOTIFY_FOUND_SS_URL = Notification.Name(rawValue: "NOTIFY_FOUND_SS_URL") diff --git a/ShadowsocksX-NG/PreferencesWinController.swift b/ShadowsocksX-NG/PreferencesWinController.swift new file mode 100644 index 0000000..74a3746 --- /dev/null +++ b/ShadowsocksX-NG/PreferencesWinController.swift @@ -0,0 +1,34 @@ +// +// PreferencesWinController.swift +// ShadowsocksX-NG +// +// Created by 邱宇舟 on 2017/3/11. +// Copyright © 2017年 qiuyuzhou. All rights reserved. +// + +import Cocoa +import RxCocoa +import RxSwift + +class PreferencesWinController: NSWindowController { + + @IBOutlet weak var toolbar: NSToolbar! + @IBOutlet weak var tabView: NSTabView! + + override func windowDidLoad() { + super.windowDidLoad() + + // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. + toolbar.selectedItemIdentifier = "general" + } + + func windowWillClose(_ notification: Notification) { + NotificationCenter.default + .post(name: NOTIFY_CONF_CHANGED, object: nil) + } + + @IBAction func toolbarAction(sender: NSToolbarItem) { + tabView.selectTabViewItem(withIdentifier: sender.itemIdentifier) + } + +} diff --git a/ShadowsocksX-NG/PreferencesWinController.xib b/ShadowsocksX-NG/PreferencesWinController.xib new file mode 100644 index 0000000..52fea9a --- /dev/null +++ b/ShadowsocksX-NG/PreferencesWinController.xib @@ -0,0 +1,697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ShadowsocksX-NG/ProxyPreferencesController.swift b/ShadowsocksX-NG/ProxyInterfacesViewCtrl.swift similarity index 57% rename from ShadowsocksX-NG/ProxyPreferencesController.swift rename to ShadowsocksX-NG/ProxyInterfacesViewCtrl.swift index 82bab46..06d21d0 100644 --- a/ShadowsocksX-NG/ProxyPreferencesController.swift +++ b/ShadowsocksX-NG/ProxyInterfacesViewCtrl.swift @@ -1,31 +1,27 @@ // -// ProxyPreferencesController.swift +// ProxyInterfacesTableViewCtrl.swift // ShadowsocksX-NG // -// Created by 邱宇舟 on 16/6/29. -// Copyright © 2016年 qiuyuzhou. All rights reserved. +// Created by 邱宇舟 on 2017/3/17. +// Copyright © 2017年 qiuyuzhou. All rights reserved. // import Cocoa +import RxCocoa +import RxSwift -class ProxyPreferencesController: NSWindowController, NSTableViewDataSource, NSTableViewDelegate { +class ProxyInterfacesViewCtrl: NSViewController, NSTableViewDataSource, NSTableViewDelegate { var networkServices: NSArray! var selectedNetworkServices: NSMutableSet! - var autoConfigureNetworkServices: Bool = true + @IBOutlet weak var tableView: NSTableView! + @IBOutlet weak var autoConfigCheckBox: NSButton! - @IBOutlet var autoConfigCheckBox: NSButton! - - @IBOutlet var tableView: NSTableView! - - override func windowDidLoad() { - super.windowDidLoad() - - // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. - let defaults = UserDefaults.standard - self.setValue(defaults.bool(forKey: "AutoConfigureNetworkServices"), forKey: "autoConfigureNetworkServices") + override func viewDidLoad() { + super.viewDidLoad() + let defaults = UserDefaults.standard if let services = defaults.array(forKey: "Proxy4NetworkServices") { selectedNetworkServices = NSMutableSet(array: services) } else { @@ -35,26 +31,7 @@ class ProxyPreferencesController: NSWindowController, NSTableViewDataSource, NST networkServices = ProxyConfTool.networkServicesList() as NSArray! tableView.reloadData() } - - @IBAction func ok(_ sender: NSObject){ - ProxyConfHelper.disableProxy() - - let defaults = UserDefaults.standard - defaults.setValue(selectedNetworkServices.allObjects, forKeyPath: "Proxy4NetworkServices") - defaults.set(autoConfigureNetworkServices, forKey: "AutoConfigureNetworkServices") - - defaults.synchronize() - - window?.performClose(self) - - NotificationCenter.default - .post(name: Notification.Name(rawValue: NOTIFY_ADV_PROXY_CONF_CHANGED), object: nil) - } - - @IBAction func cancel(_ sender: NSObject){ - window?.performClose(self) - } - + //-------------------------------------------------- // For NSTableViewDataSource func numberOfRows(in tableView: NSTableView) -> Int { diff --git a/ShadowsocksX-NG/ShadowsocksX-NG-Bridging-Header.h b/ShadowsocksX-NG/ShadowsocksX-NG-Bridging-Header.h index 222e9be..db59115 100644 --- a/ShadowsocksX-NG/ShadowsocksX-NG-Bridging-Header.h +++ b/ShadowsocksX-NG/ShadowsocksX-NG-Bridging-Header.h @@ -6,7 +6,6 @@ #import "LaunchAtLoginController.h" #import "SWBQRCodeWindowController.h" -#import "ShortcutsPreferencesWindowController.h" #import "ShortcutsController.h" #import "Utils.h" #import "ProxyConfHelper.h" diff --git a/ShadowsocksX-NG/ShortcutsController.m b/ShadowsocksX-NG/ShortcutsController.m index a8dd302..e69200c 100644 --- a/ShadowsocksX-NG/ShortcutsController.m +++ b/ShadowsocksX-NG/ShortcutsController.m @@ -10,20 +10,18 @@ #import -#import "ShortcutsPreferencesWindowController.h" - @implementation ShortcutsController + (void)bindShortcuts { MASShortcutBinder* binder = [MASShortcutBinder sharedBinder]; [binder - bindShortcutWithDefaultsKey:kGlobalShortcutToggleRunning + bindShortcutWithDefaultsKey: @"ToggleRunning" toAction:^{ [[NSNotificationCenter defaultCenter] postNotificationName: @"NOTIFY_TOGGLE_RUNNING" object: nil]; }]; [binder - bindShortcutWithDefaultsKey:kGlobalShortcutSwitchProxyMode + bindShortcutWithDefaultsKey: @"SwitchProxyMode" toAction:^{ [[NSNotificationCenter defaultCenter] postNotificationName: @"NOTIFY_SWITCH_PROXY_MODE" object: nil]; }]; diff --git a/ShadowsocksX-NG/ShortcutsPreferencesWindowController.h b/ShadowsocksX-NG/ShortcutsPreferencesWindowController.h deleted file mode 100644 index f29a38b..0000000 --- a/ShadowsocksX-NG/ShortcutsPreferencesWindowController.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// ShortcutsPreferencesWindowController.h -// ShadowsocksX-NG -// -// Created by 邱宇舟 on 2017/3/10. -// Copyright © 2017年 qiuyuzhou. All rights reserved. -// - -#import -#import - - -static NSString *const kGlobalShortcutToggleRunning = @"ToggleRunning"; -static NSString *const kGlobalShortcutSwitchProxyMode= @"SwitchProxyMode"; - - -@interface ShortcutsPreferencesWindowController : NSWindowController - -@property(nonatomic, weak) IBOutlet MASShortcutView* toggleRunningShortcutCtrl; -@property(nonatomic, weak) IBOutlet MASShortcutView* switchModeShortcutCtrl; - -@end diff --git a/ShadowsocksX-NG/ShortcutsPreferencesWindowController.m b/ShadowsocksX-NG/ShortcutsPreferencesWindowController.m deleted file mode 100644 index 092c3e8..0000000 --- a/ShadowsocksX-NG/ShortcutsPreferencesWindowController.m +++ /dev/null @@ -1,26 +0,0 @@ -// -// ShortcutsPreferencesWindowController.m -// ShadowsocksX-NG -// -// Created by 邱宇舟 on 2017/3/10. -// Copyright © 2017年 qiuyuzhou. All rights reserved. -// - -#import "ShortcutsPreferencesWindowController.h" - - -@interface ShortcutsPreferencesWindowController () - -@end - -@implementation ShortcutsPreferencesWindowController - -- (void)windowDidLoad { - [super windowDidLoad]; - - // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. - self.toggleRunningShortcutCtrl.associatedUserDefaultsKey = kGlobalShortcutToggleRunning; - self.switchModeShortcutCtrl.associatedUserDefaultsKey = kGlobalShortcutSwitchProxyMode; -} - -@end diff --git a/ShadowsocksX-NG/ShortcutsPreferencesWindowController.xib b/ShadowsocksX-NG/ShortcutsPreferencesWindowController.xib deleted file mode 100644 index 5d265a6..0000000 --- a/ShadowsocksX-NG/ShortcutsPreferencesWindowController.xib +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ShadowsocksX-NG/command-512.png b/ShadowsocksX-NG/command-512.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8084c8c6dabdb01a5b473f1f0f14e6b1c68885 GIT binary patch literal 24660 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
$jlO^r)rzID6M0 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 literal 0 HcmV?d00001 diff --git a/ShadowsocksX-NG/kcptun_1.png b/ShadowsocksX-NG/kcptun_1.png new file mode 100644 index 0000000000000000000000000000000000000000..30913a279d84d1ad6dc11c1b21d657cdd0ea3838 GIT binary patch literal 10708 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 X!LBV+upxAHCCs<4N>a5FCL#X=8(tNk literal 0 HcmV?d00001 diff --git a/ShadowsocksX-NG/virtual-server-icon-3.png b/ShadowsocksX-NG/virtual-server-icon-3.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7d5bd2ae934f44846812f9681df96bffa34e9b GIT binary patch literal 62827 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 literal 0 HcmV?d00001 diff --git a/ShadowsocksX-NG/zh-Hans.lproj/AdvPreferencesWindowController.strings b/ShadowsocksX-NG/zh-Hans.lproj/AdvPreferencesWindowController.strings deleted file mode 100644 index f01ad9b..0000000 --- a/ShadowsocksX-NG/zh-Hans.lproj/AdvPreferencesWindowController.strings +++ /dev/null @@ -1,39 +0,0 @@ - -/* Class = "NSButtonCell"; title = "启用 Udp Relay"; ObjectID = "1C3-4s-Apd"; */ -"1C3-4s-Apd.title" = "启用 Udp Relay"; - -/* Class = "NSTextFieldCell"; title = "Don't change these preferences if you have no idea what are they."; ObjectID = "8wL-qv-5nD"; */ -"8wL-qv-5nD.title" = "如果你不明白这些选项是什么,请不要修改"; - -/* Class = "NSWindow"; title = "高级设置"; ObjectID = "F0z-JX-Cv5"; */ -"F0z-JX-Cv5.title" = "高级设置"; - -/* Class = "NSTextFieldCell"; title = "Seconds"; ObjectID = "Gd3-Fm-sWh"; */ -"Gd3-Fm-sWh.title" = "秒"; - -/* Class = "NSBox"; title = "Box"; ObjectID = "ayu-Tb-kmf"; */ -"ayu-Tb-kmf.title" = "Box"; - -/* Class = "NSTextFieldCell"; title = "本地 Socks5 监听地址:"; ObjectID = "cwr-n0-zwn"; */ -"cwr-n0-zwn.title" = "本地 Socks5 监听地址:"; - -/* Class = "NSTextFieldCell"; title = "GFW List URL:"; ObjectID = "dg0-gS-z5V"; */ -"dg0-gS-z5V.title" = "GFW LIST URL:"; - -/* Class = "NSTextFieldCell"; title = "Timeout:"; ObjectID = "i4l-2S-gOQ"; */ -"i4l-2S-gOQ.title" = "超时:"; - -/* Class = "NSTextFieldCell"; title = "本地 Socks5 监听端口:"; ObjectID = "qRs-ow-vVB"; */ -"qRs-ow-vVB.title" = "本地 Socks5 监听端口:"; - -/* Class = "NSTextFieldCell"; title = "Local PAC Listen Address:"; ObjectID = "dvL-Ic-Wae"; */ -"dvL-Ic-Wae.title" = "本地 PAC 监听地址:"; - -/* Class = "NSTextFieldCell"; title = "Local PAC Listen Port:"; ObjectID = "PSg-XK-qhl"; */ -"PSg-XK-qhl.title" = "本地 PAC 监听端口:"; - -/* Class = "NSTextFieldCell"; title = "White List URL:"; ObjectID = "aif-uV-Lxk"; */ -"aif-uV-Lxk.title" = "白名单列表 URL:"; - -/* Class = "NSTextFieldCell"; title = "White IP List URL:"; ObjectID = "qhu-d1-qgq"; */ -"qhu-d1-qgq.title" = "白名单IP列表 URL:"; diff --git a/ShadowsocksX-NG/zh-Hans.lproj/HTTPPreferencesWindowController.strings b/ShadowsocksX-NG/zh-Hans.lproj/HTTPPreferencesWindowController.strings deleted file mode 100644 index cc82ba2..0000000 --- a/ShadowsocksX-NG/zh-Hans.lproj/HTTPPreferencesWindowController.strings +++ /dev/null @@ -1,18 +0,0 @@ - -/* Class = "NSTextFieldCell"; title = "HTTP Proxy Listen Port:"; ObjectID = "2Sd-yn-gdY"; */ -"2Sd-yn-gdY.title" = "HTTP 代理 监听端口:"; - -/* Class = "NSButtonCell"; title = "HTTP Proxy Enable"; ObjectID = "dqU-MG-Sum"; */ -"dqU-MG-Sum.title" = "HTTP 代理 开启"; - -/* Class = "NSTextFieldCell"; title = "HTTP Proxy Listen Address:"; ObjectID = "qd0-kc-ttB"; */ -"qd0-kc-ttB.title" = "HTTP 代理 监听地址:"; - -/* Class = "NSWindow"; title = "HTTP Proxy Preferences"; ObjectID = "vS3-DL-Nq3"; */ -"vS3-DL-Nq3.title" = "HTTP 代理 设置"; - -/* Class = "NSButtonCell"; title = "Follow Global Mode"; ObjectID = "ofk-Pc-c8f"; */ -"ofk-Pc-c8f.title" = "跟随全局模式"; - -/* Class = "NSButton"; title = "Copy Shell Export Command"; ObjectID = "ySG-BC-5r0"; */ -"ySG-BC-5r0.title" = "复制终端 Export 命令"; diff --git a/ShadowsocksX-NG/zh-Hans.lproj/ProxyPreferencesController.strings b/ShadowsocksX-NG/zh-Hans.lproj/ProxyPreferencesController.strings deleted file mode 100644 index ca91ca2..0000000 --- a/ShadowsocksX-NG/zh-Hans.lproj/ProxyPreferencesController.strings +++ /dev/null @@ -1,13 +0,0 @@ - -/* Class = "NSWindow"; title = "Advanced Proxy Preferences"; ObjectID = "F0z-JX-Cv5"; */ -"F0z-JX-Cv5.title" = "高级代理设置"; - -/* Class = "NSButtonCell"; title = "Auto Configure"; ObjectID = "FLv-D9-CRw"; */ -"FLv-D9-CRw.title" = "自动设置"; - -/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "lsQ-1C-OhG"; */ -"lsQ-1C-OhG.title" = "取消"; - -/* Class = "NSButtonCell"; title = "OK"; ObjectID = "rWE-M6-TvV"; */ -"rWE-M6-TvV.title" = "确定"; -