mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
251 lines
8.1 KiB
C#
251 lines
8.1 KiB
C#
using GHelper.Helpers;
|
|
|
|
namespace GHelper.Display
|
|
{
|
|
enum SplendidCommand: int
|
|
{
|
|
Init = 10,
|
|
DimmingAsus = 9,
|
|
DimmingVisual = 19
|
|
}
|
|
|
|
public static class ScreenControl
|
|
{
|
|
|
|
public const int MAX_REFRESH = 1000;
|
|
|
|
public static DisplayGammaRamp? gammaRamp;
|
|
|
|
private static int _brightness = 100;
|
|
private static bool _init = true;
|
|
|
|
private static System.Timers.Timer brightnessTimer = new System.Timers.Timer(100);
|
|
|
|
static ScreenControl () {
|
|
brightnessTimer.Elapsed += BrightnessTimerTimer_Elapsed;
|
|
}
|
|
|
|
private static bool RunSplendid(SplendidCommand command, int? param1 = null, int? param2 = null)
|
|
{
|
|
var splendid = Environment.SystemDirectory + "\\DriverStore\\FileRepository\\asussci2.inf_amd64_f2eed2fae3b45a67\\ASUSOptimization\\AsusSplendid.exe";
|
|
bool isGameVisual = Directory.Exists("C:\\ProgramData\\ASUS\\GameVisual");
|
|
bool isSplenddid = File.Exists(splendid);
|
|
|
|
if (isSplenddid)
|
|
{
|
|
if (command == SplendidCommand.DimmingVisual && !isGameVisual) command = SplendidCommand.DimmingAsus;
|
|
var result = ProcessHelper.RunCMD(splendid, (int)command + " " + param1 + " " + param2);
|
|
if (result.Contains("file not exist") || (result.Length == 0 && isGameVisual)) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
private static void BrightnessTimerTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
|
|
{
|
|
brightnessTimer.Stop();
|
|
|
|
|
|
if (RunSplendid(SplendidCommand.DimmingVisual, 0, (int)(40 + _brightness * 0.6))) return;
|
|
|
|
if (_init)
|
|
{
|
|
_init = false;
|
|
RunSplendid(SplendidCommand.Init);
|
|
RunSplendid(SplendidCommand.Init, 4);
|
|
if (RunSplendid(SplendidCommand.DimmingVisual, 0, (int)(40 + _brightness * 0.6))) return;
|
|
}
|
|
|
|
// GammaRamp Fallback
|
|
SetGamma(_brightness);
|
|
}
|
|
|
|
public static void AutoScreen(bool force = false)
|
|
{
|
|
if (force || AppConfig.Is("screen_auto"))
|
|
{
|
|
if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online)
|
|
SetScreen(MAX_REFRESH, 1);
|
|
else
|
|
SetScreen(60, 0);
|
|
}
|
|
else
|
|
{
|
|
SetScreen(overdrive: AppConfig.Get("overdrive"));
|
|
}
|
|
}
|
|
|
|
public static int SetBrightness(int brightness = -1, int delta = 0)
|
|
{
|
|
if (!AppConfig.IsOLED()) return -1;
|
|
|
|
if (brightness < 0) brightness = AppConfig.Get("brightness", 100);
|
|
|
|
_brightness = Math.Max(0, Math.Min(100, brightness + delta));
|
|
AppConfig.Set("brightness", _brightness);
|
|
|
|
brightnessTimer.Start();
|
|
|
|
Program.settingsForm.VisualiseBrightness();
|
|
|
|
return _brightness;
|
|
}
|
|
|
|
|
|
|
|
public static void SetGamma(int brightness = 100)
|
|
{
|
|
var bright = Math.Round((float)brightness / 200 + 0.5, 2);
|
|
|
|
var screenName = ScreenNative.FindLaptopScreen();
|
|
if (screenName is null) return;
|
|
|
|
try
|
|
{
|
|
var handle = ScreenNative.CreateDC(screenName, screenName, null, IntPtr.Zero);
|
|
if (gammaRamp is null)
|
|
{
|
|
var gammaDump = new GammaRamp();
|
|
if (ScreenNative.GetDeviceGammaRamp(handle, ref gammaDump))
|
|
{
|
|
gammaRamp = new DisplayGammaRamp(gammaDump);
|
|
//Logger.WriteLine("Gamma R: " + string.Join("-", gammaRamp.Red));
|
|
//Logger.WriteLine("Gamma G: " + string.Join("-", gammaRamp.Green));
|
|
//Logger.WriteLine("Gamma B: " + string.Join("-", gammaRamp.Blue));
|
|
}
|
|
}
|
|
|
|
if (gammaRamp is null || !gammaRamp.IsOriginal())
|
|
{
|
|
Logger.WriteLine("Not default Gamma");
|
|
gammaRamp = new DisplayGammaRamp();
|
|
}
|
|
|
|
var ramp = gammaRamp.AsBrightnessRamp(bright);
|
|
bool result = ScreenNative.SetDeviceGammaRamp(handle, ref ramp);
|
|
|
|
Logger.WriteLine("Gamma " + bright.ToString() + ": " + result);
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.WriteLine(ex.ToString());
|
|
}
|
|
|
|
//ScreenBrightness.Set(60 + (int)(40 * bright));
|
|
}
|
|
|
|
public static void SetScreen(int frequency = -1, int overdrive = -1, int miniled = -1)
|
|
{
|
|
var laptopScreen = ScreenNative.FindLaptopScreen(true);
|
|
|
|
if (laptopScreen is null) return;
|
|
|
|
if (ScreenNative.GetRefreshRate(laptopScreen) < 0) return;
|
|
|
|
if (frequency >= MAX_REFRESH)
|
|
{
|
|
frequency = ScreenNative.GetMaxRefreshRate(laptopScreen);
|
|
}
|
|
|
|
if (frequency > 0)
|
|
{
|
|
ScreenNative.SetRefreshRate(laptopScreen, frequency);
|
|
}
|
|
|
|
if (overdrive >= 0)
|
|
{
|
|
if (AppConfig.IsNoOverdrive()) overdrive = 0;
|
|
if (!AppConfig.IsOLED()) Program.acpi.DeviceSet(AsusACPI.ScreenOverdrive, overdrive, "ScreenOverdrive");
|
|
|
|
}
|
|
|
|
if (miniled >= 0)
|
|
{
|
|
if (Program.acpi.DeviceGet(AsusACPI.ScreenMiniled1) >= 0)
|
|
Program.acpi.DeviceSet(AsusACPI.ScreenMiniled1, miniled, "Miniled1");
|
|
else
|
|
Program.acpi.DeviceSet(AsusACPI.ScreenMiniled2, miniled, "Miniled2");
|
|
}
|
|
|
|
InitScreen();
|
|
}
|
|
|
|
|
|
public static int ToogleMiniled()
|
|
{
|
|
int miniled1 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled1);
|
|
int miniled2 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled2);
|
|
|
|
Logger.WriteLine($"MiniledToggle: {miniled1} {miniled2}");
|
|
|
|
int miniled;
|
|
|
|
if (miniled1 >= 0)
|
|
{
|
|
miniled = (miniled1 == 1) ? 0 : 1;
|
|
}
|
|
else
|
|
{
|
|
switch (miniled2)
|
|
{
|
|
case 1: miniled = 2; break;
|
|
case 2: miniled = 0; break;
|
|
default: miniled = 1; break;
|
|
}
|
|
}
|
|
|
|
AppConfig.Set("miniled", miniled);
|
|
SetScreen(-1, -1, miniled);
|
|
return miniled;
|
|
}
|
|
|
|
public static void InitScreen()
|
|
{
|
|
var laptopScreen = ScreenNative.FindLaptopScreen();
|
|
|
|
int frequency = ScreenNative.GetRefreshRate(laptopScreen);
|
|
int maxFrequency = ScreenNative.GetMaxRefreshRate(laptopScreen);
|
|
|
|
bool screenAuto = AppConfig.Is("screen_auto");
|
|
bool overdriveSetting = !AppConfig.IsNoOverdrive();
|
|
|
|
int overdrive = AppConfig.IsNoOverdrive() ? 0 : Program.acpi.DeviceGet(AsusACPI.ScreenOverdrive);
|
|
|
|
int miniled1 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled1);
|
|
int miniled2 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled2);
|
|
|
|
int miniled = (miniled1 >= 0) ? miniled1 : miniled2;
|
|
bool hdr = false;
|
|
|
|
if (miniled >= 0)
|
|
{
|
|
Logger.WriteLine($"Miniled: {miniled1} {miniled2}");
|
|
AppConfig.Set("miniled", miniled);
|
|
hdr = ScreenCCD.GetHDRStatus();
|
|
}
|
|
|
|
bool screenEnabled = (frequency >= 0);
|
|
|
|
AppConfig.Set("frequency", frequency);
|
|
AppConfig.Set("overdrive", overdrive);
|
|
|
|
Program.settingsForm.Invoke(delegate
|
|
{
|
|
Program.settingsForm.VisualiseScreen(
|
|
screenEnabled: screenEnabled,
|
|
screenAuto: screenAuto,
|
|
frequency: frequency,
|
|
maxFrequency: maxFrequency,
|
|
overdrive: overdrive,
|
|
overdriveSetting: overdriveSetting,
|
|
miniled1: miniled1,
|
|
miniled2: miniled2,
|
|
hdr: hdr
|
|
);
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|