44 lines
1.5 KiB
C#
44 lines
1.5 KiB
C#
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using CursorLang.Core.Services;
|
|
|
|
namespace CursorLang.Agent.Services;
|
|
|
|
/// <summary>
|
|
/// Starts the settings window.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// The agent does not keep track of whether the window is already open, and does not
|
|
/// need to: the settings process guards a single-instance slot of its own, so a second
|
|
/// launch raises the window already there and exits. That costs a process start to find
|
|
/// out, which is a fraction of the time it takes a person to look at the tray, and it
|
|
/// saves the agent from holding a handle to something it does not own.
|
|
/// </remarks>
|
|
internal static class SettingsLauncher
|
|
{
|
|
/// <summary>
|
|
/// Opens the settings window. Returns <c>false</c> when the executable is not
|
|
/// where it should be — a half-copied installation, or the agent run from a build
|
|
/// folder of its own.
|
|
/// </summary>
|
|
internal static bool Open()
|
|
{
|
|
if (AgentExecutable.SettingsPath is not { } path)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
try
|
|
{
|
|
using Process? started = Process.Start(new ProcessStartInfo(path) { UseShellExecute = false });
|
|
return started is not null;
|
|
}
|
|
catch (Exception e) when (e is Win32Exception or InvalidOperationException)
|
|
{
|
|
// Nothing to tell the user with: the agent has no window of its own, and
|
|
// the one that would have shown the message is the one that failed to start
|
|
return false;
|
|
}
|
|
}
|
|
}
|