diff --git a/shadowsocks-csharp.sln b/shadowsocks-csharp.sln index 83869ae2..120baca6 100755 --- a/shadowsocks-csharp.sln +++ b/shadowsocks-csharp.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2012 for Windows Desktop +# Visual Studio 2012 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "test\test.csproj", "{45913187-0685-4903-B250-DCEF0479CD86}" diff --git a/shadowsocks-csharp/Controller/Local.cs b/shadowsocks-csharp/Controller/Local.cs index 924cfbad..9faafdb9 100755 --- a/shadowsocks-csharp/Controller/Local.cs +++ b/shadowsocks-csharp/Controller/Local.cs @@ -10,9 +10,9 @@ namespace Shadowsocks.Controller { class Local - { + { private Server _server; - private bool _shareOverLAN; + private bool _shareOverLAN; //private Encryptor encryptor; Socket _listener; public Local(Configuration config) @@ -26,7 +26,7 @@ namespace Shadowsocks.Controller { try { - // Create a TCP/IP socket. + // Create a TCP/IP socket. _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); IPEndPoint localEndPoint = null; @@ -36,7 +36,7 @@ namespace Shadowsocks.Controller } else { - localEndPoint = new IPEndPoint(IPAddress.Loopback, _server.local_port); + localEndPoint = new IPEndPoint(IPAddress.Loopback, _server.local_port); } // Bind the socket to the local endpoint and listen for incoming connections. @@ -224,7 +224,7 @@ namespace Shadowsocks.Controller // reject socks 4 response = new byte[]{ 0, 91 }; } - connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(handshakeSendCallback), null); + connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(HandshakeSendCallback), null); } else { @@ -238,7 +238,7 @@ namespace Shadowsocks.Controller } } - private void handshakeSendCallback(IAsyncResult ar) + private void HandshakeSendCallback(IAsyncResult ar) { try { @@ -270,7 +270,7 @@ namespace Shadowsocks.Controller if (bytesRead > 0) { byte[] response = { 5, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; - connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(startPipe), null); + connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(StartPipe), null); } else { @@ -285,15 +285,15 @@ namespace Shadowsocks.Controller } - private void startPipe(IAsyncResult ar) + private void StartPipe(IAsyncResult ar) { try { connection.EndReceive(ar); remote.BeginReceive(remoteRecvBuffer, 0, RecvSize, 0, - new AsyncCallback(pipeRemoteReceiveCallback), null); + new AsyncCallback(PipeRemoteReceiveCallback), null); connection.BeginReceive(connetionRecvBuffer, 0, RecvSize, 0, - new AsyncCallback(pipeConnectionReceiveCallback), null); + new AsyncCallback(PipeConnectionReceiveCallback), null); } catch (Exception e) { @@ -302,7 +302,7 @@ namespace Shadowsocks.Controller } } - private void pipeRemoteReceiveCallback(IAsyncResult ar) + private void PipeRemoteReceiveCallback(IAsyncResult ar) { try @@ -313,7 +313,7 @@ namespace Shadowsocks.Controller { int bytesToSend; encryptor.Decrypt(remoteRecvBuffer, bytesRead, remoteSendBuffer, out bytesToSend); - connection.BeginSend(remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(pipeConnectionSendCallback), null); + connection.BeginSend(remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeConnectionSendCallback), null); } else { @@ -328,7 +328,7 @@ namespace Shadowsocks.Controller } } - private void pipeConnectionReceiveCallback(IAsyncResult ar) + private void PipeConnectionReceiveCallback(IAsyncResult ar) { try @@ -339,7 +339,7 @@ namespace Shadowsocks.Controller { int bytesToSend; encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend); - remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(pipeRemoteSendCallback), null); + remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); } else { @@ -353,13 +353,13 @@ namespace Shadowsocks.Controller } } - private void pipeRemoteSendCallback(IAsyncResult ar) + private void PipeRemoteSendCallback(IAsyncResult ar) { try { remote.EndSend(ar); connection.BeginReceive(this.connetionRecvBuffer, 0, RecvSize, 0, - new AsyncCallback(pipeConnectionReceiveCallback), null); + new AsyncCallback(PipeConnectionReceiveCallback), null); } catch (Exception e) { @@ -368,13 +368,13 @@ namespace Shadowsocks.Controller } } - private void pipeConnectionSendCallback(IAsyncResult ar) + private void PipeConnectionSendCallback(IAsyncResult ar) { try { connection.EndSend(ar); remote.BeginReceive(this.remoteRecvBuffer, 0, RecvSize, 0, - new AsyncCallback(pipeRemoteReceiveCallback), null); + new AsyncCallback(PipeRemoteReceiveCallback), null); } catch (Exception e) { diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index e6e80d05..c58801c0 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -1,4 +1,5 @@ -using Shadowsocks.Model; +using System.IO; +using Shadowsocks.Model; using System; using System.Collections.Generic; using System.Text; @@ -34,6 +35,7 @@ namespace Shadowsocks.Controller public ShadowsocksController() { _config = Configuration.Load(); + polipoRunner = new PolipoRunner(); polipoRunner.Start(_config); local = new Local(_config); @@ -63,9 +65,10 @@ namespace Shadowsocks.Controller return Configuration.Load(); } - public void SaveServers(List servers) + public void SaveServers(List servers, bool noChange) { _config.configs = servers; + _config.noChange = noChange; SaveConfig(_config); } @@ -83,6 +86,7 @@ namespace Shadowsocks.Controller public void ToggleShareOverLAN(bool enabled) { _config.shareOverLan = enabled; + _config.noChange = false; SaveConfig(_config); if (ShareOverLANStatusChanged != null) { @@ -129,9 +133,13 @@ namespace Shadowsocks.Controller } - protected void SaveConfig(Configuration newConfig) + public void SaveConfig(Configuration newConfig) { Configuration.Save(newConfig); + if (newConfig.noChange) + { + return; + } // some logic in configuration updated the config when saving, we need to read it again _config = Configuration.Load(); @@ -172,6 +180,5 @@ namespace Shadowsocks.Controller { UpdateSystemProxy(); } - } } diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index 65b0a3b6..60aabbdc 100755 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -17,6 +17,7 @@ namespace Shadowsocks.Model public bool enabled; public bool shareOverLan; public bool isDefault; + public bool noChange; private static string CONFIG_FILE = "gui-config.json"; diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index a42a97ae..c90f089b 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -54,7 +54,6 @@ namespace Shadowsocks // TODO run without a main form to save RAM Application.Run(new ConfigForm(controller)); - } } } diff --git a/shadowsocks-csharp/View/AboutForm.Designer.cs b/shadowsocks-csharp/View/AboutForm.Designer.cs new file mode 100644 index 00000000..11568121 --- /dev/null +++ b/shadowsocks-csharp/View/AboutForm.Designer.cs @@ -0,0 +1,105 @@ +namespace Shadowsocks.View +{ + partial class AboutForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.titleLabel = new System.Windows.Forms.Label(); + this.versionLabel = new System.Windows.Forms.Label(); + this.authorLabel = new System.Windows.Forms.Label(); + this.githubLabel = new System.Windows.Forms.LinkLabel(); + this.SuspendLayout(); + // + // titleLabel + // + this.titleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.titleLabel.Location = new System.Drawing.Point(12, 40); + this.titleLabel.Name = "titleLabel"; + this.titleLabel.Size = new System.Drawing.Size(260, 23); + this.titleLabel.TabIndex = 0; + this.titleLabel.Text = "Shadowsocks for Windows"; + this.titleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // versionLabel + // + this.versionLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.versionLabel.Location = new System.Drawing.Point(12, 84); + this.versionLabel.Name = "versionLabel"; + this.versionLabel.Size = new System.Drawing.Size(260, 23); + this.versionLabel.TabIndex = 0; + this.versionLabel.Text = "Version: 2.0.4.0"; + this.versionLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // authorLabel + // + this.authorLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.authorLabel.Location = new System.Drawing.Point(12, 139); + this.authorLabel.Name = "authorLabel"; + this.authorLabel.Size = new System.Drawing.Size(260, 23); + this.authorLabel.TabIndex = 0; + this.authorLabel.Text = "By: clowwindy"; + this.authorLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // githubLabel + // + this.githubLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.githubLabel.Location = new System.Drawing.Point(13, 201); + this.githubLabel.Name = "githubLabel"; + this.githubLabel.Size = new System.Drawing.Size(259, 23); + this.githubLabel.TabIndex = 1; + this.githubLabel.TabStop = true; + this.githubLabel.Text = "GitHub"; + this.githubLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.githubLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.githubLabel_LinkClicked); + // + // AboutForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 261); + this.Controls.Add(this.githubLabel); + this.Controls.Add(this.authorLabel); + this.Controls.Add(this.versionLabel); + this.Controls.Add(this.titleLabel); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "About"; + this.Load += new System.EventHandler(this.AboutForm_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label titleLabel; + private System.Windows.Forms.Label versionLabel; + private System.Windows.Forms.Label authorLabel; + private System.Windows.Forms.LinkLabel githubLabel; + } +} \ No newline at end of file diff --git a/shadowsocks-csharp/View/AboutForm.cs b/shadowsocks-csharp/View/AboutForm.cs new file mode 100644 index 00000000..e2a91e5d --- /dev/null +++ b/shadowsocks-csharp/View/AboutForm.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Reflection; +using System.Text; +using System.Windows.Forms; + +namespace Shadowsocks.View +{ + public partial class AboutForm : Form + { + public AboutForm() + { + InitializeComponent(); + } + + private void githubLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + string url = "https://github.com/clowwindy/shadowsocks-csharp"; + System.Diagnostics.Process.Start(url); + } + + private void AboutForm_Load(object sender, EventArgs e) + { + Assembly assembly = Assembly.GetExecutingAssembly(); + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); + string version = fvi.FileVersion; + versionLabel.Text = "Version: " + version; + } + } +} diff --git a/shadowsocks-csharp/View/AboutForm.resx b/shadowsocks-csharp/View/AboutForm.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/shadowsocks-csharp/View/AboutForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index 8bd980b8..e5b4126f 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -14,11 +14,13 @@ namespace Shadowsocks.View { private ShadowsocksController controller; private UpdateChecker updateChecker; + private AboutForm aboutForm; // this is a copy of configuration that we are working on - private Configuration modifiedConfiguration; - private int oldSelectedIndex = -1; - private bool isFirstRun; + private Configuration _modifiedConfiguration; + private Configuration _oldConfiguration; + private int _oldSelectedIndex = -1; + private bool _isFirstRun; public ConfigForm(ShadowsocksController controller) { @@ -66,7 +68,7 @@ namespace Shadowsocks.View notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; notifyIcon1.BalloonTipClicked += notifyIcon1_BalloonTipClicked; notifyIcon1.ShowBalloonTip(5000); - isFirstRun = false; + _isFirstRun = false; } void notifyIcon1_BalloonTipClicked(object sender, EventArgs e) @@ -82,11 +84,11 @@ namespace Shadowsocks.View IPTextBox.Focus(); } - private bool SaveOldSelectedServer() + private bool SaveOldSelectedServer(object sender) { try { - if (oldSelectedIndex == -1 || oldSelectedIndex >= modifiedConfiguration.configs.Count) + if (_oldSelectedIndex == -1 || _oldSelectedIndex >= _modifiedConfiguration.configs.Count) { return true; } @@ -100,7 +102,27 @@ namespace Shadowsocks.View remarks = RemarksTextBox.Text }; Configuration.CheckServer(server); - modifiedConfiguration.configs[oldSelectedIndex] = server; + + _modifiedConfiguration.configs[_oldSelectedIndex] = server; + if (sender.Equals(OKButton)) + { + if (_oldConfiguration.configs[_oldConfiguration.index].server == + _modifiedConfiguration.configs[_oldSelectedIndex].server && + _oldConfiguration.configs[_oldConfiguration.index].server_port == + _modifiedConfiguration.configs[_oldSelectedIndex].server_port && + _oldConfiguration.configs[_oldConfiguration.index].password == + _modifiedConfiguration.configs[_oldSelectedIndex].password && + _oldConfiguration.configs[_oldConfiguration.index].local_port == + _modifiedConfiguration.configs[_oldSelectedIndex].local_port) + { + _modifiedConfiguration.noChange = true; + } + else + { + _modifiedConfiguration.noChange = false; + _oldConfiguration = _modifiedConfiguration; + } + } return true; } catch (FormatException) @@ -116,15 +138,15 @@ namespace Shadowsocks.View private void LoadSelectedServer() { - if (ServersListBox.SelectedIndex >= 0 && ServersListBox.SelectedIndex < modifiedConfiguration.configs.Count) + if (ServersListBox.SelectedIndex >= 0 && ServersListBox.SelectedIndex < _modifiedConfiguration.configs.Count) { - Server server = modifiedConfiguration.configs[ServersListBox.SelectedIndex]; + Server server = _modifiedConfiguration.configs[ServersListBox.SelectedIndex]; IPTextBox.Text = server.server; ServerPortTextBox.Text = server.server_port.ToString(); PasswordTextBox.Text = server.password; ProxyPortTextBox.Text = server.local_port.ToString(); - EncryptionSelect.Text = server.method == null ? "aes-256-cfb" : server.method; + EncryptionSelect.Text = server.method ?? "aes-256-cfb"; RemarksTextBox.Text = server.remarks; ServerGroupBox.Visible = true; //IPTextBox.Focus(); @@ -138,7 +160,7 @@ namespace Shadowsocks.View private void LoadConfiguration(Configuration configuration) { ServersListBox.Items.Clear(); - foreach (Server server in modifiedConfiguration.configs) + foreach (Server server in _modifiedConfiguration.configs) { ServersListBox.Items.Add(string.IsNullOrEmpty(server.server) ? "New server" : string.IsNullOrEmpty(server.remarks)? server.server + ":" + server.server_port : server.server + ":" + server.server_port + " (" + server.remarks + ")"); } @@ -146,15 +168,16 @@ namespace Shadowsocks.View private void LoadCurrentConfiguration() { - modifiedConfiguration = controller.GetConfiguration(); - LoadConfiguration(modifiedConfiguration); - oldSelectedIndex = modifiedConfiguration.index; - ServersListBox.SelectedIndex = modifiedConfiguration.index; + _modifiedConfiguration = controller.GetConfiguration(); + _oldConfiguration = _modifiedConfiguration; + LoadConfiguration(_modifiedConfiguration); + _oldSelectedIndex = _modifiedConfiguration.index; + ServersListBox.SelectedIndex = _modifiedConfiguration.index; LoadSelectedServer(); UpdateServersMenu(); - enableItem.Checked = modifiedConfiguration.enabled; - ShareOverLANItem.Checked = modifiedConfiguration.shareOverLan; + enableItem.Checked = _modifiedConfiguration.enabled; + ShareOverLANItem.Checked = _modifiedConfiguration.shareOverLan; } private void UpdateServersMenu() @@ -193,56 +216,56 @@ namespace Shadowsocks.View } else { - isFirstRun = true; + _isFirstRun = true; } updateChecker.CheckUpdate(); } private void ServersListBox_SelectedIndexChanged(object sender, EventArgs e) { - if (oldSelectedIndex == ServersListBox.SelectedIndex) + if (_oldSelectedIndex == ServersListBox.SelectedIndex) { // we are moving back to oldSelectedIndex or doing a force move return; } - if (!SaveOldSelectedServer()) + if (!SaveOldSelectedServer(sender)) { // why this won't cause stack overflow? - ServersListBox.SelectedIndex = oldSelectedIndex; + ServersListBox.SelectedIndex = _oldSelectedIndex; return; } LoadSelectedServer(); - oldSelectedIndex = ServersListBox.SelectedIndex; + _oldSelectedIndex = ServersListBox.SelectedIndex; } private void AddButton_Click(object sender, EventArgs e) { - if (!SaveOldSelectedServer()) + if (!SaveOldSelectedServer(sender)) { return; } Server server = Configuration.GetDefaultServer(); - modifiedConfiguration.configs.Add(server); - LoadConfiguration(modifiedConfiguration); - ServersListBox.SelectedIndex = modifiedConfiguration.configs.Count - 1; - oldSelectedIndex = ServersListBox.SelectedIndex; + _modifiedConfiguration.configs.Add(server); + LoadConfiguration(_modifiedConfiguration); + ServersListBox.SelectedIndex = _modifiedConfiguration.configs.Count - 1; + _oldSelectedIndex = ServersListBox.SelectedIndex; } private void DeleteButton_Click(object sender, EventArgs e) { - oldSelectedIndex = ServersListBox.SelectedIndex; - if (oldSelectedIndex >= 0 && oldSelectedIndex < modifiedConfiguration.configs.Count) + _oldSelectedIndex = ServersListBox.SelectedIndex; + if (_oldSelectedIndex >= 0 && _oldSelectedIndex < _modifiedConfiguration.configs.Count) { - modifiedConfiguration.configs.RemoveAt(oldSelectedIndex); + _modifiedConfiguration.configs.RemoveAt(_oldSelectedIndex); } - if (oldSelectedIndex >= modifiedConfiguration.configs.Count) + if (_oldSelectedIndex >= _modifiedConfiguration.configs.Count) { // can be -1 - oldSelectedIndex = modifiedConfiguration.configs.Count - 1; + _oldSelectedIndex = _modifiedConfiguration.configs.Count - 1; } - ServersListBox.SelectedIndex = oldSelectedIndex; - LoadConfiguration(modifiedConfiguration); - ServersListBox.SelectedIndex = oldSelectedIndex; + ServersListBox.SelectedIndex = _oldSelectedIndex; + LoadConfiguration(_modifiedConfiguration); + ServersListBox.SelectedIndex = _oldSelectedIndex; LoadSelectedServer(); } @@ -258,28 +281,28 @@ namespace Shadowsocks.View private void ShowFirstTimeBalloon() { - if (isFirstRun) + if (_isFirstRun) { notifyIcon1.BalloonTipTitle = "Shadowsocks is here"; notifyIcon1.BalloonTipText = "You can turn on/off Shadowsocks in the context menu"; notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; notifyIcon1.ShowBalloonTip(0); - isFirstRun = false; + _isFirstRun = false; } } private void OKButton_Click(object sender, EventArgs e) { - if (!SaveOldSelectedServer()) + if (!SaveOldSelectedServer(sender)) { return; } - if (modifiedConfiguration.configs.Count == 0) + if (_modifiedConfiguration.configs.Count == 0) { MessageBox.Show("Please add at least one server"); return; } - controller.SaveServers(modifiedConfiguration.configs); + controller.SaveServers(_modifiedConfiguration.configs, _modifiedConfiguration.noChange); this.Hide(); ShowFirstTimeBalloon(); } @@ -298,7 +321,9 @@ namespace Shadowsocks.View private void AboutItem_Click(object sender, EventArgs e) { - Process.Start("https://github.com/clowwindy/shadowsocks-csharp"); + aboutForm = new AboutForm(); + aboutForm.Show(); + //Process.Start("https://github.com/clowwindy/shadowsocks-csharp"); } private void notifyIcon1_DoubleClick(object sender, EventArgs e) @@ -348,5 +373,13 @@ namespace Shadowsocks.View qrCodeForm.Icon = this.Icon; qrCodeForm.Show(); } + + private void enableLogBox_CheckedChanged(object sender, EventArgs e) + { + if (this.Visible) + { + MessageBox.Show("This option only works on next startup."); + } + } } } diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index d19fbc98..90316b83 100755 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -59,11 +59,11 @@ false - + - - - + + + @@ -80,6 +80,12 @@ + + Form + + + AboutForm.cs + Form @@ -98,6 +104,9 @@ QRCodeForm.cs + + AboutForm.cs + ConfigForm.cs Designer