// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using System.Text.Json; using autoShell.Handlers.Generated; using autoShell.Logging; using autoShell.Services; namespace autoShell.Handlers; /// /// Handles display commands: ListResolutions, SetScreenResolution, and SetTextSize. /// internal class DisplayActionHandler : ActionHandlerBase { private readonly IDisplayService _display; private readonly ILogger _logger; public DisplayActionHandler(IDisplayService display, ILogger logger) { _display = display; _logger = logger; AddAction("ListResolutions", HandleListResolutions); AddAction("SetScreenResolution", HandleSetScreenResolution); AddAction("SetTextSize", HandleSetTextSize); } private ActionResult HandleListResolutions(JsonElement parameters) { try { string resolutions = _display.ListResolutions(); using var doc = JsonDocument.Parse(resolutions); return ActionResult.Ok("Listed resolutions", doc.RootElement.Clone()); } catch (Exception ex) { _logger.Error(ex); return ActionResult.Fail($"Failed to list resolutions: {ex.Message}"); } } private ActionResult HandleSetScreenResolution(SetScreenResolutionParams p) { try { int width = p.Width; int height = p.Height; if (width <= 0 || height <= 0) { return ActionResult.Fail("Invalid resolution: width and height must be positive"); } uint? refreshRate = null; if (p.RefreshRate.HasValue) { if (p.RefreshRate.Value <= 0) { return ActionResult.Fail("Invalid refresh rate: must be positive"); } refreshRate = (uint)p.RefreshRate.Value; } string result = _display.SetResolution((uint)width, (uint)height, refreshRate); return ActionResult.Ok(result); } catch (Exception ex) { _logger.Error(ex); return ActionResult.Fail($"Failed to set resolution: {ex.Message}"); } } private ActionResult HandleSetTextSize(SetTextSizeParams p) { try { int textSizePct = p.Size; if (textSizePct <= 0) { return ActionResult.Fail("Invalid text size: size required"); } _display.SetTextSize(textSizePct); return ActionResult.Ok($"Text size set to {textSizePct}%"); } catch (Exception ex) { _logger.Error(ex); return ActionResult.Fail($"Failed to set text size: {ex.Message}"); } } }