using System.IO;
using System.IO.Pipes;
namespace DeskCore;
///
/// Befehlszeile von DeskCore, z. B. für Desktop-Verknüpfungen und Skripte:
/// DeskCore.exe --launch "Arbeit" Start-Gruppe starten
/// DeskCore.exe --snapshot "Name" Box-Anordnung wiederherstellen
/// DeskCore.exe --toggle-desktop Desktop-Icons und Boxen ein-/ausblenden
/// DeskCore.exe --peek Boxen vor alle Fenster holen
/// DeskCore.exe --minimized im Infobereich starten
/// Läuft DeskCore schon, wird der Befehl an die laufende Instanz weitergereicht.
///
public static class Commands
{
private const string PipeName = "DeskCore.Befehle";
private const char Separator = '\u001F';
public static string? Value(string[] args, string name)
{
int i = Array.FindIndex(args, a => a.Equals(name, StringComparison.OrdinalIgnoreCase));
return i >= 0 && i + 1 < args.Length ? args[i + 1] : null;
}
public static bool Has(string[] args, string name) => args.Any(a => a.Equals(name, StringComparison.OrdinalIgnoreCase));
/// Soll für diesen Aufruf das Hauptfenster erscheinen?
public static bool WantsWindow(string[] args) =>
!Has(args, "--minimized") && Value(args, "--launch") is null && Value(args, "--snapshot") is null &&
!Has(args, "--toggle-desktop") && !Has(args, "--peek");
/// An die laufende Instanz senden.
public static bool Send(string[] args)
{
try
{
using var client = new NamedPipeClientStream(".", PipeName, PipeDirection.Out);
client.Connect(3000);
using var w = new StreamWriter(client);
w.Write(string.Join(Separator, args));
w.Flush();
return true;
}
catch { return false; }
}
///
/// Empfängt Befehle weiterer Aufrufe (im Hintergrund). Die Pipe ist standardmäßig nur für den
/// eigenen Benutzer beschreibbar – andere Benutzer können DeskCore keine Befehle schicken.
///
public static void Listen(Action onCommand)
{
new Thread(() =>
{
while (true)
{
try
{
using var server = new NamedPipeServerStream(PipeName, PipeDirection.In, 1);
server.WaitForConnection();
using var r = new StreamReader(server);
var text = r.ReadToEnd();
onCommand(text.Length == 0 ? [] : text.Split(Separator));
}
catch { Thread.Sleep(500); }
}
}) { IsBackground = true, Name = "Befehle" }.Start();
}
}