- Only use one instance of LogForm Signed-off-by: Syrone Wong <wong.syrone@gmail.com>tags/3.3.1
@@ -348,18 +348,30 @@ namespace Shadowsocks.Controller | |||
{ | |||
_config.autoCheckUpdate = enabled; | |||
Configuration.Save(_config); | |||
if (ConfigChanged != null) | |||
{ | |||
ConfigChanged(this, new EventArgs()); | |||
} | |||
} | |||
public void SaveLogViewerConfig(LogViewerConfig newConfig) | |||
{ | |||
_config.logViewer = newConfig; | |||
Configuration.Save(_config); | |||
if (ConfigChanged != null) | |||
{ | |||
ConfigChanged(this, new EventArgs()); | |||
} | |||
} | |||
public void SaveProxyConfig(ProxyConfig newConfig) | |||
{ | |||
_config.proxy = newConfig; | |||
Configuration.Save(_config); | |||
if (ConfigChanged != null) | |||
{ | |||
ConfigChanged(this, new EventArgs()); | |||
} | |||
} | |||
public void UpdateLatency(Server server, TimeSpan latency) | |||
@@ -56,6 +56,10 @@ namespace Shadowsocks.Model | |||
config.localPort = 1080; | |||
if (config.index == -1 && config.strategy == null) | |||
config.index = 0; | |||
if (config.logViewer == null) | |||
config.logViewer = new LogViewerConfig(); | |||
if (config.proxy == null) | |||
config.proxy = new ProxyConfig(); | |||
return config; | |||
} | |||
catch (Exception e) | |||
@@ -13,7 +13,9 @@ namespace Shadowsocks | |||
{ | |||
static class Program | |||
{ | |||
static ShadowsocksController controller; | |||
private static ShadowsocksController _controller; | |||
// XXX: Don't change this name | |||
private static MenuViewController _viewController; | |||
/// <summary> | |||
/// 应用程序的主入口点。 | |||
@@ -61,9 +63,9 @@ namespace Shadowsocks | |||
#else | |||
Logging.OpenLogFile(); | |||
#endif | |||
controller = new ShadowsocksController(); | |||
MenuViewController viewController = new MenuViewController(controller); | |||
controller.Start(); | |||
_controller = new ShadowsocksController(); | |||
_viewController = new MenuViewController(_controller); | |||
_controller.Start(); | |||
Application.Run(); | |||
} | |||
} | |||
@@ -88,10 +90,10 @@ namespace Shadowsocks | |||
{ | |||
case PowerModes.Resume: | |||
Logging.Info("os wake up"); | |||
controller?.Start(); | |||
_controller?.Start(); | |||
break; | |||
case PowerModes.Suspend: | |||
controller?.Stop(); | |||
_controller?.Stop(); | |||
Logging.Info("os suspend"); | |||
break; | |||
} | |||
@@ -99,10 +101,10 @@ namespace Shadowsocks | |||
private static void Application_ApplicationExit(object sender, EventArgs e) | |||
{ | |||
if (controller != null) | |||
if (_controller != null) | |||
{ | |||
controller.Stop(); | |||
controller = null; | |||
_controller.Stop(); | |||
_controller = null; | |||
} | |||
} | |||
} | |||
@@ -35,19 +35,13 @@ namespace Shadowsocks.View | |||
Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); | |||
LogViewerConfig config = controller.GetConfigurationCopy().logViewer; | |||
if (config == null) | |||
{ | |||
config = new LogViewerConfig(); | |||
} | |||
else | |||
{ | |||
topMostTrigger = config.topMost; | |||
wrapTextTrigger = config.wrapText; | |||
toolbarTrigger = config.toolbarShown; | |||
LogMessageTextBox.BackColor = config.GetBackgroundColor(); | |||
LogMessageTextBox.ForeColor = config.GetTextColor(); | |||
LogMessageTextBox.Font = config.GetFont(); | |||
} | |||
topMostTrigger = config.topMost; | |||
wrapTextTrigger = config.wrapText; | |||
toolbarTrigger = config.toolbarShown; | |||
LogMessageTextBox.BackColor = config.GetBackgroundColor(); | |||
LogMessageTextBox.ForeColor = config.GetTextColor(); | |||
LogMessageTextBox.Font = config.GetFont(); | |||
controller.TrafficChanged += controller_TrafficChanged; | |||
@@ -219,8 +213,7 @@ namespace Shadowsocks.View | |||
timer.Start(); | |||
LogViewerConfig config = controller.GetConfigurationCopy().logViewer; | |||
if (config == null) | |||
config = new LogViewerConfig(); | |||
Height = config.height; | |||
Width = config.width; | |||
Top = config.GetBestTop(); | |||
@@ -246,8 +239,7 @@ namespace Shadowsocks.View | |||
timer.Stop(); | |||
controller.TrafficChanged -= controller_TrafficChanged; | |||
LogViewerConfig config = controller.GetConfigurationCopy().logViewer; | |||
if (config == null) | |||
config = new LogViewerConfig(); | |||
config.topMost = topMostTrigger; | |||
config.wrapText = wrapTextTrigger; | |||
config.toolbarShown = toolbarTrigger; | |||
@@ -52,8 +52,7 @@ namespace Shadowsocks.View | |||
private MenuItem VerboseLoggingToggleItem; | |||
private ConfigForm configForm; | |||
private ProxyForm proxyForm; | |||
private List<LogForm> logForms = new List<LogForm>(); | |||
private bool logFormsVisible = false; | |||
private LogForm logForm; | |||
private string _urlToOpen; | |||
public MenuViewController(ShadowsocksController controller) | |||
@@ -133,6 +132,8 @@ namespace Shadowsocks.View | |||
MessageBox.Show(e.GetException().ToString(), String.Format(I18N.GetString("Shadowsocks Error: {0}"), e.GetException().Message)); | |||
} | |||
#region Tray Icon | |||
private void UpdateTrayIcon() | |||
{ | |||
int dpi; | |||
@@ -177,10 +178,10 @@ namespace Shadowsocks.View | |||
} | |||
// we want to show more details but notify icon title is limited to 63 characters | |||
string text = I18N.GetString("Shadowsocks") + " " + UpdateChecker.Version + "\n" + | |||
(enabled ? | |||
I18N.GetString("System Proxy On: ") + (global ? I18N.GetString("Global") : I18N.GetString("PAC")) : | |||
String.Format(I18N.GetString("Running: Port {0}"), config.localPort)) // this feedback is very important because they need to know Shadowsocks is running | |||
+ "\n" + serverInfo; | |||
(enabled ? | |||
I18N.GetString("System Proxy On: ") + (global ? I18N.GetString("Global") : I18N.GetString("PAC")) : | |||
String.Format(I18N.GetString("Running: Port {0}"), config.localPort)) // this feedback is very important because they need to know Shadowsocks is running | |||
+ "\n" + serverInfo; | |||
_notifyIcon.Text = text.Substring(0, Math.Min(63, text.Length)); | |||
} | |||
@@ -201,7 +202,7 @@ namespace Shadowsocks.View | |||
else if (global) | |||
{ | |||
Color flyBlue = Color.FromArgb(25, 125, 191); | |||
// Muliply with flyBlue | |||
// Multiply with flyBlue | |||
int red = color.R * flyBlue.R / 255; | |||
int green = color.G * flyBlue.G / 255; | |||
int blue = color.B * flyBlue.B / 255; | |||
@@ -230,6 +231,10 @@ namespace Shadowsocks.View | |||
return bitmap; | |||
} | |||
#endregion | |||
#region MenuItems and MenuGroups | |||
private MenuItem CreateMenuItem(string text, EventHandler click) | |||
{ | |||
return new MenuItem(I18N.GetString(text), click); | |||
@@ -282,6 +287,8 @@ namespace Shadowsocks.View | |||
}); | |||
} | |||
#endregion | |||
private void controller_ConfigChanged(object sender, EventArgs e) | |||
{ | |||
LoadCurrentConfiguration(); | |||
@@ -406,7 +413,7 @@ namespace Shadowsocks.View | |||
i++; | |||
} | |||
// user want a seperator item between strategy and servers menugroup | |||
// user wants a seperator item between strategy and servers menugroup | |||
items.Add( i++, new MenuItem("-") ); | |||
int strategyCount = i; | |||
@@ -459,31 +466,25 @@ namespace Shadowsocks.View | |||
} | |||
} | |||
private void ShowLogForms() | |||
private void ShowLogForm() | |||
{ | |||
if (logForms.Count == 0) | |||
if (logForm != null) | |||
{ | |||
LogForm f = new LogForm(controller, Logging.LogFilePath); | |||
f.Show(); | |||
f.Activate(); | |||
f.FormClosed += logForm_FormClosed; | |||
logForms.Add(f); | |||
logFormsVisible = true; | |||
logForm.Activate(); | |||
} | |||
else | |||
{ | |||
logFormsVisible = !logFormsVisible; | |||
foreach (LogForm f in logForms) | |||
{ | |||
f.Visible = logFormsVisible; | |||
} | |||
logForm = new LogForm(controller, Logging.LogFilePath); | |||
logForm.Show(); | |||
logForm.Activate(); | |||
logForm.FormClosed += logForm_FormClosed; | |||
} | |||
} | |||
void logForm_FormClosed(object sender, FormClosedEventArgs e) | |||
{ | |||
logForms.Remove((LogForm)sender); | |||
logForm = null; | |||
Utils.ReleaseMemory(true); | |||
} | |||
void configForm_FormClosed(object sender, FormClosedEventArgs e) | |||
@@ -519,11 +520,9 @@ namespace Shadowsocks.View | |||
private void CheckUpdateForFirstRun() | |||
{ | |||
Configuration config = controller.GetConfigurationCopy(); | |||
if (!config.isDefault) | |||
{ | |||
_isStartupChecking = true; | |||
updateChecker.CheckUpdate(config, 3000); | |||
} | |||
if (config.isDefault) return; | |||
_isStartupChecking = true; | |||
updateChecker.CheckUpdate(config, 3000); | |||
} | |||
private void ShowFirstTimeBalloon() | |||
@@ -547,7 +546,7 @@ namespace Shadowsocks.View | |||
} | |||
else if (e.Button == MouseButtons.Middle) | |||
{ | |||
ShowLogForms(); | |||
ShowLogForm(); | |||
} | |||
} | |||
@@ -607,15 +606,6 @@ namespace Shadowsocks.View | |||
controller.SelectStrategy((string)item.Tag); | |||
} | |||
private void ShowLogItem_Click(object sender, EventArgs e) | |||
{ | |||
LogForm f = new LogForm(controller, Logging.LogFilePath); | |||
f.Show(); | |||
f.FormClosed += logForm_FormClosed; | |||
logForms.Add(f); | |||
} | |||
private void VerboseLoggingToggleItem_Click( object sender, EventArgs e ) { | |||
VerboseLoggingToggleItem.Checked = ! VerboseLoggingToggleItem.Checked; | |||
controller.ToggleVerboseLogging( VerboseLoggingToggleItem.Checked ); | |||
@@ -820,5 +810,10 @@ namespace Shadowsocks.View | |||
{ | |||
ShowProxyForm(); | |||
} | |||
private void ShowLogItem_Click(object sender, EventArgs e) | |||
{ | |||
ShowLogForm(); | |||
} | |||
} | |||
} |
@@ -47,11 +47,6 @@ namespace Shadowsocks.View | |||
private void LoadCurrentConfiguration() | |||
{ | |||
_modifiedConfiguration = controller.GetConfigurationCopy().proxy; | |||
if (_modifiedConfiguration == null) | |||
{ | |||
_modifiedConfiguration = new ProxyConfig(); | |||
controller.SaveProxyConfig(_modifiedConfiguration); | |||
} | |||
UseProxyCheckBox.Checked = _modifiedConfiguration.useProxy; | |||
ProxyServerTextBox.Text = _modifiedConfiguration.proxyServer; | |||
ProxyPortTextBox.Text = _modifiedConfiguration.proxyPort.ToString(); | |||