diff --git a/InvisibleMan-XRay/Factories/WindowFactory.cs b/InvisibleMan-XRay/Factories/WindowFactory.cs index 2d06061..75fe187 100644 --- a/InvisibleMan-XRay/Factories/WindowFactory.cs +++ b/InvisibleMan-XRay/Factories/WindowFactory.cs @@ -38,6 +38,7 @@ public MainWindow CreateMainWindow() isNeedToShowPolicyWindow: IsNeedToShowPolicyWindow, shouldStartHidden: ShouldStartHidden, isNeedToAutoConnect: IsNeedToAutoConnect, + getMode: settingsHandler.UserSettings.GetMode, getConfig: configHandler.GetCurrentConfig, loadConfig: core.LoadConfig, enableMode: core.EnableMode, @@ -56,7 +57,8 @@ public MainWindow CreateMainWindow() onGitHubClick: linkHandler.OpenGitHubRepositoryLink, onBugReportingClick: linkHandler.OpenBugReportingLink, onCustomLinkClick: linkHandler.OpenCustomLink, - onChangeRunningStatus: notifyHandler.UpdateConnectionStatus + onChangeRunningStatus: notifyHandler.UpdateConnectionStatus, + setIndicator: notifyHandler.SetIndicator ); return mainWindow; diff --git a/InvisibleMan-XRay/Handlers/NotifyHandler.cs b/InvisibleMan-XRay/Handlers/NotifyHandler.cs index 9fa4acc..23539e0 100644 --- a/InvisibleMan-XRay/Handlers/NotifyHandler.cs +++ b/InvisibleMan-XRay/Handlers/NotifyHandler.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Drawing; +using System.Drawing.Drawing2D; using System.Windows.Forms; using System.Collections.Generic; @@ -14,6 +15,7 @@ namespace InvisibleManXRay.Handlers public class NotifyHandler : Handler, IDisposable { private NotifyIcon notifyIcon; + private Icon baseIcon; private Func getMode; private Action onOpenClick; @@ -71,6 +73,7 @@ public void InitializeNotifyIcon() notifyIcon = new NotifyIcon(); notifyIcon.Icon = GetNotifyIcon(); + baseIcon = notifyIcon.Icon; notifyIcon.Visible = true; HandleNotifyIconClick(); @@ -201,6 +204,45 @@ private void CheckItem(ToolStripMenuItem item) item.Checked = true; } + public void SetIndicator(Mode? mode) + { + if (notifyIcon == null || baseIcon == null) + return; + + if (mode == null) + { + notifyIcon.Icon = baseIcon; + return; + } + + Color color = mode == Mode.TUN ? Color.Red : Color.Blue; + notifyIcon.Icon = CreateIndicatorIcon(color); + } + private Icon CreateIndicatorIcon(Color color) + { + using (Bitmap bmp = baseIcon.ToBitmap()) + using (Graphics g = Graphics.FromImage(bmp)) + using (Brush brush = new SolidBrush(color)) + using (Pen outline = new Pen(Color.White, 1)) + { + int size = bmp.Width / 3 + 2; + int x = bmp.Width - size - 1; + int y = bmp.Height - size - 1; + + g.SmoothingMode = SmoothingMode.AntiAlias; + g.FillEllipse(brush, x, y, size, size); + g.DrawEllipse(outline, x, y, size, size); + + IntPtr hIcon = bmp.GetHicon(); + Icon icon = (Icon)Icon.FromHandle(hIcon).Clone(); + DestroyIcon(hIcon); + return icon; + + [System.Runtime.InteropServices.DllImport("user32.dll")] + static extern bool DestroyIcon(IntPtr handle); + } + } + public void Dispose() { notifyIcon?.Dispose(); diff --git a/InvisibleMan-XRay/Windows/MainWindow/MainWindow.xaml.cs b/InvisibleMan-XRay/Windows/MainWindow/MainWindow.xaml.cs index 05dba64..1c3667d 100644 --- a/InvisibleMan-XRay/Windows/MainWindow/MainWindow.xaml.cs +++ b/InvisibleMan-XRay/Windows/MainWindow/MainWindow.xaml.cs @@ -29,6 +29,7 @@ private enum ConnectionStatus { STOPPED, WAITING, RUNNING } private Func openUpdateWindow; private Func openAboutWindow; private Func openPolicyWindow; + private Func getMode; private Action onRunServer; private Action onCancelServer; private Action onStopServer; @@ -38,6 +39,7 @@ private enum ConnectionStatus { STOPPED, WAITING, RUNNING } private Action onBugReportingClick; private Action onCustomLinkClick; private Action onChangeRunningStatus; + private Action setIndicator; private BackgroundWorker runWorker; private BackgroundWorker updateWorker; @@ -219,6 +221,7 @@ public void Setup( Func isNeedToShowPolicyWindow, Func shouldStartHidden, Func isNeedToAutoConnect, + Func getMode, Func getConfig, Func loadConfig, Func enableMode, @@ -237,12 +240,14 @@ public void Setup( Action onGitHubClick, Action onBugReportingClick, Action onCustomLinkClick, - Action onChangeRunningStatus + Action onChangeRunningStatus, + Action setIndicator ) { this.isNeedToShowPolicyWindow = isNeedToShowPolicyWindow; this.shouldStartHidden = shouldStartHidden; this.isNeedToAutoConnect = isNeedToAutoConnect; + this.getMode = getMode; this.getConfig = getConfig; this.loadConfig = loadConfig; this.checkForUpdate = checkForUpdate; @@ -262,6 +267,7 @@ Action onChangeRunningStatus this.onBugReportingClick = onBugReportingClick; this.onCustomLinkClick = onCustomLinkClick; this.onChangeRunningStatus = onChangeRunningStatus; + this.setIndicator = setIndicator; UpdateUI(); } @@ -454,6 +460,8 @@ private void ShowRunStatus() statusStop.Visibility = Visibility.Hidden; statusWaitForRun.Visibility = Visibility.Hidden; + setIndicator?.Invoke(getMode?.Invoke()); + buttonStop.Visibility = Visibility.Visible; buttonCancel.Visibility = Visibility.Hidden; buttonRun.Visibility = Visibility.Hidden; @@ -467,6 +475,8 @@ private void ShowStopStatus() statusRun.Visibility = Visibility.Hidden; statusWaitForRun.Visibility = Visibility.Hidden; + setIndicator?.Invoke(null); + buttonRun.Visibility = Visibility.Visible; buttonCancel.Visibility = Visibility.Hidden; buttonStop.Visibility = Visibility.Hidden; @@ -480,6 +490,8 @@ private void ShowWaitForRunStatus() statusStop.Visibility = Visibility.Hidden; statusRun.Visibility = Visibility.Hidden; + setIndicator?.Invoke(null); + buttonCancel.Visibility = Visibility.Visible; buttonRun.Visibility = Visibility.Hidden; buttonStop.Visibility = Visibility.Hidden;