Compare commits

...

18 Commits

Author SHA1 Message Date
Serge
5b64f89351 Version bump 2024-08-21 18:43:00 +02:00
Serge
de10360224 Backlight controls for ProArt #2973 2024-08-21 18:38:15 +02:00
Serge
63828e3db7 Cleanup 2024-08-21 18:11:54 +02:00
Serge
8b66e95b8b Backlight modes for old TUFs https://github.com/seerge/g-helper/discussions/2996 2024-08-21 10:38:33 +02:00
Serge
cd930cebf9 Optimus check for varibright toggle https://github.com/seerge/g-helper/issues/2984 2024-08-18 12:35:52 +02:00
Serge
7bdaca93d5 XGM check for Optimized mode https://github.com/seerge/g-helper/issues/2985 2024-08-17 17:24:46 +02:00
Serge
ef6990c528 Backlight controls for new Vivobooks https://github.com/seerge/g-helper/issues/2973 2024-08-17 12:51:41 +02:00
Serge
72f01321ae Main window position tweak #2983 2024-08-16 17:20:05 +02:00
Serge
e6767126c9 Main window position tweak https://github.com/seerge/g-helper/issues/2983 2024-08-16 16:50:41 +02:00
Serge
50f0c82b70 Merge branch 'main' of https://github.com/seerge/g-helper 2024-08-15 11:03:57 +02:00
Serge
12587e222f Backup config reading https://github.com/seerge/g-helper/issues/2978 2024-08-15 11:03:54 +02:00
Serge
dfb51b897e New Crowdin updates (#2975)
* New translations strings.resx (Lithuanian)

* New translations strings.resx (Lithuanian)
2024-08-15 10:20:40 +02:00
Serge
cc36184834 Update README.md 2024-08-15 10:18:03 +02:00
Serge
338a5e85f4 Update README.md 2024-08-14 10:54:34 +02:00
Serge
632ed073a1 New translations strings.resx (French) (#2972) 2024-08-14 09:37:26 +02:00
Serge
07a1ea46c7 Hotkey handling only when Optimization service is not running 2024-08-12 23:22:27 +02:00
Serge
8e0bea59aa GPU setting tweak 2024-08-12 23:19:03 +02:00
Serge
0deccfa47a Limit Dynamic Lighting check only for win 11 https://github.com/seerge/g-helper/issues/2966 2024-08-12 14:22:00 +02:00
12 changed files with 82 additions and 48 deletions

View File

@@ -41,10 +41,19 @@ public static class AppConfig
{ {
config = JsonSerializer.Deserialize<Dictionary<string, object>>(text); config = JsonSerializer.Deserialize<Dictionary<string, object>>(text);
} }
catch catch (Exception ex)
{ {
Logger.WriteLine("Broken config: " + text); Logger.WriteLine($"Broken config: {ex.Message} {text}");
Init(); try
{
text = File.ReadAllText(configFile + ".bak");
config = JsonSerializer.Deserialize<Dictionary<string, object>>(text);
}
catch (Exception exb)
{
Logger.WriteLine($"Broken backup config: {exb.Message} {text}");
Init();
}
} }
} }
else else
@@ -422,7 +431,7 @@ public static class AppConfig
public static bool IsInputBacklight() public static bool IsInputBacklight()
{ {
return ContainsModel("GA503") || IsSlash(); return ContainsModel("GA503") || IsSlash() || IsVivoZenPro();
} }
public static bool IsInvertedFNLock() public static bool IsInvertedFNLock()

View File

@@ -114,8 +114,11 @@ public class AsusACPI
public const int APU_MEM = 0x000600C1; public const int APU_MEM = 0x000600C1;
public const int TUF_KB_BRIGHTNESS = 0x00050021; public const int TUF_KB_BRIGHTNESS = 0x00050021;
public const int VIVO_KB_BRIGHTNESS = 0x0005002F;
public const int TUF_KB = 0x00100056; public const int TUF_KB = 0x00100056;
public const int TUF_KB2 = 0x0010005a; public const int TUF_KB2 = 0x0010005a;
public const int TUF_KB_STATE = 0x00100057; public const int TUF_KB_STATE = 0x00100057;
public const int MicMuteLed = 0x00040017; public const int MicMuteLed = 0x00040017;
@@ -785,6 +788,8 @@ public class AsusACPI
{ {
int param = 0x80 | (brightness & 0x7F); int param = 0x80 | (brightness & 0x7F);
DeviceSet(TUF_KB_BRIGHTNESS, param, "TUF Brightness"); DeviceSet(TUF_KB_BRIGHTNESS, param, "TUF Brightness");
if (AppConfig.IsVivoZenPro()) DeviceSet(VIVO_KB_BRIGHTNESS, param, "VIVO Brightness");
} }
public void TUFKeyboardRGB(AuraMode mode, Color color, int speed, string? log = "TUF RGB") public void TUFKeyboardRGB(AuraMode mode, Color color, int speed, string? log = "TUF RGB")
@@ -800,7 +805,13 @@ public class AsusACPI
setting[5] = (byte)speed; setting[5] = (byte)speed;
int result = DeviceSet(TUF_KB, setting, log); int result = DeviceSet(TUF_KB, setting, log);
if (result != 1) DeviceSet(TUF_KB2, setting, log); if (result != 1)
{
setting[0] = (byte)0xb3;
DeviceSet(TUF_KB2, setting, log);
setting[0] = (byte)0xb4;
DeviceSet(TUF_KB2, setting, log);
}
} }

View File

@@ -709,7 +709,10 @@ namespace GHelper
{ {
using (var amdControl = new AmdGpuControl()) using (var amdControl = new AmdGpuControl())
{ {
amdControl.SetVariBright(checkVariBright.Checked ? 1 : 0); if (NvidiaSmi.GetDisplayActiveStatus()) return; // Skip if Nvidia GPU is active
var status = checkVariBright.Checked ? 1 : 0;
var result = amdControl.SetVariBright(status);
Logger.WriteLine($"VariBright {status}: {result}");
ProcessHelper.KillByName("RadeonSoftware"); ProcessHelper.KillByName("RadeonSoftware");
} }
} }

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.184</AssemblyVersion> <AssemblyVersion>0.185</AssemblyVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -92,7 +92,12 @@ namespace GHelper.Gpu
{ {
if (AppConfig.NoAutoUltimate()) if (AppConfig.NoAutoUltimate())
{ {
Program.acpi.SetGPUEco(0); int standardStatus = Program.acpi.SetGPUEco(0);
if (standardStatus == 0)
{
settings.VisualiseGPUMode();
return;
}
Thread.Sleep(100); Thread.Sleep(100);
} }
status = Program.acpi.DeviceSet(AsusACPI.GPUMux, 0, "GPUMux"); status = Program.acpi.DeviceSet(AsusACPI.GPUMux, 0, "GPUMux");
@@ -222,6 +227,7 @@ namespace GHelper.Gpu
if ((GpuAuto && !IsPlugged()) || (ForceGPU && GpuMode == AsusACPI.GPUModeEco)) if ((GpuAuto && !IsPlugged()) || (ForceGPU && GpuMode == AsusACPI.GPUModeEco))
{ {
if (Program.acpi.IsXGConnected()) return false;
if (HardwareControl.IsUsedGPU()) if (HardwareControl.IsUsedGPU())
{ {
DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertDGPU, Properties.Strings.AlertDGPUTitle, MessageBoxButtons.YesNo); DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertDGPU, Properties.Strings.AlertDGPUTitle, MessageBoxButtons.YesNo);

View File

@@ -32,7 +32,7 @@ public static class NvidiaSmi
public static int GetDefaultMaxGPUPower() public static int GetDefaultMaxGPUPower()
{ {
if (AppConfig.ContainsModel("GU605")) return 125; if (AppConfig.ContainsModel("GU605") || AppConfig.ContainsModel("GA605")) return 125;
if (AppConfig.ContainsModel("GA403")) return 90; if (AppConfig.ContainsModel("GA403")) return 90;
if (AppConfig.ContainsModel("FA607")) return 140; if (AppConfig.ContainsModel("FA607")) return 140;
else return 175; else return 175;

View File

@@ -7,6 +7,8 @@ namespace GHelper.Helpers
public static bool IsEnabled() public static bool IsEnabled()
{ {
if (Environment.OSVersion.Version.Build < 22000) return false;
using var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Lighting"); using var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Lighting");
var registryValueObject = key?.GetValue("AmbientLightingEnabled"); var registryValueObject = key?.GetValue("AmbientLightingEnabled");

View File

@@ -707,9 +707,6 @@ namespace GHelper.Input
case 55: // Arconym case 55: // Arconym
KeyProcess("m6"); KeyProcess("m6");
return; return;
case 136: // FN + F12
if (!AppConfig.IsNoAirplaneMode()) Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Airplane, "Airplane");
return;
case 181: // FN + Numpad Enter case 181: // FN + Numpad Enter
KeyProcess("fne"); KeyProcess("fne");
return; return;
@@ -726,12 +723,6 @@ namespace GHelper.Input
case 158: // Fn + C case 158: // Fn + C
KeyProcess("fnc"); KeyProcess("fnc");
return; return;
case 78: // Fn + ESC
ToggleFnLock();
return;
case 75: // Fn + Arrow Lock
ToggleArrowLock();
return;
case 189: // Tablet mode case 189: // Tablet mode
TabletMode(); TabletMode();
return; return;
@@ -821,6 +812,15 @@ namespace GHelper.Input
case 126: // Fn+F8 emojis popup case 126: // Fn+F8 emojis popup
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.OemSemicolon); KeyboardHook.KeyKeyPress(Keys.LWin, Keys.OemSemicolon);
return; return;
case 78: // Fn + ESC
ToggleFnLock();
return;
case 75: // Fn + Arrow Lock
ToggleArrowLock();
return;
case 136: // FN + F12
if (!AppConfig.IsNoAirplaneMode()) Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Airplane, "Airplane");
return;
} }

View File

@@ -282,19 +282,22 @@ namespace GHelper
} }
else else
{ {
var screen = Screen.PrimaryScreen;
if (screen is null) screen = Screen.FromControl(settingsForm);
settingsForm.Left = Screen.FromControl(settingsForm).WorkingArea.Width - 10 - settingsForm.Width; settingsForm.Location = screen.WorkingArea.Location;
settingsForm.Top = Screen.FromControl(settingsForm).WorkingArea.Height - 10 - settingsForm.Height; settingsForm.Left = screen.WorkingArea.Width - 10 - settingsForm.Width;
settingsForm.Top = screen.WorkingArea.Height - 10 - settingsForm.Height;
settingsForm.Show(); settingsForm.Show();
settingsForm.Activate(); settingsForm.Activate();
settingsForm.Left = Screen.FromControl(settingsForm).WorkingArea.Width - 10 - settingsForm.Width; settingsForm.Left = screen.WorkingArea.Width - 10 - settingsForm.Width;
if (AppConfig.IsAlly()) if (AppConfig.IsAlly())
settingsForm.Top = Math.Max(10, Screen.FromControl(settingsForm).Bounds.Height - 110 - settingsForm.Height); settingsForm.Top = Math.Max(10, screen.Bounds.Height - 110 - settingsForm.Height);
else else
settingsForm.Top = Screen.FromControl(settingsForm).WorkingArea.Height - 10 - settingsForm.Height; settingsForm.Top = screen.WorkingArea.Height - 10 - settingsForm.Height;
settingsForm.VisualiseGPUMode(); settingsForm.VisualiseGPUMode();
} }

View File

@@ -226,7 +226,7 @@
<value>Tout</value> <value>Tout</value>
</data> </data>
<data name="AuraZoneDock" xml:space="preserve"> <data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value> <value>Station d'accueil</value>
</data> </data>
<data name="AuraZoneLogo" xml:space="preserve"> <data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value> <value>Logo</value>
@@ -495,7 +495,7 @@ Voulez-vous continuer ?</value>
<value>Écran</value> <value>Écran</value>
</data> </data>
<data name="LEDStatusIndicators" xml:space="preserve"> <data name="LEDStatusIndicators" xml:space="preserve">
<value>LED Status Indicators</value> <value>Indicateurs d'état LED</value>
</data> </data>
<data name="Lid" xml:space="preserve"> <data name="Lid" xml:space="preserve">
<value>Capot</value> <value>Capot</value>
@@ -507,7 +507,7 @@ Voulez-vous continuer ?</value>
<value>Éclairage</value> <value>Éclairage</value>
</data> </data>
<data name="LockScreen" xml:space="preserve"> <data name="LockScreen" xml:space="preserve">
<value>Lock Screen</value> <value>Écran de verrouillage</value>
</data> </data>
<data name="Logo" xml:space="preserve"> <data name="Logo" xml:space="preserve">
<value>Logo</value> <value>Logo</value>
@@ -585,10 +585,10 @@ Voulez-vous continuer ?</value>
<value>Synchroniser avec le pointeur</value> <value>Synchroniser avec le pointeur</value>
</data> </data>
<data name="Multizone" xml:space="preserve"> <data name="Multizone" xml:space="preserve">
<value>Multi Zone</value> <value>Multi-zones</value>
</data> </data>
<data name="MultizoneStrong" xml:space="preserve"> <data name="MultizoneStrong" xml:space="preserve">
<value>Multi Zone Strong</value> <value>Forte zone multiple</value>
</data> </data>
<data name="Muted" xml:space="preserve"> <data name="Muted" xml:space="preserve">
<value>Son désactivé</value> <value>Son désactivé</value>
@@ -741,7 +741,7 @@ Voulez-vous continuer ?</value>
<value>Allumer l'écran</value> <value>Allumer l'écran</value>
</data> </data>
<data name="ToggleTouchscreen" xml:space="preserve"> <data name="ToggleTouchscreen" xml:space="preserve">
<value>Toggle Touchscreen</value> <value>Activer/désactiver l'écran tactile</value>
</data> </data>
<data name="Touchscreen" xml:space="preserve"> <data name="Touchscreen" xml:space="preserve">
<value/> <value/>

View File

@@ -163,7 +163,7 @@
<value>Taikyti</value> <value>Taikyti</value>
</data> </data>
<data name="ApplyFanCurve" xml:space="preserve"> <data name="ApplyFanCurve" xml:space="preserve">
<value>Taikyti tinkintą aušintuvo kreivę</value> <value>Taikyti tinkintą kreivę</value>
</data> </data>
<data name="ApplyPowerLimits" xml:space="preserve"> <data name="ApplyPowerLimits" xml:space="preserve">
<value>Taikyti galios ribas</value> <value>Taikyti galios ribas</value>
@@ -244,7 +244,7 @@
<value>Automatinis</value> <value>Automatinis</value>
</data> </data>
<data name="AutoRefreshTooltip" xml:space="preserve"> <data name="AutoRefreshTooltip" xml:space="preserve">
<value>Nustato 60Hz, kad taupytų energiją, ir atgal, kai įjungtas į lizdą</value> <value>Nustatomas 60Hz dažn. taupymui, ir atgal, kuomet įkraunama</value>
</data> </data>
<data name="Awake" xml:space="preserve"> <data name="Awake" xml:space="preserve">
<value>Pabudęs</value> <value>Pabudęs</value>
@@ -280,7 +280,7 @@
<value>Įkrovos riba</value> <value>Įkrovos riba</value>
</data> </data>
<data name="BatteryHealth" xml:space="preserve"> <data name="BatteryHealth" xml:space="preserve">
<value>Sveikata</value> <value>Baterijos būklė</value>
</data> </data>
<data name="BatteryLimitFull" xml:space="preserve"> <data name="BatteryLimitFull" xml:space="preserve">
<value>Vienkartinė įkrova iki 100%</value> <value>Vienkartinė įkrova iki 100%</value>
@@ -313,7 +313,7 @@
<value>Ryškumo didinimas</value> <value>Ryškumo didinimas</value>
</data> </data>
<data name="BWTrayIcon" xml:space="preserve"> <data name="BWTrayIcon" xml:space="preserve">
<value>Black and white tray icon</value> <value>Naudoti juodai baltą piktogramą</value>
</data> </data>
<data name="Calibrate" xml:space="preserve"> <data name="Calibrate" xml:space="preserve">
<value>Kalibruoti</value> <value>Kalibruoti</value>
@@ -346,7 +346,7 @@
<value>Išjungti valdiklį</value> <value>Išjungti valdiklį</value>
</data> </data>
<data name="DisableOnLidClose" xml:space="preserve"> <data name="DisableOnLidClose" xml:space="preserve">
<value>Disable on lid close</value> <value>Išjungti uždarius gaubtą</value>
</data> </data>
<data name="DisableOverdrive" xml:space="preserve"> <data name="DisableOverdrive" xml:space="preserve">
<value>Išjungti ekrano pikselių spartinimą</value> <value>Išjungti ekrano pikselių spartinimą</value>
@@ -364,7 +364,7 @@
<value>Tvarkyklės ir programinė įranga</value> <value>Tvarkyklės ir programinė įranga</value>
</data> </data>
<data name="EcoGPUTooltip" xml:space="preserve"> <data name="EcoGPUTooltip" xml:space="preserve">
<value>Išjungia dGPU, kad taupytų energiją</value> <value>Išjungia dGPU akumuliatoriaus taupymui</value>
</data> </data>
<data name="EcoMode" xml:space="preserve"> <data name="EcoMode" xml:space="preserve">
<value>Ekonomiškas</value> <value>Ekonomiškas</value>
@@ -465,7 +465,7 @@ Vis tiek norite tęsti?</value>
<value>Temperatūros tikslas</value> <value>Temperatūros tikslas</value>
</data> </data>
<data name="HibernateAfter" xml:space="preserve"> <data name="HibernateAfter" xml:space="preserve">
<value>Minutės iki miego su akumuliatoriumi (0 IŠJUNGTA)</value> <value>Užmigimo laikas akumuliatoriaus režimu (0 IŠJUNGTA)</value>
</data> </data>
<data name="High" xml:space="preserve"> <data name="High" xml:space="preserve">
<value>Aukštas</value> <value>Aukštas</value>
@@ -483,7 +483,7 @@ Vis tiek norite tęsti?</value>
<value>Klaviatūra</value> <value>Klaviatūra</value>
</data> </data>
<data name="KillGpuApps" xml:space="preserve"> <data name="KillGpuApps" xml:space="preserve">
<value>Sustabdyti visas GPU naudojančias programėles, kai perjungiama į ekonomišką režimą</value> <value>Sustabdyti visas GPU naudojančias programėles, kai perjungiama į ekon. režimą</value>
</data> </data>
<data name="LaptopBacklight" xml:space="preserve"> <data name="LaptopBacklight" xml:space="preserve">
<value>Apšvietimas</value> <value>Apšvietimas</value>
@@ -549,10 +549,10 @@ Vis tiek norite tęsti?</value>
<value>Paveikslėlis</value> <value>Paveikslėlis</value>
</data> </data>
<data name="MaxRefreshTooltip" xml:space="preserve"> <data name="MaxRefreshTooltip" xml:space="preserve">
<value>Maksimalus kadrų dažnis mažesnę delsą</value> <value>Maksimalus kadrų dažnis mažesnei delsai</value>
</data> </data>
<data name="MinRefreshTooltip" xml:space="preserve"> <data name="MinRefreshTooltip" xml:space="preserve">
<value>60Hz kadrų dažnis, kad taupytumėte energiją</value> <value>60Hz kadrų dažnis energijos taupymui</value>
</data> </data>
<data name="Minute" xml:space="preserve"> <data name="Minute" xml:space="preserve">
<value>min.</value> <value>min.</value>
@@ -561,7 +561,7 @@ Vis tiek norite tęsti?</value>
<value>min.</value> <value>min.</value>
</data> </data>
<data name="MouseAngleSnapping" xml:space="preserve"> <data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value> <value>Kampinis fiksavimas</value>
</data> </data>
<data name="MouseAutoPowerOff" xml:space="preserve"> <data name="MouseAutoPowerOff" xml:space="preserve">
<value>Automatiškai išjungti po</value> <value>Automatiškai išjungti po</value>
@@ -570,7 +570,7 @@ Vis tiek norite tęsti?</value>
<value>Klavišo atsakas</value> <value>Klavišo atsakas</value>
</data> </data>
<data name="MouseImportFailed" xml:space="preserve"> <data name="MouseImportFailed" xml:space="preserve">
<value>Import failed. Selected file is not a valid mouse profile or corrutpted.</value> <value>Importuoti nepavyko. Pasirinktas failas nėra galiojantis pelės profilis arba yra sugadintas.</value>
</data> </data>
<data name="MouseLiftOffDistance" xml:space="preserve"> <data name="MouseLiftOffDistance" xml:space="preserve">
<value>Pakilimo atstumas</value> <value>Pakilimo atstumas</value>
@@ -609,10 +609,10 @@ Vis tiek norite tęsti?</value>
<value>Neprijungta</value> <value>Neprijungta</value>
</data> </data>
<data name="Off" xml:space="preserve"> <data name="Off" xml:space="preserve">
<value>Off</value> <value>Išjungta</value>
</data> </data>
<data name="On" xml:space="preserve"> <data name="On" xml:space="preserve">
<value>On</value> <value>Įjungta</value>
</data> </data>
<data name="OneZone" xml:space="preserve"> <data name="OneZone" xml:space="preserve">
<value>One Zone</value> <value>One Zone</value>
@@ -624,10 +624,10 @@ Vis tiek norite tęsti?</value>
<value>Optimizuotas</value> <value>Optimizuotas</value>
</data> </data>
<data name="OptimizedGPUTooltip" xml:space="preserve"> <data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Perjungti į ekonomišką, kai naudojamas akumuliatorius, ir į standartinį, kai įjungtas į lizdą</value> <value>Naudojant akumuliatorių įjungiamas ekon. režimas, įkraunant - stand. režimas</value>
</data> </data>
<data name="OptimizedUSBC" xml:space="preserve"> <data name="OptimizedUSBC" xml:space="preserve">
<value>Neįjungti GPU, kai naudojamas USB-C įkroviklis optimizuotame režime</value> <value>jungti GPU optimizuotame režime, kai naudojamas USB-C įkroviklis</value>
</data> </data>
<data name="Other" xml:space="preserve"> <data name="Other" xml:space="preserve">
<value>Kita</value> <value>Kita</value>
@@ -756,7 +756,7 @@ Vis tiek norite tęsti?</value>
<value>Išjungti naudojant akumuliatorių</value> <value>Išjungti naudojant akumuliatorių</value>
</data> </data>
<data name="UltimateGPUTooltip" xml:space="preserve"> <data name="UltimateGPUTooltip" xml:space="preserve">
<value>Nukreipia ekraną į dGPU, kad maksimizuotų kadrų dažnį</value> <value>Maksimaliai padidinamas kadrų kiekis, nukreipiant ekraną į dGPU</value>
</data> </data>
<data name="UltimateMode" xml:space="preserve"> <data name="UltimateMode" xml:space="preserve">
<value>Maksimalus</value> <value>Maksimalus</value>

View File

@@ -5,7 +5,7 @@
Small and lightweight Armoury Crate alternative for Asus laptops offering almost same functionality without extra load and unnecessary services. Small and lightweight Armoury Crate alternative for Asus laptops offering almost same functionality without extra load and unnecessary services.
Works with all popular models, such as ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, Flow Z13, TUF Series, Strix or Scar Series, ProArt, Vivobook, Zenbook, ROG Ally and many more! Works with all popular models, such as ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, Flow Z13, TUF Series, Strix or Scar Series, ProArt, Vivobook, Zenbook, ROG Ally / Ally X and many more!
# [:floppy_disk:Download](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip) # [:floppy_disk:Download](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
**⭐ If you like the app - please spread the word about it online** **⭐ If you like the app - please spread the word about it online**
@@ -17,7 +17,7 @@ Works with all popular models, such as ROG Zephyrus G14, G15, G16, M16, Flow X13
<a href="https://bit.ly/4c0ZWs9"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-eur.png" height="36" alt="PayPal EUR"></a>&nbsp; <a href="https://bit.ly/4c0ZWs9"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-eur.png" height="36" alt="PayPal EUR"></a>&nbsp;
<a href="https://bit.ly/4aGTyW8"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-usd.png" height="36" alt="PayPal USD"></a>&nbsp; <a href="https://bit.ly/4aGTyW8"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-usd.png" height="36" alt="PayPal USD"></a>&nbsp;
<a href="https://buy.stripe.com/8wM6pt8HbgK50tWbIK"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/stripe.png" height="36" alt="Stripe"></a>&nbsp; <a href="https://buy.stripe.com/8wM6pt8HbgK50tWbIK"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/stripe.png" height="36" alt="Stripe"></a>&nbsp;
<a href="https://buy.stripe.com/8wM6pt8HbgK50tWbIK"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/alipay.png" height="36" alt="Alipay"></a> <a href="https://buy.stripe.com/6oE29dg9D3Xj7Wo28b"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/alipay.png" height="36" alt="Alipay"></a>
</td> </td>
</tr> </tr>
</table> </table>