Compare commits

...

26 Commits

Author SHA1 Message Date
Serge
bd1a11a15a Update README.md 2023-07-23 14:46:02 +02:00
Serge
c2262c0f89 Moved Aura commands to parallel thread 2023-07-23 14:36:22 +02:00
Serge
88aaf94441 Merge branch 'main' of https://github.com/seerge/g-helper 2023-07-23 13:33:08 +02:00
Serge
20b99810cb Standard mode fix 2023-07-23 13:33:05 +02:00
Serge
7b327a4481 Merge pull request #856 from seerge/l10n_main
New Crowdin updates
2023-07-23 12:39:23 +02:00
Serge
6f40dadfcb New translations Strings.resx (Chinese Simplified) 2023-07-23 09:59:11 +02:00
Serge
a004924a42 Merge 2023-07-22 19:23:36 +02:00
Serge
ef442da885 Merge 2023-07-22 19:23:29 +02:00
Serge
eab2ef695d Hide Unsupported elements in Extra 2023-07-22 19:20:44 +02:00
Serge
0291920a55 Merge pull request #844 from seerge/l10n_main
New Crowdin updates
2023-07-22 11:39:35 +02:00
Serge
633c841d7f New translations Strings.resx (Chinese Traditional) 2023-07-22 01:48:49 +02:00
Serge
f2f4df5693 New translations Strings.resx (Spanish) 2023-07-21 20:47:51 +02:00
Serge
4592d729d3 New translations Strings.resx (Italian) 2023-07-21 18:26:01 +02:00
Serge
8cedcb7b5d Merge pull request #841 from seerge/l10n_main
New Crowdin updates
2023-07-21 18:05:15 +02:00
Serge
37d133bd7c Merge pull request #842 from IceStormNG/clamshell-mode-fixes
Clamshell mode fixes
2023-07-21 15:50:51 +02:00
IceStormNG
3f87730375 Fixed a typo 2023-07-21 15:45:42 +02:00
IceStormNG
d99c3a8301 Assign handler via code so the settings assignment does not trigger the handler 2023-07-21 15:42:40 +02:00
IceStormNG
fbc792cb1d Only instanciate if needed. 2023-07-21 15:40:24 +02:00
IceStormNG
5498bb9398 This name makes more sense as it only checks for requirements 2023-07-21 15:39:23 +02:00
IceStormNG
25f842df9d Only touch power settings if the user checks the box. But always disable the changes back to the defaults when the user unchecks it. 2023-07-21 15:38:26 +02:00
Serge
987ee1c000 New translations Strings.resx (Polish) 2023-07-21 14:46:05 +02:00
Serge
afe760f58d Merge pull request #840 from seerge/l10n_main
New Crowdin updates
2023-07-21 13:00:18 +02:00
Serge
b07f0a09fa New translations Strings.resx (Chinese Simplified) 2023-07-21 12:59:52 +02:00
Serge
2b26791dc0 New translations Strings.resx (Ukrainian) 2023-07-21 12:59:51 +02:00
Serge
8db6939b30 Update README.md 2023-07-21 12:47:21 +02:00
Serge
29bcb810b4 Update release.yml 2023-07-21 11:40:51 +02:00
17 changed files with 239 additions and 141 deletions

View File

@@ -20,7 +20,7 @@ jobs:
- name: Publish - name: Publish
run: | run: |
dotnet publish app/GHelper.sln --configuration Release --runtime win-x64 -p:PublishSingleFile=true --no-self-contained dotnet publish app/GHelper.sln --configuration Release --runtime win-x64 -p:PublishSingleFile=true --no-self-contained
powershell Compress-Archive app/bin/x64/Release/net7.0-windows8.0/win-x64/publish/* GHelper.zip powershell Compress-Archive app/bin/x64/Release/net7.0-windows/win-x64/publish/* GHelper.zip
- name: Upload - name: Upload
env: env:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}

View File

@@ -256,13 +256,13 @@ namespace GHelper
public static void ApplyBrightness(int brightness, string log = "Backlight") public static void ApplyBrightness(int brightness, string log = "Backlight")
{ {
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardBrightness(brightness);
Task.Run(async () => Task.Run(async () =>
{ {
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardBrightness(brightness);
byte[] msg = { AURA_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness }; byte[] msg = { AURA_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
byte[] msgBackup = { INPUT_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness }; byte[] msgBackup = { INPUT_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
@@ -311,55 +311,60 @@ namespace GHelper
public static void ApplyAuraPower() public static void ApplyAuraPower()
{ {
List<AuraDev19b6> flags = new(); Task.Run(async () =>
// Keyboard
if (AppConfig.IsNotFalse("keyboard_awake")) flags.Add(AuraDev19b6.AwakeKeyb);
if (AppConfig.IsNotFalse("keyboard_boot")) flags.Add(AuraDev19b6.BootKeyb);
if (AppConfig.IsNotFalse("keyboard_sleep")) flags.Add(AuraDev19b6.SleepKeyb);
if (AppConfig.IsNotFalse("keyboard_shutdown")) flags.Add(AuraDev19b6.ShutdownKeyb);
// Lightbar
if (AppConfig.IsNotFalse("keyboard_awake_bar")) flags.Add(AuraDev19b6.AwakeBar);
if (AppConfig.IsNotFalse("keyboard_boot_bar")) flags.Add(AuraDev19b6.BootBar);
if (AppConfig.IsNotFalse("keyboard_sleep_bar")) flags.Add(AuraDev19b6.SleepBar);
if (AppConfig.IsNotFalse("keyboard_shutdown_bar")) flags.Add(AuraDev19b6.ShutdownBar);
// Lid
if (AppConfig.IsNotFalse("keyboard_awake_lid")) flags.Add(AuraDev19b6.AwakeLid);
if (AppConfig.IsNotFalse("keyboard_boot_lid")) flags.Add(AuraDev19b6.BootLid);
if (AppConfig.IsNotFalse("keyboard_sleep_lid")) flags.Add(AuraDev19b6.SleepLid);
if (AppConfig.IsNotFalse("keyboard_shutdown_lid")) flags.Add(AuraDev19b6.ShutdownLid);
// Logo
if (AppConfig.IsNotFalse("keyboard_awake_logo")) flags.Add(AuraDev19b6.AwakeLogo);
if (AppConfig.IsNotFalse("keyboard_boot_logo")) flags.Add(AuraDev19b6.BootLogo);
if (AppConfig.IsNotFalse("keyboard_sleep_logo")) flags.Add(AuraDev19b6.SleepLogo);
if (AppConfig.IsNotFalse("keyboard_shutdown_logo")) flags.Add(AuraDev19b6.ShutdownLogo);
byte[] msg = AuraDev19b6Extensions.ToBytes(flags.ToArray());
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{ {
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
device.WriteFeatureData(msg);
Logger.WriteLine("USB-KB " + device.Attributes.ProductHexId + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF")) List<AuraDev19b6> flags = new();
Program.acpi.TUFKeyboardPower(
flags.Contains(AuraDev19b6.AwakeKeyb), // Keyboard
flags.Contains(AuraDev19b6.BootKeyb), if (AppConfig.IsNotFalse("keyboard_awake")) flags.Add(AuraDev19b6.AwakeKeyb);
flags.Contains(AuraDev19b6.SleepKeyb), if (AppConfig.IsNotFalse("keyboard_boot")) flags.Add(AuraDev19b6.BootKeyb);
flags.Contains(AuraDev19b6.ShutdownKeyb)); if (AppConfig.IsNotFalse("keyboard_sleep")) flags.Add(AuraDev19b6.SleepKeyb);
if (AppConfig.IsNotFalse("keyboard_shutdown")) flags.Add(AuraDev19b6.ShutdownKeyb);
// Lightbar
if (AppConfig.IsNotFalse("keyboard_awake_bar")) flags.Add(AuraDev19b6.AwakeBar);
if (AppConfig.IsNotFalse("keyboard_boot_bar")) flags.Add(AuraDev19b6.BootBar);
if (AppConfig.IsNotFalse("keyboard_sleep_bar")) flags.Add(AuraDev19b6.SleepBar);
if (AppConfig.IsNotFalse("keyboard_shutdown_bar")) flags.Add(AuraDev19b6.ShutdownBar);
// Lid
if (AppConfig.IsNotFalse("keyboard_awake_lid")) flags.Add(AuraDev19b6.AwakeLid);
if (AppConfig.IsNotFalse("keyboard_boot_lid")) flags.Add(AuraDev19b6.BootLid);
if (AppConfig.IsNotFalse("keyboard_sleep_lid")) flags.Add(AuraDev19b6.SleepLid);
if (AppConfig.IsNotFalse("keyboard_shutdown_lid")) flags.Add(AuraDev19b6.ShutdownLid);
// Logo
if (AppConfig.IsNotFalse("keyboard_awake_logo")) flags.Add(AuraDev19b6.AwakeLogo);
if (AppConfig.IsNotFalse("keyboard_boot_logo")) flags.Add(AuraDev19b6.BootLogo);
if (AppConfig.IsNotFalse("keyboard_sleep_logo")) flags.Add(AuraDev19b6.SleepLogo);
if (AppConfig.IsNotFalse("keyboard_shutdown_logo")) flags.Add(AuraDev19b6.ShutdownLogo);
byte[] msg = AuraDev19b6Extensions.ToBytes(flags.ToArray());
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
device.WriteFeatureData(msg);
Logger.WriteLine("USB-KB " + device.Attributes.ProductHexId + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardPower(
flags.Contains(AuraDev19b6.AwakeKeyb),
flags.Contains(AuraDev19b6.BootKeyb),
flags.Contains(AuraDev19b6.SleepKeyb),
flags.Contains(AuraDev19b6.ShutdownKeyb));
});
} }
@@ -367,44 +372,48 @@ namespace GHelper
public static void ApplyAura() public static void ApplyAura()
{ {
Mode = AppConfig.Get("aura_mode"); Task.Run(async () =>
Speed = AppConfig.Get("aura_speed");
SetColor(AppConfig.Get("aura_color"));
SetColor2(AppConfig.Get("aura_color2"));
int _speed;
switch (Speed)
{ {
case 1:
_speed = 0xeb;
break;
case 2:
_speed = 0xf5;
break;
default:
_speed = 0xe1;
break;
}
byte[] msg = AuraMessage(Mode, Color1, Color2, _speed); Mode = AppConfig.Get("aura_mode");
var devices = GetHidDevices(deviceIds); Speed = AppConfig.Get("aura_speed");
SetColor(AppConfig.Get("aura_color"));
SetColor2(AppConfig.Get("aura_color2"));
foreach (HidDevice device in devices) int _speed;
{
device.OpenDevice(); switch (Speed)
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{ {
device.WriteFeatureData(msg); case 1:
device.WriteFeatureData(MESSAGE_SET); _speed = 0xeb;
device.WriteFeatureData(MESSAGE_APPLY); break;
Logger.WriteLine("USB-KB " + device.Capabilities.FeatureReportByteLength + "|" + device.Capabilities.InputReportByteLength + device.Description + device.DevicePath + ":" + BitConverter.ToString(msg)); case 2:
_speed = 0xf5;
break;
default:
_speed = 0xe1;
break;
} }
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF")) byte[] msg = AuraMessage(Mode, Color1, Color2, _speed);
Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed); var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
device.WriteFeatureData(msg);
device.WriteFeatureData(MESSAGE_SET);
device.WriteFeatureData(MESSAGE_APPLY);
Logger.WriteLine("USB-KB " + device.Capabilities.FeatureReportByteLength + "|" + device.Capabilities.InputReportByteLength + device.Description + device.DevicePath + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed);
});
} }

View File

@@ -238,7 +238,7 @@ namespace GHelper.Display
//Fallback scenario //Fallback scenario
if (iRet != 0) if (iRet != 0)
{ {
Thread.Sleep(1000); Thread.Sleep(500);
iRet = ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero); iRet = ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
Logger.WriteLine("Screen = " + frequency.ToString() + "Hz : " + (iRet == 0 ? "OK" : iRet)); Logger.WriteLine("Screen = " + frequency.ToString() + "Hz : " + (iRet == 0 ? "OK" : iRet));
} }

66
app/Extra.Designer.cs generated
View File

@@ -137,7 +137,7 @@ namespace GHelper
panelServices.Controls.Add(labelServices); panelServices.Controls.Add(labelServices);
panelServices.Controls.Add(buttonServices); panelServices.Controls.Add(buttonServices);
panelServices.Dock = DockStyle.Top; panelServices.Dock = DockStyle.Top;
panelServices.Location = new Point(15, 1236); panelServices.Location = new Point(15, 1216);
panelServices.Name = "panelServices"; panelServices.Name = "panelServices";
panelServices.Size = new Size(983, 75); panelServices.Size = new Size(983, 75);
panelServices.TabIndex = 3; panelServices.TabIndex = 3;
@@ -235,15 +235,17 @@ namespace GHelper
panelBindings.Location = new Point(15, 65); panelBindings.Location = new Point(15, 65);
panelBindings.Name = "panelBindings"; panelBindings.Name = "panelBindings";
panelBindings.Padding = new Padding(0, 0, 10, 5); panelBindings.Padding = new Padding(0, 0, 10, 5);
panelBindings.Size = new Size(983, 325); panelBindings.Size = new Size(983, 305);
panelBindings.TabIndex = 5; panelBindings.TabIndex = 5;
// //
// tableBindings // tableBindings
// //
tableBindings.AutoSize = true;
tableBindings.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableBindings.ColumnCount = 3; tableBindings.ColumnCount = 3;
tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15.4649944F)); tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15.45389F));
tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40.97453F)); tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40.94511F));
tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 43.6323357F)); tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 43.6010056F));
tableBindings.Controls.Add(label1, 0, 5); tableBindings.Controls.Add(label1, 0, 5);
tableBindings.Controls.Add(textBox1, 2, 1); tableBindings.Controls.Add(textBox1, 2, 1);
tableBindings.Controls.Add(textM1, 2, 0); tableBindings.Controls.Add(textM1, 2, 0);
@@ -268,19 +270,19 @@ namespace GHelper
tableBindings.Name = "tableBindings"; tableBindings.Name = "tableBindings";
tableBindings.Padding = new Padding(16, 12, 0, 12); tableBindings.Padding = new Padding(16, 12, 0, 12);
tableBindings.RowCount = 6; tableBindings.RowCount = 6;
tableBindings.RowStyles.Add(new RowStyle(SizeType.Absolute, 51F)); tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle(SizeType.Absolute, 51F)); tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle(SizeType.Absolute, 51F)); tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle(SizeType.Absolute, 51F)); tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle(SizeType.Absolute, 49F)); tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle(SizeType.Absolute, 21F)); tableBindings.RowStyles.Add(new RowStyle());
tableBindings.Size = new Size(973, 320); tableBindings.Size = new Size(973, 300);
tableBindings.TabIndex = 12; tableBindings.TabIndex = 12;
// //
// label1 // label1
// //
label1.AutoSize = true; label1.AutoSize = true;
label1.Location = new Point(16, 265); label1.Location = new Point(16, 242);
label1.Margin = new Padding(0); label1.Margin = new Padding(0);
label1.Name = "label1"; label1.Name = "label1";
label1.Padding = new Padding(5, 10, 0, 0); label1.Padding = new Padding(5, 10, 0, 0);
@@ -291,7 +293,7 @@ namespace GHelper
// textBox1 // textBox1
// //
textBox1.Dock = DockStyle.Top; textBox1.Dock = DockStyle.Top;
textBox1.Location = new Point(558, 66); textBox1.Location = new Point(558, 61);
textBox1.Margin = new Padding(4, 3, 4, 3); textBox1.Margin = new Padding(4, 3, 4, 3);
textBox1.Name = "textBox1"; textBox1.Name = "textBox1";
textBox1.PlaceholderText = "action"; textBox1.PlaceholderText = "action";
@@ -339,7 +341,7 @@ namespace GHelper
comboM4.Dock = DockStyle.Top; comboM4.Dock = DockStyle.Top;
comboM4.FormattingEnabled = true; comboM4.FormattingEnabled = true;
comboM4.Items.AddRange(new object[] { Strings.PerformanceMode, Strings.OpenGHelper, Strings.Custom }); comboM4.Items.AddRange(new object[] { Strings.PerformanceMode, Strings.OpenGHelper, Strings.Custom });
comboM4.Location = new Point(167, 168); comboM4.Location = new Point(167, 153);
comboM4.Margin = new Padding(4, 3, 4, 3); comboM4.Margin = new Padding(4, 3, 4, 3);
comboM4.Name = "comboM4"; comboM4.Name = "comboM4";
comboM4.Size = new Size(383, 40); comboM4.Size = new Size(383, 40);
@@ -352,7 +354,7 @@ namespace GHelper
comboM3.Dock = DockStyle.Top; comboM3.Dock = DockStyle.Top;
comboM3.FormattingEnabled = true; comboM3.FormattingEnabled = true;
comboM3.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom }); comboM3.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });
comboM3.Location = new Point(167, 117); comboM3.Location = new Point(167, 107);
comboM3.Margin = new Padding(4, 3, 4, 3); comboM3.Margin = new Padding(4, 3, 4, 3);
comboM3.Name = "comboM3"; comboM3.Name = "comboM3";
comboM3.Size = new Size(383, 40); comboM3.Size = new Size(383, 40);
@@ -361,7 +363,7 @@ namespace GHelper
// textM4 // textM4
// //
textM4.Dock = DockStyle.Top; textM4.Dock = DockStyle.Top;
textM4.Location = new Point(558, 168); textM4.Location = new Point(558, 153);
textM4.Margin = new Padding(4, 3, 4, 3); textM4.Margin = new Padding(4, 3, 4, 3);
textM4.Name = "textM4"; textM4.Name = "textM4";
textM4.PlaceholderText = "action"; textM4.PlaceholderText = "action";
@@ -371,7 +373,7 @@ namespace GHelper
// textM3 // textM3
// //
textM3.Dock = DockStyle.Top; textM3.Dock = DockStyle.Top;
textM3.Location = new Point(558, 117); textM3.Location = new Point(558, 107);
textM3.Margin = new Padding(4, 3, 4, 3); textM3.Margin = new Padding(4, 3, 4, 3);
textM3.Name = "textM3"; textM3.Name = "textM3";
textM3.PlaceholderText = "action"; textM3.PlaceholderText = "action";
@@ -381,7 +383,7 @@ namespace GHelper
// labelM4 // labelM4
// //
labelM4.AutoSize = true; labelM4.AutoSize = true;
labelM4.Location = new Point(16, 165); labelM4.Location = new Point(16, 150);
labelM4.Margin = new Padding(0); labelM4.Margin = new Padding(0);
labelM4.Name = "labelM4"; labelM4.Name = "labelM4";
labelM4.Padding = new Padding(5, 10, 0, 0); labelM4.Padding = new Padding(5, 10, 0, 0);
@@ -392,7 +394,7 @@ namespace GHelper
// labelM3 // labelM3
// //
labelM3.AutoSize = true; labelM3.AutoSize = true;
labelM3.Location = new Point(16, 114); labelM3.Location = new Point(16, 104);
labelM3.Margin = new Padding(0); labelM3.Margin = new Padding(0);
labelM3.Name = "labelM3"; labelM3.Name = "labelM3";
labelM3.Padding = new Padding(5, 10, 0, 0); labelM3.Padding = new Padding(5, 10, 0, 0);
@@ -403,7 +405,7 @@ namespace GHelper
// labelM2 // labelM2
// //
labelM2.AutoSize = true; labelM2.AutoSize = true;
labelM2.Location = new Point(16, 63); labelM2.Location = new Point(16, 58);
labelM2.Margin = new Padding(0); labelM2.Margin = new Padding(0);
labelM2.Name = "labelM2"; labelM2.Name = "labelM2";
labelM2.Padding = new Padding(5, 10, 0, 0); labelM2.Padding = new Padding(5, 10, 0, 0);
@@ -418,7 +420,7 @@ namespace GHelper
comboM2.Dock = DockStyle.Top; comboM2.Dock = DockStyle.Top;
comboM2.FormattingEnabled = true; comboM2.FormattingEnabled = true;
comboM2.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom }); comboM2.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });
comboM2.Location = new Point(167, 66); comboM2.Location = new Point(167, 61);
comboM2.Margin = new Padding(4, 3, 4, 3); comboM2.Margin = new Padding(4, 3, 4, 3);
comboM2.Name = "comboM2"; comboM2.Name = "comboM2";
comboM2.Size = new Size(383, 40); comboM2.Size = new Size(383, 40);
@@ -427,7 +429,7 @@ namespace GHelper
// labelFNF4 // labelFNF4
// //
labelFNF4.AutoSize = true; labelFNF4.AutoSize = true;
labelFNF4.Location = new Point(16, 216); labelFNF4.Location = new Point(16, 196);
labelFNF4.Margin = new Padding(0); labelFNF4.Margin = new Padding(0);
labelFNF4.Name = "labelFNF4"; labelFNF4.Name = "labelFNF4";
labelFNF4.Padding = new Padding(5, 10, 0, 0); labelFNF4.Padding = new Padding(5, 10, 0, 0);
@@ -441,7 +443,7 @@ namespace GHelper
comboFNF4.ButtonColor = Color.FromArgb(255, 255, 255); comboFNF4.ButtonColor = Color.FromArgb(255, 255, 255);
comboFNF4.Dock = DockStyle.Top; comboFNF4.Dock = DockStyle.Top;
comboFNF4.FormattingEnabled = true; comboFNF4.FormattingEnabled = true;
comboFNF4.Location = new Point(167, 219); comboFNF4.Location = new Point(167, 199);
comboFNF4.Margin = new Padding(4, 3, 4, 3); comboFNF4.Margin = new Padding(4, 3, 4, 3);
comboFNF4.Name = "comboFNF4"; comboFNF4.Name = "comboFNF4";
comboFNF4.Size = new Size(383, 40); comboFNF4.Size = new Size(383, 40);
@@ -450,7 +452,7 @@ namespace GHelper
// textFNF4 // textFNF4
// //
textFNF4.Dock = DockStyle.Top; textFNF4.Dock = DockStyle.Top;
textFNF4.Location = new Point(558, 219); textFNF4.Location = new Point(558, 199);
textFNF4.Margin = new Padding(4, 3, 4, 3); textFNF4.Margin = new Padding(4, 3, 4, 3);
textFNF4.Name = "textFNF4"; textFNF4.Name = "textFNF4";
textFNF4.PlaceholderText = "action"; textFNF4.PlaceholderText = "action";
@@ -463,7 +465,7 @@ namespace GHelper
comboFNC.ButtonColor = Color.FromArgb(255, 255, 255); comboFNC.ButtonColor = Color.FromArgb(255, 255, 255);
comboFNC.Dock = DockStyle.Top; comboFNC.Dock = DockStyle.Top;
comboFNC.FormattingEnabled = true; comboFNC.FormattingEnabled = true;
comboFNC.Location = new Point(167, 268); comboFNC.Location = new Point(167, 245);
comboFNC.Margin = new Padding(4, 3, 4, 3); comboFNC.Margin = new Padding(4, 3, 4, 3);
comboFNC.Name = "comboFNC"; comboFNC.Name = "comboFNC";
comboFNC.Size = new Size(383, 40); comboFNC.Size = new Size(383, 40);
@@ -472,7 +474,7 @@ namespace GHelper
// textFNC // textFNC
// //
textFNC.Dock = DockStyle.Top; textFNC.Dock = DockStyle.Top;
textFNC.Location = new Point(558, 268); textFNC.Location = new Point(558, 245);
textFNC.Margin = new Padding(4, 3, 4, 3); textFNC.Margin = new Padding(4, 3, 4, 3);
textFNC.Name = "textFNC"; textFNC.Name = "textFNC";
textFNC.PlaceholderText = "action"; textFNC.PlaceholderText = "action";
@@ -526,7 +528,7 @@ namespace GHelper
panelBacklightHeader.Controls.Add(pictureBacklight); panelBacklightHeader.Controls.Add(pictureBacklight);
panelBacklightHeader.Controls.Add(labelBacklightTitle); panelBacklightHeader.Controls.Add(labelBacklightTitle);
panelBacklightHeader.Dock = DockStyle.Top; panelBacklightHeader.Dock = DockStyle.Top;
panelBacklightHeader.Location = new Point(15, 390); panelBacklightHeader.Location = new Point(15, 370);
panelBacklightHeader.Name = "panelBacklightHeader"; panelBacklightHeader.Name = "panelBacklightHeader";
panelBacklightHeader.Padding = new Padding(10, 5, 10, 5); panelBacklightHeader.Padding = new Padding(10, 5, 10, 5);
panelBacklightHeader.Size = new Size(983, 50); panelBacklightHeader.Size = new Size(983, 50);
@@ -572,7 +574,7 @@ namespace GHelper
panelBacklight.Controls.Add(panelXMG); panelBacklight.Controls.Add(panelXMG);
panelBacklight.Controls.Add(tableBacklight); panelBacklight.Controls.Add(tableBacklight);
panelBacklight.Dock = DockStyle.Top; panelBacklight.Dock = DockStyle.Top;
panelBacklight.Location = new Point(15, 440); panelBacklight.Location = new Point(15, 420);
panelBacklight.Name = "panelBacklight"; panelBacklight.Name = "panelBacklight";
panelBacklight.Padding = new Padding(0, 5, 0, 5); panelBacklight.Padding = new Padding(0, 5, 0, 5);
panelBacklight.Size = new Size(983, 402); panelBacklight.Size = new Size(983, 402);
@@ -961,7 +963,7 @@ namespace GHelper
panelSettingsHeader.Controls.Add(pictureSettings); panelSettingsHeader.Controls.Add(pictureSettings);
panelSettingsHeader.Controls.Add(labelSettings); panelSettingsHeader.Controls.Add(labelSettings);
panelSettingsHeader.Dock = DockStyle.Top; panelSettingsHeader.Dock = DockStyle.Top;
panelSettingsHeader.Location = new Point(15, 842); panelSettingsHeader.Location = new Point(15, 822);
panelSettingsHeader.Name = "panelSettingsHeader"; panelSettingsHeader.Name = "panelSettingsHeader";
panelSettingsHeader.Padding = new Padding(10, 5, 10, 5); panelSettingsHeader.Padding = new Padding(10, 5, 10, 5);
panelSettingsHeader.Size = new Size(983, 50); panelSettingsHeader.Size = new Size(983, 50);
@@ -1013,7 +1015,7 @@ namespace GHelper
panelSettings.Controls.Add(checkGpuApps); panelSettings.Controls.Add(checkGpuApps);
panelSettings.Controls.Add(checkFnLock); panelSettings.Controls.Add(checkFnLock);
panelSettings.Dock = DockStyle.Top; panelSettings.Dock = DockStyle.Top;
panelSettings.Location = new Point(15, 892); panelSettings.Location = new Point(15, 872);
panelSettings.Name = "panelSettings"; panelSettings.Name = "panelSettings";
panelSettings.Padding = new Padding(20, 5, 10, 5); panelSettings.Padding = new Padding(20, 5, 10, 5);
panelSettings.Size = new Size(983, 344); panelSettings.Size = new Size(983, 344);
@@ -1031,7 +1033,6 @@ namespace GHelper
checkAutoToggleClamshellMode.TabIndex = 58; checkAutoToggleClamshellMode.TabIndex = 58;
checkAutoToggleClamshellMode.Text = "Auto Toggle Clamshell Mode"; checkAutoToggleClamshellMode.Text = "Auto Toggle Clamshell Mode";
checkAutoToggleClamshellMode.UseVisualStyleBackColor = true; checkAutoToggleClamshellMode.UseVisualStyleBackColor = true;
checkAutoToggleClamshellMode.CheckedChanged += checkAutoToggleClamshellMode_CheckedChanged;
// //
// checkAutoApplyWindowsPowerMode // checkAutoApplyWindowsPowerMode
// //
@@ -1159,6 +1160,7 @@ namespace GHelper
((System.ComponentModel.ISupportInitialize)pictureBindings).EndInit(); ((System.ComponentModel.ISupportInitialize)pictureBindings).EndInit();
((System.ComponentModel.ISupportInitialize)pictureHelp).EndInit(); ((System.ComponentModel.ISupportInitialize)pictureHelp).EndInit();
panelBindings.ResumeLayout(false); panelBindings.ResumeLayout(false);
panelBindings.PerformLayout();
tableBindings.ResumeLayout(false); tableBindings.ResumeLayout(false);
tableBindings.PerformLayout(); tableBindings.PerformLayout();
tableKeys.ResumeLayout(false); tableKeys.ResumeLayout(false);

View File

@@ -11,6 +11,7 @@ namespace GHelper
{ {
ScreenControl screenControl = new ScreenControl(); ScreenControl screenControl = new ScreenControl();
ClamshellModeControl clamshellControl = new ClamshellModeControl();
Dictionary<string, string> customActions = new Dictionary<string, string> Dictionary<string, string> customActions = new Dictionary<string, string>
{ {
@@ -123,6 +124,21 @@ namespace GHelper
customActions.Add("screenpad_up", Properties.Strings.ScreenPadUp); customActions.Add("screenpad_up", Properties.Strings.ScreenPadUp);
} }
if (InputDispatcher.NoMKeys())
{
labelM1.Text = "FN+F2";
labelM2.Text = "FN+F3";
labelM3.Text = "FN+F4";
labelM4.Visible = comboM4.Visible = textM4.Visible = false;
labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;
}
if (Program.acpi.DeviceGet(AsusACPI.GPUEco) < 0)
{
checkGpuApps.Visible = false;
checkUSBC.Visible = false;
}
InitTheme(); InitTheme();
SetKeyCombo(comboM1, textM1, "m1"); SetKeyCombo(comboM1, textM1, "m1");
@@ -211,8 +227,9 @@ namespace GHelper
} }
} }
//checkAutoToggleClamshellMode.Visible = clamshellControl.IsExternalDisplayConnected();
checkAutoToggleClamshellMode.Checked = AppConfig.Is("toggle_clamshell_mode"); checkAutoToggleClamshellMode.Checked = AppConfig.Is("toggle_clamshell_mode");
checkAutoToggleClamshellMode.CheckedChanged += checkAutoToggleClamshellMode_CheckedChanged;
checkTopmost.Checked = AppConfig.Is("topmost"); checkTopmost.Checked = AppConfig.Is("topmost");
checkTopmost.CheckedChanged += CheckTopmost_CheckedChanged; ; checkTopmost.CheckedChanged += CheckTopmost_CheckedChanged; ;
@@ -471,11 +488,19 @@ namespace GHelper
AppConfig.Set("auto_apply_power_plan", checkAutoApplyWindowsPowerMode.Checked ? 1 : 0); AppConfig.Set("auto_apply_power_plan", checkAutoApplyWindowsPowerMode.Checked ? 1 : 0);
} }
private void checkAutoToggleClamshellMode_CheckedChanged(object sender, EventArgs e) private void checkAutoToggleClamshellMode_CheckedChanged(object? sender, EventArgs e)
{ {
AppConfig.Set("toggle_clamshell_mode", checkAutoToggleClamshellMode.Checked ? 1 : 0); AppConfig.Set("toggle_clamshell_mode", checkAutoToggleClamshellMode.Checked ? 1 : 0);
ClamshellModeControl ctrl = new ClamshellModeControl();
ctrl.ToggleLidAction(); if (checkAutoToggleClamshellMode.Checked)
{
clamshellControl.ToggleLidAction();
}
else
{
ClamshellModeControl.DisableClamshellMode();
}
} }
} }
} }

View File

@@ -15,7 +15,7 @@
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly> <ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks> <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<AssemblyVersion>0.100</AssemblyVersion> <AssemblyVersion>0.101</AssemblyVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -177,7 +177,7 @@ namespace GHelper.Gpu
{ {
bool GpuAuto = AppConfig.Is("gpu_auto"); bool GpuAuto = AppConfig.Is("gpu_auto");
bool ForceGPU = AppConfig.ContainsModel("503"); bool ForceGPU = AppConfig.ContainsModel("503") || AppConfig.Is("gpu_fix");
int GpuMode = AppConfig.Get("gpu_mode"); int GpuMode = AppConfig.Get("gpu_mode");
@@ -321,5 +321,16 @@ namespace GHelper.Gpu
} }
} }
// Manually forcing standard mode on shutdown/hibernate for some exotic cases
// https://github.com/seerge/g-helper/pull/855
public void StandardModeFix()
{
if (!AppConfig.Is("gpu_fix")) return; // No config entry
if (Program.acpi.DeviceGet(AsusACPI.GPUMux) == 0) return; // Ultimate mode
Logger.WriteLine("Forcing Standard Mode on shutdown / hibernation");
Program.acpi.SetGPUEco(0);
}
} }
} }

View File

@@ -39,24 +39,38 @@ namespace GHelper.Helpers
return SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online; return SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online;
} }
public bool IsInClamshellMode() public bool IsClamshellReady()
{ {
return IsExternalDisplayConnected() && IsChargerConnected(); return IsExternalDisplayConnected() && IsChargerConnected();
} }
public void ToggleLidAction() public void ToggleLidAction()
{ {
if (IsInClamshellMode() && IsClamshellEnabled()) if (!IsClamshellEnabled())
{ {
PowerNative.SetLidAction(0, true); return;
Logger.WriteLine("Engaging Clamshell Mode"); }
if (IsClamshellReady())
{
EnableClamshellMode();
} }
else else
{ {
PowerNative.SetLidAction(1, true); DisableClamshellMode();
Logger.WriteLine("Disengaging Clamshell Mode");
} }
} }
public static void DisableClamshellMode()
{
PowerNative.SetLidAction(1, true);
Logger.WriteLine("Disengaging Clamshell Mode");
}
public static void EnableClamshellMode()
{
PowerNative.SetLidAction(0, true);
Logger.WriteLine("Engaging Clamshell Mode");
}
public void UnregisterDisplayEvents() public void UnregisterDisplayEvents()
{ {

View File

@@ -148,6 +148,13 @@ namespace GHelper.Input
return AppConfig.ContainsModel("TUF") && !AppConfig.ContainsModel("FA506"); return AppConfig.ContainsModel("TUF") && !AppConfig.ContainsModel("FA506");
} }
public static bool NoMKeys()
{
return AppConfig.ContainsModel("Z13") ||
AppConfig.ContainsModel("FA506") ||
AppConfig.ContainsModel("FX506");
}
public void KeyPressed(object sender, KeyPressedEventArgs e) public void KeyPressed(object sender, KeyPressedEventArgs e)
{ {
@@ -155,7 +162,7 @@ namespace GHelper.Input
{ {
Logger.WriteLine(e.Key.ToString()); Logger.WriteLine(e.Key.ToString());
if (AppConfig.ContainsModel("Z13") || AppConfig.ContainsModel("FA506")) if (NoMKeys())
{ {
switch (e.Key) switch (e.Key)
{ {

View File

@@ -100,6 +100,10 @@ namespace GHelper
// Subscribing for system power change events // Subscribing for system power change events
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged; SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
SystemEvents.SessionEnding += SystemEvents_SessionEnding;
clamshellControl.RegisterDisplayEvents(); clamshellControl.RegisterDisplayEvents();
clamshellControl.ToggleLidAction(); clamshellControl.ToggleLidAction();
@@ -117,7 +121,19 @@ namespace GHelper
} }
private static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
gpuControl.StandardModeFix();
}
private static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
if (e.Reason == SessionSwitchReason.SessionLogon || e.Reason == SessionSwitchReason.SessionUnlock)
{
Logger.WriteLine("Session:" + e.Reason.ToString());
screenControl.AutoScreen();
}
}
static void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) static void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{ {
@@ -178,8 +194,12 @@ namespace GHelper
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{ {
Logger.WriteLine("Power Mode:" + e.Mode.ToString());
if (e.Mode == PowerModes.Suspend) gpuControl.StandardModeFix();
if (SystemInformation.PowerStatus.PowerLineStatus == isPlugged) return; if (SystemInformation.PowerStatus.PowerLineStatus == isPlugged) return;
Logger.WriteLine("Power Mode Changed");
SetAutoModes(true); SetAutoModes(true);
} }

View File

@@ -402,7 +402,7 @@
<value>Nuevas actualizaciones</value> <value>Nuevas actualizaciones</value>
</data> </data>
<data name="NoNewUpdates" xml:space="preserve"> <data name="NoNewUpdates" xml:space="preserve">
<value>No hay nuevas actualizaciones</value> <value>No hay actualizaciones</value>
</data> </data>
<data name="OpenGHelper" xml:space="preserve"> <data name="OpenGHelper" xml:space="preserve">
<value>Abrir ventana G-Helper</value> <value>Abrir ventana G-Helper</value>

View File

@@ -208,7 +208,7 @@
<value>Limite Ricarica Batteria</value> <value>Limite Ricarica Batteria</value>
</data> </data>
<data name="BatteryHealth" xml:space="preserve"> <data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value> <value>Salute Batteria</value>
</data> </data>
<data name="BiosAndDriverUpdates" xml:space="preserve"> <data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Aggiornamenti Driver e BIOS</value> <value>Aggiornamenti Driver e BIOS</value>
@@ -232,7 +232,7 @@
<value>Colore</value> <value>Colore</value>
</data> </data>
<data name="CPUBoost" xml:space="preserve"> <data name="CPUBoost" xml:space="preserve">
<value>CPU Boost</value> <value>Boost CPU</value>
</data> </data>
<data name="Custom" xml:space="preserve"> <data name="Custom" xml:space="preserve">
<value>Personalizzato</value> <value>Personalizzato</value>

View File

@@ -208,7 +208,7 @@
<value>Limit ładowania baterii</value> <value>Limit ładowania baterii</value>
</data> </data>
<data name="BatteryHealth" xml:space="preserve"> <data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value> <value>Stan baterii</value>
</data> </data>
<data name="BiosAndDriverUpdates" xml:space="preserve"> <data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Aktualizacje BIOS i sterowników</value> <value>Aktualizacje BIOS i sterowników</value>
@@ -294,7 +294,7 @@ Nadal chcesz kontynuować?</value>
<value>Wentylatory i moc</value> <value>Wentylatory i moc</value>
</data> </data>
<data name="FanSpeed" xml:space="preserve"> <data name="FanSpeed" xml:space="preserve">
<value>Wentylator</value> <value>Went</value>
</data> </data>
<data name="FansPower" xml:space="preserve"> <data name="FansPower" xml:space="preserve">
<value>Dostosuj</value> <value>Dostosuj</value>

View File

@@ -208,7 +208,7 @@
<value>Ліміт заряду батареї</value> <value>Ліміт заряду батареї</value>
</data> </data>
<data name="BatteryHealth" xml:space="preserve"> <data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value> <value>Стан батареї</value>
</data> </data>
<data name="BiosAndDriverUpdates" xml:space="preserve"> <data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Оновлення BIOS та драйверів</value> <value>Оновлення BIOS та драйверів</value>

View File

@@ -199,7 +199,7 @@
<value>唤醒时</value> <value>唤醒时</value>
</data> </data>
<data name="BacklightTimeout" xml:space="preserve"> <data name="BacklightTimeout" xml:space="preserve">
<value>插电/电池时背光时间 (0表示长亮)</value> <value>插电/电池时熄灭时间(0表示长亮</value>
</data> </data>
<data name="Balanced" xml:space="preserve"> <data name="Balanced" xml:space="preserve">
<value>平衡模式</value> <value>平衡模式</value>
@@ -208,7 +208,7 @@
<value>电池充电限制</value> <value>电池充电限制</value>
</data> </data>
<data name="BatteryHealth" xml:space="preserve"> <data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value> <value>电池健康</value>
</data> </data>
<data name="BiosAndDriverUpdates" xml:space="preserve"> <data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS 和驱动程序更新</value> <value>BIOS 和驱动程序更新</value>
@@ -495,7 +495,7 @@
<value>切换 Aura 模式</value> <value>切换 Aura 模式</value>
</data> </data>
<data name="ToggleClamshellMode" xml:space="preserve"> <data name="ToggleClamshellMode" xml:space="preserve">
<value>Auto Toggle Clamshell Mode</value> <value>自动启用外接显示器模式</value>
</data> </data>
<data name="ToggleFnLock" xml:space="preserve"> <data name="ToggleFnLock" xml:space="preserve">
<value>切换 Fn 锁定</value> <value>切换 Fn 锁定</value>

View File

@@ -208,7 +208,7 @@
<value>電池充電上限</value> <value>電池充電上限</value>
</data> </data>
<data name="BatteryHealth" xml:space="preserve"> <data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value> <value>電池健康度</value>
</data> </data>
<data name="BiosAndDriverUpdates" xml:space="preserve"> <data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS與驅動程式更新 Updates</value> <value>BIOS與驅動程式更新 Updates</value>

View File

@@ -125,7 +125,11 @@ You can find them under ``%AppData%\GHelper`` folder. Please include them when p
Open app, and uncheck and check again "run on startup". If it still doesn't help (by some reason), you can try to manually edit "GHelper" task in windows Task Scheduler, and add couple of seconds delay to start. Open app, and uncheck and check again "run on startup". If it still doesn't help (by some reason), you can try to manually edit "GHelper" task in windows Task Scheduler, and add couple of seconds delay to start.
#### How do I uninstall G-helper? #### How do I uninstall G-helper?
G-helper is a single exe, and it doesn't install anything in the system. To remove it - you can simply delete exe :) If you have applied any custom fan profiles or PPTs - before removing I would recommend selecting your favorite performance mode (for example balanced) and clicking "Factory defaults" under Fans + Power. G-helper is a single exe, and it doesn't install anything in the system. To remove it - you can simply delete exe :) If you have applied any custom fan profiles or PPTs - before removing I would recommend selecting your
favorite performance mode (for example balanced) and clicking "Factory defaults" under Fans + Power.
#### Can I undervolt my CPU ?
Currently you can undervolt AMD CPUs. If your model supports that - you will see undervolting slider under ``Fans+Power -> Advanced``. If you don't see slider there, it means your CPU doesn't support undervolting. Full list of models that suppor that [can be found here](https://github.com/seerge/g-helper/discussions/736)
#### I have G14 2023 and my GPU refuses to disable/enable #### I have G14 2023 and my GPU refuses to disable/enable
It seem to be an issue in older BIOS versions. As [users report](https://github.com/seerge/g-helper/issues/680) - latest BIOS 310 (installable via myasus / g-helper -> updates) resolves all issues :) So please update. It seem to be an issue in older BIOS versions. As [users report](https://github.com/seerge/g-helper/issues/680) - latest BIOS 310 (installable via myasus / g-helper -> updates) resolves all issues :) So please update.
@@ -219,6 +223,12 @@ Full list of keycodes https://learn.microsoft.com/en-us/windows/win32/inputdev/v
![Screenshot 2023-07-17 192155](https://github.com/seerge/g-helper/assets/5920850/e450e124-1589-4787-bce8-7c37ffe72fbd) ![Screenshot 2023-07-17 192155](https://github.com/seerge/g-helper/assets/5920850/e450e124-1589-4787-bce8-7c37ffe72fbd)
### Force Standard mode on shutdown / hibernation
In some rare cases G14 2023 seem to have issues with enabling / disabling dGPU - i.e. Eco mode. Till we wait for a fix from asus on BIOS level, one of the proposed solutions is to always shutdown laptop in Standard mode (then everything seem to work fine). To enable "forced" Standard mode on shutdown add following line to ``%AppData%\GHelper\config.json``
```
"gpu_fix" : 1,
```
### Disable OSD ### Disable OSD
You can disable app's OSD (for performance modes, keyboard backlight, etc) by adding following line to ``%AppData%\GHelper\config.json`` You can disable app's OSD (for performance modes, keyboard backlight, etc) by adding following line to ``%AppData%\GHelper\config.json``
``` ```