You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Lidarr/src/NzbDrone/SysTray/SysTrayApp.cs

117 lines
3.0 KiB

using System;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Extensions.Hosting;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Core.Lifecycle;
using NzbDrone.Host;
namespace NzbDrone.SysTray
{
public class SystemTrayApp : Form, IHostedService
{
private readonly IBrowserService _browserService;
private readonly ILifecycleService _lifecycle;
private readonly NotifyIcon _trayIcon = new NotifyIcon();
private readonly ContextMenuStrip _trayMenu = new ContextMenuStrip();
public SystemTrayApp(IBrowserService browserService, ILifecycleService lifecycle)
{
_browserService = browserService;
_lifecycle = lifecycle;
}
public void Start()
{
_trayMenu.Items.Add(new ToolStripMenuItem("Launch Browser", null, LaunchBrowser));
_trayMenu.Items.Add(new ToolStripSeparator());
_trayMenu.Items.Add(new ToolStripMenuItem("Exit", null, OnExit));
_trayIcon.Text = string.Format("Lidarr - {0}", BuildInfo.Version);
_trayIcon.Icon = Properties.Resources.NzbDroneIcon;
_trayIcon.ContextMenuStrip = _trayMenu;
_trayIcon.Visible = true;
_trayIcon.DoubleClick += LaunchBrowser;
Application.Run(this);
}
public Task StartAsync(CancellationToken cancellationToken)
{
var thread = new Thread(Start);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
protected override void OnClosing(CancelEventArgs e)
{
DisposeTrayIcon();
}
protected override void OnLoad(EventArgs e)
{
Visible = false;
ShowInTaskbar = false;
base.OnLoad(e);
}
protected override void Dispose(bool isDisposing)
{
if (isDisposing)
{
_trayIcon.Dispose();
}
if (InvokeRequired)
{
Invoke(new MethodInvoker(() => Dispose(isDisposing)));
}
else
{
base.Dispose(isDisposing);
}
}
private void OnExit(object sender, EventArgs e)
{
_lifecycle.Shutdown();
}
private void LaunchBrowser(object sender, EventArgs e)
{
try
{
_browserService.LaunchWebUI();
}
catch (Exception)
{
}
}
private void DisposeTrayIcon()
{
if (_trayIcon == null)
{
return;
}
_trayIcon.Visible = false;
_trayIcon.Icon = null;
_trayIcon.Visible = false;
_trayIcon.Dispose();
}
}
}