mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-06 11:16:51 +02:00
This PR contains a set of bug fixes and general improvements to [Awake](https://awake.den.dev/) and developer experience tooling for building the module. ### Awake Fixes - **#32544** - Fixed an issue where Awake settings became non-functional after the PC wakes from sleep. Added `WM_POWERBROADCAST` handling to detect system resume events (`PBT_APMRESUMEAUTOMATIC`, `PBT_APMRESUMESUSPEND`) and re-apply `SetThreadExecutionState` to restore the awake state. - **#36150** - Fixed an issue where Awake would not prevent sleep when AC power is connected. Added `PBT_APMPOWERSTATUSCHANGE` handling to re-apply `SetThreadExecutionState` when the power source changes (AC/battery transitions). - **#41674** - Fixed silent failure when `SetThreadExecutionState` fails. The monitor thread now handles the return value, logs an error, and reverts to passive mode with updated tray icon. - **#41738** - Fixed `--display-on` CLI flag default from `true` to `false` to align with documentation and PowerToys settings behavior. This is a breaking change for scripts relying on the undocumented default. - **#41918** - Fixed `WM_COMMAND` message processing flaw in `TrayHelper.WndProc` that incorrectly compared enum values against enum count. Added proper bounds checking for custom tray time entries. - **#44134** - Documented that `ES_DISPLAY_REQUIRED` (used when "Keep display on" is enabled) blocks Task Scheduler idle detection, preventing scheduled maintenance tasks like SSD TRIM. Workaround: disable "Keep display on" or manually run `Optimize-Volume -DriveLetter C -ReTrim`. - **#38770** - Fixed tray icon failing to appear after Windows updates. Increased retry attempts and delays for icon Add operations (10 attempts, up to ~15.5 seconds total) while keeping existing fast retry behavior for Update/Delete operations. - **#40501** - Fixed tray icon not disappearing when Awake is disabled. The `SetShellIcon` function was incorrectly requiring an icon for Delete operations, causing the `NIM_DELETE` message to never be sent. - Fixed an issue where toggling "Keep screen on" during an active timed session would disrupt the countdown timer. The display setting now updates directly without restarting the timer, preserving the exact remaining time. ### Performance Optimizations - Fixed O(n²) loop in `TrayHelper.CreateAwakeTimeSubMenu` by replacing `ElementAt(i)` with `foreach` iteration. - Fixed Observable subscription leak in `Manager.cs` by storing `IDisposable` and disposing in `CancelExistingThread()`. Also removed dead `_tokenSource` code that was no longer used. - Reduced allocations in `SingleThreadSynchronizationContext` by changing `Tuple<>` to `ValueTuple`. - Replaced dedicated exit event thread with `ThreadPool.RegisterWaitForSingleObject()` to reduce resource usage. ### Code Quality - Replaced `Console.WriteLine` with `Logger.LogError` in `TrayHelper.cs` for consistent logging. - Added proper error logging to silent exception catches in `AwakeService.cs`. - Removed dead `Math.Min(minutes, int.MaxValue)` code where `minutes` is already an `int`. - Extracted hardcoded tray icon ID to named constant `TrayIconId`. - Standardized null coalescing for `GetSettings<AwakeSettings>()` calls across all files. ### Debugging Experience Fixes - Fixed first-chance exceptions in `settings_window.cpp` during debugging. Added `HasKey()` check before accessing `hotkey_changed` property to prevent `hresult_error` exceptions when the property doesn't exist in module settings. - Fixed first-chance exceptions in FindMyMouse `parse_settings` during debugging. Refactored to extract the properties object once and added `HasKey()` checks before all `GetNamedObject()` calls. This prevents `winrt::hresult_error` exceptions when optional settings keys (like legacy `overlay_opacity`) don't exist, improving the debugging experience by eliminating spurious exception breaks. - Fixed LightSwitch.UITests build failures when building from a clean state. Added missing project references (`ManagedCommon`, `LightSwitchModuleInterface`) with `ReferenceOutputAssembly=false` to ensure proper build ordering, and added existence check for the native DLL copy operation. ### Developer Experience - Added `setup-dev-environment.ps1` script to automate development environment setup. - Added `clean-artifacts.ps1` script to resolve build errors from corrupted build state or missing image files. - Added build script that allows standalone command line build of the Awake module. - Added troubleshooting section to `doc/devdocs/development/debugging.md` with guidance on resolving common build errors.
224 lines
11 KiB
XML
224 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<root>
|
|
<!--
|
|
Microsoft ResX Schema
|
|
|
|
Version 2.0
|
|
|
|
The primary goals of this format is to allow a simple XML format
|
|
that is mostly human readable. The generation and parsing of the
|
|
various data types are done through the TypeConverter classes
|
|
associated with the data types.
|
|
|
|
Example:
|
|
|
|
... ado.net/XML headers & schema ...
|
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
<resheader name="version">2.0</resheader>
|
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
</data>
|
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
<comment>This is a comment</comment>
|
|
</data>
|
|
|
|
There are any number of "resheader" rows that contain simple
|
|
name/value pairs.
|
|
|
|
Each data row contains a name, and value. The row also contains a
|
|
type or mimetype. Type corresponds to a .NET class that support
|
|
text/value conversion through the TypeConverter architecture.
|
|
Classes that don't support this are serialized and stored with the
|
|
mimetype set.
|
|
|
|
The mimetype is used for serialized objects, and tells the
|
|
ResXResourceReader how to depersist the object. This is currently not
|
|
extensible. For a given mimetype the value must be set accordingly:
|
|
|
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
that the ResXResourceWriter will generate, however the reader can
|
|
read any of the formats listed below.
|
|
|
|
mimetype: application/x-microsoft.net.object.binary.base64
|
|
value : The object must be serialized with
|
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
: and then encoded with base64 encoding.
|
|
|
|
mimetype: application/x-microsoft.net.object.soap.base64
|
|
value : The object must be serialized with
|
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
: and then encoded with base64 encoding.
|
|
|
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
value : The object must be serialized into a byte array
|
|
: using a System.ComponentModel.TypeConverter
|
|
: and then encoded with base64 encoding.
|
|
-->
|
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
<xsd:element name="root" msdata:IsDataSet="true">
|
|
<xsd:complexType>
|
|
<xsd:choice maxOccurs="unbounded">
|
|
<xsd:element name="metadata">
|
|
<xsd:complexType>
|
|
<xsd:sequence>
|
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
</xsd:sequence>
|
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
<xsd:attribute name="type" type="xsd:string" />
|
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
<xsd:attribute ref="xml:space" />
|
|
</xsd:complexType>
|
|
</xsd:element>
|
|
<xsd:element name="assembly">
|
|
<xsd:complexType>
|
|
<xsd:attribute name="alias" type="xsd:string" />
|
|
<xsd:attribute name="name" type="xsd:string" />
|
|
</xsd:complexType>
|
|
</xsd:element>
|
|
<xsd:element name="data">
|
|
<xsd:complexType>
|
|
<xsd:sequence>
|
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
</xsd:sequence>
|
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
<xsd:attribute ref="xml:space" />
|
|
</xsd:complexType>
|
|
</xsd:element>
|
|
<xsd:element name="resheader">
|
|
<xsd:complexType>
|
|
<xsd:sequence>
|
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
</xsd:sequence>
|
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
</xsd:complexType>
|
|
</xsd:element>
|
|
</xsd:choice>
|
|
</xsd:complexType>
|
|
</xsd:element>
|
|
</xsd:schema>
|
|
<resheader name="resmimetype">
|
|
<value>text/microsoft-resx</value>
|
|
</resheader>
|
|
<resheader name="version">
|
|
<value>2.0</value>
|
|
</resheader>
|
|
<resheader name="reader">
|
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
</resheader>
|
|
<resheader name="writer">
|
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
</resheader>
|
|
<data name="AWAKE_EXIT" xml:space="preserve">
|
|
<value>Exit</value>
|
|
</data>
|
|
<data name="AWAKE_HOUR" xml:space="preserve">
|
|
<value>{0} hour</value>
|
|
<comment>{0} shouldn't be removed. It will be replaced by the number 1 at runtime by the application. Used for defining a period to keep the PC awake.</comment>
|
|
</data>
|
|
<data name="AWAKE_HOURS" xml:space="preserve">
|
|
<value>{0} hours</value>
|
|
<comment>{0} shouldn't be removed. It will be replaced by a number greater than 1 at runtime by the application. Used for defining a period to keep the PC awake.</comment>
|
|
</data>
|
|
<data name="AWAKE_KEEP_INDEFINITELY" xml:space="preserve">
|
|
<value>Keep awake indefinitely</value>
|
|
<comment>Keep the system awake forever</comment>
|
|
</data>
|
|
<data name="AWAKE_KEEP_ON_INTERVAL" xml:space="preserve">
|
|
<value>Keep awake on interval</value>
|
|
<comment>Keep the system awake for a given time</comment>
|
|
</data>
|
|
<data name="AWAKE_KEEP_SCREEN_ON" xml:space="preserve">
|
|
<value>Keep screen on</value>
|
|
</data>
|
|
<data name="AWAKE_KEEP_UNTIL_EXPIRATION" xml:space="preserve">
|
|
<value>Keep awake until expiration date and time</value>
|
|
<comment>Keep the system awake until expiration date and time</comment>
|
|
</data>
|
|
<data name="AWAKE_MINUTE" xml:space="preserve">
|
|
<value>{0} minute</value>
|
|
<comment>{0} shouldn't be removed. It will be replaced by the number 1 at runtime by the application. Used for defining a period to keep the PC awake.</comment>
|
|
</data>
|
|
<data name="AWAKE_MINUTES" xml:space="preserve">
|
|
<value>{0} minutes</value>
|
|
<comment>{0} shouldn't be removed. It will be replaced by a number greater than 1 at runtime by the application. Used for defining a period to keep the PC awake.</comment>
|
|
</data>
|
|
<data name="AWAKE_OFF" xml:space="preserve">
|
|
<value>Off (keep using the selected power plan)</value>
|
|
<comment>Don't keep the system awake, use the selected system power plan</comment>
|
|
</data>
|
|
<data name="AWAKE_CMD_HELP_CONFIG_OPTION" xml:space="preserve">
|
|
<value>Specifies whether Awake will be using the PowerToys configuration file for managing the state.</value>
|
|
</data>
|
|
<data name="AWAKE_CMD_HELP_DISPLAY_OPTION" xml:space="preserve">
|
|
<value>Determines whether the display should be kept awake.</value>
|
|
</data>
|
|
<data name="AWAKE_CMD_HELP_EXPIRE_AT_OPTION" xml:space="preserve">
|
|
<value>Determines the end date and time when Awake will back off and let the system manage the current sleep and display state.</value>
|
|
</data>
|
|
<data name="AWAKE_CMD_HELP_PID_OPTION" xml:space="preserve">
|
|
<value>Bind the execution of Awake to another process. When the process ends, the system will resume managing the current sleep and display state.</value>
|
|
</data>
|
|
<data name="AWAKE_CMD_HELP_TIME_OPTION" xml:space="preserve">
|
|
<value>Determines the interval (in seconds) during which the computer is kept awake.</value>
|
|
</data>
|
|
<data name="AWAKE_EXIT_BINDING_HOOK_MESSAGE" xml:space="preserve">
|
|
<value>Terminating from process binding hook.</value>
|
|
</data>
|
|
<data name="AWAKE_EXIT_MESSAGE" xml:space="preserve">
|
|
<value>Exiting from the internal termination handler.</value>
|
|
</data>
|
|
<data name="AWAKE_EXIT_SIGNAL_MESSAGE" xml:space="preserve">
|
|
<value>Received a signal to end the process. Making sure we quit...</value>
|
|
</data>
|
|
<data name="AWAKE_TRAY_TEXT_EXPIRATION" xml:space="preserve">
|
|
<value>Expiring</value>
|
|
</data>
|
|
<data name="AWAKE_TRAY_TEXT_INDEFINITE" xml:space="preserve">
|
|
<value>Indefinite</value>
|
|
</data>
|
|
<data name="AWAKE_TRAY_TEXT_OFF" xml:space="preserve">
|
|
<value>Passive</value>
|
|
</data>
|
|
<data name="AWAKE_TRAY_TEXT_TIMED" xml:space="preserve">
|
|
<value>Timed</value>
|
|
</data>
|
|
<data name="AWAKE_CMD_PARENT_PID_OPTION" xml:space="preserve">
|
|
<value>Uses the parent process as the bound target - once the process terminates, Awake stops.</value>
|
|
</data>
|
|
<data name="AWAKE_SCREEN_ON" xml:space="preserve">
|
|
<value>On</value>
|
|
</data>
|
|
<data name="AWAKE_SCREEN_OFF" xml:space="preserve">
|
|
<value>Off</value>
|
|
</data>
|
|
<data name="AWAKE_EXIT_PARENT_BINDING_FAILURE_MESSAGE" xml:space="preserve">
|
|
<value>Exiting because the parent process ID could not be found.</value>
|
|
</data>
|
|
<data name="AWAKE_EXIT_PROCESS_BINDING_FAILURE_MESSAGE" xml:space="preserve">
|
|
<value>Exiting because the requested process ID could not be found.</value>
|
|
</data>
|
|
<data name="AWAKE_EXIT_BIND_TO_SELF_FAILURE_MESSAGE" xml:space="preserve">
|
|
<value>Exiting because the provided process ID is Awake's own.</value>
|
|
</data>
|
|
<data name="AWAKE_TRAY_DISPLAY" xml:space="preserve">
|
|
<value>Screen</value>
|
|
<comment>Label for the screen/display line in tray tooltip.</comment>
|
|
</data>
|
|
<data name="AWAKE_TRAY_UNTIL" xml:space="preserve">
|
|
<value>Until</value>
|
|
<comment>Label for expiration mode showing end date/time.</comment>
|
|
</data>
|
|
<data name="AWAKE_TRAY_REMAINING" xml:space="preserve">
|
|
<value>remaining</value>
|
|
<comment>Suffix for timed mode showing time remaining, e.g. "1:30:00 remaining".</comment>
|
|
</data>
|
|
</root> |