Compare commits

..

130 Commits

Author SHA1 Message Date
Serge
5570513eeb Merge branch 'main' of https://github.com/seerge/g-helper 2024-11-03 11:02:21 +01:00
Serge
ceb1c9a250 Skip auto-backlight when lid is closed https://github.com/seerge/g-helper/issues/3335 2024-11-03 11:02:18 +01:00
Serge
e942d3fd49 Added website link 2024-10-31 11:10:09 +01:00
Serge
482fe00014 Version bump 2024-10-30 08:37:35 +01:00
Serge
54fdf9231c Custom mode hotkeys https://github.com/seerge/g-helper/issues/3323 2024-10-29 19:46:16 +01:00
Serge
b9be9a9c97 Added FN+F5 keycode for ancient devices https://github.com/seerge/g-helper/discussions/3322 2024-10-29 18:36:48 +01:00
Serge
501d0a1666 Matrix clock position tweak #3304 2024-10-29 18:34:56 +01:00
Serge
a7e50f89ca Cleanup 2024-10-28 16:21:58 +01:00
Serge
083e918086 Fix possible exception in battery fully charged https://github.com/seerge/g-helper/issues/3317 2024-10-28 16:19:05 +01:00
Serge
e6a547dbfd Animematrix clock position tweak https://github.com/seerge/g-helper/issues/3304 2024-10-28 15:23:47 +01:00
Serge
1321b2eb31 Init Screenpad brightness on start https://github.com/seerge/g-helper/issues/3301 2024-10-26 15:10:26 +02:00
Serge
5e96e3e9bc Option to skip PowerMode setting https://github.com/seerge/g-helper/issues/3287 2024-10-25 22:24:21 +02:00
Serge
5e4bd13aa9 Added GX501G to NoWMI list https://github.com/seerge/g-helper/discussions/3300 2024-10-25 22:19:11 +02:00
Serge
f320da9245 GPU mode toast notifications https://github.com/seerge/g-helper/issues/3286 2024-10-23 13:32:30 +02:00
Serge
a024c05bc1 Backlight tweaks 2024-10-23 13:29:12 +02:00
Serge
15501c7845 Animatrix picture editor tweaks https://github.com/seerge/g-helper/issues/3280 2024-10-22 17:49:37 +02:00
Serge
011fdeeb36 Version bump 2024-10-22 17:10:53 +02:00
Serge
3df0aa04de Ctrl+Shift+Alt+F7/F8 to control screenpad brightness https://github.com/seerge/g-helper/issues/3281 2024-10-22 12:08:47 +02:00
Serge
9f364a331c Assigned FN+F to toggle modes on Zenbook DUO https://github.com/seerge/g-helper/issues/3281 2024-10-22 11:44:42 +02:00
Serge
08af10afef Merge branch 'main' of https://github.com/seerge/g-helper 2024-10-22 10:50:09 +02:00
Serge
4ea59d2669 Added UX840 to the list of DUO models https://github.com/seerge/g-helper/issues/3281 2024-10-22 10:50:07 +02:00
Serge
5eb0c1d095 Increased startup delay to 2 seconds https://github.com/seerge/g-helper/issues/3275 2024-10-21 13:38:06 +02:00
Serge
a8c32470b3 Option to override maximum refresh rate #3261 2024-10-15 10:41:48 +02:00
Serge
45709eb7d6 Option to override minimum refresh rate https://github.com/seerge/g-helper/issues/3261 2024-10-14 21:38:04 +02:00
Serge
ecbd926d81 Added Vivobook S16 M5606 to OLED list #3265 2024-10-14 18:48:44 +02:00
Serge
1cca7a5881 Restart input listener if connection was dropped https://github.com/seerge/g-helper/issues/3249 2024-10-13 17:59:23 +02:00
Serge
0d3332faf3 Version bump 2024-10-12 15:42:46 +02:00
Serge
aa74730e12 Toggle between % and Wh for battery charge https://github.com/seerge/g-helper/issues/3246 2024-10-11 18:06:15 +02:00
Serge
9b5e2acf90 Show remaining battery charge in Wh https://github.com/seerge/g-helper/issues/3246 2024-10-11 15:14:36 +02:00
Serge
3fafe63c42 Visual Mode handling 2024-10-11 11:56:39 +02:00
Serge
6c0252156c Option to disable Visual Mode 2024-10-11 11:15:03 +02:00
Serge
3a750c08b5 Added G834JZR to mini-led init list https://github.com/seerge/g-helper/issues/2802 2024-10-11 10:50:56 +02:00
Serge
e28f51cce6 Version bump 2024-10-05 11:35:19 +02:00
dantmnf
b0c48b9e63 IsOLED: Add Zenbook S 14 (Intel), Zenbook S 16 (AMD) (#3203) 2024-10-05 11:32:34 +02:00
Serge
ec17d8cb80 Limits 2024-10-04 18:18:54 +02:00
Serge
42ac2d627c Hide unsupported power limtis https://github.com/seerge/g-helper/discussions/3215 2024-10-04 12:11:09 +02:00
Serge
3c241cafba New translations strings.resx (Lithuanian) (#3197) 2024-10-01 19:24:10 +02:00
Serge
873fcc0591 Skip unsupported Lighting modes #3195 2024-09-30 20:58:24 +02:00
Serge
73d5a0bb90 Cleanup 2024-09-30 18:41:51 +02:00
Serge
ff5ac7de7e Re-apply Ally controller status on every wake up / reboot #3192 2024-09-30 18:41:21 +02:00
Serge
917fe112b8 Skip unsupported Lighting modes https://github.com/seerge/g-helper/issues/3195 2024-09-30 18:24:14 +02:00
Serge
4855733274 Re-apply Ally controller status on every wake up / reboot https://github.com/seerge/g-helper/issues/3192 2024-09-30 14:30:03 +02:00
Serge
740a34fa9c Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-30 12:29:36 +02:00
Serge
534dc3d344 Init OOBE mode https://github.com/seerge/g-helper/pull/3169 2024-09-30 12:29:33 +02:00
Serge
a52a87bcfd New translations strings.resx (Chinese Traditional) (#3180) 2024-09-30 12:26:03 +02:00
Serge
cdeb4951dc Re-apply Ally controller status on every wake up / reboot https://github.com/seerge/g-helper/issues/3192 2024-09-30 12:13:22 +02:00
Serge
77d89505b3 Update GHelper.csproj 2024-09-29 11:49:00 +02:00
Serge
4be790dce0 Update tweaks 2024-09-28 17:39:05 +02:00
Serge
c9698a1613 Strix impact DPI correction https://github.com/seerge/g-helper/issues/3146 2024-09-28 17:30:21 +02:00
Serge
819506e7ee UI Tweaks 2024-09-28 09:31:39 +02:00
Serge
489616d255 Option to disable "gpu_mode_force_set" for GA503 https://github.com/seerge/g-helper/issues/3175 2024-09-26 13:22:21 +02:00
Serge
1103ab70f6 Extra delay when setting Ultimate from Eco https://github.com/seerge/g-helper/issues/3170 2024-09-25 19:48:38 +02:00
Serge
dbf0cbc3ac Dependencies update 2024-09-25 17:48:45 +02:00
Serge
a45d693937 Version bump 2024-09-25 08:15:49 +02:00
Serge
0db49af310 Config writing tweaks 2024-09-24 12:24:20 +02:00
Serge
28daaf9a4c Config writing tweaks 2024-09-24 11:56:18 +02:00
Serge
38d02ee7f9 Minimum possible number of E-Cores https://github.com/seerge/g-helper/issues/3160 2024-09-23 21:06:09 +02:00
Serge
c6d1b29a49 Touchscreen toggle toast tweaks https://github.com/seerge/g-helper/issues/3143 2024-09-23 15:24:28 +02:00
Serge
79cd773632 Version bump 2024-09-22 11:27:50 +02:00
Serge
897de4ed27 Option for Slash sleep animation on lid-close https://github.com/seerge/g-helper/discussions/3145 2024-09-22 10:59:55 +02:00
Serge
afa6dbb542 Flicker free dimming hotkey fix https://github.com/seerge/g-helper/issues/3152 2024-09-22 10:18:28 +02:00
Serge
80fbee2609 Cleanup 2024-09-21 17:53:10 +02:00
Serge
e1c83da19b Option to disable automated mode switching on power source change https://github.com/seerge/g-helper/issues/3139 2024-09-21 17:51:09 +02:00
Serge
59b5888632 Visual Mode tweaks 2024-09-21 12:54:32 +02:00
Serge
cd74c62908 Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-21 12:38:28 +02:00
Serge
000fbe466f Slash Lighting lid close tweak https://github.com/seerge/g-helper/discussions/3145 2024-09-21 12:38:25 +02:00
Serge
ab08bd8ab4 Update README.md 2024-09-20 09:53:30 +02:00
Serge
9f157d323e Battery charge limiter UI fix https://github.com/seerge/g-helper/issues/3138 2024-09-19 23:16:37 +02:00
Serge
9c236ca17b Version bump 2024-09-19 13:25:33 +02:00
Serge
ba8effcaad MicMute Toggle for external hotkey https://github.com/seerge/g-helper/issues/3127 2024-09-18 10:02:21 +02:00
Serge
28f8cc95fd Improved GPU max power reading https://github.com/seerge/g-helper/discussions/3124 2024-09-18 09:50:33 +02:00
Serge
07f1edb02f Visual Mode tweaks 2024-09-18 09:45:01 +02:00
Serge
6758d9224d Set FN+V to change Visual Modes by default 2024-09-17 18:05:18 +02:00
Serge
5e51511df0 Brightness controls tweaks 2024-09-16 23:29:24 +02:00
Serge
e71d283474 Option to save flicker-free dimming per AC/DC state https://github.com/seerge/g-helper/issues/3112 2024-09-16 19:10:36 +02:00
Serge
d0f0bd9155 Added brightness adjustment step 2024-09-16 17:21:22 +02:00
Serge
ef769982e0 Version bump 2024-09-13 19:30:18 +02:00
Nicola
68fb3b10a6 Added GA502IU model wih NoAura Devices (#3099)
Added GA502IU model wih NoAura Devices because has an only static single color keyboard, with no animations; you can only dim it's brightness
2024-09-13 19:29:54 +02:00
Serge
0a89062b52 Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-11 21:30:05 +02:00
Serge
fa4b614bb0 UI Tweaks 2024-09-11 21:30:03 +02:00
Serge
6f526c1e82 Update README.md 2024-09-10 21:12:13 +02:00
Serge
389ee0d132 Updates 2024-09-10 21:11:44 +02:00
Serge
ffd9bf6673 Cleanup 2024-09-09 13:09:30 +02:00
Serge
80f61912f3 Version bump 2024-09-09 13:07:31 +02:00
Serge
2833373f9e System Startup charge limiter 2024-09-09 13:01:34 +02:00
Serge
cf94973419 Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-09 12:33:24 +02:00
Serge
421dc0c05c System Startup charge limiter 2024-09-09 12:33:22 +02:00
Serge
38965bad9f New Crowdin updates (#3081)
* New translations strings.resx (Polish)

* New translations strings.resx (Chinese Traditional)
2024-09-09 09:53:13 +02:00
Serge
d0f1b70c9f Version bump 2024-09-07 17:47:49 +02:00
Serge
2e025edeb5 Screenpad controls cleanup https://github.com/seerge/g-helper/issues/3067 2024-09-07 17:05:57 +02:00
Serge
c69150f4ef Stop SmartDisplayControl on app start 2024-09-07 16:20:12 +02:00
Serge
0a419ac1f6 Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-07 15:04:14 +02:00
Serge
47dcf2a980 Screenpad brightness adjustment values #3067 2024-09-07 15:04:12 +02:00
Serge
1ea3725568 Screenpad brightness tweak https://github.com/seerge/g-helper/issues/3067 2024-09-07 15:03:53 +02:00
Serge
7f44ba0195 Charge limit UI tweaks 2024-09-07 14:00:05 +02:00
Serge
ce01d72db0 Improved Ally Auto Controller mode 2024-09-07 13:56:38 +02:00
Serge
451f290c34 Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-06 13:09:14 +02:00
Serge
2c6d8b86a9 Added GU603 to the list without direct RGB settings 2024-09-06 13:09:12 +02:00
Serge
5c7ba8593f New translations strings.resx (Chinese Simplified) (#3069) 2024-09-05 13:21:01 +02:00
Serge
3cb5f3de0e New Crowdin updates (#3068)
* New translations strings.resx (Spanish)

* New translations strings.resx (German)
2024-09-05 10:07:16 +02:00
Serge
c8a6e79144 New Crowdin updates (#3050)
* New translations strings.resx (Ukrainian)

* New translations strings.resx (Turkish)
2024-09-03 23:46:38 +02:00
Serge
6b97bc1eaf Fixed Slash lighting behavior for lid close https://github.com/seerge/g-helper/issues/3054 2024-09-03 20:52:50 +02:00
Serge
0d2fefb8c4 Added units to backlight timeout inputs https://github.com/seerge/g-helper/pull/3037 2024-09-02 10:47:03 +02:00
Serge
acfce9867e New Crowdin updates (#3041)
* New translations strings.resx (German)

* New translations strings.resx (Chinese Simplified)

* New translations strings.resx (German)

* New translations strings.resx (Romanian)

* New translations strings.resx (French)

* New translations strings.resx (Spanish)

* New translations strings.resx (Danish)

* New translations strings.resx (Hungarian)

* New translations strings.resx (Italian)

* New translations strings.resx (Japanese)

* New translations strings.resx (Korean)

* New translations strings.resx (Lithuanian)

* New translations strings.resx (Polish)

* New translations strings.resx (Portuguese)

* New translations strings.resx (Turkish)

* New translations strings.resx (Ukrainian)

* New translations strings.resx (Chinese Traditional)

* New translations strings.resx (Vietnamese)

* New translations strings.resx (Portuguese, Brazilian)

* New translations strings.resx (Indonesian)

* New translations strings.resx (Ukrainian)
2024-09-02 10:34:31 +02:00
Serge
d1e1b6704d Translation Updates 2024-09-02 10:24:12 +02:00
Serge
5913d4fdd7 Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-02 10:10:24 +02:00
Serge
0fd6693434 Skip Visual Mode init command for Vivobook Default setting https://github.com/seerge/g-helper/issues/3046 2024-09-02 10:10:22 +02:00
Ikko Eltociear Ashimine
e96e37a573 docs: add Japanese README (#3047)
I created Japanese translated README.
2024-09-02 09:46:46 +02:00
Serge
58b5221b3c Version bump 2024-08-31 11:56:57 +02:00
Serge
0192d59524 UI Tweaks 2024-08-31 11:06:42 +02:00
Serge
01cede58b5 UI Tweaks 2024-08-31 10:42:43 +02:00
Serge
3dbbddfa58 Startup counter 2024-08-31 10:03:16 +02:00
Serge
1b898b44d2 Cleanup 2024-08-31 09:52:48 +02:00
Serge
dc7362dab1 Added AsusPTPService to the stop/start list https://github.com/seerge/g-helper/issues/3031 2024-08-30 19:45:47 +02:00
Serge
cbd4a5e27c Exception handling https://github.com/seerge/g-helper/issues/3029 2024-08-29 23:12:34 +02:00
Serge
5e9b002013 Version bump 2024-08-26 10:03:42 +02:00
Serge
5077c30704 Power limits tweak for GA605 https://github.com/seerge/g-helper/issues/3017 2024-08-26 09:51:04 +02:00
Serge
d6363dee85 Shasl Battery timer refresh interval 2024-08-26 09:48:41 +02:00
Serge
359575d00d Log cleanup 2024-08-26 09:44:41 +02:00
Serge
9dc444fd33 Added ProArt P16 and X13 to OLED List 2024-08-24 20:09:28 +02:00
Serge
a5b8885ff6 Removed unsuppored backlight modes for ProArt X13 https://github.com/seerge/g-helper/issues/2912 2024-08-24 20:07:44 +02:00
Serge
56676005a5 Added Vivobook M550 to OLED list https://github.com/seerge/g-helper/issues/3015 2024-08-24 15:53:18 +02:00
Serge
0e59f9318e Invert FN-Lock for ProArt https://github.com/seerge/g-helper/issues/3012 2024-08-23 22:26:37 +02:00
Serge
21a2dca271 Hardware FN-Lock for ProArt https://github.com/seerge/g-helper/issues/2973 https://github.com/seerge/g-helper/issues/3012 2024-08-23 13:20:58 +02:00
Serge
e265a78b4f ProArt backlight init #2973 2024-08-22 23:31:22 +02:00
Serge
18b6dd794f Merge branch 'main' of https://github.com/seerge/g-helper 2024-08-22 14:18:05 +02:00
Serge
9fd9506177 Ryzen AI 9 undervolting https://github.com/seerge/g-helper/issues/3005 2024-08-22 14:18:02 +02:00
Serge
a30b202022 ProArt backlight init https://github.com/seerge/g-helper/issues/2973 2024-08-22 12:20:32 +02:00
Serge
b9534fdfe5 New translations strings.resx (Chinese Simplified) (#2998) 2024-08-22 12:20:11 +02:00
Serge
cb3bf3ea90 Swap brightness hotkeys for FA706IH https://github.com/seerge/g-helper/issues/3009 2024-08-22 11:30:38 +02:00
64 changed files with 1504 additions and 411 deletions

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
# These are supported funding model platforms
custom: https://g-helper.com/support

View File

@@ -347,6 +347,7 @@ namespace GHelper.Ally
if (!autoTDP && _mode != ControllerMode.Auto) return;
float fps = amdControl.GetFPS();
int? usage = 0;
if (autoTDP && fpsLimit > 0 && fpsLimit <= 120)
{
@@ -377,7 +378,8 @@ namespace GHelper.Ally
if (_mode == ControllerMode.Auto)
{
ControllerMode newMode = (fps > 0) ? ControllerMode.Gamepad : ControllerMode.Mouse;
if (fps > 0) usage = amdControl.GetiGpuUse();
ControllerMode newMode = (fps > 0 && usage > 15) ? ControllerMode.Gamepad : ControllerMode.Mouse;
if (_applyMode != newMode) _autoCount++;
else _autoCount = 0;
@@ -386,7 +388,7 @@ namespace GHelper.Ally
{
_autoCount = 0;
ApplyMode(newMode);
Logger.WriteLine($"Controller Mode {fps}: {newMode}");
Logger.WriteLine($"Controller Mode (FPS={fps}, USAGE={usage}%): {newMode}");
}
}
@@ -614,9 +616,9 @@ namespace GHelper.Ally
}
public static void ApplyXBoxStatus()
public static void DisableXBoxController(bool disabled)
{
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xD1, 0x0B, 0x01, AppConfig.Is("controller_disabled") ? (byte)0x02 : (byte)0x01 }, "Status");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD1, 0x0B, 0x01, disabled ? (byte)0x02 : (byte)0x01], $"ControllerDisabled: {disabled}");
}
public static void ApplyMode(ControllerMode applyMode = ControllerMode.Auto, bool init = false)
@@ -649,7 +651,7 @@ namespace GHelper.Ally
InputDispatcher.SetBacklightAuto(true);
}
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xD1, 0x01, 0x01, (byte)_applyMode }, "Controller");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD1, 0x01, 0x01, (byte)_applyMode], "Controller");
//AsusHid.WriteInput(CommandSave, null);
BindZone(BindingZone.M1M2);
@@ -666,6 +668,13 @@ namespace GHelper.Ally
SetDeadzones();
if (init && AppConfig.Is("controller_disabled"))
{
Thread.Sleep(500);
DisableXBoxController(false);
DisableXBoxController(true);
}
});
}

View File

@@ -114,6 +114,7 @@ namespace GHelper.AnimeMatrix
switch ((SlashMode)running)
{
case SlashMode.Static:
Logger.WriteLine("Slash: Static");
var custom = AppConfig.GetString("slash_custom");
if (custom is not null && custom.Length > 0)
{
@@ -126,6 +127,7 @@ namespace GHelper.AnimeMatrix
break;
case SlashMode.BatteryLevel:
// call tick to immediately update the pattern
Logger.WriteLine("Slash: Battery Level");
SlashTimer_start();
SlashTimer_tick();
break;
@@ -148,7 +150,7 @@ namespace GHelper.AnimeMatrix
if (deviceSlash is not null)
{
deviceSlash.SetLidMode(true);
deviceSlash.SetLidMode(!matrixLid && AppConfig.Is("slash_sleep"));
}
if (matrixLid || force)
@@ -211,7 +213,7 @@ namespace GHelper.AnimeMatrix
switch (running)
{
case 2:
SetMatrixPicture(AppConfig.GetString("matrix_picture"));
SetMatrixPicture(AppConfig.GetString("matrix_picture"), false);
break;
case 3:
SetMatrixClock();
@@ -278,7 +280,7 @@ namespace GHelper.AnimeMatrix
}
private void SlashTimer_start(int interval = 60000)
private void SlashTimer_start(int interval = 180000)
{
// 100% to 0% in 1hr = 1% every 36 seconds
// 1 bracket every 14.2857 * 36s = 514s ~ 8m 30s

View File

@@ -410,7 +410,7 @@ namespace GHelper.AnimeMatrix
if (DateTime.Now.Second % 2 != 0) timeFormat = timeFormat.Replace(":", " ");
Clear();
Text(DateTime.Now.ToString(timeFormat), 15, 2, 25);
Text(DateTime.Now.ToString(timeFormat), 15, 7 - FullRows / 2, 25);
Text(DateTime.Now.ToString(dateFormat), 11.5F, 0, 14);
Present();

View File

@@ -182,17 +182,17 @@ namespace GHelper.AnimeMatrix
public void SetBatteryPattern(int brightness)
{
SetCustom(GetBatteryPattern(brightness, 100 * (GetBatteryChargePercentage() / AppConfig.Get("charge_limit", 100))));
SetCustom(GetBatteryPattern(brightness, 100 * (GetBatteryChargePercentage() / AppConfig.Get("charge_limit", 100))), null);
}
public void SetCustom(byte[] data)
public void SetCustom(byte[] data, string? log = "Static Data")
{
Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xAC]), "Static");
Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xAC, 0xFF, 0xFF, 0x01, 0x05, 0xFF, 0xFF]), "StaticSettings");
Set(CreatePacket([0xD4, 0x00, 0x00, 0x01, 0xAC]), "StaticSave");
Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xAC]), null);
Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xAC, 0xFF, 0xFF, 0x01, 0x05, 0xFF, 0xFF]), null);
Set(CreatePacket([0xD4, 0x00, 0x00, 0x01, 0xAC]), null);
byte[] payload = new byte[] { 0xD3, 0x00, 0x00, 0x07 };
Set(CreatePacket(payload.Concat(data.Take(7)).ToArray()), "Static Data");
Set(CreatePacket(payload.Concat(data.Take(7)).ToArray()), log);
}
public void SetOptions(bool status, int brightness = 0, int interval = 0)
@@ -209,7 +209,7 @@ namespace GHelper.AnimeMatrix
public void SetLidMode(bool status)
{
Set(CreatePacket([0xD8, 0x00, 0x00, 0x02, 0xA5, status ? (byte)0x80 : (byte)0x00]), $"DisableLidClose {status}");
Set(CreatePacket([0xD8, 0x00, 0x00, 0x02, 0xA5, status ? (byte)0x80 : (byte)0x00]), $"SlashLidCloseAnimation {status}");
}
public void SetSleepActive(bool status)

View File

@@ -12,7 +12,7 @@ public static class AppConfig
private static string? _bios;
private static Dictionary<string, object> config = new Dictionary<string, object>();
private static System.Timers.Timer timer = new System.Timers.Timer(1000);
private static System.Timers.Timer timer = new System.Timers.Timer(2000);
static AppConfig()
{
@@ -92,7 +92,9 @@ public static class AppConfig
Thread.Sleep(500);
if (File.ReadAllText(backup).Contains("}"))
var backupText = File.ReadAllText(backup);
if (backupText.Contains("{") && backupText.Contains("}"))
{
File.Copy(backup, configFile, true);
}
@@ -219,6 +221,7 @@ public static class AppConfig
private static void Write()
{
timer.Stop();
timer.Start();
}
@@ -302,27 +305,32 @@ public static class AppConfig
switch (mode)
{
case 1:
if (device == AsusFan.GPU)
curve = StringToBytes("14-3F-44-48-4C-50-54-62-16-1F-26-2D-39-47-55-5F");
else
curve = StringToBytes("14-3F-44-48-4C-50-54-62-11-1A-22-29-34-43-51-5A");
break;
case 2:
if (device == AsusFan.GPU)
curve = StringToBytes("3C-41-42-46-47-4B-4C-62-08-11-11-1D-1D-26-26-2D");
else
curve = StringToBytes("3C-41-42-46-47-4B-4C-62-03-0C-0C-16-16-22-22-29");
break;
case AsusACPI.PerformanceTurbo:
switch (device)
{
case AsusFan.GPU:
return StringToBytes("14-3F-44-48-4C-50-54-62-16-1F-26-2D-39-47-55-5F");
default:
return StringToBytes("14-3F-44-48-4C-50-54-62-11-1A-22-29-34-43-51-5A");
}
case AsusACPI.PerformanceSilent:
switch (device)
{
case AsusFan.GPU:
return StringToBytes("3C-41-42-46-47-4B-4C-62-08-11-11-1D-1D-26-26-2D");
default:
return StringToBytes("3C-41-42-46-47-4B-4C-62-03-0C-0C-16-16-22-22-29");
}
default:
if (device == AsusFan.GPU)
curve = StringToBytes("3A-3D-40-44-48-4D-51-62-0C-16-1D-1F-26-2D-34-4A");
else
curve = StringToBytes("3A-3D-40-44-48-4D-51-62-08-11-16-1A-22-29-30-45");
break;
switch (device)
{
case AsusFan.GPU:
return StringToBytes("3A-3D-40-44-48-4D-51-62-0C-16-1D-1F-26-2D-34-4A");
default:
return StringToBytes("3A-3D-40-44-48-4D-51-62-08-11-16-1A-22-29-30-45");
}
}
return curve;
}
public static string GetModeString(string name)
@@ -391,32 +399,37 @@ public static class AppConfig
return ContainsModel("Vivobook") || ContainsModel("Zenbook") || ContainsModel("ProArt");
}
public static bool IsHardwareFnLock()
{
return IsVivoZenPro();
}
// Devices with bugged bios command to change brightness
public static bool SwappedBrightness()
{
return ContainsModel("FA506IH") || ContainsModel("FA506IC") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH") || ContainsModel("FA506IV") || ContainsModel("FA706IC");
return ContainsModel("FA506IH") || ContainsModel("FA506IC") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH") || ContainsModel("FA506IV") || ContainsModel("FA706IC") || ContainsModel("FA706IH");
}
public static bool IsDUO()
{
return ContainsModel("Duo") || ContainsModel("GX550") || ContainsModel("GX650");
return ContainsModel("Duo") || ContainsModel("GX550") || ContainsModel("GX650") || ContainsModel("UX840");
}
// G14 2020 has no aura, but media keys instead
public static bool NoAura()
{
return ContainsModel("GA401I") && !ContainsModel("GA401IHR");
return (ContainsModel("GA401I") && !ContainsModel("GA401IHR")) || ContainsModel("GA502IU") || ContainsModel("HN7306");
}
public static bool MediaKeys()
{
return NoAura() || ContainsModel("G712L");
return (ContainsModel("GA401I") && !ContainsModel("GA401IHR")) || ContainsModel("G712L");
}
public static bool IsSingleColor()
{
return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("FX516P") || ContainsModel("X13") || IsARCNM() || ContainsModel("GA502IU") || ContainsModel("FA617N") || ContainsModel("FA617X");
return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("FX516P") || ContainsModel("X13") || IsARCNM() || ContainsModel("FA617N") || ContainsModel("FA617X") || NoAura();
}
public static bool IsSlash()
@@ -441,7 +454,7 @@ public static class AppConfig
public static bool IsOLED()
{
return ContainsModel("OLED") || IsSlash() || ContainsModel("M7600") || ContainsModel("UX64") || ContainsModel("UX34") || ContainsModel("UX53") || ContainsModel("K360") || ContainsModel("X150") || ContainsModel("M350") || ContainsModel("K650") || ContainsModel("UM53") || ContainsModel("K660") || ContainsModel("UX84") || ContainsModel("M650") || ContainsModel("K340") || ContainsModel("K350") || ContainsModel("M140") || ContainsModel("UM340") || ContainsModel("S540") || ContainsModel("M7400") || ContainsModel("N650");
return ContainsModel("OLED") || IsSlash() || ContainsModel("M7600") || ContainsModel("UX64") || ContainsModel("UX34") || ContainsModel("UX53") || ContainsModel("K360") || ContainsModel("X150") || ContainsModel("M350") || ContainsModel("K650") || ContainsModel("UM53") || ContainsModel("K660") || ContainsModel("UX84") || ContainsModel("M650") || ContainsModel("M550") || ContainsModel("K340") || ContainsModel("K350") || ContainsModel("M140") || ContainsModel("UM340") || ContainsModel("S540") || ContainsModel("M7400") || ContainsModel("N650") || ContainsModel("HN7306") || ContainsModel("H7606") || ContainsModel("UX5406") || ContainsModel("M5606");
}
public static bool IsNoOverdrive()
@@ -491,12 +504,12 @@ public static class AppConfig
public static bool NoWMI()
{
return ContainsModel("GL704G") || ContainsModel("GM501G");
return ContainsModel("GL704G") || ContainsModel("GM501G") || ContainsModel("GX501G");
}
public static bool IsNoDirectRGB()
{
return ContainsModel("GA503") || ContainsModel("G533Q") || ContainsModel("GU502") || IsSlash();
return ContainsModel("GA503") || ContainsModel("G533Q") || ContainsModel("GU502") || ContainsModel("GU603") || IsSlash();
}
public static bool IsStrixNumpad()
@@ -607,12 +620,12 @@ public static class AppConfig
public static bool IsFanRequired()
{
return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R") || ContainsModel("G713P") || ContainsModel("GU605") || ContainsModel("GA403") || ContainsModel("G634J") || ContainsModel("G834J") || ContainsModel("G614J") || ContainsModel("G814J") || ContainsModel("FX507V");
return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R") || ContainsModel("G713P") || ContainsModel("GU605") || ContainsModel("GA605") || ContainsModel("GA403") || ContainsModel("G634J") || ContainsModel("G834J") || ContainsModel("G614J") || ContainsModel("G814J") || ContainsModel("FX507V");
}
public static bool IsAMDLight()
{
return ContainsModel("GA402X") || ContainsModel("GA403") || ContainsModel("FA507N") || ContainsModel("FA507X") || ContainsModel("FA707N") || ContainsModel("FA707X");
return ContainsModel("GA402X") || ContainsModel("GA605") || ContainsModel("GA403") || ContainsModel("FA507N") || ContainsModel("FA507X") || ContainsModel("FA707N") || ContainsModel("FA707X");
}
public static bool IsPowerRequired()
@@ -627,7 +640,7 @@ public static class AppConfig
public static bool IsForceSetGPUMode()
{
return Is("gpu_mode_force_set") || ContainsModel("503");
return Is("gpu_mode_force_set") || (ContainsModel("503") && IsNotFalse("gpu_mode_force_set"));
}
public static bool IsNoGPUModes()
@@ -683,7 +696,12 @@ public static class AppConfig
public static bool IsForceMiniled()
{
return ContainsModel("G834JYR") || Is("force_miniled");
return ContainsModel("G834JYR") || ContainsModel("G834JZR") || Is("force_miniled");
}
public static bool SaveDimming()
{
return Is("save_dimming");
}
}

View File

@@ -114,7 +114,7 @@ public class AsusACPI
public const int APU_MEM = 0x000600C1;
public const int TUF_KB_BRIGHTNESS = 0x00050021;
public const int VIVO_KB_BRIGHTNESS = 0x0005002F;
public const int KBD_BACKLIGHT_OOBE = 0x0005002F;
public const int TUF_KB = 0x00100056;
public const int TUF_KB2 = 0x0010005a;
@@ -788,7 +788,6 @@ public class AsusACPI
{
int param = 0x80 | (brightness & 0x7F);
DeviceSet(TUF_KB_BRIGHTNESS, param, "TUF Brightness");
if (AppConfig.IsVivoZenPro()) DeviceSet(VIVO_KB_BRIGHTNESS, param, "VIVO Brightness");
}
@@ -831,6 +830,7 @@ public class AsusACPI
state = state | 0x01 << 8;
DeviceSet(TUF_KB_STATE, state, "TUF_KB");
if (AppConfig.IsVivoZenPro() && DeviceGet(KBD_BACKLIGHT_OOBE) >= 0) DeviceSet(KBD_BACKLIGHT_OOBE, 1, "VIVO OOBE");
}
public void SubscribeToEvents(Action<object, EventArrivedEventArgs> EventHandler)

View File

@@ -326,7 +326,8 @@ namespace GHelper
return;
}
LightingMode lm = supportedLightingModes[comboBoxLightingMode.SelectedIndex];
var index = comboBoxLightingMode.SelectedIndex;
LightingMode lm = supportedLightingModes[index < supportedLightingModes.Count ? index : 0 ];
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
if (ls.LightingMode == lm)

View File

@@ -145,7 +145,7 @@ namespace GHelper.AutoUpdate
Logger.WriteLine(ex.Message);
}
Environment.Exit(0);
Application.Exit();
}
}

View File

@@ -2,31 +2,46 @@
namespace GHelper.Battery
{
internal class BatteryControl
public static class BatteryControl
{
static bool _chargeFull = AppConfig.Is("charge_full");
public static bool chargeFull
{
get
{
return _chargeFull;
}
set
{
AppConfig.Set("charge_full", value ? 1 : 0);
_chargeFull = value;
}
}
public static void ToggleBatteryLimitFull()
{
if (AppConfig.Is("charge_full")) SetBatteryChargeLimit();
if (chargeFull) SetBatteryChargeLimit();
else SetBatteryLimitFull();
}
public static void SetBatteryLimitFull()
{
AppConfig.Set("charge_full", 1);
chargeFull = true;
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, 100, "BatteryLimit");
Program.settingsForm.VisualiseBatteryFull();
}
public static void UnSetBatteryLimitFull()
{
AppConfig.Set("charge_full", 0);
chargeFull = false;
Logger.WriteLine("Battery fully charged");
Program.settingsForm.Invoke(Program.settingsForm.VisualiseBatteryFull);
}
public static void AutoBattery(bool init = false)
{
if (AppConfig.Is("charge_full") && !init) SetBatteryLimitFull();
if (chargeFull && !init) SetBatteryLimitFull();
else SetBatteryChargeLimit();
}
@@ -38,14 +53,15 @@ namespace GHelper.Battery
if (AppConfig.IsChargeLimit6080())
{
if (limit > 80) limit = 100;
if (limit > 85) limit = 100;
else if (limit >= 80) limit = 80;
else if (limit < 60) limit = 60;
}
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, limit, "BatteryLimit");
AppConfig.Set("charge_limit", limit);
AppConfig.Set("charge_full", 0);
chargeFull = false;
Program.settingsForm.VisualiseBattery(limit);
}

View File

@@ -13,19 +13,28 @@ namespace GHelper.Display
var profiles = new Dictionary<string, string>()
{
{"FA_Series", "2177-APOR41-de476ec68578c865e886ef6872aa56ee.zip"},
{"FA401UI", "19767-N39QWK-05990dae2bf601e9db8b998bfad49f57.zip"},
{"FA401UU", "19768-K9LFCV-5224d6f68051d884a3adaa588e6300c3.zip"},
{"FA401UV", "19769-8MSQD6-d06ff0a176407b4eaeed468a3bff2bc1.zip"},
{"FA401WI", "19937-J3GRCD-e37d8c1557b9f11d8fb493a78b50fe2d.zip"},
{"FA401WU", "19938-5PIL7F-a3c8522c89e03fc25e2f7290ee5c5f22.zip"},
{"FA401WV", "19939-KIX4CK-3462e49f2c6388228b427b85332538b7.zip"},
{"FA506IC", "7822-ZGQ1KC-bc80be3be7ca585bef60f526b6461c86.zip"},
{"FA506ICB", "13914-2HYCD7-95fabfe5669a204620517f0158c0cea1.zip"},
{"FA506IE", "7828-57N8GH-9fe07a7e4ebde12a8d4682d3ffa66fe4.zip"},
{"FA506IEB", "14661-ZYWH5T-3b45ebeb7fca81d98796d5960e11226c.zip"},
{"FA506IH", "3407-VZBOUN-8a12385fa46e077010677d330e9320d5.zip"},
{"FA506IHR", "7823-15HGA0-44d621a3c0f0dd2c407f67d262871be0.zip"},
{"FA506IHRB", "19343-MBMUPH-190cdb28402ba8efd3e11561c9b2eeb9.zip"},
{"FA506II", "3410-9ZXQO2-aa08794537699c5dbfcca49b63fb7f8d.zip"},
{"FA506IM", "7824-EKKW9A-21c7e073a81fc868b78e605b17290839.zip"},
{"FA506IR", "7825-G6XND9-c16ea7e98b58e878c61d1071b100ee60.zip"},
{"FA506IU", "3413-AMCR39-2a8b889a8810da4e8692f87e1ae3ea2c.zip"},
{"FA506IV", "3415-VA0CJ6-266febe84bcecc5ed89fdc286f444ce2.zip"},
{"FA506NC", "18359-BM2XCN-3ca9de427310b05afa92dcbe1babf947.zip"},
{"FA506NCR", "19230-KJ866Z-1980e6f6a843b6b31111e38973fa1cda.zip"},
{"FA506NF", "18361-CU7H6I-55beba8445b9aa0fe9cbeb8ec9a47ccf.zip"},
{"FA506NFR", "19231-GARR16-f7052f6be62ddce2048ebcd6ba808563.zip"},
{"FA506QC", "7829-LBYY5U-b14343c260b738563b69ad0e4f4b88d1.zip"},
{"FA506QE", "7827-75P3DP-b664f4da04e77ed1faa722bf0c781d82.zip"},
{"FA506QM", "9440-87VQKP-48357026f1f3099cfed1161a320587f0.zip"},
@@ -33,9 +42,9 @@ namespace GHelper.Display
{"FA507NI", "14451-N6AX9R-0bc8e15be5cf889c755aaa7052f6fee8.zip"},
{"FA507NJ", "14454-QXKHOE-d28f2eb001f9b7ce0582cbe33961a6ad.zip"},
{"FA507NU", "14452-EZXLVF-c64dd3d7efede78df653b029888d9d04.zip"},
{"FA507NUR", "18871-WR3YMP-6cbcd0502eb9bf200465e36c4de8c9fd.zip"},
{"FA507NUR", "19358-JYO79G-f8bc53beeadfdfef80dc6a4eb85c69e2.zip"},
{"FA507NV", "14453-VC333P-41549f64788d59c9711eccec892fa8c1.zip"},
{"FA507NVR", "18872-HVR4UY-220dc7f3f73cf12b2af2505db6ce67ab.zip"},
{"FA507NVR", "19359-YWEAES-37feeb146db89c3549bac528d67ae209.zip"},
{"FA507RC", "11448-0TRT8V-7712eb9302300dd82815027efbbe4787.zip"},
{"FA507RE", "11449-ONC7VG-a7ac70468292336f63532c21204d69d4.zip"},
{"FA507RF", "14311-X72FIU-66bf16069a82bdf2cc09f8b92cb25c67.zip"},
@@ -50,17 +59,24 @@ namespace GHelper.Display
{"FA507XJ", "14820-8RT0TF-9d341fae2a290494206deb5fcf1fd427.zip"},
{"FA507XU", "14818-3PA2GD-2d1e2d035309ec7282a1c47e27f7c7fd.zip"},
{"FA507XV", "14819-ET4L73-daf905274776ae9c92a7b74e687dc63d.zip"},
{"FA607PI", "17579-FL63B4-df08bf92fe3c156ce738e43de7824d65.zip"},
{"FA607PU", "17580-WM413K-eff7721ca9ec5b633ef196dbfcd58ff2.zip"},
{"FA607PV", "17581-JNXO2Q-15d026a4ae630d44b28c18aee0a99e51.zip"},
{"FA607NU", "20567-VB45RR-ceeec88490fec992f2f8948ece38952e.zip"},
{"FA607NUR", "20570-XEDISK-5e1220f6a19492a3e6319697497deaa3.zip"},
{"FA607PI", "19157-PL5PW6-2fde4880a46a6b7357d96eaa7a4ec946.zip"},
{"FA607PU", "19158-AWQ1FA-f1ed2d008bef71741a9b09b35730b9e7.zip"},
{"FA607PV", "19159-V6UKPP-92f56a3aa89b834d1ab12f229a8ae1a7.zip"},
{"FA607RC", "10190-XHDRTQ-0e6c248e3dab6bb07e052edd963c5218.zip"},
{"FA607RE", "10194-AF495K-23a4d74be5132e4babc64bb13237a12b.zip"},
{"FA607RH", "10191-9BS333-c6deb5f9fd5a37d446d2722da54c0ec3.zip"},
{"FA607RM", "10195-4U5EEF-cf98d168cacdd5a60782e881a9c143be.zip"},
{"FA607RR", "10193-FYX2N7-730c76e49ef71a6164804eafd2621dab.zip"},
{"FA607RW", "10192-UFOOP3-f52a50dac189ffa96560f73e04c53a6c.zip"},
{"FA617NS", "15967-YKHJ0B-89095e43578e64c160d2952bb14513f2.zip"},
{"FA617NT", "15970-C1BW39-2ef1c5d5d9a967cf2fc1f511d3db3a43.zip"},
{"FA608WI", "20103-UE0O65-d6707b2a2f666d671d728661c981883a.zip"},
{"FA608WU", "20102-IQVJL2-edc900ffe25635856729d26dbeac272f.zip"},
{"FA608WV", "20104-EE3Q5U-a7695b4d1668b1a8dda2576f64bffad2.zip"},
{"FA617NS", "20225-0J8FEF-cb6ef3732560ed38542d5047e78596f0.zip"},
{"FA617NSR", "20226-B5TAVP-f153443e85ccad055fa12d58eec69c5c.zip"},
{"FA617NT", "20224-YN6NKP-1d0e927ae5c1bb7d15e36b63176460e2.zip"},
{"FA617NTR", "20227-KL8UNI-2b4063b7a52b142fb75e9136570afbf9.zip"},
{"FA617XS", "15968-Y9NFXN-cb420fe6e177fc1cf675e9d42a6fd0ea.zip"},
{"FA617XT", "15969-UKYP5L-ad54051ebbad4b17693b65f5bceda799.zip"},
{"FA706IC", "5215-5J3H5Y-d2cdc2f5e03d68e5e5e562581a77c8e6.zip"},
@@ -72,6 +88,7 @@ namespace GHelper.Display
{"FA706IR", "8825-63J2NY-2496ecf21b5fa71e65671531b670cdac.zip"},
{"FA706IU", "2608-EI64MF-64c35bda7789e6e71298e22d793b78d4.zip"},
{"FA706NF", "18362-1V7Z1Z-0bc79f01bdfadc5b39342fba622a5b8d.zip"},
{"FA706NFR", "19232-FE6TXN-d062445db610ce901453145ebc518efe.zip"},
{"FA706QC", "8826-032S4E-868933565b1a7d762bda8cafc1e77458.zip"},
{"FA706QE", "8824-KZNJL9-9d827f4973d4c9787ff050dc1bf35eef.zip"},
{"FA706QM", "8830-6NX7U4-b7bbfe663aa954534d33d2f822181728.zip"},
@@ -79,7 +96,9 @@ namespace GHelper.Display
{"FA707NI", "14455-19J6WZ-10282c6083ee018a614e75bc809ecf1f.zip"},
{"FA707NJ", "14457-BGJD0K-d963ff94009c9a2a5b99606eac711a95.zip"},
{"FA707NU", "14456-VAZ4LS-1d798d3873c55e9d10b43a3f2b12cd15.zip"},
{"FA707NUR", "20568-IPF4CY-f7bd11b80ffa20b77b75e6a89213db48.zip"},
{"FA707NV", "14458-7G8B40-08117ddb45ed3c6978aa4ad60e3d2c96.zip"},
{"FA707NVR", "20569-1MFNC4-e41979f29c26628eacf1e9067dd3544d.zip"},
{"FA707RC", "10196-81D3O0-94ccf4d908c9bcb44f8f9092ef9fa2e2.zip"},
{"FA707RE", "10200-AUS9AW-7f366055be2ae2b4c659aa9590bb4d5e.zip"},
{"FA707RF", "14312-6KGU80-09ba6d3e3b490c3d1dce3d16df62cd8a.zip"},
@@ -92,6 +111,9 @@ namespace GHelper.Display
{"FA707XJ", "14823-MX6CGK-0d0862cd441f96a72b1c8baeaa8aa3b4.zip"},
{"FA707XU", "14824-O2LZZA-f0ea2bf54bbc4fd4e7391048f4a083e4.zip"},
{"FA707XV", "14825-DUSKD1-7d0a055d869a7366105380c44788724b.zip"},
{"FA808WI", "19512-TZ3G4D-60c6849ce49cca1d2177f31ead77df5a.zip"},
{"FA808WU", "19510-ASGCD8-0558641c1b976b901c52d1d72f0bddd7.zip"},
{"FA808WV", "19511-QDVPAJ-f3990996e7a9c0d472b46af286d529f1.zip"},
{"FX_Series", "2174-J1XJKV-bd932ade5eebb0b2f1a36eac85bc5c7d.zip"},
{"FX505DD", "3439-CJLCNE-3df3a90619c571de2917a35a402fe6cb.zip"},
{"FX505DT", "3427-H77L9I-2f3f50fbbb1dc4ac6e703b2820acb491.zip"},
@@ -143,15 +165,18 @@ namespace GHelper.Display
{"FX517ZM", "13759-694BOG-7b8f61a1d8a387715721fd2b8e0bd766.zip"},
{"FX517ZR", "11463-MCHEWS-7a732705aea49eb663fe1e8930c463de.zip"},
{"FX517ZW", "11464-S41ORA-d99633ecf421ba4ab73800bc9ebf2e5b.zip"},
{"FX607JI", "17739-YJBJMA-59c984b28eeb6c02498190f768b12b52.zip"},
{"FX607JIR", "17740-78V0QP-43bf1ea30f94d3d3a286f42dd90a1816.zip"},
{"FX607JU", "17744-JEFX0I-f1ee2104c17a5cc511efefa3dc7b9601.zip"},
{"FX607JUR", "17743-A2JS5H-224a1f32f7dbfecb0d6b91fdb6ffac8e.zip"},
{"FX607JV", "17741-OWALZC-eb293a03c7b4595270939bccfe891656.zip"},
{"FX607JVR", "17742-3OOC7N-f28635b55ce56f9e32672b2e409a075c.zip"},
{"FX607JI", "19085-6NMHTY-9137eab4a853f284c0ac1f8890735c7b.zip"},
{"FX607JIR", "19088-H9SUHL-c75a1547f17e7c69e0a870425d3592b8.zip"},
{"FX607JU", "19086-N1S5J4-c4fc8458bcbefa107fc1c2e1dbe44255.zip"},
{"FX607JUR", "19087-ZBS95F-bc3055487fdc07870c12341042a37222.zip"},
{"FX607JV", "19089-LLP8ZE-c52cc4765390eba2eae3c798a367df25.zip"},
{"FX607JVR", "19090-XQYJEH-a5aaa078def637077c4d1d3a619ae198.zip"},
{"FX607VB", "20704-FGKI8R-ac8a18cb35a009bcdb6d18ec7537879a.zip"},
{"FX607VF", "20706-OMC7L2-e66289430eb7decd16fe4c6353edb8c4.zip"},
{"FX607VI", "14072-0Z0LX5-c3145816b5c9b045a3e829e194425624.zip"},
{"FX607VJ", "14073-H1KA78-95472184994955393ebf635af4a55c71.zip"},
{"FX607VU", "14074-RCMD10-b606bf5fd03bdf6a8aef412202de86ff.zip"},
{"FX607VU", "20707-N1HJ0V-31f1da0a565763c625714c39b7bb5bae.zip"},
{"FX607VUR", "20705-ON83H2-dd9e78d43fb57f06d0e8ef0d9d1e849e.zip"},
{"FX607VV", "14075-BX4NJX-a9e24be091f08e6cc3885397f143bdc5.zip"},
{"FX607ZC", "9267-SQXQMT-edf1ee77d7f276d9b2f14fbe80e86459.zip"},
{"FX607ZE", "9268-MI06A0-5f60b76f497adb2c80dc5d34e7ca00ef.zip"},
@@ -237,14 +262,14 @@ namespace GHelper.Display
{"G533ZX", "11729-XNFMPR-e0aad4e4d4956dba8629f419b1f86026.zip"},
{"G614JF", "14496-NAATJZ-a3847e890e57aa749645b854b28ead79.zip"},
{"G614JI", "14168-4VTU0U-37decb2df809672eccf1156769eda929.zip"},
{"G614JIR", "18120-52TT5M-28a5c8e138ed1660e9eadc81121f789a.zip"},
{"G614JIR", "19126-IMXGO5-4cce9f45ad28fa60d016f8d212c50b10.zip"},
{"G614JJ", "14497-P0D5PL-abe178509e0316da9ee56b24e15d0384.zip"},
{"G614JU", "14498-5D71EB-2300be03087494ee34356470ca022b7c.zip"},
{"G614JV", "14500-SPJCAL-a8e2e223857c334ba4c20c8122151bb7.zip"},
{"G614JVR", "18121-2WOF0H-4e7045c7a210693fef2b99b8e032316b.zip"},
{"G614JVR", "19129-EA1WB4-4666564ee013c4df53be44bcdd20bec0.zip"},
{"G614JZ", "18199-P9WWOH-093d361358629a2bddd5bff7b5fb7a5f.zip"},
{"G634JY", "14163-JLRBOO-8ea519425efe56cc144e38d22cebd3f0.zip"},
{"G634JYR", "18087-6Z1W8Q-cd92004b6b9392e2cf07317db8ca9c6d.zip"},
{"G634JYR", "19130-MUAT65-0eced7ca55a61cc41341faa3a48d34f3.zip"},
{"G634JZ", "15827-MSW5I1-0f39e92313e54afe3e35f5636dc37fd5.zip"},
{"G634JZR", "17891-O7PAGL-5c6e6d059ff7bc1b9245fdf8a8066263.zip"},
{"G703GX", "105-NMT9XG-76a0810ddf16ee376fa049bd179377fc.zip"},
@@ -297,15 +322,15 @@ namespace GHelper.Display
{"G733ZW", "10080-HY42QH-aa285046069cfe113953b91f1a28d101.zip"},
{"G733ZX", "10082-JS5F1Y-41bccc831aec7bf1c0a59a309bc607c7.zip"},
{"G814JI", "18243-BAU912-671afb033d3b1c44f9852ff608910f42.zip"},
{"G814JIR", "17315-02XE3O-7a00ed5b91bc305aade5a1830691d0d6.zip"},
{"G814JIR", "19802-1CGBPH-f1d31bab157b36d109e1e10591d49f4b.zip"},
{"G814JU", "18193-Y5GMF0-843cee9ed982a3d5aba21e99efbc396c.zip"},
{"G814JV", "18194-9Q537I-c5c2ca782d26dcd5346c110767347903.zip"},
{"G814JVR", "17313-P6P61Y-5960dc1d0bd8ba2057bc22aaa8bf89e5.zip"},
{"G814JVR", "19801-JK7M4V-617e0c975bf6e2a6f67802d825fa6aa4.zip"},
{"G814JZ", "18195-V98WBX-19d4c2e52916bf9c96fcaed6f1d9bdda.zip"},
{"G834JY", "15954-HAV3KR-d219c43750d485279e12cf76f5b2569b.zip"},
{"G834JYR", "17314-YYBQF3-a65b1bc3fd1e8de145dc9d606e8c45c8.zip"},
{"G834JYR", "19121-GX7FZU-7c449cf7db0033db75da0f4a464ee4d9.zip"},
{"G834JZ", "15953-C7XC62-a987058c0a26fa3c929b300d099296a5.zip"},
{"G834JZR", "17316-AFT379-743360d9b36031d91a72fe03e3fafca0.zip"},
{"G834JZR", "19122-CAYURL-f71108b839d923ae92f3f83451ddfa69.zip"},
{"GA401IC", "5864-KC8TTP-082f9a62dda322ccaed82ff3e3466bf8.zip"},
{"GA401IE", "5866-JO8504-dde5402bdecafc1cef55a7dc3d6167ec.zip"},
{"GA401IHR", "5865-7DV6TB-9833a54c7334dc3aef1b9e99f56b9e95.zip"},
@@ -333,9 +358,9 @@ namespace GHelper.Display
{"GA402XV", "14902-EL34M9-731ba1cc0d27d2db9a79d872673e7958.zip"},
{"GA402XY", "14903-ICC56W-0456739d8ba5ee543dfba99eb6ad217a.zip"},
{"GA402XZ", "14904-B3K2NR-928b7272790e7da0079c549cd4885d5d.zip"},
{"GA403UI", "18084-XTMSW5-6cad333378f3b1059688a419a8422fc1.zip"},
{"GA403UU", "18086-WXV037-ad90bc3f20ff056c45dbbb848fa72a67.zip"},
{"GA403UV", "18085-G56QVI-3f24b5bd1eaa8dd9086b86092cb62ffb.zip"},
{"GA403UI", "19112-NB8TJ1-e1de0121e30431cc5520ea6eccb6e46f.zip"},
{"GA403UU", "19113-C86SAH-4338dac48ad593c4079515b7599b8943.zip"},
{"GA403UV", "19114-6KR0FP-4740ed98a2ca06bc26c363de380a037d.zip"},
{"GA502II", "3554-REAPZQ-5f94c7ecd52ae2cad50aaac4341bec7b.zip"},
{"GA502IU", "3555-15UWZ4-d1cd040265773efd61bdfd146140a990.zip"},
{"GA502IV", "3556-ULLH3K-1f56134e43e1ffa353256fbeb9840d3f.zip"},
@@ -356,6 +381,9 @@ namespace GHelper.Display
{"GA503RS", "11745-689QTC-6c441a7161a34b871918fce5997c4e2e.zip"},
{"GA503RW", "12055-SG6VTH-91cc5782da63cf3dcc16804a47db25a2.zip"},
{"GA503RX", "12056-MR9J0D-b7dad63f751d2e53aeee479524986bdd.zip"},
{"GA605WI", "20014-K4K912-2a2e5a66fac3cc97fb13394a189bd75e.zip"},
{"GA605WU", "20015-HJM11B-a724c1fe216b73c0b3b24475047f4615.zip"},
{"GA605WV", "20016-BWVQPK-01624c1cdd5a3c05252bad472fab1240.zip"},
{"GL_Series", "2167-P7ELNB-44d357ee720a0c48c2eb37eee785316c.zip"},
{"GL503GE", "57-YI7HPS-9ed36ba45ff6398f3648a44ced4e5e61.zip"},
{"GL504GM", "58-JOZ3S5-998677afd41375cb8fd60ace8d11a788.zip"},
@@ -395,11 +423,11 @@ namespace GHelper.Display
{"GU604VI", "14284-R38BM3-e2591bfa2582ce68b2c8aba63beac5e3.zip"},
{"GU604VY", "14282-78N7V4-25e76896744c53317fa41a80788a2241.zip"},
{"GU604VZ", "14283-U4JX5C-f31dff75d52f48ceca0102fd1bc76e31.zip"},
{"GU605MI", "17935-R3OAJH-55a4fbb2be67a37226accd279357268b.zip"},
{"GU605MU", "17936-VBZ5PL-ad3a380f62bc87ee738c09c8e5255f91.zip"},
{"GU605MV", "17938-7DGM0T-caed792b162e94846167888f36fc632e.zip"},
{"GU605MY", "17937-HZWNQ4-72d9c4fed1b31f188874cd6461ffba83.zip"},
{"GU605MZ", "17939-IEJ2X5-fe077100dc4eafbae46d7eb831a791a8.zip"},
{"GU605MI", "19271-93QRMU-eab4115ee09fb9bbd86facec08a822a1.zip"},
{"GU605MU", "19272-RDZDEJ-4380e52eab6a3742613c2f694a19da1e.zip"},
{"GU605MV", "19274-1T9PKS-d05273f430d255ad1779cf6a7eb57db3.zip"},
{"GU605MY", "19273-F4A493-2bc9083d99e7827b4580311d34f8998b.zip"},
{"GU605MZ", "19275-52DG5X-1072d6f4fdc5b9cbb304da7146f05a79.zip"},
{"GV301QC", "5128-RN42GR-9a6049e7adabd1ff2aeed24293fe03a8.zip"},
{"GV301QCZ", "6778-152PHS-7a9ad124aef1059471542dfc8912ed7b.zip"},
{"GV301QE", "5125-PD15GR-9a7f72cbf5bd97d283464d8e407f0231.zip"},
@@ -486,6 +514,7 @@ namespace GHelper.Display
{"NR2301L", "14736-3DM4T5-41c1b0b5c2d726da7c66e0c39ea08017.zip"},
{"RC71L", "17126-IIDPFS-718c077a118724bb0045b35e30d5ac4e.zip"},
{"RC71X", "15182-KWVC62-c754d9ea39f9160df7e21e4538ce60df.zip"},
{"RC72LA", "19770-DOSUSI-85f700513af330af6e20fcfdabaeb87f.zip"},
};
if (profiles.ContainsKey(model))

View File

@@ -16,7 +16,10 @@ namespace GHelper.Display
var modes = new DISPLAYCONFIG_MODE_INFO[modeCount];
err = QueryDisplayConfig(QDC.QDC_ONLY_ACTIVE_PATHS, ref pathCount, paths, ref modeCount, modes, IntPtr.Zero);
if (err != 0)
throw new Win32Exception(err);
{
Logger.WriteLine("HDR Detection Error: " + new Win32Exception(err).Message);
return false;
}
string internalName = AppConfig.GetString("internal_display");

View File

@@ -6,7 +6,14 @@ namespace GHelper.Display
{
public const int MAX_REFRESH = 1000;
public static int MIN_RATE = AppConfig.Get("min_rate", 60);
public static int MAX_RATE = AppConfig.Get("max_rate");
public static int GetMaxRate(string? laptopScreen)
{
if (MAX_RATE > 0) return MAX_RATE;
else return ScreenNative.GetMaxRefreshRate(laptopScreen);
}
public void AutoScreen(bool force = false)
{
@@ -15,7 +22,7 @@ namespace GHelper.Display
if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online)
SetScreen(MAX_REFRESH, 1);
else
SetScreen(60, 0);
SetScreen(MIN_RATE, 0);
}
else
{
@@ -29,7 +36,7 @@ namespace GHelper.Display
var refreshRate = ScreenNative.GetRefreshRate(laptopScreen);
if (refreshRate < 0) return;
ScreenNative.SetRefreshRate(laptopScreen, refreshRate > 60 ? 60 : ScreenNative.GetMaxRefreshRate(laptopScreen));
ScreenNative.SetRefreshRate(laptopScreen, refreshRate > MIN_RATE ? MIN_RATE : GetMaxRate(laptopScreen));
InitScreen();
}
@@ -43,7 +50,7 @@ namespace GHelper.Display
if (frequency >= MAX_REFRESH)
{
frequency = ScreenNative.GetMaxRefreshRate(laptopScreen);
frequency = GetMaxRate(laptopScreen);
}
if (frequency > 0 && frequency != refreshRate)
@@ -151,7 +158,7 @@ namespace GHelper.Display
{
var laptopScreen = ScreenNative.FindLaptopScreen();
int frequency = ScreenNative.GetRefreshRate(laptopScreen);
int maxFrequency = ScreenNative.GetMaxRefreshRate(laptopScreen);
int maxFrequency = GetMaxRate(laptopScreen);
if (maxFrequency > 0) AppConfig.Set("max_frequency", maxFrequency);
else maxFrequency = AppConfig.Get("max_frequency");

View File

@@ -1,4 +1,5 @@
using GHelper.Helpers;
using Microsoft.Win32;
using System.Management;
namespace GHelper.Display
@@ -37,6 +38,7 @@ namespace GHelper.Display
Cinema = 25,
Vivid = 13,
Eyecare = 17,
Disabled = 18,
}
public static class VisualControl
{
@@ -44,6 +46,7 @@ namespace GHelper.Display
private static int _brightness = 100;
private static bool _init = true;
private static bool _download = true;
private static string? _splendidPath = null;
private static System.Timers.Timer brightnessTimer = new System.Timers.Timer(200);
@@ -98,7 +101,7 @@ namespace GHelper.Display
foreach (FileInfo icm in icms)
{
//Logger.WriteLine(icm.FullName);
if (icm.Name.Contains("sRGB"))
{
try
@@ -106,7 +109,7 @@ namespace GHelper.Display
_modes.Add(isVivo ? SplendidGamut.VivoSRGB : SplendidGamut.sRGB, "Gamut: sRGB");
Logger.WriteLine(icm.FullName + " sRGB");
}
catch
catch
{
}
}
@@ -174,7 +177,8 @@ namespace GHelper.Display
{ SplendidCommand.FPS, "FPS"},
{ SplendidCommand.Cinema, "Cinema"},
{ SplendidCommand.Vivid, "Vivid" },
{ SplendidCommand.Eyecare, "Eyecare"}
{ SplendidCommand.Eyecare, "Eyecare"},
{ SplendidCommand.Disabled, "Disabled"}
};
}
@@ -204,6 +208,20 @@ namespace GHelper.Display
};
}
const string GameVisualKey = @"HKEY_CURRENT_USER\Software\ASUS\ARMOURY CRATE Service\GameVisual";
const string GameVisualValue = "ActiveGVStatus";
public static bool IsEnabled()
{
var status = (int?)Registry.GetValue(GameVisualKey, GameVisualValue, 1);
return status > 0;
}
public static void SetRegStatus(int status = 1)
{
Registry.SetValue(GameVisualKey, GameVisualValue, status, RegistryValueKind.DWord);
}
public static void SetGamut(int mode = -1)
{
if (skipGamut) return;
@@ -211,9 +229,19 @@ namespace GHelper.Display
AppConfig.Set("gamut", mode);
if (RunSplendid(SplendidCommand.GamutMode, 0, mode)) return;
if (_init)
var result = RunSplendid(SplendidCommand.GamutMode, 0, mode);
if (result == 0) return;
if (result == -1)
{
Logger.WriteLine("Gamut setting refused, reverting.");
RunSplendid(SplendidCommand.GamutMode, 0, (int)GetDefaultGamut());
if (ProcessHelper.IsUserAdministrator() && _download)
{
_download = false;
ColorProfileHelper.InstallProfile();
}
}
if (result == 1 && _init)
{
_init = false;
RunSplendid(SplendidCommand.Init);
@@ -224,7 +252,7 @@ namespace GHelper.Display
public static void SetVisual(SplendidCommand mode = SplendidCommand.Default, int whiteBalance = DefaultColorTemp, bool init = false)
{
if (mode == SplendidCommand.None) return;
if (mode == SplendidCommand.Default && init) return; // Skip default setting on init
if ((mode == SplendidCommand.Disabled || mode == SplendidCommand.Default || mode == SplendidCommand.VivoNormal) && init) return; // Skip default setting on init
if (!forceVisual && ScreenCCD.GetHDRStatus(true)) return;
if (!forceVisual && ScreenNative.GetRefreshRate(ScreenNative.FindLaptopScreen(true)) < 0) return;
@@ -234,12 +262,16 @@ namespace GHelper.Display
if (whiteBalance != DefaultColorTemp && !init) ProcessHelper.RunAsAdmin();
int? balance;
int? balance = null;
int command = 0;
switch (mode)
{
case SplendidCommand.Disabled:
command = 2;
break;
case SplendidCommand.Eyecare:
balance = 2;
balance = 4;
break;
case SplendidCommand.VivoNormal:
case SplendidCommand.VivoVivid:
@@ -253,9 +285,19 @@ namespace GHelper.Display
break;
}
if (RunSplendid(mode, 0, balance)) return;
if (_init)
int result = RunSplendid(mode, command, balance);
if (result == 0) return;
if (result == -1)
{
Logger.WriteLine("Visual mode setting refused, reverting.");
RunSplendid(SplendidCommand.Default, 0, DefaultColorTemp);
if (ProcessHelper.IsUserAdministrator() && _download)
{
_download = false;
ColorProfileHelper.InstallProfile();
}
}
if (result == 1 && _init)
{
_init = false;
RunSplendid(SplendidCommand.Init);
@@ -288,7 +330,7 @@ namespace GHelper.Display
return _splendidPath;
}
private static bool RunSplendid(SplendidCommand command, int? param1 = null, int? param2 = null)
private static int RunSplendid(SplendidCommand command, int? param1 = null, int? param2 = null)
{
var splendid = GetSplendidPath();
bool isVivo = AppConfig.IsVivoZenPro();
@@ -298,10 +340,16 @@ namespace GHelper.Display
{
if (command == SplendidCommand.DimmingVisual && isVivo) command = SplendidCommand.DimmingVivo;
var result = ProcessHelper.RunCMD(splendid, (int)command + " " + param1 + " " + param2);
if (result.Contains("file not exist") || (result.Length == 0 && !isVivo)) return false;
if (result.Contains("file not exist") || (result.Length == 0 && !isVivo)) return 1;
if (result.Contains("return code: -1")) return -1;
if (result.Contains("Visual is disabled"))
{
SetRegStatus(1);
return 1;
}
}
return true;
return 0;
}
private static void BrightnessTimerTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
@@ -309,28 +357,46 @@ namespace GHelper.Display
brightnessTimer.Stop();
if (RunSplendid(SplendidCommand.DimmingVisual, 0, (int)(40 + _brightness * 0.6))) return;
if (RunSplendid(SplendidCommand.DimmingVisual, 0, (int)(40 + _brightness * 0.6)) == 0) return;
if (_init)
{
_init = false;
RunSplendid(SplendidCommand.Init);
RunSplendid(SplendidCommand.Init, 4);
if (RunSplendid(SplendidCommand.DimmingVisual, 0, (int)(40 + _brightness * 0.6))) return;
if (RunSplendid(SplendidCommand.DimmingVisual, 0, (int)(40 + _brightness * 0.6)) == 0) return;
}
// GammaRamp Fallback
SetGamma(_brightness);
}
public static void InitBrightness()
{
if (!AppConfig.IsOLED()) return;
if (!AppConfig.SaveDimming()) return;
int brightness = GetBrightness();
if (brightness >= 0) SetBrightness(brightness);
}
private static bool IsOnBattery()
{
return AppConfig.SaveDimming() && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online;
}
public static int GetBrightness()
{
return AppConfig.Get(IsOnBattery() ? "brightness_battery" : "brightness", 100);
}
public static int SetBrightness(int brightness = -1, int delta = 0)
{
if (!AppConfig.IsOLED()) return -1;
if (brightness < 0) brightness = AppConfig.Get("brightness", 100);
if (brightness < 0) brightness = GetBrightness();
_brightness = Math.Max(0, Math.Min(100, brightness + delta));
AppConfig.Set("brightness", _brightness);
AppConfig.Set(IsOnBattery() ? "brightness_battery" : "brightness", _brightness);
brightnessTimer.Start();

15
app/Extra.Designer.cs generated
View File

@@ -73,8 +73,8 @@ namespace GHelper
labelBacklightTitle = new Label();
panelBacklight = new Panel();
panelBacklightExtra = new Panel();
numericBacklightPluggedTime = new NumericUpDown();
numericBacklightTime = new NumericUpDown();
numericBacklightPluggedTime = new NumericUpDownWithUnit();
numericBacklightTime = new NumericUpDownWithUnit();
labelBacklightTimeout = new Label();
labelSpeed = new Label();
comboKeyboardSpeed = new RComboBox();
@@ -119,7 +119,7 @@ namespace GHelper
checkStatusLed = new CheckBox();
checkPerKeyRGB = new CheckBox();
panelPower = new Panel();
numericHibernateAfter = new NumericUpDown();
numericHibernateAfter = new NumericUpDownWithUnit();
labelHibernateAfter = new Label();
pictureHibernate = new PictureBox();
toolTip = new ToolTip(components);
@@ -715,6 +715,7 @@ namespace GHelper
numericBacklightPluggedTime.Name = "numericBacklightPluggedTime";
numericBacklightPluggedTime.Size = new Size(140, 39);
numericBacklightPluggedTime.TabIndex = 1;
numericBacklightPluggedTime.Unit = "sec";
//
// numericBacklightTime
//
@@ -725,6 +726,7 @@ namespace GHelper
numericBacklightTime.Name = "numericBacklightTime";
numericBacklightTime.Size = new Size(140, 39);
numericBacklightTime.TabIndex = 2;
numericBacklightTime.Unit = "sec";
//
// labelBacklightTimeout
//
@@ -1323,6 +1325,7 @@ namespace GHelper
numericHibernateAfter.Maximum = new decimal(new int[] { 3000000, 0, 0, 0 });
numericHibernateAfter.Name = "numericHibernateAfter";
numericHibernateAfter.Size = new Size(152, 39);
numericHibernateAfter.Unit = "min";
numericHibernateAfter.TabIndex = 1;
//
// labelHibernateAfter
@@ -1714,8 +1717,8 @@ namespace GHelper
private Panel panelBacklightHeader;
private Panel panelBacklight;
private Panel panelBacklightExtra;
private NumericUpDown numericBacklightPluggedTime;
private NumericUpDown numericBacklightTime;
private NumericUpDownWithUnit numericBacklightPluggedTime;
private NumericUpDownWithUnit numericBacklightTime;
private Label labelBacklightTimeout;
private Label labelSpeed;
private RComboBox comboKeyboardSpeed;
@@ -1764,7 +1767,7 @@ namespace GHelper
private Panel panelPower;
private PictureBox pictureHibernate;
private Label labelHibernateAfter;
private NumericUpDown numericHibernateAfter;
private NumericUpDownWithUnit numericHibernateAfter;
private CheckBox checkGPUFix;
private ToolTip toolTip;
private CheckBox checkBootSound;

View File

@@ -76,7 +76,8 @@ namespace GHelper
customActions.Remove("fnlock");
break;
case "fnv":
customActions[""] = EMPTY;
customActions[""] = Properties.Strings.VisualMode;
customActions.Remove("visual");
break;
case "fne":
customActions[""] = "Calculator";
@@ -504,7 +505,10 @@ namespace GHelper
return;
}
eCoresMax = Math.Max(8, eCoresMax);
if (eCoresMax == 0) eCoresMax = 8;
if (pCoresMax == 0) pCoresMax = 6;
eCoresMax = Math.Max(4, eCoresMax);
pCoresMax = Math.Max(6, pCoresMax);
panelCores.Visible = true;

View File

@@ -15,7 +15,7 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<AssemblyVersion>0.185</AssemblyVersion>
<AssemblyVersion>0.198</AssemblyVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -63,8 +63,8 @@
<PackageReference Include="NAudio" Version="2.1.0" />
<PackageReference Include="NvAPIWrapper.Net" Version="0.8.1.101" />
<PackageReference Include="System.Management" Version="8.0.0" />
<PackageReference Include="TaskScheduler" Version="2.10.1" />
<PackageReference Include="WinForms.DataVisualization" Version="1.8.0" />
<PackageReference Include="TaskScheduler" Version="2.11.0" />
<PackageReference Include="WinForms.DataVisualization" Version="1.9.2" />
</ItemGroup>
<ItemGroup>

View File

@@ -119,6 +119,18 @@ public class AmdGpuControl : IGpuControl
}
public int? GetiGpuUse()
{
if (_adlContextHandle == nint.Zero || _iGPU == null) return null;
if (ADL2_New_QueryPMLogData_Get(_adlContextHandle, ((ADLAdapterInfo)_iGPU).AdapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput) != Adl2.ADL_SUCCESS) return null;
ADLSingleSensorData gpuUsage = adlpmLogDataOutput.Sensors[(int)ADLSensorType.PMLOG_INFO_ACTIVITY_GFX];
if (gpuUsage.Supported == 0) return null;
return gpuUsage.Value;
}
public int? GetGpuPower()
{
if (_adlContextHandle == nint.Zero || _iGPU == null) return null;

View File

@@ -92,13 +92,16 @@ namespace GHelper.Gpu
{
if (AppConfig.NoAutoUltimate())
{
int standardStatus = Program.acpi.SetGPUEco(0);
if (standardStatus == 0)
Program.acpi.SetGPUEco(0);
Thread.Sleep(500);
int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco);
Logger.WriteLine("Eco flag : " + eco);
if (eco == 1)
{
settings.VisualiseGPUMode();
return;
}
Thread.Sleep(100);
}
status = Program.acpi.DeviceSet(AsusACPI.GPUMux, 0, "GPUMux");
restart = true;

View File

@@ -41,7 +41,7 @@ public static class NvidiaSmi
public static int GetMaxGPUPower()
{
string output = RunNvidiaSmiCommand("--query-gpu=power.max_limit --format csv,noheader,nounits");
output = output.Trim().Trim('\n', '\r');
output = output.Trim().Trim('\n', '\r').Replace(".00","").Replace(",00", "");
if (float.TryParse(output, out float floatValue))
{

View File

@@ -94,7 +94,7 @@ namespace GHelper
private void CheckController_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.Set("controller_disabled", checkController.Checked ? 1 : 0);
AllyControl.ApplyXBoxStatus();
AllyControl.DisableXBoxController(checkController.Checked);
}
private void ComboBinding(RComboBox combo)

View File

@@ -24,7 +24,7 @@ public static class HardwareControl
public static decimal? fullCapacity;
public static decimal? chargeCapacity;
public static string? batteryCharge;
public static string? cpuFan;
public static string? gpuFan;
@@ -34,6 +34,20 @@ public static class HardwareControl
static long lastUpdate;
static bool _chargeWatt = AppConfig.Is("charge_watt");
public static bool chargeWatt
{
get
{
return _chargeWatt;
}
set
{
AppConfig.Set("charge_watt", value ? 1 : 0);
_chargeWatt = value;
}
}
private static int GetGpuUse()
{
try
@@ -226,11 +240,17 @@ public static class HardwareControl
if (fullCapacity > 0 && chargeCapacity > 0)
{
batteryCapacity = Math.Min(100, ((decimal)chargeCapacity / (decimal)fullCapacity) * 100);
if (batteryCapacity > 99) BatteryControl.UnSetBatteryLimitFull();
batteryCapacity = Math.Min(100, (decimal)chargeCapacity / (decimal)fullCapacity * 100);
if (batteryCapacity > 99 && BatteryControl.chargeFull) BatteryControl.UnSetBatteryLimitFull();
if (chargeWatt)
{
batteryCharge = Math.Round((decimal)chargeCapacity / 1000, 1).ToString() + "Wh";
}
else
{
batteryCharge = Math.Round(batteryCapacity, 1) + "%";
}
}
}
public static bool IsUsedGPU(int threshold = 10)

View File

@@ -20,6 +20,8 @@ namespace GHelper.Helpers
"AsusCertService"
};
//"AsusPTPService",
static List<string> processesAC = new() {
"ArmouryCrateSE.Service",
"ArmouryCrate.Service",

View File

@@ -1,12 +1,13 @@
using GHelper.Helpers;
using Microsoft.Win32.TaskScheduler;
using System.Diagnostics;
using System.Security.Principal;
public class Startup
{
static string taskName = "GHelper";
static string chargeTaskName = taskName + "Charge";
static string strExeFilePath = Application.ExecutablePath.Trim();
public static bool IsScheduled()
{
@@ -32,7 +33,6 @@ public class Startup
{
try
{
string strExeFilePath = Application.ExecutablePath.Trim();
string action = task.Definition.Actions.FirstOrDefault()!.ToString().Trim();
if (!strExeFilePath.Equals(action, StringComparison.OrdinalIgnoreCase) && !File.Exists(action))
{
@@ -41,11 +41,60 @@ public class Startup
UnSchedule();
Schedule();
}
} catch (Exception ex)
}
catch (Exception ex)
{
Logger.WriteLine($"Can't check startup task: {ex.Message}");
}
if (taskService.RootFolder.AllTasks.FirstOrDefault(t => t.Name == chargeTaskName) == null) ScheduleCharge();
}
}
}
public static void UnscheduleCharge()
{
using (TaskService taskService = new TaskService())
{
try
{
taskService.RootFolder.DeleteTask(chargeTaskName);
}
catch (Exception e)
{
Logger.WriteLine("Can't remove charge limit task: " + e.Message);
}
}
}
public static void ScheduleCharge()
{
if (strExeFilePath is null) return;
using (TaskDefinition td = TaskService.Instance.NewTask())
{
td.RegistrationInfo.Description = "G-Helper Charge Limit";
td.Triggers.Add(new BootTrigger());
td.Actions.Add(strExeFilePath, "charge");
td.Principal.RunLevel = TaskRunLevel.LUA;
td.Principal.LogonType = TaskLogonType.S4U;
td.Principal.UserId = WindowsIdentity.GetCurrent().Name;
td.Settings.StopIfGoingOnBatteries = false;
td.Settings.DisallowStartIfOnBatteries = false;
td.Settings.ExecutionTimeLimit = TimeSpan.Zero;
try
{
TaskService.Instance.RootFolder.RegisterTaskDefinition(chargeTaskName, td);
Logger.WriteLine("Charge limit task scheduled: " + strExeFilePath);
}
catch (Exception e)
{
Logger.WriteLine("Can't create a charge limit task: " + e.Message);
}
}
}
@@ -53,29 +102,20 @@ public class Startup
public static void Schedule()
{
string strExeFilePath = Application.ExecutablePath;
if (strExeFilePath is null) return;
var userId = WindowsIdentity.GetCurrent().Name;
using (TaskDefinition td = TaskService.Instance.NewTask())
{
td.RegistrationInfo.Description = "G-Helper Auto Start";
td.Triggers.Add(new LogonTrigger { UserId = userId, Delay = TimeSpan.FromSeconds(1) });
td.Triggers.Add(new LogonTrigger { UserId = WindowsIdentity.GetCurrent().Name, Delay = TimeSpan.FromSeconds(2) });
td.Actions.Add(strExeFilePath);
if (ProcessHelper.IsUserAdministrator())
if (ProcessHelper.IsUserAdministrator())
td.Principal.RunLevel = TaskRunLevel.Highest;
td.Settings.StopIfGoingOnBatteries = false;
td.Settings.DisallowStartIfOnBatteries = false;
td.Settings.ExecutionTimeLimit = TimeSpan.Zero;
Debug.WriteLine(strExeFilePath);
Debug.WriteLine(userId);
try
{
TaskService.Instance.RootFolder.RegisterTaskDefinition(taskName, td);
@@ -87,8 +127,12 @@ public class Startup
else
ProcessHelper.RunAsAdmin();
}
Logger.WriteLine("Startup task scheduled: " + strExeFilePath);
}
ScheduleCharge();
}
public static void UnSchedule()
@@ -107,5 +151,7 @@ public class Startup
ProcessHelper.RunAsAdmin();
}
}
UnscheduleCharge();
}
}

View File

@@ -2,21 +2,31 @@
public static class TouchscreenHelper
{
public static bool? ToggleTouchscreen()
public static bool? GetStatus()
{
try
{
ProcessHelper.RunAsAdmin();
return ProcessHelper.RunCMD("powershell", "(Get-PnpDevice -FriendlyName '*touch*screen*').Status").Contains("OK");
}
catch (Exception ex)
{
Logger.WriteLine($"Can't get touchscreen status: {ex.Message}");
return null;
}
}
var status = !ProcessHelper.RunCMD("powershell", "(Get-PnpDevice -FriendlyName '*touch*screen*').Status").Contains("OK");
public static void ToggleTouchscreen(bool status)
{
try
{
ProcessHelper.RunAsAdmin();
ProcessHelper.RunCMD("powershell", (status ? "Enable-PnpDevice" : "Disable-PnpDevice") + " -InstanceId (Get-PnpDevice -FriendlyName '*touch*screen*').InstanceId -Confirm:$false");
return status;
}
catch (Exception ex)
{
Logger.WriteLine($"Can't toggle touchscreen: {ex.Message}");
return null;
}
}

View File

@@ -14,9 +14,16 @@ namespace GHelper.Input
{
System.Timers.Timer timer = new System.Timers.Timer(1000);
public static bool backlightActivity = true;
public static bool lidClose = false;
public static Keys keyProfile = Keys.F5;
public static Keys keyApp = Keys.F12;
public static Keys keyProfile = (Keys)AppConfig.Get("keybind_profile", (int)Keys.F5);
public static Keys keyApp = (Keys)AppConfig.Get("keybind_app", (int)Keys.F12);
public static Keys keyProfile0 = (Keys)AppConfig.Get("keybind_profile_0", (int)Keys.F17);
public static Keys keyProfile1 = (Keys)AppConfig.Get("keybind_profile_1", (int)Keys.F18);
public static Keys keyProfile2 = (Keys)AppConfig.Get("keybind_profile_2", (int)Keys.F16);
public static Keys keyProfile3 = (Keys)AppConfig.Get("keybind_profile_3", (int)Keys.F19);
public static Keys keyProfile4 = (Keys)AppConfig.Get("keybind_profile_4", (int)Keys.F20);
static ModeControl modeControl = Program.modeControl;
static ScreenControl screenControl = new ScreenControl();
@@ -85,8 +92,7 @@ namespace GHelper.Input
InitBacklightTimer();
if (AppConfig.IsVivoZenbook())
Program.acpi.DeviceSet(AsusACPI.FnLock, AppConfig.Is("fn_lock") ^ AppConfig.IsInvertedFNLock() ? 1 : 0, "FnLock");
if (AppConfig.IsHardwareFnLock()) HardwareFnLock(AppConfig.Is("fn_lock"));
}
@@ -102,10 +108,6 @@ namespace GHelper.Input
{
hook.UnregisterAll();
// CTRL + SHIFT + F5 to cycle profiles
if (AppConfig.Get("keybind_profile") != -1) keyProfile = (Keys)AppConfig.Get("keybind_profile");
if (AppConfig.Get("keybind_app") != -1) keyApp = (Keys)AppConfig.Get("keybind_app");
string actionM1 = AppConfig.GetString("m1");
string actionM2 = AppConfig.GetString("m2");
@@ -119,18 +121,22 @@ namespace GHelper.Input
if (!AppConfig.Is("skip_hotkeys"))
{
if (AppConfig.IsDUO())
{
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F7);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F8);
}
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F13);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F14);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F15);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F16);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F17);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F18);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F19);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F20);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, keyProfile0);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, keyProfile1);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, keyProfile2);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, keyProfile3);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, keyProfile4);
hook.RegisterHotKey(ModifierKeys.Control, Keys.VolumeDown);
hook.RegisterHotKey(ModifierKeys.Control, Keys.VolumeUp);
@@ -155,7 +161,7 @@ namespace GHelper.Input
// FN-Lock group
if (AppConfig.Is("fn_lock") && !AppConfig.IsVivoZenbook())
if (AppConfig.Is("fn_lock") && !AppConfig.IsHardwareFnLock())
for (Keys i = Keys.F1; i <= Keys.F11; i++) hook.RegisterHotKey(ModifierKeys.None, i);
// Arrow-lock group
@@ -229,24 +235,31 @@ namespace GHelper.Input
}
static void SetBrightness(int delta)
static void SetBrightness(bool up, bool hotkey = false)
{
int brightness = -1;
if (isTUF) brightness = ScreenBrightness.Get();
if (AppConfig.SwappedBrightness()) delta = -delta;
if (AppConfig.SwappedBrightness() && !hotkey) up = !up;
Program.acpi.DeviceSet(AsusACPI.UniversalControl, delta > 0 ? AsusACPI.Brightness_Up : AsusACPI.Brightness_Down, "Brightness");
int step = AppConfig.Get("brightness_step", 10);
if (step != 10)
{
Program.toast.RunToast(ScreenBrightness.Adjust(up ? step : -step) + "%", up ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);
return;
}
Program.acpi.DeviceSet(AsusACPI.UniversalControl, up ? AsusACPI.Brightness_Up : AsusACPI.Brightness_Down, "Brightness");
if (isTUF)
{
if (AppConfig.SwappedBrightness()) return;
if (delta < 0 && brightness <= 0) return;
if (delta > 0 && brightness >= 100) return;
if (!up && brightness <= 0) return;
if (up && brightness >= 100) return;
Thread.Sleep(100);
if (brightness == ScreenBrightness.Get())
Program.toast.RunToast(ScreenBrightness.Adjust(delta) + "%", (delta < 0) ? ToastIcon.BrightnessDown : ToastIcon.BrightnessUp);
Program.toast.RunToast(ScreenBrightness.Adjust(up ? step : -step) + "%", up ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);
}
}
@@ -276,7 +289,7 @@ namespace GHelper.Input
KeyboardHook.KeyPress(Keys.VolumeUp);
return;
case Keys.F4:
KeyProcess("m3");
ToggleMic();
return;
}
}
@@ -295,10 +308,10 @@ namespace GHelper.Input
HandleEvent(199); // Backlight cycle
return;
case Keys.F5:
SetBrightness(-10);
SetBrightness(false);
return;
case Keys.F6:
SetBrightness(+10);
SetBrightness(true);
return;
case Keys.F7:
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.P);
@@ -307,7 +320,7 @@ namespace GHelper.Input
HandleEvent(126); // Emojis
return;
case Keys.F9:
KeyProcess("m3"); // MicMute
ToggleMic(); // MicMute
return;
case Keys.F10:
HandleEvent(133); // Camera Toggle
@@ -366,10 +379,10 @@ namespace GHelper.Input
KeyboardHook.KeyPress(Keys.Snapshot);
break;
case Keys.F7:
SetBrightness(-10);
SetBrightness(false);
break;
case Keys.F8:
SetBrightness(+10);
SetBrightness(true);
break;
case Keys.F9:
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.P);
@@ -408,20 +421,26 @@ namespace GHelper.Input
{
if (e.Key == keyProfile) modeControl.CyclePerformanceMode();
if (e.Key == keyApp) Program.SettingsToggle();
if (e.Key == Keys.F20) KeyProcess("m3");
if (e.Key == Keys.F20) ToggleMic();
}
if (e.Modifier == (ModifierKeys.Control | ModifierKeys.Shift | ModifierKeys.Alt))
{
if (e.Key == keyProfile) modeControl.CyclePerformanceMode(true);
if (e.Key == keyProfile0) modeControl.SetPerformanceMode(0, true);
if (e.Key == keyProfile1) modeControl.SetPerformanceMode(1, true);
if (e.Key == keyProfile2) modeControl.SetPerformanceMode(2, true);
if (e.Key == keyProfile3) modeControl.SetPerformanceMode(3, true);
if (e.Key == keyProfile4) modeControl.SetPerformanceMode(4, true);
switch (e.Key)
{
case Keys.F1:
SetBrightness(-10);
SetBrightness(false);
break;
case Keys.F2:
SetBrightness(10);
SetBrightness(true);
break;
case Keys.F3:
Program.settingsForm.gpuControl.ToggleXGM(true);
@@ -429,30 +448,23 @@ namespace GHelper.Input
case Keys.F4:
Program.settingsForm.BeginInvoke(Program.settingsForm.allyControl.ToggleModeHotkey);
break;
case Keys.F7:
SetScreenpad(-10);
break;
case Keys.F8:
SetScreenpad(10);
break;
case Keys.F13:
ToggleScreenRate();
break;
case Keys.F14:
Program.toast.RunToast(Properties.Strings.EcoMode);
Program.settingsForm.gpuControl.SetGPUMode(AsusACPI.GPUModeEco);
break;
case Keys.F15:
Program.toast.RunToast(Properties.Strings.StandardMode);
Program.settingsForm.gpuControl.SetGPUMode(AsusACPI.GPUModeStandard);
break;
case Keys.F16:
modeControl.SetPerformanceMode(2, true);
break;
case Keys.F17:
modeControl.SetPerformanceMode(0, true);
break;
case Keys.F18:
modeControl.SetPerformanceMode(1, true);
break;
case Keys.F19:
modeControl.SetPerformanceMode(3, true);
break;
case Keys.F20:
modeControl.SetPerformanceMode(4, true);
break;
}
}
@@ -463,11 +475,11 @@ namespace GHelper.Input
{
case Keys.VolumeDown:
// Screen brightness down on CTRL+VolDown
SetBrightness(-10);
SetBrightness(false);
break;
case Keys.VolumeUp:
// Screen brightness up on CTRL+VolUp
SetBrightness(+10);
SetBrightness(true);
break;
}
}
@@ -505,6 +517,8 @@ namespace GHelper.Input
action = "micmute";
if (name == "fnc")
action = "fnlock";
if (name == "fnv")
action = "visual";
if (name == "fne")
action = "calculator";
}
@@ -559,15 +573,13 @@ namespace GHelper.Input
ToggleFnLock();
break;
case "micmute":
bool muteStatus = Audio.ToggleMute();
Program.toast.RunToast(muteStatus ? Properties.Strings.Muted : Properties.Strings.Unmuted, muteStatus ? ToastIcon.MicrophoneMute : ToastIcon.Microphone);
if (AppConfig.IsVivoZenbook()) Program.acpi.DeviceSet(AsusACPI.MicMuteLed, muteStatus ? 1 : 0, "MicmuteLed");
ToggleMic();
break;
case "brightness_up":
SetBrightness(+10);
SetBrightness(true);
break;
case "brightness_down":
SetBrightness(-10);
SetBrightness(false);
break;
case "screenpad_up":
SetScreenpad(10);
@@ -585,15 +597,27 @@ namespace GHelper.Input
Program.settingsForm.BeginInvoke(Program.settingsForm.allyControl.ToggleModeHotkey);
break;
case "touchscreen":
var touchscreenStatus = TouchscreenHelper.ToggleTouchscreen();
if (touchscreenStatus is not null)
Program.toast.RunToast(Properties.Strings.Touchscreen + " " + ((bool)touchscreenStatus ? Properties.Strings.On : Properties.Strings.Off), ToastIcon.Touchpad);
var status = !TouchscreenHelper.GetStatus();
Logger.WriteLine("Touchscreen status: " + status);
if (status is not null)
{
Program.toast.RunToast(Properties.Strings.Touchscreen + " " + ((bool)status ? Properties.Strings.On : Properties.Strings.Off), ToastIcon.Touchpad);
TouchscreenHelper.ToggleTouchscreen((bool)status);
}
break;
default:
break;
}
}
static void ToggleMic()
{
bool muteStatus = Audio.ToggleMute();
Program.toast.RunToast(muteStatus ? Properties.Strings.Muted : Properties.Strings.Unmuted, muteStatus ? ToastIcon.MicrophoneMute : ToastIcon.Microphone);
if (AppConfig.IsVivoZenbook()) Program.acpi.DeviceSet(AsusACPI.MicMuteLed, muteStatus ? 1 : 0, "MicmuteLed");
}
static bool GetTouchpadState()
{
using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\PrecisionTouchPad\Status", false))
@@ -629,13 +653,19 @@ namespace GHelper.Input
Program.toast.RunToast("Arrow-Lock " + (arLock == 1 ? Properties.Strings.On : Properties.Strings.Off), ToastIcon.FnLock);
}
public static void HardwareFnLock(bool fnLock)
{
Program.acpi.DeviceSet(AsusACPI.FnLock, fnLock ^ AppConfig.IsInvertedFNLock() ? 1 : 0, "FnLock");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x4E, fnLock ? (byte)0x00 : (byte)0x01], "USB FnLock");
}
public static void ToggleFnLock()
{
bool fnLock = !AppConfig.Is("fn_lock");
AppConfig.Set("fn_lock", fnLock ? 1 : 0);
if (AppConfig.IsVivoZenbook())
Program.acpi.DeviceSet(AsusACPI.FnLock, fnLock ^ AppConfig.IsInvertedFNLock() ? 1 : 0, "FnLock");
if (AppConfig.IsHardwareFnLock())
HardwareFnLock(fnLock);
else
Program.settingsForm.BeginInvoke(Program.inputDispatcher.RegisterKeys);
@@ -711,6 +741,8 @@ namespace GHelper.Input
KeyProcess("fne");
return;
case 174: // FN+F5
case 153: // FN+F5 OLD MODELS
case 157: // Zenbook DUO FN+F
modeControl.CyclePerformanceMode(Control.ModifierKeys == Keys.Shift);
return;
case 179: // FN+F4
@@ -772,7 +804,7 @@ namespace GHelper.Input
}
else
{
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Down, "Brightness");
SetBrightness(false, true);
}
break;
case 32: // FN+F8
@@ -787,7 +819,7 @@ namespace GHelper.Input
}
else
{
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Up, "Brightness");
SetBrightness(true, true);
}
break;
case 133: // Camera Toggle
@@ -843,6 +875,7 @@ namespace GHelper.Input
public static void SetBacklightAuto(bool init = false)
{
if (lidClose) return;
if (init) Aura.Init();
Aura.ApplyBrightness(GetBacklight(), "Auto", init);
}
@@ -931,7 +964,7 @@ namespace GHelper.Input
private static System.Threading.Timer screenpadActionTimer;
private static int screenpadBrightnessToSet;
public static void ApplyScreenpadAction(int brightness, bool doToggle = false)
public static void ApplyScreenpadAction(int brightness, bool instant = true)
{
var delay = AppConfig.Get("screenpad_delay", 1500);
@@ -939,11 +972,12 @@ namespace GHelper.Input
Action<int> action = (b) =>
{
if (b >= 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 1, "ScreenpadOn");
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, Math.Max(b * 255 / 100, 0), "Screenpad");
int[] brightnessValues = [0, 4, 9, 14, 21, 32, 48, 73, 111, 169, 255];
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, brightnessValues[Math.Min(brightnessValues.Length - 1, Math.Max(0, b / 10))], "Screenpad");
if (b < 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 0, "ScreenpadOff");
};
if(delay <= 0 || (brightness > 0 && brightness < 100 && doToggle == false)) //instant action
if(delay <= 0 || instant) //instant action
{
action(brightness);
}
@@ -969,25 +1003,31 @@ namespace GHelper.Input
if (brightness < 0) brightness = 100;
else if (brightness >= 100) brightness = 0;
else brightness = -10;
ApplyScreenpadAction(brightness, false);
}
else
{
brightness = Math.Max(Math.Min(100, brightness + delta), -10);
brightness = Math.Max(Math.Min(100, brightness + delta), 0);
ApplyScreenpadAction(brightness);
}
AppConfig.Set("screenpad", brightness);
ApplyScreenpadAction(brightness);
string toast;
if (brightness < 0) toast = "Off";
else if (brightness == 0) toast = "Hidden";
else toast = brightness.ToString() + "%";
Program.toast.RunToast($"Screen Pad {toast}", delta > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);
}
public static void InitScreenpad()
{
if (!AppConfig.IsDUO()) return;
int brightness = AppConfig.Get("screenpad");
if (brightness >= 0) ApplyScreenpadAction(brightness);
}
static void LaunchProcess(string command = "")
{
if (string.IsNullOrEmpty(command)) return;

View File

@@ -10,6 +10,8 @@ namespace GHelper.Input
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
Action<int> _handler;
static int retry = 0;
public KeyboardListener(Action<int> KeyHandler)
{
_handler = KeyHandler;
@@ -67,6 +69,12 @@ namespace GHelper.Input
catch (Exception ex)
{
Logger.WriteLine($"Listener exited: {ex.Message}");
if (retry++ < 2)
{
Thread.Sleep(300);
Logger.WriteLine($"Restarting listener {retry}");
Listen();
}
}
}

View File

@@ -30,6 +30,7 @@ namespace GHelper
labelScaling.Text = Properties.Strings.ScalingQuality;
labelRotation.Text = Properties.Strings.ImageRotation;
labelContrastTitle.Text = Properties.Strings.Contrast;
labelGammaTitle.Text = Properties.Strings.Brightness;
buttonPicture.Text = Properties.Strings.PictureGif;
buttonReset.Text = Properties.Strings.Reset;
@@ -80,7 +81,7 @@ namespace GHelper
{
AppConfig.Set("matrix_contrast", trackContrast.Value);
AppConfig.Set("matrix_gamma", trackGamma.Value);
SetMatrixPicture();
SetMatrixPicture(false);
}

View File

@@ -110,30 +110,24 @@ namespace GHelper.Mode
if (notify) Toast();
// Power plan from config or defaulting to balanced
if (AppConfig.GetModeString("scheme") is not null)
PowerNative.SetPowerPlan(AppConfig.GetModeString("scheme"));
else
PowerNative.SetBalancedPowerPlan();
if (!AppConfig.Is("skip_powermode"))
{
// Power plan from config or defaulting to balanced
if (AppConfig.GetModeString("scheme") is not null)
PowerNative.SetPowerPlan(AppConfig.GetModeString("scheme"));
else
PowerNative.SetBalancedPowerPlan();
// Windows power mode
if (AppConfig.GetModeString("powermode") is not null)
PowerNative.SetPowerMode(AppConfig.GetModeString("powermode"));
else
PowerNative.SetPowerMode(Modes.GetBase(mode));
// Windows power mode
if (AppConfig.GetModeString("powermode") is not null)
PowerNative.SetPowerMode(AppConfig.GetModeString("powermode"));
else
PowerNative.SetPowerMode(Modes.GetBase(mode));
}
// CPU Boost setting override
if (AppConfig.GetMode("auto_boost") != -1)
PowerNative.SetCPUBoost(AppConfig.GetMode("auto_boost"));
//BatteryControl.SetBatteryChargeLimit();
/*
if (NativeMethods.PowerGetEffectiveOverlayScheme(out Guid activeScheme) == 0)
{
Debug.WriteLine("Effective :" + activeScheme);
}
*/
PowerNative.SetCPUBoost(AppConfig.GetMode("auto_boost"));
settings.FansInit();
}
@@ -162,7 +156,8 @@ namespace GHelper.Mode
modeToggleTimer.Start();
Modes.SetCurrent(Modes.GetNext(back));
Toast();
} else
}
else
{
SetPerformanceMode(Modes.GetNext(back), true);
}
@@ -270,9 +265,6 @@ namespace GHelper.Mode
var stapmResult = SendCommand.set_stapm_limit((uint)limit_total * 1000);
if (init) Logger.WriteLine($"STAPM: {limit_total} {stapmResult}");
var stapmResult2 = SendCommand.set_stapm2_limit((uint)limit_total * 1000);
if (init) Logger.WriteLine($"STAPM2: {limit_total} {stapmResult2}");
var slowResult = SendCommand.set_slow_limit((uint)limit_slow * 1000);
if (init) Logger.WriteLine($"SLOW: {limit_slow} {slowResult}");
@@ -388,7 +380,7 @@ namespace GHelper.Mode
if (gpu_power >= AsusACPI.MinGPUPower && gpu_power <= AsusACPI.MaxGPUPower && Program.acpi.DeviceGet(AsusACPI.GPU_POWER) >= 0)
Program.acpi.DeviceSet(AsusACPI.GPU_POWER, gpu_power, "PowerLimit TGP (GPU VAR)");
if (gpu_boost >= AsusACPI.MinGPUBoost && gpu_boost <= AsusACPI.MaxGPUBoost && Program.acpi.DeviceGet(AsusACPI.PPT_GPUC0) >= 0)
if (gpu_boost >= AsusACPI.MinGPUBoost && gpu_boost <= AsusACPI.MaxGPUBoost && Program.acpi.DeviceGet(AsusACPI.PPT_GPUC0) >= 0)
boostResult = Program.acpi.DeviceSet(AsusACPI.PPT_GPUC0, gpu_boost, "PowerLimit C0 (GPU BOOST)");
if (gpu_temp >= AsusACPI.MinGPUTemp && gpu_temp <= AsusACPI.MaxGPUTemp && Program.acpi.DeviceGet(AsusACPI.PPT_GPUC2) >= 0)

View File

@@ -86,7 +86,7 @@
public override int DPIIncrements()
{
return 100;
return 50;
}

View File

@@ -53,6 +53,13 @@ namespace GHelper
string action = "";
if (args.Length > 0) action = args[0];
if (action == "charge")
{
BatteryLimit();
Application.Exit();
return;
}
string language = AppConfig.GetString("language");
if (language != null && language.Length > 0)
@@ -69,6 +76,10 @@ namespace GHelper
Logger.WriteLine("------------");
Logger.WriteLine("App launched: " + AppConfig.GetModel() + " :" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + CultureInfo.CurrentUICulture + (ProcessHelper.IsUserAdministrator() ? "." : ""));
var startCount = AppConfig.Get("start_count") + 1;
AppConfig.Set("start_count", startCount);
Logger.WriteLine("Start Count: " + startCount);
acpi = new AsusACPI();
if (!acpi.IsConnected() && AppConfig.IsASUS())
@@ -83,6 +94,8 @@ namespace GHelper
return;
}
ProcessHelper.KillByName("ASUSSmartDisplayControl");
Application.EnableVisualStyles();
HardwareControl.RecreateGpuControl();
@@ -199,7 +212,7 @@ namespace GHelper
if (settingsForm.matrixForm is not null && settingsForm.matrixForm.Text != "")
settingsForm.matrixForm.InitTheme();
if (settingsForm.handheldForm is not null && settingsForm.handheldForm.Text != "")
if (settingsForm.handheldForm is not null && settingsForm.handheldForm.Text != "")
settingsForm.handheldForm.InitTheme();
break;
@@ -218,7 +231,12 @@ namespace GHelper
Logger.WriteLine("AutoSetting for " + isPlugged.ToString());
BatteryControl.AutoBattery(init);
if (init) screenControl.InitMiniled();
if (init)
{
screenControl.InitMiniled();
InputDispatcher.InitScreenpad();
}
inputDispatcher.Init();
@@ -237,11 +255,14 @@ namespace GHelper
if (AppConfig.IsAlly())
{
allyControl.Init();
} else
}
else
{
settingsForm.AutoKeyboard();
}
VisualControl.InitBrightness();
return true;
}
@@ -262,6 +283,7 @@ namespace GHelper
}
if (SystemInformation.PowerStatus.PowerLineStatus == isPlugged) return;
if (AppConfig.Is("disable_power_event")) return;
SetAutoModes(true);
}
@@ -282,7 +304,7 @@ namespace GHelper
}
else
{
var screen = Screen.PrimaryScreen;
var screen = Screen.PrimaryScreen;
if (screen is null) screen = Screen.FromControl(settingsForm);
settingsForm.Location = screen.WorkingArea.Location;
@@ -293,7 +315,7 @@ namespace GHelper
settingsForm.Activate();
settingsForm.Left = screen.WorkingArea.Width - 10 - settingsForm.Width;
if (AppConfig.IsAlly())
settingsForm.Top = Math.Max(10, screen.Bounds.Height - 110 - settingsForm.Height);
else
@@ -322,6 +344,23 @@ namespace GHelper
Application.Exit();
}
static void BatteryLimit()
{
try
{
int limit = AppConfig.Get("charge_limit");
if (limit > 0 && limit < 100)
{
Logger.WriteLine($"------- Startup Battery Limit {limit} -------");
acpi = new AsusACPI();
acpi.DeviceSet(AsusACPI.BatteryLimit, limit, "Limit");
}
}
catch (Exception ex)
{
Logger.WriteLine("Startup Battery Limit Error: " + ex.Message);
}
}
}
}

View File

@@ -771,6 +771,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Donate.
/// </summary>
internal static string Donate {
get {
return ResourceManager.GetString("Donate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Download Color Profiles.
/// </summary>
@@ -1196,6 +1205,42 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Legend.
/// </summary>
internal static string Legend {
get {
return ResourceManager.GetString("Legend", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Can&apos;t check local version.
/// </summary>
internal static string LegendGray {
get {
return ResourceManager.GetString("LegendGray", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Updated.
/// </summary>
internal static string LegendGreen {
get {
return ResourceManager.GetString("LegendGreen", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Update Available.
/// </summary>
internal static string LegendRed {
get {
return ResourceManager.GetString("LegendRed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lid.
/// </summary>
@@ -1575,7 +1620,7 @@ namespace GHelper.Properties {
}
/// <summary>
/// Looks up a localized string similar to Switch to Eco on battery and to Standard when plugged.
/// Looks up a localized string similar to Switch to Eco on battery and to Standard when plugged in.
/// </summary>
internal static string OptimizedGPUTooltip {
get {
@@ -1935,7 +1980,7 @@ namespace GHelper.Properties {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Touchscreen.
/// </summary>
internal static string Touchscreen {
get {

View File

@@ -744,7 +744,7 @@ Vil du stadig fortsætte?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Vil du stadig fortsætte?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Trotzdem fortfahren?</value>
<value>Touchscreen umschalten</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -783,7 +783,7 @@ Trotzdem fortfahren?</value>
<value>Darstellungsmodi sind nicht verfügbar, wenn HDR aktiv ist.</value>
</data>
<data name="VisualModesScreen" xml:space="preserve">
<value>Darstellungsmodi sind nicht verfügbar, wenn Laptop-Bildschirm aus ist.</value>
<value>Modi nicht verfügbar, wenn Laptop-Bildschirm aus ist.</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Lautstärke verringern</value>
@@ -800,4 +800,22 @@ Trotzdem fortfahren?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Spenden</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legende</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Kann lokale Version nicht überprüfen</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update verfügbar</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Aktuell</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@
<value>Alternar pantalla táctil</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Pantalla táctil</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donar</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Leyenda</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>No se puede comprobar la versión local</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Actualización disponible</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Actualizado</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Voulez-vous continuer ?</value>
<value>Activer/désactiver l'écran tactile</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Voulez-vous continuer ?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Érintőképernyő ki-/bekapcsolása</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbó</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Apakah Anda masih ingin melanjutkan?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Apakah Anda masih ingin melanjutkan?</value>
<data name="Zoom" xml:space="preserve">
<value>Perbesar</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Sei sicuro di voler continuare?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Sei sicuro di voler continuare?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>터보</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>확대/축소</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -250,13 +250,13 @@
<value>Pabudęs</value>
</data>
<data name="BacklightLow" xml:space="preserve">
<value>Low</value>
<value>Žem.</value>
</data>
<data name="BacklightMax" xml:space="preserve">
<value>Max</value>
<value>Maks.</value>
</data>
<data name="BacklightMid" xml:space="preserve">
<value>Mid</value>
<value>Vid.</value>
</data>
<data name="BacklightOff" xml:space="preserve">
<value>Išjungta</value>
@@ -265,10 +265,10 @@
<value>Laiko riba su lizdu / akumuliatoriumi (0 ĮJUNGTA)</value>
</data>
<data name="BacklightTimeoutBattery" xml:space="preserve">
<value>Backlight Timeout when on battery</value>
<value>Foninio apšvietimo laikas akumuliatoriaus režimu</value>
</data>
<data name="BacklightTimeoutPlugged" xml:space="preserve">
<value>Backlight Timeout when plugged</value>
<value>Foninio apšvietimo laikas įkraunant</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Balansuotas</value>
@@ -519,7 +519,7 @@ Vis tiek norite tęsti?</value>
<value>Kairiojo jungiklio nejautrumo zonos</value>
</data>
<data name="LTDeadzones" xml:space="preserve">
<value>Left Trigger Deadzones</value>
<value>Kairiojo jungiklio nejautrumo zonos</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Garso vizualizatorius</value>
@@ -585,13 +585,13 @@ Vis tiek norite tęsti?</value>
<value>Sinchronizuoti su pele</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multi Zone</value>
<value>Kelios zonos</value>
</data>
<data name="MultizoneStrong" xml:space="preserve">
<value>Multi Zone Strong</value>
<value>Kelių zonų stiprumas</value>
</data>
<data name="Muted" xml:space="preserve">
<value>Muted</value>
<value>Išjungta</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Mikrofono nutildymas</value>
@@ -615,7 +615,7 @@ Vis tiek norite tęsti?</value>
<value>Įjungta</value>
</data>
<data name="OneZone" xml:space="preserve">
<value>One Zone</value>
<value>Viena zona</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Atidaryti G-Helper langą</value>
@@ -675,16 +675,16 @@ Vis tiek norite tęsti?</value>
<value>RPM</value>
</data>
<data name="RSDeadzones" xml:space="preserve">
<value>Right Stick Deadzones</value>
<value>Dešiniojo jungiklio nejautrumo zonos</value>
</data>
<data name="RTDeadzones" xml:space="preserve">
<value>Right Trigger Deadzones</value>
<value>Dešiniojo jungiklio nejautrumo zonos</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Paleisti įjungus sistemą</value>
</data>
<data name="ScalingQuality" xml:space="preserve">
<value>Scaling Quality</value>
<value>Mastelio kokybė</value>
</data>
<data name="ScreenPadDown" xml:space="preserve">
<value>Ekrano skydelio ryškumo mažinimas</value>
@@ -741,10 +741,10 @@ Vis tiek norite tęsti?</value>
<value>Perjungti ekraną</value>
</data>
<data name="ToggleTouchscreen" xml:space="preserve">
<value>Toggle Touchscreen</value>
<value>Valdyti jutiklinį ekraną</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Jutiklinis ekranas</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -765,7 +765,7 @@ Vis tiek norite tęsti?</value>
<value>Įtampos mažinimas yra eksperimentinė ir pavojinga funkcija. Jei pritaikytos reikšmės yra per mažos jūsų aparatinei įrangai, ji gali tapti nestabili, išsijungti arba pažeisti duomenų vientisumą. Jei norite pabandyti, iš pirmo pradėkite nuo mažų reikšmių, spustelėkite „Taikyti“ ir išbandykite, kas jums tinka.</value>
</data>
<data name="Unmuted" xml:space="preserve">
<value>Unmuted</value>
<value>Įjungta</value>
</data>
<data name="Updates" xml:space="preserve">
<value>Naujinimai</value>
@@ -798,6 +798,24 @@ Vis tiek norite tęsti?</value>
<value>Visada rodyti programėlės langą viršuje</value>
</data>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
<value>Mastelis</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Paremti</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legenda</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Nepavyko patikrinti vietinės versijos</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Išleista nauja versija</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Atnaujinta</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Nadal chcesz kontynuować?</value>
<value>Włącz/wyłącz ekran dotykowy</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Ekran dotykowy</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Nadal chcesz kontynuować?</value>
<data name="Zoom" xml:space="preserve">
<value>Przybliżenie</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Wesprzyj</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legenda</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Brak informacji</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Dostępna aktualizacja</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Wersja aktualna</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Quer prosseguir?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Quer prosseguir?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value />
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Yine de devam etmek istiyor musunuz?</value>
<value>Dokunmatik Ekranı Değiştir</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Dokunmatik ekran</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Yine de devam etmek istiyor musunuz?</value>
<data name="Zoom" xml:space="preserve">
<value>Yakınlaştır</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Bağış</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Gösterge</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Yerel sürüm denetlenemiyor</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Güncelleme Mevcut</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Güncellendi</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -316,7 +316,7 @@
<value>Чорно-біла іконка трею</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Калібрування</value>
<value>Калібр.</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Зарядка</value>
@@ -744,7 +744,7 @@
<value>Сенсорний екран</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Сенсорний екран</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Турбо</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>Зум</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Донат</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Легенда</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Немає даних</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Є оновлення</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Оновлено</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -741,10 +741,10 @@
<value>关闭屏幕</value>
</data>
<data name="ToggleTouchscreen" xml:space="preserve">
<value>Toggle Touchscreen</value>
<value>切换触摸屏</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>触摸屏</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>增强模式</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>缩放</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>赞助</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>无法检查本地版本</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>有可用更新</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>已更新</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -157,7 +157,7 @@
<value>程式正在執行</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper正在執行。 請檢查右下系統匣。</value>
<value>G-Helper 正在執行。 請檢查右下系統匣。</value>
</data>
<data name="Apply" xml:space="preserve">
<value>套用</value>
@@ -169,10 +169,10 @@
<value>套用功率限制</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>自動調整Windows電源模式</value>
<value>自動調整 Windows 電源模式</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>分配給GPU的記憶體</value>
<value>分配給 GPU 的記憶體</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>執行中的華碩服務</value>
@@ -295,7 +295,7 @@
<value>次要</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS與驅動程式更新</value>
<value>BIOS 與驅動程式更新</value>
</data>
<data name="Boot" xml:space="preserve">
<value>開機時</value>
@@ -744,7 +744,7 @@
<value>切換螢幕觸控</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>觸控螢幕</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>極速</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>縮放</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>捐贈</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>無法檢查本機版本</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>有可用的更新</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>已更新</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -41,6 +41,7 @@ namespace Ryzen
//RAPHAEL/DRAGON RANGE - 10
//MENDOCINO - 11
//HAWKPOINT - 12
//STRIXPOINT - 13
public static void Init()
{
@@ -77,7 +78,7 @@ namespace Ryzen
FAMID = 1; //PICASSO
}
if (CPUModel.Contains("Model " + Convert.ToString(32)))
if (CPUModel.Contains("Family " + Convert.ToString(23)) && CPUModel.Contains("Model " + Convert.ToString(32)))
{
FAMID = 2; //DALI
}
@@ -127,6 +128,11 @@ namespace Ryzen
FAMID = 12; //HAWKPOINT
}
if (CPUModel.Contains("Family " + Convert.ToString(26)) && CPUModel.Contains("Model " + Convert.ToString(36)))
{
FAMID = 13; //STRIXPOINT
}
Logger.WriteLine($"CPU: {FAMID} - {CPUName} - {CPUModel}");
SetAddresses();
@@ -141,7 +147,7 @@ namespace Ryzen
public static bool IsSupportedUV()
{
if (CPUName.Length == 0) Init();
return CPUName.Contains("Ryzen 9") || CPUName.Contains("4900H") || CPUName.Contains("4800H") || CPUName.Contains("4600H");
return CPUName.Contains("Ryzen AI 9") || CPUName.Contains("Ryzen 9") || CPUName.Contains("4900H") || CPUName.Contains("4800H") || CPUName.Contains("4600H");
}
public static bool IsSupportedUViGPU()
@@ -238,6 +244,16 @@ namespace Ryzen
Smu.PSMU_ADDR_RSP = 0x3B10a80;
Smu.PSMU_ADDR_ARG = 0x3B10a88;
}
else if (FAMID == 13)
{
Smu.MP1_ADDR_MSG = 0x3B10928;
Smu.MP1_ADDR_RSP = 0x3B10978;
Smu.MP1_ADDR_ARG = 0x3B10998;
Smu.PSMU_ADDR_MSG = 0x3B10a20;
Smu.PSMU_ADDR_RSP = 0x3B10a80;
Smu.PSMU_ADDR_ARG = 0x3B10a88;
}
else if (FAMID == 4 || FAMID == 6)
{
Smu.MP1_ADDR_MSG = 0x3B10530;

View File

@@ -22,6 +22,7 @@ namespace Ryzen
//RAPHAEL/DRAGON RANGE - 10
//MENDOCINO - 11
//HAWKPOINT - 12
//STRIXPOINT - 13
public static Smu RyzenAccess = new Smu(false);
public static int FAMID = RyzenControl.FAMID;
@@ -49,7 +50,8 @@ namespace Ryzen
case 9:
case 11:
case 12:
RyzenAccess.SendMp1(0x14, ref Args);
case 13:
result = RyzenAccess.SendMp1(0x14, ref Args);
result = RyzenAccess.SendPsmu(0x31, ref Args);
break;
default:
@@ -61,32 +63,6 @@ namespace Ryzen
}
//STAMP2 Limit
public static Smu.Status? set_stapm2_limit(uint value)
{
RyzenAccess.Initialize();
uint[] Args = new uint[6];
Args[0] = value;
Smu.Status? result = null;
switch (FAMID)
{
case 3:
case 5:
case 7:
case 8:
case 9:
case 11:
case 12:
result = RyzenAccess.SendPsmu(0x31, ref Args);
break;
default:
break;
}
RyzenAccess.Deinitialize();
return result;
}
//Fast Limit
public static Smu.Status? set_fast_limit(uint value)
{
@@ -109,7 +85,9 @@ namespace Ryzen
case 9:
case 11:
case 12:
case 13:
result = RyzenAccess.SendMp1(0x15, ref Args);
result = RyzenAccess.SendPsmu(0x32, ref Args);
break;
default:
break;
@@ -140,7 +118,10 @@ namespace Ryzen
case 9:
case 11:
case 12:
case 13:
result = RyzenAccess.SendMp1(0x16, ref Args);
result = RyzenAccess.SendPsmu(0x33, ref Args);
result = RyzenAccess.SendPsmu(0x34, ref Args);
break;
default:
break;
@@ -176,11 +157,12 @@ namespace Ryzen
case 9:
case 11:
case 12:
case 13:
result = RyzenAccess.SendMp1(0x19, ref Args);
break;
case 4:
case 6:
RyzenAccess.SendMp1(0x23, ref Args);
result = RyzenAccess.SendMp1(0x23, ref Args);
result = RyzenAccess.SendPsmu(0x56, ref Args);
break;
case 10:
@@ -194,37 +176,6 @@ namespace Ryzen
return result;
}
//Skin Temp limit
public static Smu.Status? set_apu_skin_temp_limit(uint value)
{
RyzenAccess.Initialize();
uint[] Args = new uint[6];
Args[0] = value;
Smu.Status? result = null;
switch (FAMID)
{
case 5:
case 8:
case 9:
case 11:
case 12:
result = RyzenAccess.SendMp1(0x33, ref Args);
break;
case 3:
case 7:
result = RyzenAccess.SendMp1(0x38, ref Args);
break;
default:
break;
}
RyzenAccess.Deinitialize();
return result;
}
//Set All Core Curve Optimiser
public static Smu.Status? set_coall(int value)
{
@@ -241,12 +192,12 @@ namespace Ryzen
{
case 3:
case 7:
RyzenAccess.SendMp1(0x55, ref Args);
result = RyzenAccess.SendMp1(0x55, ref Args);
result = RyzenAccess.SendPsmu(0xB1, ref Args);
break;
case 4:
case 6:
RyzenAccess.SendMp1(0x36, ref Args);
result = RyzenAccess.SendMp1(0x36, ref Args);
result = RyzenAccess.SendPsmu(0xB, ref Args);
break;
case 5:
@@ -254,6 +205,7 @@ namespace Ryzen
case 9:
case 11:
case 12:
case 13:
result = RyzenAccess.SendPsmu(0x5D, ref Args);
break;
case 10:
@@ -285,7 +237,7 @@ namespace Ryzen
{
case 3:
case 7:
RyzenAccess.SendMp1(0x64, ref Args);
result = RyzenAccess.SendMp1(0x64, ref Args);
result = RyzenAccess.SendPsmu(0x57, ref Args);
break;
case 5:
@@ -293,6 +245,7 @@ namespace Ryzen
case 9:
case 11:
case 12:
case 13:
result = RyzenAccess.SendPsmu(0xb7, ref Args);
break;
default:

View File

@@ -93,6 +93,7 @@ namespace GHelper
buttonMatrix.Text = Properties.Strings.PictureGif;
buttonQuit.Text = Properties.Strings.Quit;
buttonUpdates.Text = Properties.Strings.Updates;
buttonDonate.Text = Properties.Strings.Donate;
buttonController.Text = Properties.Strings.Controller;
labelAlly.Text = Properties.Strings.AllyController;
@@ -234,6 +235,7 @@ namespace GHelper
labelCharge.MouseEnter += PanelBattery_MouseEnter;
labelCharge.MouseLeave += PanelBattery_MouseLeave;
labelBattery.Click += LabelBattery_Click;
buttonPeripheral1.Click += ButtonPeripheral_Click;
buttonPeripheral2.Click += ButtonPeripheral_Click;
@@ -270,6 +272,12 @@ namespace GHelper
labelCharge.Click += LabelCharge_Click;
buttonDonate.Click += ButtonDonate_Click;
if (AppConfig.Get("start_count") > 10 && !AppConfig.Is("donate_click"))
{
buttonDonate.BorderColor = colorTurbo;
buttonDonate.Badge = true;
}
labelDynamicLighting.Click += LabelDynamicLighting_Click;
@@ -277,8 +285,16 @@ namespace GHelper
InitVisual();
}
private void LabelBattery_Click(object? sender, EventArgs e)
{
HardwareControl.chargeWatt = !HardwareControl.chargeWatt;
RefreshSensors(true);
}
private void ButtonDonate_Click(object? sender, EventArgs e)
{
AppConfig.Set("donate_click", 1);
buttonDonate.Badge = false;
Process.Start(new ProcessStartInfo("https://github.com/seerge/g-helper/wiki/Support-Project") { UseShellExecute = true });
}
@@ -444,7 +460,7 @@ namespace GHelper
Invoke(delegate
{
sliderGammaIgnore = true;
sliderGamma.Value = AppConfig.Get("brightness", 100);
sliderGamma.Value = VisualControl.GetBrightness();
labelGamma.Text = sliderGamma.Value + "%";
sliderGammaIgnore = false;
});
@@ -658,14 +674,14 @@ namespace GHelper
{
case 0:
Logger.WriteLine("Lid Closed");
InputDispatcher.lidClose = AniMatrixControl.lidClose = true;
Aura.ApplyBrightness(0, "Lid");
AniMatrixControl.lidClose = true;
matrixControl.SetLidMode();
break;
case 1:
Logger.WriteLine("Lid Open");
InputDispatcher.lidClose = AniMatrixControl.lidClose = false;
Aura.ApplyBrightness(InputDispatcher.GetBacklight(), "Lid");
AniMatrixControl.lidClose = false;
matrixControl.SetLidMode();
break;
}
@@ -834,7 +850,7 @@ namespace GHelper
private void Button60Hz_MouseHover(object? sender, EventArgs e)
{
labelTipScreen.Text = Properties.Strings.MinRefreshTooltip;
labelTipScreen.Text = Properties.Strings.MinRefreshTooltip.Replace("60", ScreenControl.MIN_RATE.ToString());
}
private void ButtonScreen_MouseLeave(object? sender, EventArgs e)
@@ -844,7 +860,7 @@ namespace GHelper
private void ButtonScreenAuto_MouseHover(object? sender, EventArgs e)
{
labelTipScreen.Text = Properties.Strings.AutoRefreshTooltip;
labelTipScreen.Text = Properties.Strings.AutoRefreshTooltip.Replace("60", ScreenControl.MIN_RATE.ToString());
}
private void ButtonUltimate_MouseHover(object? sender, EventArgs e)
@@ -1199,7 +1215,7 @@ namespace GHelper
private void Button60Hz_Click(object? sender, EventArgs e)
{
AppConfig.Set("screen_auto", 0);
screenControl.SetScreen(60, 0);
screenControl.SetScreen(ScreenControl.MIN_RATE, 0);
}
@@ -1230,16 +1246,18 @@ namespace GHelper
{
buttonScreenAuto.Activated = true;
}
else if (frequency == 60)
else if (frequency == ScreenControl.MIN_RATE)
{
button60Hz.Activated = true;
}
else if (frequency > 60)
else if (frequency > ScreenControl.MIN_RATE)
{
button120Hz.Activated = true;
}
if (maxFrequency > 60)
button60Hz.Text = ScreenControl.MIN_RATE + "Hz";
if (maxFrequency > ScreenControl.MIN_RATE)
{
button120Hz.Text = maxFrequency.ToString() + "Hz" + (overdriveSetting ? " + OD" : "");
panelScreen.Visible = true;
@@ -1411,7 +1429,9 @@ namespace GHelper
cpuTemp = ": " + Math.Round((decimal)HardwareControl.cpuTemp).ToString() + "°C";
if (HardwareControl.batteryCapacity > 0)
charge = Properties.Strings.BatteryCharge + ": " + Math.Round(HardwareControl.batteryCapacity, 1) + "% ";
{
charge = Properties.Strings.BatteryCharge + ": " + HardwareControl.batteryCharge;
}
if (HardwareControl.batteryRate < 0)
battery = Properties.Strings.Discharging + ": " + Math.Round(-(decimal)HardwareControl.batteryRate, 1).ToString() + "W";
@@ -1524,14 +1544,14 @@ namespace GHelper
public void AutoKeyboard()
{
InputDispatcher.SetBacklightAuto(true);
if (!AppConfig.Is("skip_aura"))
{
Aura.ApplyPower();
Aura.ApplyAura();
}
InputDispatcher.SetBacklightAuto(true);
if (Program.acpi.IsXGConnected())
XGM.Light(AppConfig.Is("xmg_light"));
@@ -1766,7 +1786,7 @@ namespace GHelper
public void VisualiseBatteryFull()
{
if (AppConfig.Is("charge_full"))
if (BatteryControl.chargeFull)
{
buttonBatteryFull.BackColor = colorStandard;
buttonBatteryFull.ForeColor = SystemColors.ControlLightLight;

View File

@@ -0,0 +1,141 @@
using System.Globalization;
using System.Text.RegularExpressions;
public class NumericUpDownWithUnit : NumericUpDown
{
#region| Fields |
private string unit = null;
private bool unitFirst = false;
#endregion
#region| Properties |
public string Unit
{
get => unit;
set
{
unit = value;
UpdateEditText();
}
}
public bool UnitFirst
{
get => unitFirst;
set
{
unitFirst = value;
UpdateEditText();
}
}
#endregion
#region| Methods |
/// <summary>
/// Method called when updating the numeric updown text.
/// </summary>
protected override void UpdateEditText()
{
// If there is a unit we handle it ourselfs, if there is not we leave it to the base class.
if (Unit != null && Unit != string.Empty)
{
if (UnitFirst)
{
Text = $"({Unit}) {Value}";
}
else
{
Text = $"{Value} ({Unit})";
}
}
else
{
base.UpdateEditText();
}
}
/// <summary>
/// Validate method called before actually updating the text.
/// This is exactly the same as the base class but it will use the new ParseEditText from this class instead.
/// </summary>
protected override void ValidateEditText()
{
// See if the edit text parses to a valid decimal considering the label unit
ParseEditText();
UpdateEditText();
}
/// <summary>
/// Converts the text displayed in the up-down control to a numeric value and evaluates it.
/// </summary>
protected new void ParseEditText()
{
try
{
// The only difference of this methods to the base one is that text is replaced directly
// with the property Text instead of using the regex.
// We now that the only characters that may be on the textbox are from the unit we provide.
// because the NumericUpDown handles invalid input from user for us.
// This is where the magic happens. This regex will match all characters from the unit
// (so your unit cannot have numbers). You can change this regex to fill your needs
var regex = new Regex($@"[^(?!{Unit} )]+");
var match = regex.Match(Text);
if (match.Success)
{
var text = match.Value;
// VSWhidbey 173332: Verify that the user is not starting the string with a "-"
// before attempting to set the Value property since a "-" is a valid character with
// which to start a string representing a negative number.
if (!string.IsNullOrEmpty(text) && !(text.Length == 1 && text == "-"))
{
if (Hexadecimal)
{
Value = Constrain(Convert.ToDecimal(Convert.ToInt32(Text, 16)));
}
else
{
Value = Constrain(Decimal.Parse(text, CultureInfo.CurrentCulture));
}
}
}
}
catch
{
// Leave value as it is
}
finally
{
UserEdit = false;
}
}
/// </summary>
/// Returns the provided value constrained to be within the min and max.
/// This is exactly the same as the one in base class (which is private so we can't directly use it).
/// </summary>
private decimal Constrain(decimal value)
{
if (value < Minimum)
{
value = Minimum;
}
if (value > Maximum)
{
value = Maximum;
}
return value;
}
#endregion
}

View File

@@ -52,6 +52,16 @@ namespace GHelper.UI
}
}
private bool badge = false;
public bool Badge
{
get { return badge; }
set
{
badge = value;
}
}
public RButton()
{
DoubleBuffered = true;
@@ -99,6 +109,15 @@ namespace GHelper.UI
pevent.Graphics.DrawPath(penBorder, pathBorder);
}
if (badge)
{
using (Brush brush = new SolidBrush(borderColor))
{
var radius = ratio * 10;
pevent.Graphics.FillEllipse(brush, rectSurface.Width - rectSurface.Height / 2 - radius, rectSurface.Height / 2 - radius, radius + radius, radius + radius);
}
}
if (!Enabled && ForeColor != SystemColors.ControlText)
{
var rect = pevent.ClipRectangle;

View File

@@ -268,6 +268,16 @@ namespace GHelper.USB
Encoding.ASCII.GetBytes("]ASUS Tech.Inc."),
new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x1A },
}, "Init");
if (AppConfig.IsProArt())
{
AsusHid.WriteInput([AsusHid.INPUT_ID, 0x05, 0x20, 0x31, 0x00, 0x08], "ProArt Init");
//AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x4E], "ProArt Init");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xBA, 0xC5, 0xC4], "ProArt Init");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x8F, 0x01], "ProArt Init");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x85, 0xFF], "ProArt Init");
//AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x4E], "ProArt Init");
}
}

View File

@@ -78,7 +78,7 @@ namespace GHelper
// labelBIOS
//
labelBIOS.AutoSize = true;
labelBIOS.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelBIOS.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
labelBIOS.Location = new Point(68, 23);
labelBIOS.Margin = new Padding(4, 0, 4, 0);
labelBIOS.Name = "labelBIOS";
@@ -113,7 +113,7 @@ namespace GHelper
// labelUpdates
//
labelUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelUpdates.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelUpdates.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
labelUpdates.Location = new Point(864, 19);
labelUpdates.Name = "labelUpdates";
labelUpdates.Size = new Size(302, 32);
@@ -125,6 +125,7 @@ namespace GHelper
buttonRefresh.Activated = false;
buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonRefresh.BackColor = SystemColors.ControlLight;
buttonRefresh.Badge = false;
buttonRefresh.BorderColor = Color.Transparent;
buttonRefresh.BorderRadius = 5;
buttonRefresh.FlatAppearance.BorderSize = 0;
@@ -192,7 +193,7 @@ namespace GHelper
// labelDrivers
//
labelDrivers.AutoSize = true;
labelDrivers.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelDrivers.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
labelDrivers.Location = new Point(68, 6);
labelDrivers.Margin = new Padding(4, 0, 4, 0);
labelDrivers.Name = "labelDrivers";
@@ -280,7 +281,7 @@ namespace GHelper
//
labelLegend.AutoSize = true;
labelLegend.Dock = DockStyle.Top;
labelLegend.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelLegend.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
labelLegend.Location = new Point(20, 10);
labelLegend.Margin = new Padding(10);
labelLegend.Name = "labelLegend";

View File

@@ -49,6 +49,11 @@ namespace GHelper
labelBIOS.Text = "BIOS";
labelDrivers.Text = Properties.Strings.DriverAndSoftware;
labelLegend.Text = Properties.Strings.Legend;
labelLegendGray.Text = Properties.Strings.LegendGray;
labelLegendRed.Text = Properties.Strings.LegendRed;
labelLegendGreen.Text = Properties.Strings.LegendGreen;
SuspendLayout();
tableBios.Visible = false;
@@ -206,17 +211,26 @@ namespace GHelper
public void VisualiseNewCount(int updatesCount, TableLayoutPanel table)
{
Invoke(delegate
if (InvokeRequired)
{
labelUpdates.Text = $"{Properties.Strings.NewUpdates}: {updatesCount}";
labelUpdates.ForeColor = colorTurbo;
labelUpdates.Font = new Font(labelUpdates.Font, FontStyle.Bold);
panelBios.AccessibleName = labelUpdates.Text;
});
Invoke(delegate
{
_VisualiseNewCount(updatesCount, table);
});
}
else
{
_VisualiseNewCount(updatesCount, table);
}
}
public void _VisualiseNewCount(int updatesCount, TableLayoutPanel table)
{
labelUpdates.Text = $"{Properties.Strings.NewUpdates}: {updatesCount}";
labelUpdates.ForeColor = colorTurbo;
labelUpdates.Font = new Font(labelUpdates.Font, FontStyle.Bold);
panelBios.AccessibleName = labelUpdates.Text;
}
static string CleanupDeviceId(string input)
{

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Microsoft ResX Schema
Version 2.0
@@ -48,7 +48,7 @@
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

181
docs/README.ja-JP.md Normal file
View File

@@ -0,0 +1,181 @@
# G-Helper - Asusートパソコン用の軽量コントロールツール
[![United24](https://raw.githubusercontent.com/seerge/g-helper/main/docs/ua.png)](https://u24.gov.ua/)
[![GitHub release](https://img.shields.io/github/release/seerge/g-helper)](https://GitHub.com/seerge/g-helper/releases/)
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/) <sup>[中文版点这里](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)</sup>
Asusートパソコン用の軽量なArmoury Crate代替ツールで、余分な負荷や不要なサービスなしでほぼ同じ機能を提供します。
ROG Zephyrus G14、G15、G16、M16、Flow X13、Flow X16、Flow Z13、TUFシリーズ、StrixまたはScarシリーズ、ProArt、Vivobook、Zenbook、ROG Ally / Ally Xなど、すべての人気モデルで動作します
# [:floppy_disk:ダウンロード](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
**⭐ アプリが気に入ったら、ぜひオンラインで広めてください**
<table>
<tr>
<td><b>プロジェクトをサポート</b></td>
<td >
<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://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/6oE29dg9D3Xj7Wo28b"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/alipay.png" height="36" alt="Alipay"></a>
</td>
</tr>
</table>
- [FAQ](https://github.com/seerge/g-helper/wiki/FAQ)
- [セットアップと要件](https://github.com/seerge/g-helper/wiki/Requirements)
- [トラブルシューティング](https://github.com/seerge/g-helper/wiki/Troubleshooting)
- [パワーユーザー設定](https://github.com/seerge/g-helper/wiki/Power-user-settings)
[![G-Helper Download](https://github.com/seerge/g-helper/assets/5920850/4d98465a-63a5-4498-ae14-afb3e67e7e82)](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
## :loudspeaker: YouTubeレビューとガイド
| [![Youtube review Josh Cravey](https://i.ytimg.com/vi/hqe-PjuE-K8/hqdefault.jpg)](https://www.youtube.com/watch?v=hqe-PjuE-K8) | [![Youtube review cbutters Tech](https://i.ytimg.com/vi/6aVdwJKZSSc/hqdefault.jpg)](https://www.youtube.com/watch?v=6aVdwJKZSSc) |
| ----------------- | ---------------- |
| [Josh Cravey](https://www.youtube.com/watch?v=hqe-PjuE-K8) | [cbutters Tech](https://www.youtube.com/watch?v=6aVdwJKZSSc) |
## 📰 記事
1. https://www.digitaltrends.com/computing/g-helper-armoury-crate-alternative/
2. https://binaryfork.com/ghelper-armoury-crate-alternative-10216/
## :gift: 利点
1. シームレスで自動的なGPU切り替え
2. すべてのパフォーマンスモードを電力制限とファンカーブで完全にカスタマイズ可能
3. 軽量。システムに何もインストールしません。実行するための単一のexeファイルのみ
4. シンプルでクリーンなネイティブUIで、すべての設定に簡単にアクセス
5. FNロックとカスタムホットキー
![Screenshot 2024-03-11 104354](https://github.com/seerge/g-helper/assets/5920850/626a5a6e-fdae-431c-843e-92886c8420ee)
### :zap: 機能
1. パフォーマンスモード: サイレント - バランス - ターボ (内蔵、デフォルトのファンカーブ付き)
2. GPUモード: エコ - スタンダード - アルティメット - オプティマイズド
3. ディスプレイのリフレッシュレート制御とディスプレイオーバードライブ (OD)
4. カスタムファンカーブエディタ、電力制限、ターボブースト選択
5. アニメマトリックスまたはスラッシュライティングの制御、アニメーションGIF、時計、オーディオビジュアライザー
6. バックライトのアニメーションモードとカラー
7. ホットキーの処理
8. CPUとGPUの温度、ファン速度、バッテリーステータスの監視
9. バッテリーの充電制限
10. NVidia GPUのオーバークロックとアンダーボルティング
11. XG Mobileの制御
12. AMD CPUのアンダーボルティング
13. BIOSとドライバの更新
14. Asusマウスの設定
15. ミニLEDのマルチゾーンスイッチ
16. フリッカーフリーディミングとビジュアルモード
### :gear: 自動化
- バッテリー使用時または電源接続時のパフォーマンスモードの切り替え
- オプティマイズドGPUモード - バッテリー使用時にdGPUを無効化し、電源接続時に有効化
- 自動ディスプレイリフレッシュレート (バッテリー使用時に60Hz、電源接続時に最大Hz)
- バッテリー使用時または電源接続時のキーボードバックライトのタイムアウト
### :rocket: パフォーマンスモード
<img align="right" width="300" src="https://github.com/seerge/g-helper/assets/5920850/3e119674-db8d-486b-aa65-2bf9b61f9aa6">
すべてのモードはBIOSに組み込まれており、デフォルトのファンカーブと電力制限が設定されています。これらはArmoury Crateと同じです。
各BIOSモードは対応するWindowsパワーモードとペアになっています。これを「ファン + 電源」設定で調整できます。
1. BIOSの「サイレント」 + Windowsの「最高の電力効率」パワーモード
2. BIOSの「バランス」 (AC時のパフォーマンス) + Windowsの「バランス」パワーモード
3. BIOSの「ターボ」 + Windowsの「最高のパフォーマンス」パワーモード
### :video_game: GPUモード
1. エコ: 低電力の統合GPUのみが有効、iGPUが内蔵ディスプレイを駆動
2. スタンダード (MS Hybrid): iGPUとdGPUが有効、iGPUが内蔵ディスプレイを駆動
3. アルティメット: iGPUとdGPUが有効、dGPUが内蔵ディスプレイを駆動 (2022年以降のモデルでサポート)
4. オプティマイズド: バッテリー使用時にdGPUを無効化 (エコ)し、電源接続時に有効化 (スタンダード)
![Screenshot 2024-03-11 111818](https://github.com/seerge/g-helper/assets/5920850/fd69a81e-978d-4d5c-a0a8-26da51f90a5b)
![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)
### :mouse: Asusマウスとその他の周辺機器のサポート
[現在サポートされているモデル](https://github.com/seerge/g-helper/discussions/900)
- ROG Chakram X (P708)
- ROG Chakram Core (P511)
- ROG Gladius II and Gladius II Origin (P502 and P504)
- ROG Gladius II Wireless
- ROG Gladius III
- ROG Gladius III Wireless
- ROG Harpe Ace Aim Lab Edition
- ROG Keris Wireless
- ROG Keris II Ace
- ROG Strix Carry (P508)
- ROG Strix III Gladius III Aimpoint Wireless (P711)
- ROG Strix Impact III (P518)
- ROG Spatha X
- ROG Strix Impact II Wireless
- ROG Pugio
- ROG Pugio II
- TUF Gaming M4 Wireless (P306)
- TUF Gaming M3
- TUF Gaming M3 Gen II
- TUF Gaming M4 AIR
- TUF Gaming M5
- TX Gaming Mini
[@IceStormNG](https://github.com/IceStormNG) 👑 の貢献と研究に大いに感謝します。
### ⌨️ キーバインディング
- ``Fn + F5 / Fn + Shift + F5`` - パフォーマンスモードを前方/後方に切り替え
- ``Ctrl + Shift + F5 / Ctrl + Shift + Alt + F5`` - パフォーマンスモードを前方/後方に切り替え
- ``Ctrl + Shift + F12`` - G-Helperウィンドウを開く
- ``Ctrl + M1 / M2`` - ディスプレイの明るさを下げる/上げる
- ``Shift + M1 / M2`` - バックライトの明るさを下げる/上げる
- ``Fn + C`` - Fnロック
- ``Fn + Ctrl + F7 / F8`` - フリッカーフリーディミングを下げる/上げる
- ``Fn + Shift + F7 / F8`` - マトリックス/スラッシュライティングの明るさを下げる/上げる
- ``Fn + Shift + F7 / F8`` - スクリーンパッドの明るさを下げる/上げる
- ``Ctrl + Shift + F20`` - マイクをミュート
- ``Ctrl + Shift + Alt + F13`` - ディスプレイのリフレッシュレートを切り替え
- ``Ctrl + Shift + Alt + F14`` - エコGPUモード
- ``Ctrl + Shift + Alt + F15`` - スタンダードGPUモード
- ``Ctrl + Shift + Alt + F16`` - サイレント
- ``Ctrl + Shift + Alt + F17`` - バランス
- ``Ctrl + Shift + Alt + F18`` - ターボ
- ``Ctrl + Shift + Alt + F19`` - カスタム1 (存在する場合)
- ``Ctrl + Shift + Alt + F20`` - カスタム2 (存在する場合)
- [カスタムキーバインディング/ホットキー](https://github.com/seerge/g-helper/wiki/Power-user-settings#custom-hotkey-actions)
### 🎮ROG Allyバインディング
- ``M + DPad Left / Right`` - ディスプレイの明るさ
- ``M + DPad Up`` - タッチキーボード
- ``M + DPad Down`` - デスクトップを表示
- ``M + Y`` - AMDオーバーレイを切り替え
- ``M + X`` - スクリーンショット
- ``M + Right Stick Click`` - コントローラーモード
------------------
### 🔖 重要な注意事項
G-Helperはオペレーティングシステム、ファームウェア、またはドライバではありません。ハードウェアをリアルタイムで「実行」することはありません。
これは、製造元が作成し、BIOSに保存されている事前定義された操作モードの1つを選択し、オプションでいくつかの設定を行うアプリケーションです。Armoury Crateと同じように機能します。Asus System Control Interface「ドライバ」を使用してすべての機能を実現します。
Armoury Crateと同じモード/設定を使用する場合、デバイスのパフォーマンスや動作に違いはありません。
G-Helperの役割は、リモコンがテレビに対して果たす役割に似ています。
### 使用ライブラリとプロジェクト
- [Linux Kernel](https://github.com/torvalds/linux/blob/master/include/linux/platform_data/x86/asus-wmi.h) - ASUS ACPI/WMIインターフェースの基本エンドポイント
- [NvAPIWrapper](https://github.com/falahati/NvAPIWrapper) - Nvidia APIへのアクセス
- [Starlight](https://github.com/vddCore/Starlight) - アニメマトリックス通信プロトコル
- [UXTU](https://github.com/JamesCJ60/Universal-x86-Tuning-Utility) - Ryzen System Management Unitを使用したアンダーボルティング
- [AsusCtl](https://gitlab.com/asus-linux/asusctl) - インスピレーションと逆アセンブル
### 免責事項
"Asus"、"ROG"、"TUF"、および"Armoury Crate"は、AsusTek Computer, Inc.の商標であり、AsusTek Computerに属する資産に対して一切の権利を主張しません。これらの資産は純粋に情報提供の目的で使用されています。
ソフトウェアは「現状のまま」提供され、明示または黙示のいかなる保証もなく、商品性、特定の目的への適合性、および非侵害の保証を含みますが、これに限定されません。このソフトウェアの誤用は、システムの不安定性や誤動作を引き起こす可能性があります。

View File

@@ -1,11 +1,11 @@
# G-Helper - Lightweight control tool for Asus laptops
[![United24](https://raw.githubusercontent.com/seerge/g-helper/main/docs/ua.png)](https://u24.gov.ua/)
[![GitHub release](https://img.shields.io/github/release/seerge/g-helper)](https://GitHub.com/seerge/g-helper/releases/)
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/) <sup>[中文版点这里](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)</sup>
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/) <sup>[中文版点这里](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)</sup> <sup>[日本語はこちら](https://github.com/seerge/g-helper/blob/main/docs/README.ja-JP.md)</sup>
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 / Ally X and many more!
Works with all popular models, such as ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, Flow Z13, DUO, TUF Series, Strix or Scar Series, ProArt, Vivobook, Zenbook, ROG Ally or Ally X and many more!
# [: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**

View File

@@ -4,7 +4,7 @@
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/)
语言: [English](https://github.com/seerge/g-helper#readme) | 中文
语言: [English](https://github.com/seerge/g-helper#readme) | 中文 | [日本語](https://github.com/seerge/g-helper/blob/main/docs/README.ja-JP.md)
适用于华硕Asus笔记本电脑的轻量级 Armoury Crate (奥创控制中心)替代品,在功能几乎相同的同时减少不必要的服务以减轻负载。
G-helper兼容所有主流型号例如 ROG 幻14、幻15、幻16、幻13、幻X、天选飞行堡垒系列、枪神/魔霸系列、创系列、灵耀系列、无畏系列、ROG Ally 等!