// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using autoShell.Handlers.Generated;
using autoShell.Logging;
using autoShell.Services;
namespace autoShell.Handlers;
///
/// Handles virtual desktop commands: CreateDesktop, MoveWindowToDesktop, NextDesktop,
/// PinWindow, PreviousDesktop, and SwitchDesktop.
///
internal class VirtualDesktopActionHandler : ActionHandlerBase
{
private readonly IAppRegistry _appRegistry;
private readonly ILogger _logger;
private readonly IVirtualDesktopService _virtualDesktop;
private readonly IWindowService _window;
public VirtualDesktopActionHandler(IAppRegistry appRegistry, IWindowService window, IVirtualDesktopService virtualDesktop, ILogger logger)
{
_appRegistry = appRegistry;
_logger = logger;
_virtualDesktop = virtualDesktop;
_window = window;
AddAction("CreateDesktop", HandleCreateDesktop);
AddAction("MoveWindowToDesktop", HandleMoveWindowToDesktop);
AddAction("NextDesktop", HandleNextDesktop);
AddAction("PinWindow", HandlePinWindow);
AddAction("PreviousDesktop", HandlePreviousDesktop);
AddAction("SwitchDesktop", HandleSwitchDesktop);
}
private ActionResult HandleCreateDesktop(CreateDesktopParams p)
{
string namesJson = p.Names != null
? System.Text.Json.JsonSerializer.Serialize(p.Names)
: "[\"desktop 1\"]";
_virtualDesktop.CreateDesktops(namesJson);
return ActionResult.Ok("Created new desktop(s)");
}
private ActionResult HandleMoveWindowToDesktop(MoveWindowToDesktopParams p)
{
string process = p.Name;
string desktop = p.DesktopId.ToString();
if (string.IsNullOrEmpty(process) || string.IsNullOrEmpty(desktop))
{
return ActionResult.Fail("MoveWindowToDesktop requires name and desktopId");
}
string resolvedName = _appRegistry.ResolveProcessName(process);
IntPtr hWnd = _window.FindProcessWindowHandle(resolvedName);
if (hWnd == IntPtr.Zero)
{
return ActionResult.Fail($"Could not find window for '{process}'");
}
_virtualDesktop.MoveWindowToDesktop(hWnd, desktop);
return ActionResult.Ok($"Moved {process} to desktop {desktop}");
}
private ActionResult HandleNextDesktop(NextDesktopParams p)
{
_virtualDesktop.NextDesktop();
return ActionResult.Ok("Switched to next desktop");
}
private ActionResult HandlePinWindow(PinWindowParams p)
{
string name = p.Name;
string pinProcess = _appRegistry.ResolveProcessName(name);
IntPtr pinHWnd = _window.FindProcessWindowHandle(pinProcess);
if (pinHWnd == IntPtr.Zero)
{
return ActionResult.Fail($"Could not find window for '{name}'");
}
_virtualDesktop.PinWindow(pinHWnd);
return ActionResult.Ok($"Pinned '{name}' to all desktops");
}
private ActionResult HandlePreviousDesktop(PreviousDesktopParams p)
{
_virtualDesktop.PreviousDesktop();
return ActionResult.Ok("Switched to previous desktop");
}
private ActionResult HandleSwitchDesktop(SwitchDesktopParams p)
{
string desktopId = p.DesktopId.ToString();
_virtualDesktop.SwitchDesktop(desktopId);
return ActionResult.Ok($"Switched to desktop {desktopId}");
}
}