diff --git a/app/Display/ScreenControl.cs b/app/Display/ScreenControl.cs index 3e52fcd5..b9505f78 100644 --- a/app/Display/ScreenControl.cs +++ b/app/Display/ScreenControl.cs @@ -77,8 +77,12 @@ namespace GHelper.Display int overdrive = Program.acpi.DeviceGet(AsusACPI.ScreenOverdrive); int miniled = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled); + bool hdr = false; + if (miniled >= 0) + { AppConfig.Set("miniled", miniled); + } bool screenEnabled = (frequency >= 0); @@ -94,7 +98,8 @@ namespace GHelper.Display maxFrequency: maxFrequency, overdrive: overdrive, overdriveSetting: overdriveSetting, - miniled: miniled + miniled: miniled, + hdr: hdr ); }); diff --git a/app/Display/ScreenNative.cs b/app/Display/ScreenNative.cs index b612d509..8911567e 100644 --- a/app/Display/ScreenNative.cs +++ b/app/Display/ScreenNative.cs @@ -1,8 +1,6 @@ -using Microsoft.VisualBasic.Logging; -using System.Collections; -using System.Diagnostics.Metrics; +using System.Collections; +using System.Diagnostics; using System.Runtime.InteropServices; -using System.Windows.Forms; using static GHelper.Display.ScreenInterrogatory; namespace GHelper.Display diff --git a/app/Fans.cs b/app/Fans.cs index 5441c304..ef113de2 100644 --- a/app/Fans.cs +++ b/app/Fans.cs @@ -692,7 +692,14 @@ namespace GHelper comboBoost.SelectedIndex = Math.Min(boost, comboBoost.Items.Count - 1); string powerMode = PowerNative.GetPowerMode(); - comboPowerMode.SelectedValue = powerMode; + bool batterySaver = PowerNative.GetBatterySaverStatus(); + + comboPowerMode.Enabled = !batterySaver; + + if (batterySaver) + comboPowerMode.SelectedIndex = 0; + else + comboPowerMode.SelectedValue = powerMode; } diff --git a/app/Mode/PowerNative.cs b/app/Mode/PowerNative.cs index d484cee6..e751fb9c 100644 --- a/app/Mode/PowerNative.cs +++ b/app/Mode/PowerNative.cs @@ -153,6 +153,13 @@ namespace GHelper.Mode Guid guidScheme = new Guid(scheme); uint status = PowerGetEffectiveOverlayScheme(out Guid activeScheme); + + if (GetBatterySaverStatus()) + { + Logger.WriteLine("Battery Saver detected"); + return; + } + if (status != 0 || activeScheme != guidScheme) { status = PowerSetActiveOverlayScheme(guidScheme); @@ -288,6 +295,48 @@ namespace GHelper.Mode Logger.WriteLine("Setting Hibernate after " + seconds + ": " + (hrAC == 0 ? "OK" : hrAC)); } + [DllImport("Kernel32")] + private static extern bool GetSystemPowerStatus(SystemPowerStatus sps); + public enum ACLineStatus : byte + { + Offline = 0, Online = 1, Unknown = 255 + } + + public enum BatteryFlag : byte + { + High = 1, + Low = 2, + Critical = 4, + Charging = 8, + NoSystemBattery = 128, + Unknown = 255 + } + + // Fields must mirror their unmanaged counterparts, in order + [StructLayout(LayoutKind.Sequential)] + public class SystemPowerStatus + { + public ACLineStatus ACLineStatus; + public BatteryFlag BatteryFlag; + public Byte BatteryLifePercent; + public Byte SystemStatusFlag; + public Int32 BatteryLifeTime; + public Int32 BatteryFullLifeTime; + } + + public static bool GetBatterySaverStatus() + { + SystemPowerStatus sps = new SystemPowerStatus(); + try + { + GetSystemPowerStatus(sps); + return (sps.SystemStatusFlag > 0); + } catch (Exception ex) + { + return false; + } + + } } } diff --git a/app/Settings.cs b/app/Settings.cs index bad49cd6..ff93dca7 100644 --- a/app/Settings.cs +++ b/app/Settings.cs @@ -758,7 +758,7 @@ namespace GHelper - public void VisualiseScreen(bool screenEnabled, bool screenAuto, int frequency, int maxFrequency, int overdrive, bool overdriveSetting, int miniled) + public void VisualiseScreen(bool screenEnabled, bool screenAuto, int frequency, int maxFrequency, int overdrive, bool overdriveSetting, int miniled, bool hdr) { ButtonEnabled(button60Hz, screenEnabled); @@ -800,6 +800,7 @@ namespace GHelper if (miniled >= 0) { buttonMiniled.Activated = (miniled == 1); + buttonMiniled.Enabled = !hdr; } else {