mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-15 03:07:56 +01:00
awake tweak
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
// Copyright (c) Microsoft Corporation
|
||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System;
|
||||
using Microsoft.CommandPalette.Extensions.Toolkit;
|
||||
using PowerToysExtension.Helpers;
|
||||
|
||||
namespace PowerToysExtension.Commands;
|
||||
|
||||
internal sealed partial class RefreshAwakeStatusCommand : InvokableCommand
|
||||
{
|
||||
private readonly Action<string> _applySubtitle;
|
||||
|
||||
internal RefreshAwakeStatusCommand(Action<string> applySubtitle)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(applySubtitle);
|
||||
_applySubtitle = applySubtitle;
|
||||
Name = "Refresh Awake status";
|
||||
}
|
||||
|
||||
public override CommandResult Invoke()
|
||||
{
|
||||
try
|
||||
{
|
||||
var subtitle = AwakeStatusService.GetStatusSubtitle();
|
||||
_applySubtitle(subtitle);
|
||||
return CommandResult.KeepOpen();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return CommandResult.ShowToast(new ToastArgs()
|
||||
{
|
||||
Message = $"Failed to refresh Awake status: {ex.Message}",
|
||||
Result = CommandResult.KeepOpen(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -32,14 +32,25 @@ internal sealed partial class StartAwakeCommand : InvokableCommand
|
||||
var result = _action().GetAwaiter().GetResult();
|
||||
if (!result.Success)
|
||||
{
|
||||
return CommandResult.ShowToast(result.Error ?? "Failed to start Awake.");
|
||||
return ShowToastKeepOpen(result.Error ?? "Failed to start Awake.");
|
||||
}
|
||||
|
||||
return string.IsNullOrWhiteSpace(_successToast) ? CommandResult.Hide() : CommandResult.ShowToast(_successToast);
|
||||
return string.IsNullOrWhiteSpace(_successToast)
|
||||
? CommandResult.KeepOpen()
|
||||
: ShowToastKeepOpen(_successToast);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return CommandResult.ShowToast($"Launching Awake failed: {ex.Message}");
|
||||
return ShowToastKeepOpen($"Launching Awake failed: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private static CommandResult ShowToastKeepOpen(string message)
|
||||
{
|
||||
return CommandResult.ShowToast(new ToastArgs()
|
||||
{
|
||||
Message = message,
|
||||
Result = CommandResult.KeepOpen(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,14 +22,23 @@ internal sealed partial class StopAwakeCommand : InvokableCommand
|
||||
var result = AwakeService.Instance.SetOffAsync().GetAwaiter().GetResult();
|
||||
if (result.Success)
|
||||
{
|
||||
return CommandResult.ShowToast("Awake switched to Off.");
|
||||
return ShowToastKeepOpen("Awake switched to Off.");
|
||||
}
|
||||
|
||||
return CommandResult.ShowToast(result.Error ?? "Awake does not appear to be running.");
|
||||
return ShowToastKeepOpen(result.Error ?? "Awake does not appear to be running.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return CommandResult.ShowToast($"Failed to switch Awake off: {ex.Message}");
|
||||
return ShowToastKeepOpen($"Failed to switch Awake off: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private static CommandResult ShowToastKeepOpen(string message)
|
||||
{
|
||||
return CommandResult.ShowToast(new ToastArgs()
|
||||
{
|
||||
Message = message,
|
||||
Result = CommandResult.KeepOpen(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,14 +71,34 @@ internal static class AwakeCommandsFactory
|
||||
{
|
||||
var results = new List<IListItem>();
|
||||
|
||||
var statusSubtitle = AwakeStatusService.BuildSubtitle();
|
||||
if (Matches("Current status", statusSubtitle, searchText))
|
||||
var statusSubtitle = AwakeStatusService.GetStatusSubtitle();
|
||||
if (Matches("Awake: Current status", statusSubtitle, searchText))
|
||||
{
|
||||
var statusItem = new ListItem(new CommandItem(new Commands.NoOpCommand("Awake status")))
|
||||
ListItem? statusItem = null;
|
||||
var refreshCommand = new RefreshAwakeStatusCommand(subtitle =>
|
||||
{
|
||||
Title = "Current status",
|
||||
if (statusItem is not null)
|
||||
{
|
||||
statusItem.Subtitle = subtitle;
|
||||
}
|
||||
});
|
||||
|
||||
var statusNoOp = new NoOpCommand();
|
||||
statusNoOp.Name = "Awake status";
|
||||
|
||||
statusItem = new ListItem(new CommandItem(statusNoOp))
|
||||
{
|
||||
Title = "Awake: Current status",
|
||||
Subtitle = statusSubtitle,
|
||||
Icon = AwakeIcon,
|
||||
MoreCommands =
|
||||
[
|
||||
new CommandContextItem(refreshCommand)
|
||||
{
|
||||
Title = "Refresh status",
|
||||
Subtitle = "Re-read current Awake state",
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
results.Add(statusItem);
|
||||
|
||||
@@ -9,6 +9,7 @@ using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
using Common.UI;
|
||||
|
||||
namespace PowerToysExtension.Helpers;
|
||||
|
||||
@@ -47,7 +48,7 @@ internal static class AwakeStatusService
|
||||
return new AwakeStatusSnapshot(isRunning, mode, settings.Properties.KeepDisplayOn, duration, expiration);
|
||||
}
|
||||
|
||||
internal static string BuildSubtitle()
|
||||
internal static string GetStatusSubtitle()
|
||||
{
|
||||
var snapshot = GetSnapshot();
|
||||
if (!snapshot.IsRunning)
|
||||
@@ -55,16 +56,25 @@ internal static class AwakeStatusService
|
||||
return "Awake is idle";
|
||||
}
|
||||
|
||||
if (snapshot.Mode == AwakeMode.Passive)
|
||||
{
|
||||
// When the PowerToys Awake module is enabled, the Awake process stays resident
|
||||
// even in passive mode. In that case "idle" is correct. If the module is disabled,
|
||||
// a running process implies a standalone/session keep-awake, so report as active.
|
||||
return ModuleEnablementService.IsModuleEnabled(SettingsDeepLink.SettingsWindow.Awake)
|
||||
? "Awake is idle"
|
||||
: "Active - session running";
|
||||
}
|
||||
|
||||
return snapshot.Mode switch
|
||||
{
|
||||
AwakeMode.Passive => "Awake is idle",
|
||||
AwakeMode.Indefinite => snapshot.KeepDisplayOn ? "Active <20> indefinite (display on)" : "Active <20> indefinite",
|
||||
AwakeMode.Indefinite => snapshot.KeepDisplayOn ? "Active - indefinite (display on)" : "Active - indefinite",
|
||||
AwakeMode.Timed => snapshot.Duration is { } span
|
||||
? $"Active <EFBFBD> timer {FormatDuration(span)}"
|
||||
: "Active <EFBFBD> timer",
|
||||
? $"Active - timer {FormatDuration(span)}"
|
||||
: "Active - timer",
|
||||
AwakeMode.Expirable => snapshot.Expiration is { } expiry
|
||||
? $"Active <EFBFBD> until {expiry.ToLocalTime():t}"
|
||||
: "Active <EFBFBD> scheduled",
|
||||
? $"Active - until {expiry.ToLocalTime():t}"
|
||||
: "Active - scheduled",
|
||||
_ => "Awake is running",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -35,6 +35,34 @@ internal sealed class AwakeModuleCommandProvider : ModuleCommandProvider
|
||||
}
|
||||
|
||||
// Direct commands surfaced in the PowerToys list page.
|
||||
ListItem? statusItem = null;
|
||||
var refreshCommand = new RefreshAwakeStatusCommand(subtitle =>
|
||||
{
|
||||
if (statusItem is not null)
|
||||
{
|
||||
statusItem.Subtitle = subtitle;
|
||||
}
|
||||
});
|
||||
|
||||
var statusNoOp = new NoOpCommand();
|
||||
statusNoOp.Name = "Awake status";
|
||||
|
||||
statusItem = new ListItem(new CommandItem(statusNoOp))
|
||||
{
|
||||
Title = "Awake: Current status",
|
||||
Subtitle = AwakeStatusService.GetStatusSubtitle(),
|
||||
Icon = icon,
|
||||
MoreCommands =
|
||||
[
|
||||
new CommandContextItem(refreshCommand)
|
||||
{
|
||||
Title = "Refresh status",
|
||||
Subtitle = "Re-read current Awake state",
|
||||
},
|
||||
],
|
||||
};
|
||||
items.Add(statusItem);
|
||||
|
||||
items.Add(new ListItem(new StartAwakeCommand("Awake: Keep awake indefinitely", () => AwakeService.Instance.SetIndefiniteAsync(), "Awake set to indefinite"))
|
||||
{
|
||||
Title = "Awake: Keep awake indefinitely",
|
||||
|
||||
Reference in New Issue
Block a user