Skip to content

Commit 2e93f56

Browse files
committed
Merge branch 'dev'
2 parents 2126079 + 51eff57 commit 2e93f56

22 files changed

+361
-215
lines changed

README.md

+1-9
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,14 @@ Then I rewrite the GUI code by swift.
5151
- Could reorder shadowsocks profiles by drag & drop in servers preferences panel.
5252
- Auto check update (unable to auto download)
5353

54-
## Different from original ShadowsocksX
54+
## Differences from original ShadowsocksX
5555

5656
Run ss-local as backgroud service through launchd, not in app process.
5757
So after you quit the app, the ss-local maybe is still running.
5858

5959
Add a manual mode which won't configure the system proxy settings.
6060
Then you could configure your apps to use socks5 proxy manual.
6161

62-
63-
## TODO List
64-
- [ ] 用nettop替换掉sar,重写显示网速功能
65-
- [ ] 用Swift重写剩余的OC代码
66-
- [ ] 用SwiftUI重写界面
67-
- [ ] Embed the http proxy server [privoxy](http://www.privoxy.org/), [get it](https://homebrew.bintray.com/bottles/privoxy-3.0.26.sierra.bottle.tar.gz).
68-
- [ ] ACL mode support [Shadowsocks ACL](https://github.com/shadowsocksr/shadowsocksr-libev/tree/master/acl)
69-
7062
## License
7163

7264
The project is released under the terms of GPLv3.

ShadowsocksX-NG.xcodeproj/project.pbxproj

+7-3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
099C07EE26249E6300D6FD67 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 099C07ED26249E6300D6FD67 /* Alamofire */; };
3434
09AB0C26262F0485008E57C1 /* ProxyConfHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09AB0C25262F0485008E57C1 /* ProxyConfHelper.swift */; };
3535
09AB0C2E262F298A008E57C1 /* ProxyConfHelperVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09AB0C2D262F298A008E57C1 /* ProxyConfHelperVersion.swift */; };
36+
09B0F22926413D7A0045297F /* IconUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B0F22826413D7A0045297F /* IconUtils.swift */; };
3637
09C3968C26345B0B009C2C99 /* ProxyConfTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C3968B26345B0B009C2C99 /* ProxyConfTool.swift */; };
3738
1F94B2D84433EFEBF9FAE5D0 /* Pods_ShadowsocksX_NG_R.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFF6A36F1612D98DC91EF19A /* Pods_ShadowsocksX_NG_R.framework */; };
3839
9B07EFA71D048BBB0052D9DF /* ss-local in Resources */ = {isa = PBXBuildFile; fileRef = 9B07EFA61D048BBB0052D9DF /* ss-local */; };
@@ -139,6 +140,7 @@
139140
0984E97F263AFDF800A79681 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/SWBQRCodeWindowController.strings"; sourceTree = "<group>"; };
140141
09AB0C25262F0485008E57C1 /* ProxyConfHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyConfHelper.swift; sourceTree = "<group>"; };
141142
09AB0C2D262F298A008E57C1 /* ProxyConfHelperVersion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyConfHelperVersion.swift; sourceTree = "<group>"; };
143+
09B0F22826413D7A0045297F /* IconUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconUtils.swift; sourceTree = "<group>"; };
142144
09C3968B26345B0B009C2C99 /* ProxyConfTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyConfTool.swift; sourceTree = "<group>"; };
143145
09F9DCD1261CC452006CA4B9 /* libcrypto.1.0.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libcrypto.1.0.0.dylib; sourceTree = "<group>"; };
144146
19083CFCED87354F006967FF /* Pods_ShadowsocksX_NGUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NGUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -344,6 +346,7 @@
344346
0948A8CE26288D090060D4AA /* QRCodeUtils.swift */,
345347
09AB0C25262F0485008E57C1 /* ProxyConfHelper.swift */,
346348
09AB0C2D262F298A008E57C1 /* ProxyConfHelperVersion.swift */,
349+
09B0F22826413D7A0045297F /* IconUtils.swift */,
347350
);
348351
path = "ShadowsocksX-NG";
349352
sourceTree = "<group>";
@@ -691,6 +694,7 @@
691694
090294792639B2CC00FAC817 /* SWBQRCodeWindowController.swift in Sources */,
692695
083BF83B1D8275A800831C68 /* SystemThemeChangeHelper.swift in Sources */,
693696
0948A8CF26288D090060D4AA /* QRCodeUtils.swift in Sources */,
697+
09B0F22926413D7A0045297F /* IconUtils.swift in Sources */,
694698
9B3FFF0D1D05FEB30019A709 /* Utils.swift in Sources */,
695699
9BEEF0751D04EF3E00FC52B3 /* PreferencesWindowController.swift in Sources */,
696700
9B0BFFE91D0460A70040E62B /* AppDelegate.swift in Sources */,
@@ -951,7 +955,7 @@
951955
"$(PROJECT_DIR)",
952956
);
953957
MACOSX_DEPLOYMENT_TARGET = 10.12;
954-
MARKETING_VERSION = 1.5.5;
958+
MARKETING_VERSION = 1.6.0;
955959
PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG-R";
956960
PRODUCT_NAME = "$(TARGET_NAME)";
957961
SWIFT_OBJC_BRIDGING_HEADER = "";
@@ -970,7 +974,7 @@
970974
CODE_SIGN_IDENTITY = "Mac Developer";
971975
COMBINE_HIDPI_IMAGES = YES;
972976
DEVELOPMENT_TEAM = 766AV76B44;
973-
ENABLE_HARDENED_RUNTIME = NO;
977+
ENABLE_HARDENED_RUNTIME = YES;
974978
HEADER_SEARCH_PATHS = "$(inherited)";
975979
INFOPLIST_FILE = "ShadowsocksX-NG/Info.plist";
976980
LD_RUNPATH_SEARCH_PATHS = (
@@ -984,7 +988,7 @@
984988
"$(PROJECT_DIR)",
985989
);
986990
MACOSX_DEPLOYMENT_TARGET = 10.12;
987-
MARKETING_VERSION = 1.5.5;
991+
MARKETING_VERSION = 1.6.0;
988992
ONLY_ACTIVE_ARCH = YES;
989993
PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG-R";
990994
PRODUCT_NAME = "$(TARGET_NAME)";

ShadowsocksX-NG/AppDelegate.swift

+45-52
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
5757
@IBOutlet var editSubscribeMenuItem: NSMenuItem!
5858

5959
// MARK: Variables
60-
var statusItemView: StatusItemView!
61-
var statusItem: NSStatusItem?
60+
var statusItemView: StatusItemView?
61+
var statusItem: NSStatusItem!
6262
var speedMonitor: NetWorkMonitor?
6363
var globalSubscribeFeed: Subscribe!
6464
var proxyConfHelper: ProxyConfHelper = ProxyConfHelper()
@@ -100,13 +100,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
100100
"AutoUpdateSubscribe": false,
101101
])
102102

103-
setUpMenu(defaults.bool(forKey: "enable_showSpeed"))
104-
105-
statusItem = NSStatusBar.system.statusItem(withLength: 20)
106-
let image = NSImage(named: NSImage.Name("menu_icon"))
107-
image?.isTemplate = true
108-
statusItem?.image = image
109-
statusItem?.menu = statusMenu
103+
setSpeedStatusItem(defaults.bool(forKey: "enable_showSpeed"))
110104

111105
let notifyCenter = NotificationCenter.default
112106
notifyCenter.addObserver(forName: NSNotification.Name(rawValue: NOTIFY_ADV_PROXY_CONF_CHANGED), object: nil, queue: nil
@@ -495,7 +489,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
495489
let defaults = UserDefaults.standard
496490
var enable = defaults.bool(forKey: "enable_showSpeed")
497491
enable = !enable
498-
setUpMenu(enable)
492+
setSpeedStatusItem(enable)
499493
defaults.set(enable, forKey: "enable_showSpeed")
500494
updateMainMenu()
501495
}
@@ -590,33 +584,27 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
590584
}
591585

592586
func updateStatusItemUI() {
593-
var image = NSImage()
594-
let defaults = UserDefaults.standard
595-
let mode = defaults.string(forKey: "ShadowsocksRunningMode")
596-
if !defaults.bool(forKey: "ShadowsocksOn") {
587+
if !UserDefaults.standard.bool(forKey: "ShadowsocksOn") {
597588
return
598589
}
599-
if mode == "auto" {
600-
image = NSImage(named: NSImage.Name("menu_icon_pac"))!
601-
//statusItem?.title = "Auto".localized
602-
} else if mode == "global" {
603-
//statusItem?.title = "Global".localized
604-
image = NSImage(named: NSImage.Name("menu_icon_global"))!
605-
} else if mode == "manual" {
606-
image = NSImage(named: NSImage.Name("menu_icon_manual"))!
607-
//statusItem?.title = "Manual".localized
608-
} else if mode == "whiteList" {
609-
if defaults.string(forKey: "ACLFileName")! == "chn.acl" {
610-
image = NSImage(named: NSImage.Name("menu_icon_white"))!
611-
} else {
612-
image = NSImage(named: NSImage.Name("menu_icon_acl"))!
613-
}
590+
591+
var image = NSImage()
592+
let iconImageName = IconUtils.getIconImageName();
593+
if(iconImageName != "") {
594+
image = NSImage(named: NSImage.Name(iconImageName))!
614595
}
615-
let titleWidth: CGFloat = 0//statusItem?.title!.size(withAttributes: [NSFontAttributeName: statusItem?.button!.font!]).width//这里不包含IP白名单模式等等,需要重新调整//PS还是给上游加上白名单模式?
616-
let imageWidth: CGFloat = 22
617-
statusItem?.length = titleWidth + imageWidth
618596
image.isTemplate = true
619597
statusItem!.image = image
598+
599+
if(statusItem!.view != nil) {
600+
statusItem!.length = 85
601+
statusItemView = StatusItemView(statusItem: statusItem!, menu: statusMenu)
602+
statusItem!.view = statusItemView
603+
604+
speedMonitor?.stop()
605+
speedMonitor = NetWorkMonitor(statusItemView: statusItemView!)
606+
speedMonitor?.start()
607+
}
620608
}
621609

622610
func updateMainMenu() {
@@ -723,28 +711,33 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
723711

724712
}
725713

726-
func setUpMenu(_ showSpeed: Bool) {
714+
func setSpeedStatusItem(_ showSpeed: Bool) {
727715
// should not operate the system status bar
728716
// we can add sub menu like bittorrent sync
729-
// if statusItem == nil{
730-
// statusItem = NSStatusBar.system().statusItem(withLength: 85)
731-
// let image = NSImage(named: "menu_icon")
732-
// image?.isTemplate = true
733-
// statusItem!.image = image
734-
// statusItemView = StatusItemView(statusItem: statusItem!, menu: statusMenu)
735-
// statusItem!.view = statusItemView
736-
// }
737-
// if showSpeed{
738-
// if speedMonitor == nil{
739-
// speedMonitor = NetWorkMonitor(statusItemView: statusItemView)
740-
// }
741-
// statusItem?.length = 85
742-
// speedMonitor?.start()
743-
// }else{
744-
// speedMonitor?.stop()
745-
// speedMonitor = nil
746-
// statusItem?.length = 20
747-
// }
717+
if(statusItem == nil) {
718+
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
719+
let image = NSImage(named: NSImage.Name("menu_icon"))
720+
image!.isTemplate = true
721+
statusItem!.image = image
722+
statusItem!.menu = statusMenu
723+
}
724+
725+
if showSpeed {
726+
statusItem!.length = 85
727+
statusItemView = StatusItemView(statusItem: statusItem!, menu: statusMenu)
728+
statusItem!.view = statusItemView
729+
730+
if speedMonitor == nil {
731+
speedMonitor = NetWorkMonitor(statusItemView: statusItemView!)
732+
}
733+
speedMonitor?.start()
734+
} else {
735+
statusItem!.length = 20
736+
statusItem!.view = nil
737+
738+
speedMonitor?.stop()
739+
speedMonitor = nil
740+
}
748741
}
749742

750743
func checkForUpdate(mustShowAlert: Bool) -> Void {
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,54 @@
11
{
22
"images" : [
33
{
4-
"idiom" : "universal",
54
"filename" : "menu_icon_acl.png",
5+
"idiom" : "universal",
66
"scale" : "1x"
77
},
88
{
9+
"appearances" : [
10+
{
11+
"appearance" : "luminosity",
12+
"value" : "dark"
13+
}
14+
],
15+
"filename" : "menu_icon_acl-1.png",
916
"idiom" : "universal",
17+
"scale" : "1x"
18+
},
19+
{
1020
"filename" : "[email protected]",
21+
"idiom" : "universal",
22+
"scale" : "2x"
23+
},
24+
{
25+
"appearances" : [
26+
{
27+
"appearance" : "luminosity",
28+
"value" : "dark"
29+
}
30+
],
31+
"filename" : "[email protected]",
32+
"idiom" : "universal",
1133
"scale" : "2x"
1234
},
1335
{
1436
"idiom" : "universal",
1537
"scale" : "3x"
38+
},
39+
{
40+
"appearances" : [
41+
{
42+
"appearance" : "luminosity",
43+
"value" : "dark"
44+
}
45+
],
46+
"idiom" : "universal",
47+
"scale" : "3x"
1648
}
1749
],
1850
"info" : {
19-
"version" : 1,
20-
"author" : "xcode"
51+
"author" : "xcode",
52+
"version" : 1
2153
}
22-
}
54+
}
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,54 @@
11
{
22
"images" : [
33
{
4-
"idiom" : "universal",
54
"filename" : "menu_icon_global.png",
5+
"idiom" : "universal",
66
"scale" : "1x"
77
},
88
{
9+
"appearances" : [
10+
{
11+
"appearance" : "luminosity",
12+
"value" : "dark"
13+
}
14+
],
15+
"filename" : "menu_icon_global-1.png",
916
"idiom" : "universal",
17+
"scale" : "1x"
18+
},
19+
{
1020
"filename" : "[email protected]",
21+
"idiom" : "universal",
22+
"scale" : "2x"
23+
},
24+
{
25+
"appearances" : [
26+
{
27+
"appearance" : "luminosity",
28+
"value" : "dark"
29+
}
30+
],
31+
"filename" : "[email protected]",
32+
"idiom" : "universal",
1133
"scale" : "2x"
1234
},
1335
{
1436
"idiom" : "universal",
1537
"scale" : "3x"
38+
},
39+
{
40+
"appearances" : [
41+
{
42+
"appearance" : "luminosity",
43+
"value" : "dark"
44+
}
45+
],
46+
"idiom" : "universal",
47+
"scale" : "3x"
1648
}
1749
],
1850
"info" : {
19-
"version" : 1,
20-
"author" : "xcode"
51+
"author" : "xcode",
52+
"version" : 1
2153
}
22-
}
54+
}
Loading
Loading

0 commit comments

Comments
 (0)