implemented mono tray icon
This commit is contained in:
parent
ce3e881c10
commit
51a6ee5650
|
@ -1,18 +1,15 @@
|
||||||
<Properties>
|
<Properties>
|
||||||
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|x86" />
|
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|x86" />
|
||||||
<MonoDevelop.Ide.Workbench ActiveDocument="d:\Development\MediaBrowser\MediaBrowser.ServerApplication\ApplicationHost.cs">
|
<MonoDevelop.Ide.Workbench ActiveDocument="MediaBrowser.Server.Mono\Program.cs">
|
||||||
<Files>
|
<Files>
|
||||||
<File FileName="d:\Development\MediaBrowser\MediaBrowser.ServerApplication\ApplicationHost.cs" Line="506" Column="29" />
|
<File FileName="MediaBrowser.Server.Mono\Program.cs" Line="3" Column="40" />
|
||||||
<File FileName="MediaBrowser.Server.Mono\Program.cs" Line="192" Column="1" />
|
<File FileName="MediaBrowser.Server.Mono\Native\NativeApp.cs" Line="1" Column="1" />
|
||||||
<File FileName="MediaBrowser.Server.Mono\Native\NativeApp.cs" Line="24" Column="1" />
|
<File FileName="d:\Development\MediaBrowser\MediaBrowser.Common.Implementations\Logging\NLogger.cs" Line="1" Column="1" />
|
||||||
<File FileName="d:\Development\MediaBrowser\MediaBrowser.Common.Implementations\Logging\NLogger.cs" Line="72" Column="1" />
|
<File FileName="d:\Development\MediaBrowser\MediaBrowser.Common.Implementations\BaseApplicationHost.cs" Line="1" Column="1" />
|
||||||
<File FileName="d:\Development\MediaBrowser\MediaBrowser.Common.Implementations\BaseApplicationHost.cs" Line="530" Column="1" />
|
|
||||||
</Files>
|
</Files>
|
||||||
</MonoDevelop.Ide.Workbench>
|
</MonoDevelop.Ide.Workbench>
|
||||||
<MonoDevelop.Ide.DebuggingService.Breakpoints>
|
<MonoDevelop.Ide.DebuggingService.Breakpoints>
|
||||||
<BreakpointStore>
|
<BreakpointStore>
|
||||||
<Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Server.Mono\Program.cs" line="177" column="1" />
|
|
||||||
<Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Server.Mono\Program.cs" line="189" column="1" />
|
|
||||||
<Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Server.Mono\Native\NativeApp.cs" line="23" column="1" />
|
<Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Server.Mono\Native\NativeApp.cs" line="23" column="1" />
|
||||||
<Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Server.Mono\Native\NativeApp.cs" line="15" column="1" />
|
<Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Server.Mono\Native\NativeApp.cs" line="15" column="1" />
|
||||||
</BreakpointStore>
|
</BreakpointStore>
|
||||||
|
|
|
@ -127,5 +127,8 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="app.config" />
|
<None Include="app.config" />
|
||||||
|
<None Include="tray.png">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -4,6 +4,7 @@ using MediaBrowser.Common.Implementations.Updates;
|
||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
using MediaBrowser.Server.Implementations;
|
using MediaBrowser.Server.Implementations;
|
||||||
using MediaBrowser.ServerApplication;
|
using MediaBrowser.ServerApplication;
|
||||||
|
using MediaBrowser.ServerApplication.Native;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
@ -11,6 +12,7 @@ using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using Gtk;
|
using Gtk;
|
||||||
|
using Gdk;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Mono
|
namespace MediaBrowser.Server.Mono
|
||||||
|
@ -25,6 +27,9 @@ namespace MediaBrowser.Server.Mono
|
||||||
|
|
||||||
private static MainWindow _mainWindow;
|
private static MainWindow _mainWindow;
|
||||||
|
|
||||||
|
// The tray Icon
|
||||||
|
private static StatusIcon trayIcon;
|
||||||
|
|
||||||
public static void Main (string[] args)
|
public static void Main (string[] args)
|
||||||
{
|
{
|
||||||
Application.Init ();
|
Application.Init ();
|
||||||
|
@ -46,9 +51,10 @@ namespace MediaBrowser.Server.Mono
|
||||||
|
|
||||||
//_singleInstanceMutex = new Mutex(true, @"Local\" + runningPath, out createdNew);
|
//_singleInstanceMutex = new Mutex(true, @"Local\" + runningPath, out createdNew);
|
||||||
createdNew = true;
|
createdNew = true;
|
||||||
|
|
||||||
if (!createdNew)
|
if (!createdNew)
|
||||||
{
|
{
|
||||||
//_singleInstanceMutex = null;
|
_singleInstanceMutex = null;
|
||||||
logger.Info("Shutting down because another instance of Media Browser Server is already running.");
|
logger.Info("Shutting down because another instance of Media Browser Server is already running.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -67,7 +73,7 @@ namespace MediaBrowser.Server.Mono
|
||||||
{
|
{
|
||||||
logger.Info("Shutting down");
|
logger.Info("Shutting down");
|
||||||
|
|
||||||
//ReleaseMutex(logger);
|
ReleaseMutex(logger);
|
||||||
|
|
||||||
_appHost.Dispose();
|
_appHost.Dispose();
|
||||||
}
|
}
|
||||||
|
@ -95,11 +101,70 @@ namespace MediaBrowser.Server.Mono
|
||||||
// TODO: Hide splash here
|
// TODO: Hide splash here
|
||||||
_mainWindow = new MainWindow ();
|
_mainWindow = new MainWindow ();
|
||||||
|
|
||||||
_mainWindow.Show ();
|
// Creation of the Icon
|
||||||
|
// Creation of the Icon
|
||||||
|
trayIcon = new StatusIcon(new Pixbuf ("tray.png"));
|
||||||
|
trayIcon.Visible = true;
|
||||||
|
|
||||||
|
// When the TrayIcon has been clicked.
|
||||||
|
trayIcon.Activate += delegate { };
|
||||||
|
// Show a pop up menu when the icon has been right clicked.
|
||||||
|
trayIcon.PopupMenu += OnTrayIconPopup;
|
||||||
|
|
||||||
|
// A Tooltip for the Icon
|
||||||
|
trayIcon.Tooltip = "Media Browser Server";
|
||||||
|
|
||||||
|
_mainWindow.ShowAll ();
|
||||||
|
_mainWindow.Visible = false;
|
||||||
|
|
||||||
Application.Run ();
|
Application.Run ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create the popup menu, on right click.
|
||||||
|
static void OnTrayIconPopup (object o, EventArgs args) {
|
||||||
|
|
||||||
|
Menu popupMenu = new Menu();
|
||||||
|
|
||||||
|
var menuItemBrowse = new ImageMenuItem ("Browse Library");
|
||||||
|
menuItemBrowse.Image = new Gtk.Image(Stock.MediaPlay, IconSize.Menu);
|
||||||
|
popupMenu.Add(menuItemBrowse);
|
||||||
|
menuItemBrowse.Activated += delegate {
|
||||||
|
BrowserLauncher.OpenWebClient(_appHost.UserManager, _appHost.ServerConfigurationManager, _appHost, _logger);
|
||||||
|
};
|
||||||
|
|
||||||
|
var menuItemConfigure = new ImageMenuItem ("Configure Media Browser");
|
||||||
|
menuItemConfigure.Image = new Gtk.Image(Stock.Edit, IconSize.Menu);
|
||||||
|
popupMenu.Add(menuItemConfigure);
|
||||||
|
menuItemConfigure.Activated += delegate {
|
||||||
|
BrowserLauncher.OpenDashboard(_appHost.UserManager, _appHost.ServerConfigurationManager, _appHost, _logger);
|
||||||
|
};
|
||||||
|
|
||||||
|
var menuItemApi = new ImageMenuItem ("View Api Docs");
|
||||||
|
menuItemApi.Image = new Gtk.Image(Stock.Network, IconSize.Menu);
|
||||||
|
popupMenu.Add(menuItemApi);
|
||||||
|
menuItemApi.Activated += delegate {
|
||||||
|
BrowserLauncher.OpenSwagger(_appHost.ServerConfigurationManager, _appHost, _logger);
|
||||||
|
};
|
||||||
|
|
||||||
|
var menuItemCommunity = new ImageMenuItem ("Visit Community");
|
||||||
|
menuItemCommunity.Image = new Gtk.Image(Stock.Help, IconSize.Menu);
|
||||||
|
popupMenu.Add(menuItemCommunity);
|
||||||
|
menuItemCommunity.Activated += delegate { BrowserLauncher.OpenCommunity(_logger); };
|
||||||
|
|
||||||
|
var menuItemGithub = new ImageMenuItem ("Visit Github");
|
||||||
|
menuItemGithub.Image = new Gtk.Image(Stock.Network, IconSize.Menu);
|
||||||
|
popupMenu.Add(menuItemGithub);
|
||||||
|
menuItemGithub.Activated += delegate { BrowserLauncher.OpenGithub(_logger); };
|
||||||
|
|
||||||
|
var menuItemQuit = new ImageMenuItem ("Exit");
|
||||||
|
menuItemQuit.Image = new Gtk.Image(Stock.Quit, IconSize.Menu);
|
||||||
|
popupMenu.Add(menuItemQuit);
|
||||||
|
menuItemQuit.Activated += delegate { Shutdown(); };
|
||||||
|
|
||||||
|
popupMenu.ShowAll();
|
||||||
|
popupMenu.Popup();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles the SessionEnding event of the SystemEvents control.
|
/// Handles the SessionEnding event of the SystemEvents control.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -174,20 +239,40 @@ namespace MediaBrowser.Server.Mono
|
||||||
|
|
||||||
public static void Shutdown()
|
public static void Shutdown()
|
||||||
{
|
{
|
||||||
_mainWindow.Hide ();
|
if (trayIcon != null) {
|
||||||
_mainWindow.Dispose ();
|
trayIcon.Visible = false;
|
||||||
|
trayIcon.Dispose ();
|
||||||
|
trayIcon = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_mainWindow != null) {
|
||||||
|
_mainWindow.HideAll ();
|
||||||
|
_mainWindow.Dispose ();
|
||||||
|
_mainWindow = null;
|
||||||
|
}
|
||||||
|
|
||||||
Application.Quit ();
|
Application.Quit ();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Restart()
|
public static void Restart()
|
||||||
{
|
{
|
||||||
// Second instance will start first, so release the mutex and dispose the http server ahead of time
|
// Second instance will start first, so release the mutex and dispose the http server ahead of time
|
||||||
//ReleaseMutex (_logger);
|
ReleaseMutex (_logger);
|
||||||
|
|
||||||
_appHost.Dispose();
|
_appHost.Dispose();
|
||||||
|
|
||||||
_mainWindow.Hide ();
|
if (trayIcon != null) {
|
||||||
_mainWindow.Dispose ();
|
trayIcon.Visible = false;
|
||||||
|
trayIcon.Dispose ();
|
||||||
|
trayIcon = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_mainWindow != null) {
|
||||||
|
_mainWindow.HideAll ();
|
||||||
|
_mainWindow.Dispose ();
|
||||||
|
_mainWindow = null;
|
||||||
|
}
|
||||||
|
|
||||||
Application.Quit ();
|
Application.Quit ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
BIN
MediaBrowser.Server.Mono/tray.png
Normal file
BIN
MediaBrowser.Server.Mono/tray.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 55 KiB |
|
@ -189,19 +189,17 @@ namespace MediaBrowser.ServerApplication
|
||||||
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
|
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
|
||||||
void cmdApiDocs_Click(object sender, EventArgs e)
|
void cmdApiDocs_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
BrowserLauncher.OpenUrl("http://localhost:" + _configurationManager.Configuration.HttpServerPortNumber + "/" +
|
BrowserLauncher.OpenStandardApiDocumentation(_configurationManager, _appHost, _logger);
|
||||||
_appHost.WebApplicationName + "/metadata", _logger);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmdSwaggerApiDocs_Click(object sender, EventArgs e)
|
void cmdSwaggerApiDocs_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
BrowserLauncher.OpenUrl("http://localhost:" + _configurationManager.Configuration.HttpServerPortNumber + "/" +
|
BrowserLauncher.OpenSwagger(_configurationManager, _appHost, _logger);
|
||||||
_appHost.WebApplicationName + "/swagger-ui/index.html", _logger);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmdGithubWiki_Click(object sender, EventArgs e)
|
void cmdGithubWiki_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
BrowserLauncher.OpenUrl("https://github.com/MediaBrowser/MediaBrowser/wiki", _logger);
|
BrowserLauncher.OpenGithub(_logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -246,16 +244,7 @@ namespace MediaBrowser.ServerApplication
|
||||||
/// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
|
/// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
|
||||||
private void cmOpenDashboard_click(object sender, RoutedEventArgs e)
|
private void cmOpenDashboard_click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var user = _userManager.Users.FirstOrDefault(u => u.Configuration.IsAdministrator);
|
BrowserLauncher.OpenDashboard(_userManager, _configurationManager, _appHost, _logger);
|
||||||
OpenDashboard(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Opens the dashboard.
|
|
||||||
/// </summary>
|
|
||||||
private void OpenDashboard(User loggedInUser)
|
|
||||||
{
|
|
||||||
BrowserLauncher.OpenDashboardPage("dashboard.html", loggedInUser, _configurationManager, _appHost, _logger);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -265,7 +254,7 @@ namespace MediaBrowser.ServerApplication
|
||||||
/// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
|
/// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
|
||||||
private void cmVisitCT_click(object sender, RoutedEventArgs e)
|
private void cmVisitCT_click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
BrowserLauncher.OpenUrl("http://community.mediabrowser.tv/", _logger);
|
BrowserLauncher.OpenCommunity(_logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -275,8 +264,7 @@ namespace MediaBrowser.ServerApplication
|
||||||
/// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
|
/// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
|
||||||
private void cmdBrowseLibrary_click(object sender, RoutedEventArgs e)
|
private void cmdBrowseLibrary_click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var user = _userManager.Users.FirstOrDefault(u => u.Configuration.IsAdministrator);
|
BrowserLauncher.OpenWebClient(_userManager, _configurationManager, _appHost, _logger);
|
||||||
BrowserLauncher.OpenDashboardPage("index.html", user, _configurationManager, _appHost, _logger);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -1,13 +1,18 @@
|
||||||
using MediaBrowser.Controller;
|
using MediaBrowser.Controller;
|
||||||
using MediaBrowser.Controller.Configuration;
|
using MediaBrowser.Controller.Configuration;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.Library;
|
||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace MediaBrowser.ServerApplication.Native
|
namespace MediaBrowser.ServerApplication.Native
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class BrowserLauncher
|
||||||
|
/// </summary>
|
||||||
public static class BrowserLauncher
|
public static class BrowserLauncher
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -17,6 +22,7 @@ namespace MediaBrowser.ServerApplication.Native
|
||||||
/// <param name="loggedInUser">The logged in user.</param>
|
/// <param name="loggedInUser">The logged in user.</param>
|
||||||
/// <param name="configurationManager">The configuration manager.</param>
|
/// <param name="configurationManager">The configuration manager.</param>
|
||||||
/// <param name="appHost">The app host.</param>
|
/// <param name="appHost">The app host.</param>
|
||||||
|
/// <param name="logger">The logger.</param>
|
||||||
public static void OpenDashboardPage(string page, User loggedInUser, IServerConfigurationManager configurationManager, IServerApplicationHost appHost, ILogger logger)
|
public static void OpenDashboardPage(string page, User loggedInUser, IServerConfigurationManager configurationManager, IServerApplicationHost appHost, ILogger logger)
|
||||||
{
|
{
|
||||||
var url = "http://localhost:" + configurationManager.Configuration.HttpServerPortNumber + "/" +
|
var url = "http://localhost:" + configurationManager.Configuration.HttpServerPortNumber + "/" +
|
||||||
|
@ -25,11 +31,80 @@ namespace MediaBrowser.ServerApplication.Native
|
||||||
OpenUrl(url, logger);
|
OpenUrl(url, logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Opens the github.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="logger">The logger.</param>
|
||||||
|
public static void OpenGithub(ILogger logger)
|
||||||
|
{
|
||||||
|
OpenUrl("https://github.com/MediaBrowser/MediaBrowser", logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Opens the community.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="logger">The logger.</param>
|
||||||
|
public static void OpenCommunity(ILogger logger)
|
||||||
|
{
|
||||||
|
OpenUrl("http://community.mediabrowser.tv/", logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Opens the web client.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userManager">The user manager.</param>
|
||||||
|
/// <param name="configurationManager">The configuration manager.</param>
|
||||||
|
/// <param name="appHost">The app host.</param>
|
||||||
|
/// <param name="logger">The logger.</param>
|
||||||
|
public static void OpenWebClient(IUserManager userManager, IServerConfigurationManager configurationManager, IServerApplicationHost appHost, ILogger logger)
|
||||||
|
{
|
||||||
|
var user = userManager.Users.FirstOrDefault(u => u.Configuration.IsAdministrator);
|
||||||
|
OpenDashboardPage("index.html", user, configurationManager, appHost, logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Opens the dashboard.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userManager">The user manager.</param>
|
||||||
|
/// <param name="configurationManager">The configuration manager.</param>
|
||||||
|
/// <param name="appHost">The app host.</param>
|
||||||
|
/// <param name="logger">The logger.</param>
|
||||||
|
public static void OpenDashboard(IUserManager userManager, IServerConfigurationManager configurationManager, IServerApplicationHost appHost, ILogger logger)
|
||||||
|
{
|
||||||
|
var user = userManager.Users.FirstOrDefault(u => u.Configuration.IsAdministrator);
|
||||||
|
OpenDashboardPage("dashboard.html", user, configurationManager, appHost, logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Opens the swagger.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="configurationManager">The configuration manager.</param>
|
||||||
|
/// <param name="appHost">The app host.</param>
|
||||||
|
/// <param name="logger">The logger.</param>
|
||||||
|
public static void OpenSwagger(IServerConfigurationManager configurationManager, IServerApplicationHost appHost, ILogger logger)
|
||||||
|
{
|
||||||
|
OpenUrl("http://localhost:" + configurationManager.Configuration.HttpServerPortNumber + "/" +
|
||||||
|
appHost.WebApplicationName + "/swagger-ui/index.html", logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Opens the standard API documentation.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="configurationManager">The configuration manager.</param>
|
||||||
|
/// <param name="appHost">The app host.</param>
|
||||||
|
/// <param name="logger">The logger.</param>
|
||||||
|
public static void OpenStandardApiDocumentation(IServerConfigurationManager configurationManager, IServerApplicationHost appHost, ILogger logger)
|
||||||
|
{
|
||||||
|
OpenUrl("http://localhost:" + configurationManager.Configuration.HttpServerPortNumber + "/" +
|
||||||
|
appHost.WebApplicationName + "/metadata", logger);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Opens the URL.
|
/// Opens the URL.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="url">The URL.</param>
|
/// <param name="url">The URL.</param>
|
||||||
public static void OpenUrl(string url, ILogger logger)
|
/// <param name="logger">The logger.</param>
|
||||||
|
private static void OpenUrl(string url, ILogger logger)
|
||||||
{
|
{
|
||||||
var process = new Process
|
var process = new Process
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user