diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index f5bdb44c..464cc131 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -31,6 +31,7 @@ namespace Shadowsocks.Controller public event EventHandler ConfigChanged; public event EventHandler EnableStatusChanged; + public event EventHandler EnableGlobalChanged; public event EventHandler ShareOverLANStatusChanged; // when user clicked Edit PAC, and PAC file has already created @@ -93,6 +94,17 @@ namespace Shadowsocks.Controller } } + public void ToggleGlobal(bool global) + { + _config.global = global; + UpdateSystemProxy(); + SaveConfig(_config); + if (EnableGlobalChanged != null) + { + EnableGlobalChanged(this, new EventArgs()); + } + } + public void ToggleShareOverLAN(bool enabled) { _config.shareOverLan = enabled; @@ -175,7 +187,7 @@ namespace Shadowsocks.Controller { if (_config.enabled) { - SystemProxy.Enable(); + SystemProxy.Enable(_config.global); _systemProxyIsDirty = true; } else diff --git a/shadowsocks-csharp/Controller/SystemProxy.cs b/shadowsocks-csharp/Controller/SystemProxy.cs index b2e585da..c16aa235 100755 --- a/shadowsocks-csharp/Controller/SystemProxy.cs +++ b/shadowsocks-csharp/Controller/SystemProxy.cs @@ -24,16 +24,25 @@ namespace Shadowsocks.Controller _refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); } - public static void Enable() + public static void Enable(bool global) { try { RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); - registry.SetValue("ProxyEnable", 0); - registry.SetValue("ProxyServer", ""); - registry.SetValue("AutoConfigURL", "http://127.0.0.1:8093/pac?t=" + GetTimestamp(DateTime.Now)); + if (global) + { + registry.SetValue("ProxyEnable", 1); + registry.SetValue("ProxyServer", "127.0.0.1:8123"); + registry.SetValue("AutoConfigURL", ""); + } + else + { + registry.SetValue("ProxyEnable", 0); + registry.SetValue("ProxyServer", ""); + registry.SetValue("AutoConfigURL", "http://127.0.0.1:8093/pac?t=" + GetTimestamp(DateTime.Now)); + } SystemProxy.NotifyIE(); //Must Notify IE first, or the connections do not chanage CopyProxySettingFromLan(); diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index db02b840..66dbcb4c 100755 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -11,6 +11,7 @@ namespace Shadowsocks.Model { public List configs; public int index; + public bool global; public bool enabled; public bool shareOverLan; public bool isDefault; diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index c4eb8193..9965f8dc 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -37,6 +37,9 @@ namespace Shadowsocks.View private MenuItem menuItem3; private MenuItem quitItem; private MenuItem menuItem1; + private MenuItem modeItem; + private MenuItem globalModeItem; + private MenuItem PACModeItem; private ConfigForm configForm; public MenuViewController(ShadowsocksController controller) @@ -49,6 +52,7 @@ namespace Shadowsocks.View controller.ConfigChanged += controller_ConfigChanged; controller.PACFileReadyToOpen += controller_PACFileReadyToOpen; controller.ShareOverLANStatusChanged += controller_ShareOverLANStatusChanged; + controller.EnableGlobalChanged += controller_EnableGlobalChanged; this.updateChecker = new UpdateChecker(); updateChecker.NewVersionFound += updateChecker_NewVersionFound; @@ -98,6 +102,9 @@ namespace Shadowsocks.View { this.contextMenu1 = new System.Windows.Forms.ContextMenu(); this.enableItem = new System.Windows.Forms.MenuItem(); + this.modeItem = new System.Windows.Forms.MenuItem(); + this.PACModeItem = new System.Windows.Forms.MenuItem(); + this.globalModeItem = new System.Windows.Forms.MenuItem(); this.AutoStartupItem = new System.Windows.Forms.MenuItem(); this.ShareOverLANItem = new System.Windows.Forms.MenuItem(); this.ServersItem = new System.Windows.Forms.MenuItem(); @@ -117,6 +124,7 @@ namespace Shadowsocks.View // this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.enableItem, + this.modeItem, this.ServersItem, this.menuItem1, this.AutoStartupItem, @@ -134,22 +142,30 @@ namespace Shadowsocks.View this.enableItem.Index = 0; this.enableItem.Text = "&Enable"; this.enableItem.Click += new System.EventHandler(this.EnableItem_Click); - // - // AutoStartupItem - // - this.AutoStartupItem.Index = 3; - this.AutoStartupItem.Text = "Start on Boot"; - this.AutoStartupItem.Click += new System.EventHandler(this.AutoStartupItem_Click); - // - // ShareOverLANItem - // - this.ShareOverLANItem.Index = 4; - this.ShareOverLANItem.Text = "Share over LAN"; - this.ShareOverLANItem.Click += new System.EventHandler(this.ShareOverLANItem_Click); + // + // modeMenu + // + this.modeItem.Index = 1; + this.modeItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { + this.PACModeItem, + this.globalModeItem}); + this.modeItem.Text = "Mode"; + // + // PACModeItem + // + this.PACModeItem.Index = 0; + this.PACModeItem.Text = "PAC"; + this.PACModeItem.Click += new System.EventHandler(this.PACModeItem_Click); + // + // globalModeItem + // + this.globalModeItem.Index = 1; + this.globalModeItem.Text = "Global"; + this.globalModeItem.Click += new System.EventHandler(this.GlobalModeItem_Click); // // ServersItem // - this.ServersItem.Index = 1; + this.ServersItem.Index = 2; this.ServersItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.SeperatorItem, this.ConfigItem}); @@ -166,50 +182,62 @@ namespace Shadowsocks.View this.ConfigItem.Text = "Edit Servers..."; this.ConfigItem.Click += new System.EventHandler(this.Config_Click); // - // menuItem4 + // menuItem1 // - this.menuItem4.Index = 6; - this.menuItem4.Text = "-"; + this.menuItem1.Index = 3; + this.menuItem1.Text = "-"; + // + // AutoStartupItem + // + this.AutoStartupItem.Index = 4; + this.AutoStartupItem.Text = "Start on Boot"; + this.AutoStartupItem.Click += new System.EventHandler(this.AutoStartupItem_Click); + // + // ShareOverLANItem + // + this.ShareOverLANItem.Index = 5; + this.ShareOverLANItem.Text = "Share over LAN"; + this.ShareOverLANItem.Click += new System.EventHandler(this.ShareOverLANItem_Click); // // editPACFileItem // - this.editPACFileItem.Index = 5; + this.editPACFileItem.Index = 6; this.editPACFileItem.Text = "Edit &PAC File..."; this.editPACFileItem.Click += new System.EventHandler(this.EditPACFileItem_Click); // + // menuItem4 + // + this.menuItem4.Index = 7; + this.menuItem4.Text = "-"; + // // QRCodeItem // - this.QRCodeItem.Index = 7; + this.QRCodeItem.Index = 8; this.QRCodeItem.Text = "Show &QRCode..."; this.QRCodeItem.Click += new System.EventHandler(this.QRCodeItem_Click); // // ShowLogItem // - this.ShowLogItem.Index = 8; + this.ShowLogItem.Index = 9; this.ShowLogItem.Text = "Show Logs..."; this.ShowLogItem.Click += new System.EventHandler(this.ShowLogItem_Click); // // aboutItem // - this.aboutItem.Index = 9; + this.aboutItem.Index = 10; this.aboutItem.Text = "About..."; this.aboutItem.Click += new System.EventHandler(this.AboutItem_Click); // // menuItem3 // - this.menuItem3.Index = 10; + this.menuItem3.Index = 11; this.menuItem3.Text = "-"; // // quitItem // - this.quitItem.Index = 11; + this.quitItem.Index = 12; this.quitItem.Text = "&Quit"; this.quitItem.Click += new System.EventHandler(this.Quit_Click); - // - // menuItem1 - // - this.menuItem1.Index = 2; - this.menuItem1.Text = "-"; } private void controller_ConfigChanged(object sender, EventArgs e) @@ -227,6 +255,12 @@ namespace Shadowsocks.View ShareOverLANItem.Checked = controller.GetConfiguration().shareOverLan; } + void controller_EnableGlobalChanged(object sender, EventArgs e) + { + globalModeItem.Checked = controller.GetConfiguration().global; + PACModeItem.Checked = !globalModeItem.Checked; + } + void controller_PACFileReadyToOpen(object sender, ShadowsocksController.PathEventArgs e) { string argument = @"/select, " + e.Path; @@ -255,6 +289,8 @@ namespace Shadowsocks.View Configuration config = controller.GetConfiguration(); UpdateServersMenu(); enableItem.Checked = config.enabled; + globalModeItem.Checked = config.global; + PACModeItem.Checked = !config.global; ShareOverLANItem.Checked = config.shareOverLan; AutoStartupItem.Checked = AutoStartup.Check(); } @@ -338,11 +374,19 @@ namespace Shadowsocks.View ShowConfigForm(); } - private void EnableItem_Click(object sender, EventArgs e) { - enableItem.Checked = !enableItem.Checked; - controller.ToggleEnable(enableItem.Checked); + controller.ToggleEnable(!enableItem.Checked); + } + + private void GlobalModeItem_Click(object sender, EventArgs e) + { + controller.ToggleGlobal(true); + } + + private void PACModeItem_Click(object sender, EventArgs e) + { + controller.ToggleGlobal(false); } private void ShareOverLANItem_Click(object sender, EventArgs e)