Compare commits

...

254 Commits

Author SHA1 Message Date
Serge
3efe8fb67e Micmute from external keyboards 2023-08-06 18:57:19 +02:00
Serge
5c613af9f2 Cleanup 2023-08-06 16:48:25 +02:00
Serge
e33c13bd19 Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-06 14:49:19 +02:00
Serge
d764a20dc7 TUF brightness fix https://github.com/seerge/g-helper/issues/990 2023-08-06 14:49:17 +02:00
Serge
39a61b5118 Update README.md 2023-08-05 21:51:14 +02:00
Serge
f93594c4ae Universal brightness fix 2023-08-05 21:46:46 +02:00
Serge
3700e4469d Universal brightness fix 2023-08-05 21:26:07 +02:00
Serge
60a154851f Update README.md 2023-08-05 21:21:32 +02:00
Serge
8c621fe6d5 Update README.md 2023-08-05 21:20:23 +02:00
Serge
d01fe2e4b0 Update README.md 2023-08-05 19:05:49 +02:00
Serge
08382a6ec5 Update README.md 2023-08-05 17:06:02 +02:00
Serge
6746916425 Add files via upload 2023-08-05 17:04:21 +02:00
Serge
934ed919e4 Update README.md 2023-08-05 17:02:30 +02:00
Serge
53b0dc343c Update README.md 2023-08-05 16:45:36 +02:00
Serge
c04f26ae00 Update README.md 2023-08-05 16:34:34 +02:00
Serge
3b5587d2e1 Update README.md 2023-08-05 16:29:41 +02:00
Serge
cc48e04530 Merge pull request #1010 from Rakaveli/main
Support for rog keris eva edition mouse
2023-08-05 15:53:02 +02:00
Rakaveli
29f0de9cba wrong wireless flag fixed 2023-08-05 18:11:18 +05:00
Rakaveli
f9a7bd0fe0 Added support for rog keris eva edition mouse 2023-08-05 17:58:22 +05:00
Serge
1c25824bcf Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-05 13:17:52 +02:00
Serge
0fec4c9620 Optimized USB-C fix 2023-08-05 13:17:50 +02:00
Serge
2206411bea Merge pull request #1006 from seerge/l10n_main
New Crowdin updates
2023-08-05 12:43:36 +02:00
Serge
62efe79b7a New translations Strings.resx (Lithuanian) 2023-08-05 10:47:04 +02:00
Serge
327cf0e9dd New translations Strings.resx (Chinese Traditional) 2023-08-05 03:25:59 +02:00
Serge
fa3d9d1f81 - 2023-08-04 22:20:33 +02:00
Serge
cb0996eca9 Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-04 22:05:41 +02:00
Serge
3a5dbbf2ea Bindings 2023-08-04 22:05:39 +02:00
Serge
1062aba6a4 Merge pull request #1001 from seerge/l10n_main
New Crowdin updates
2023-08-04 22:03:13 +02:00
Serge
849faa5029 Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-04 21:59:04 +02:00
Serge
f242e74d07 Empty Default actions for CC / Padles on Ally 2023-08-04 21:59:02 +02:00
Serge
98a0c21355 Bindings fixes 2023-08-04 21:36:44 +02:00
Serge
7e2206d20c New translations Strings.resx (Ukrainian) 2023-08-04 18:27:11 +02:00
Serge
5f05672a3f New translations Strings.resx (Lithuanian) 2023-08-04 18:27:10 +02:00
Serge
ea812ae645 Update README.md 2023-08-04 15:59:26 +02:00
Serge
83eed09f48 Update README.md 2023-08-04 15:40:19 +02:00
Serge
d834264ef2 Merge pull request #992 from seerge/l10n_main
New Crowdin updates
2023-08-04 11:17:42 +02:00
Serge
df0ff6c284 New translations Strings.resx (Chinese Simplified) 2023-08-04 05:26:30 +02:00
Serge
bab796bae1 New translations Strings.resx (German) 2023-08-03 22:31:21 +02:00
Serge
2097a42973 Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-03 21:32:05 +02:00
Serge
458527ce2b Version Bump 2023-08-03 21:32:03 +02:00
Serge
c93f2277cf Universal brightness control 2023-08-03 21:28:05 +02:00
Serge
013bedcf9a Update README.md 2023-08-03 19:39:40 +02:00
Serge
39731fc2e8 Update README.md 2023-08-03 19:37:01 +02:00
Serge
2c1877a321 Update README.md 2023-08-03 19:34:47 +02:00
Serge
31ebbc3d18 Charge label fix 2023-08-03 19:07:30 +02:00
Serge
1447b10992 Merge pull request #985 from seerge/l10n_main
New Crowdin updates
2023-08-03 18:57:57 +02:00
Serge
ffaf3b4ab8 New translations Strings.resx (Polish) 2023-08-03 17:59:14 +02:00
Serge
7ca0dc4a85 New translations Strings.resx (Vietnamese) 2023-08-03 17:59:13 +02:00
Serge
7d3c54ef4c New translations Strings.resx (Chinese Traditional) 2023-08-03 17:59:12 +02:00
Serge
dd55a9ae4b New translations Strings.resx (Chinese Simplified) 2023-08-03 17:59:11 +02:00
Serge
4fff5ddb0a New translations Strings.resx (Ukrainian) 2023-08-03 17:59:10 +02:00
Serge
c657b79422 New translations Strings.resx (Turkish) 2023-08-03 17:59:09 +02:00
Serge
b3a8a9abef New translations Strings.resx (Portuguese) 2023-08-03 17:59:09 +02:00
Serge
6995637aec New translations Strings.resx (Lithuanian) 2023-08-03 17:59:08 +02:00
Serge
0cb0ff12a5 New translations Strings.resx (Korean) 2023-08-03 17:59:07 +02:00
Serge
f582882828 New translations Strings.resx (Italian) 2023-08-03 17:59:06 +02:00
Serge
4b6736c255 New translations Strings.resx (Hungarian) 2023-08-03 17:59:05 +02:00
Serge
246fbc9437 New translations Strings.resx (German) 2023-08-03 17:59:04 +02:00
Serge
e135d58c46 New translations Strings.resx (Spanish) 2023-08-03 17:59:03 +02:00
Serge
9bf4396902 New translations Strings.resx (French) 2023-08-03 17:59:02 +02:00
Serge
60e88c0b45 New translations Strings.resx (Romanian) 2023-08-03 17:59:01 +02:00
Serge
8ec72ec94d Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-03 17:15:49 +02:00
Serge
b808efb502 Added Battery Charge 2023-08-03 17:15:46 +02:00
Serge
92f9333800 Merge pull request #984 from IceStormNG/asus-mouse-support
TUF Gaming M3 support
2023-08-03 17:10:07 +02:00
IceStormNG
3c4a6c5e95 Added TUF Gaming M3 2023-08-03 17:05:26 +02:00
Serge
b22fffe81a Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-03 14:21:14 +02:00
Serge
dcecfbaeda Heatmap cleanup 2023-08-03 14:21:12 +02:00
Serge
2a6d02b1cb Tuf keybindings https://github.com/seerge/g-helper/issues/975 2023-08-03 13:48:24 +02:00
Serge
048f68e2ff UI Tweaks 2023-08-03 13:14:54 +02:00
Serge
ac66642623 Merge pull request #977 from ktemkin/ally_buttons
add as much button support as we can to the RC71 (ROG Ally)
2023-08-03 12:44:46 +02:00
Kate Temkin
8d9999c6c7 add as much button support as we can to the RC71 (ROG Ally) 2023-08-02 20:52:15 -06:00
IceStormNG
977e7cc8c4 Angle tuning limits are now variable and can be overriden per mouse. 2023-08-02 21:44:03 +02:00
Serge
662d5fb414 Aura Fix 2023-08-02 20:44:31 +02:00
Serge
3e0dc9ee7d Heatmap Alt fix 2023-08-02 18:25:27 +02:00
Serge
9cef990edf Revert aura tweak 2023-08-02 15:01:41 +02:00
Serge
f288f1fbf4 Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-02 14:43:17 +02:00
Serge
5561101093 Aura 2023-08-02 14:43:15 +02:00
Serge
a27906b1b7 Merge pull request #970 from seerge/l10n_main
New Crowdin updates
2023-08-02 11:13:13 +02:00
IceStormNG
659a408225 Disable packet logger for release builds. 2023-08-02 10:32:25 +02:00
Serge
3d4fab99b6 New translations Strings.resx (Chinese Simplified) 2023-08-02 04:29:56 +02:00
Serge
7c5f5a9b24 Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-02 00:30:48 +02:00
Serge
e9ae5c9dc8 Brightness fix for TUF506 2023-08-02 00:30:46 +02:00
Serge
33311611ab Fixed heatmap https://github.com/seerge/g-helper/issues/967 2023-08-01 23:54:13 +02:00
Serge
d50ec93e94 Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-01 22:45:39 +02:00
Serge
fbdfdd2f03 Skip custom keybindings https://github.com/seerge/g-helper/issues/960 2023-08-01 22:45:38 +02:00
Serge
cbe05b1a7c Update README.md 2023-08-01 22:30:14 +02:00
Serge
f32f70f145 2 Heatmap modes, one can blink, another one don't work on some devices 2023-08-01 20:24:16 +02:00
Serge
409febb48f Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-01 20:02:36 +02:00
Serge
df132ee196 Aura Fix Attempt 2023-08-01 20:02:34 +02:00
Serge
63b93cab0b Update README.md 2023-08-01 18:31:31 +02:00
Serge
9b1170d364 Update README.md 2023-08-01 14:10:17 +02:00
Serge
0dba6d7a42 Update README.md 2023-08-01 14:09:42 +02:00
Serge
d82deb9860 Fn+Np Enter support https://github.com/seerge/g-helper/issues/963 2023-08-01 13:20:11 +02:00
Serge
3307a95955 Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-01 12:23:26 +02:00
Serge
392b437913 Ctrl+M1/M2 for TUF 2023-08-01 12:23:23 +02:00
Serge
8312d8700e Merge pull request #962 from seerge/l10n_main
New Crowdin updates
2023-08-01 11:20:08 +02:00
Serge
f8110ef661 New translations Strings.resx (Lithuanian) 2023-08-01 08:30:05 +02:00
Serge
4da8f599ab New translations Strings.resx (Ukrainian) 2023-07-31 22:32:17 +02:00
Serge
0aa1e81665 Merge pull request #958 from seerge/l10n_main
New Crowdin updates
2023-07-31 22:21:55 +02:00
Serge
ffe07b42b5 Update README.md 2023-07-31 20:53:34 +02:00
Serge
d7dd4db144 New translations Strings.resx (Polish) 2023-07-31 20:40:23 +02:00
Serge
c81cb85112 New translations Strings.resx (Ukrainian) 2023-07-31 20:40:20 +02:00
Serge
e24f7679a6 New translations Strings.resx (Italian) 2023-07-31 20:40:17 +02:00
Serge
b4b3034e92 New translations Strings.resx (Hungarian) 2023-07-31 20:40:16 +02:00
Serge
9c452a2172 New translations Strings.resx (Spanish) 2023-07-31 20:40:14 +02:00
Serge
86bc0f4e5d Merge pull request #957 from IceStormNG/asus-mouse-support
Adds support for Gladius III Wireless (P706_Wireless).
2023-07-31 18:35:10 +02:00
IceStormNG
8f59ff5e3d Adds support for Gladius III Wireless (P706_Wireless). Renamed the other Gladius III (Wireless Aimpoint) to differentiate them. Fixes a crashbug that can occurs when opening the 2023-07-31 18:21:28 +02:00
Serge
a8db22b22b Merge branch 'main' of https://github.com/seerge/g-helper 2023-07-31 17:51:02 +02:00
Serge
bffd68ead4 Aura Tweaks 2023-07-31 17:50:59 +02:00
Serge
46c0f89632 Merge pull request #955 from seerge/l10n_main
New Crowdin updates
2023-07-31 17:50:07 +02:00
Serge
08c28ed0d0 New translations Strings.resx (Chinese Traditional) 2023-07-31 17:15:58 +02:00
Serge
f24f2dcec3 New translations Strings.resx (Vietnamese) 2023-07-31 16:08:52 +02:00
Serge
f7b2a5b893 New translations Strings.resx (Chinese Simplified) 2023-07-31 16:08:51 +02:00
Serge
da34a5af56 New translations Strings.resx (Turkish) 2023-07-31 16:08:49 +02:00
Serge
fa9d73e629 New translations Strings.resx (Portuguese) 2023-07-31 16:08:48 +02:00
Serge
e1b6e3057d New translations Strings.resx (Lithuanian) 2023-07-31 16:08:47 +02:00
Serge
5bb3b67979 New translations Strings.resx (Korean) 2023-07-31 16:08:46 +02:00
Serge
4046982698 New translations Strings.resx (German) 2023-07-31 16:08:43 +02:00
Serge
4f80d1ced6 New translations Strings.resx (French) 2023-07-31 16:08:41 +02:00
Serge
22799caedc New translations Strings.resx (Romanian) 2023-07-31 16:08:40 +02:00
Serge
107b09c6dc Merge pull request #954 from IceStormNG/asus-mouse-support
Adds Button debounce (button response time) setting for supported mice.
2023-07-31 13:08:20 +02:00
IceStormNG
4f2fdc55ee Adds Button debounce (button response time) setting for supported mice. 2023-07-31 13:05:31 +02:00
Serge
16674b773d Merge pull request #950 from seerge/l10n_main
New Crowdin updates
2023-07-31 13:03:07 +02:00
Serge
1e8bbba24e Merge pull request #953 from IceStormNG/asus-mouse-support
Added Rog Strix Impact II Wireless mouse support.
2023-07-31 13:02:46 +02:00
IceStormNG
b5451cfc21 Added Rog Strix Impact II Wireless mouse support. Hint: Has the same DPI switching Problem as the Keris. 2023-07-31 12:40:40 +02:00
Serge
6507dee307 New translations Strings.resx (Chinese Simplified) 2023-07-31 07:59:33 +02:00
Serge
930b885ac0 Merge pull request #943 from seerge/l10n_main
New Crowdin updates
2023-07-31 01:13:28 +02:00
Serge
22377a4ba9 Merge branch 'main' of https://github.com/seerge/g-helper 2023-07-31 00:08:47 +02:00
Serge
85cd10132e Setting Standard mode prior to going Ultimate 2023-07-31 00:08:45 +02:00
Serge
643e29e25a New translations Strings.resx (Spanish) 2023-07-30 22:02:10 +02:00
Serge
70c41b311c Update bug_report.md 2023-07-30 22:00:47 +02:00
Serge
85880c16c1 Update README.md 2023-07-30 21:59:35 +02:00
Serge
3ff0335985 Restored fallback CPU temp reading method 2023-07-30 21:52:28 +02:00
Serge
3bafaaada0 Aura Fix 3 2023-07-30 20:25:13 +02:00
Serge
584c641b18 Aura Fix 2023-07-30 20:11:41 +02:00
Serge
ca1875d57a Aura Fix 2 2023-07-30 20:08:44 +02:00
Serge
03c45994dc Aura Fix 2023-07-30 20:00:36 +02:00
Serge
f0cbec6ea1 New translations Strings.resx (Lithuanian) 2023-07-30 18:52:02 +02:00
Serge
72fe01bb34 Merge pull request #940 from seerge/l10n_main
New Crowdin updates
2023-07-30 18:26:55 +02:00
Serge
50ae8ae843 Merge pull request #941 from IceStormNG/asus-mouse-support
Mouse support fixes
2023-07-30 17:58:53 +02:00
Serge
14e3d41def New translations Strings.resx (Lithuanian) 2023-07-30 17:52:38 +02:00
Serge
200a2a9eb9 New translations Strings.resx (Polish) 2023-07-30 17:52:37 +02:00
IceStormNG
769c490d21 Give lighting zone table layout a proper name 2023-07-30 17:30:02 +02:00
IceStormNG
0da5002804 Only set new mouse profile if it actually changed. 2023-07-30 17:29:26 +02:00
IceStormNG
5bf579fec5 Imroved handling for mice with only a single lighting zone. 2023-07-30 17:28:08 +02:00
Serge
1038d4479c Merge pull request #939 from seerge/l10n_main
New Crowdin updates
2023-07-30 16:49:07 +02:00
Serge
78d663c62c New translations Strings.resx (German) 2023-07-30 16:48:49 +02:00
Serge
2f96adb204 Merge pull request #938 from IceStormNG/asus-mouse-support
Added Rog Keris Wireless
2023-07-30 16:40:07 +02:00
IceStormNG
e6f9be1bfd Merge branch 'seerge:main' into asus-mouse-support 2023-07-30 16:30:54 +02:00
IceStormNG
297cec6e77 Added Rog Keris Wireless mouse support 2023-07-30 16:30:34 +02:00
Serge
5aca01b21e Z13 rear-window 2023-07-30 16:20:53 +02:00
Serge
3df2193afb Merge branch 'main' of https://github.com/seerge/g-helper 2023-07-30 16:20:19 +02:00
Serge
ed513e4469 Merge pull request #937 from seerge/l10n_main
New Crowdin updates
2023-07-30 15:30:01 +02:00
Serge
c398537a1f Rear window backlight for Z13 2023-07-30 15:28:53 +02:00
Serge
42641f5627 New translations Strings.resx (Vietnamese) 2023-07-30 15:28:28 +02:00
Serge
7b10532650 New translations Strings.resx (Chinese Traditional) 2023-07-30 15:28:27 +02:00
Serge
eb4d4c3d70 New translations Strings.resx (Turkish) 2023-07-30 15:28:26 +02:00
Serge
43c93d6a70 New translations Strings.resx (Portuguese) 2023-07-30 15:28:25 +02:00
Serge
bd26dfb774 New translations Strings.resx (Lithuanian) 2023-07-30 15:28:24 +02:00
Serge
c4aa38c82b New translations Strings.resx (Korean) 2023-07-30 15:28:23 +02:00
Serge
c0597e01b6 New translations Strings.resx (Italian) 2023-07-30 15:28:22 +02:00
Serge
8a6c4e1cee New translations Strings.resx (Hungarian) 2023-07-30 15:28:22 +02:00
Serge
0a77176bcc New translations Strings.resx (German) 2023-07-30 15:28:21 +02:00
Serge
35fc78d757 New translations Strings.resx (Spanish) 2023-07-30 15:28:20 +02:00
Serge
407206309a New translations Strings.resx (French) 2023-07-30 15:28:19 +02:00
Serge
51bc8143dd New translations Strings.resx (Romanian) 2023-07-30 15:28:18 +02:00
Serge
98bac7171a New translations Strings.resx (Chinese Simplified) 2023-07-30 15:28:17 +02:00
Serge
839ef140ff New translations Strings.resx (Ukrainian) 2023-07-30 15:28:16 +02:00
Serge
c3e97caf49 New translations Strings.resx (Polish) 2023-07-30 15:28:15 +02:00
Serge
96319f4dbb Merge pull request #935 from IceStormNG/asus-mouse-support
Auto refresh mice when hovering the button
2023-07-30 14:00:18 +02:00
IceStormNG
cbccd5b641 Merge branch 'seerge:main' into asus-mouse-support 2023-07-30 13:49:27 +02:00
IceStormNG
4742c33466 Auto refresh mice when hovering over their buttons and the mouse is marked as "Not ready". 2023-07-30 13:48:53 +02:00
Serge
81681eb7c4 Merge pull request #934 from IceStormNG/asus-mouse-support
Added Lighting zones for supported mice.
2023-07-30 13:47:41 +02:00
IceStormNG
7c80a32fc2 Added Lighting zones for supported mice. 2023-07-30 13:42:35 +02:00
Serge
9cb2904632 FX707 fix, AuraPower refactoring 2023-07-30 13:32:01 +02:00
Serge
40859a06d0 Merge pull request #933 from IceStormNG/asus-mouse-support
Added support for ASUS TUF Gaming M4 Wireless (P306_Wireless) Mouse
2023-07-30 12:20:37 +02:00
IceStormNG
b00ac96e99 Merge branch 'main' into asus-mouse-support
# Conflicts:
#	app/Peripherals/PeripheralsProvider.cs
2023-07-30 11:56:07 +02:00
IceStormNG
c7c14a9211 byte 3 is only 2 for mice with XY DPIs. 2023-07-30 11:23:38 +02:00
IceStormNG
78cbfc8813 Added TUF M4 Wireless mouse. 2023-07-30 11:18:15 +02:00
IceStormNG
569519aeea Mice with only one DPI per setting read through a different packet 2023-07-30 11:17:21 +02:00
IceStormNG
3cfd7e01ca Renamed Gladius III to Gladius III Aimpoint as there is also a regular Gladius III 2023-07-30 11:16:53 +02:00
IceStormNG
93b6c360d6 Handling of error responses from the mouse and some mice spam packets through the interface. Read again, until you get the matching USB packet or a timeout happens (aka: No data left in the buffer). 2023-07-30 11:10:31 +02:00
IceStormNG
15ba1b8c38 Allow override of "SetDPIProfil" function if needed 2023-07-30 11:09:27 +02:00
IceStormNG
2f35889a61 Measure mouse I/O for diagnostics purpose. 2023-07-30 10:56:01 +02:00
IceStormNG
e0e86962d1 Re-ordered sync 2023-07-30 10:54:33 +02:00
IceStormNG
cdde8afc7e Somem ice have separate X/Y DPI settings (not supported yet, but needs to be read differently from the mouse). 2023-07-30 10:54:09 +02:00
IceStormNG
0af87ecdac Variable DPI Increment as some mice do not use 50 per step but 100. 2023-07-30 10:50:09 +02:00
IceStormNG
4b3d18347c Variable max brightness as some mice do not use 0-100 but 0-4 as brightness values. 2023-07-30 10:49:26 +02:00
IceStormNG
8c2ee50c93 Fixed DPI button colors for mice with no custom DPI colors. 2023-07-30 10:48:31 +02:00
IceStormNG
6d66831770 Simplified exception naming 2023-07-30 10:48:02 +02:00
IceStormNG
e0795dd16b Adjust timeout to lower values. The typical mouse response time is between 1 and 40ms. 300 should be more than enough to fail earlier when the device does not respond. 2023-07-30 10:47:35 +02:00
IceStormNG
b0733d9254 Refresh the mouse only every 20s in background. When GHelper becomes visible, force refresh all devices. 2023-07-30 10:46:10 +02:00
Serge
0d757ef06d Merge branch 'main' of https://github.com/seerge/g-helper 2023-07-29 18:52:57 +02:00
Serge
d19aaf804a Heatmap fix 2023-07-29 18:52:53 +02:00
Serge
41adef4786 Merge pull request #919 from seerge/l10n_main
New Crowdin updates
2023-07-29 00:00:48 +02:00
Serge
9ee3ae7359 New translations Strings.resx (Chinese Simplified) 2023-07-28 17:20:38 +02:00
Serge
bd0f97c5d9 New translations Strings.resx (Chinese Simplified) 2023-07-28 13:59:51 +02:00
Serge
f85644bd2b Merge pull request #913 from seerge/l10n_main
New Crowdin updates
2023-07-28 13:49:38 +02:00
Serge
62f1263951 New translations Strings.resx (Chinese Simplified) 2023-07-28 12:21:04 +02:00
Serge
1fcd0f2b97 New translations Strings.resx (Chinese Simplified) 2023-07-28 10:17:37 +02:00
Serge
73baf548a4 New translations Strings.resx (Chinese Simplified) 2023-07-28 07:51:13 +02:00
Serge
6357a22e38 New translations Strings.resx (Ukrainian) 2023-07-28 02:54:21 +02:00
Serge
3a08ee8d7c New translations Strings.resx (Polish) 2023-07-28 02:54:20 +02:00
Serge
af67684e91 New translations Strings.resx (Polish) 2023-07-28 01:47:09 +02:00
Serge
a877904b46 New translations Strings.resx (Ukrainian) 2023-07-28 00:49:53 +02:00
Serge
f090b4a44e New translations Strings.resx (Polish) 2023-07-28 00:49:52 +02:00
Serge
b3f5a2dfa2 Skip Updates param 2023-07-28 00:06:57 +02:00
Serge
6029660860 Added timer to prevent checking for Mice multiple times in a row 2023-07-28 00:06:01 +02:00
Serge
b304ce22b9 MaxRPM calibration tweaks 2023-07-27 23:50:31 +02:00
Serge
b7910d9f79 Close updates on main window close 2023-07-27 19:46:05 +02:00
Serge
505b3a9e4a Merge pull request #907 from IceStormNG/asus-mouse-support
ASUS Mouse: Resolved deadlocks
2023-07-27 11:21:56 +02:00
IceStormNG
42a346b19e Wait for mouse data before opening the window so the user does not see the form populating data. 2023-07-27 10:41:23 +02:00
IceStormNG
7c42f87751 Check for dispose before trying to Invoke. 2023-07-27 10:40:41 +02:00
IceStormNG
a323bd85ab Mouse refreshes battery again during "ReadSensors". But it does that nonblocking and event driven. 2023-07-27 10:19:17 +02:00
IceStormNG
6e4b5226f5 Do not refresh battery on main thread. 2023-07-27 10:14:06 +02:00
IceStormNG
acaa8bc523 Added missing import for synchronized annotation 2023-07-27 10:13:46 +02:00
IceStormNG
ef31935b24 Improved handling of critical sections to solve deadlocks. 2023-07-27 10:13:24 +02:00
Serge
a9c104d388 Duo keys 2023-07-27 01:41:25 +02:00
Serge
bc9d6be0d6 Deadlock 2023-07-27 00:25:30 +02:00
Serge
d37e06d399 Merge branch 'main' of https://github.com/seerge/g-helper 2023-07-27 00:06:30 +02:00
Serge
d49832ae0f Restoring Aura Call 2023-07-27 00:06:28 +02:00
Serge
f318d09b9b Merge pull request #902 from seerge/l10n_main
New Crowdin updates
2023-07-26 23:58:50 +02:00
Serge
5cd77bb5cc Merge pull request #905 from IceStormNG/clamshell-power-user-settings
Clamshell power user settings
2023-07-26 23:58:27 +02:00
Serge
6b4d18c9c5 Merge branch 'main' of https://github.com/seerge/g-helper 2023-07-26 23:57:22 +02:00
Serge
5830220a3d Performance tweaks 2023-07-26 23:57:20 +02:00
IceStormNG
dfe4bebe58 Only write the setting if it does not exist yet. 2023-07-26 23:19:36 +02:00
IceStormNG
cff2c9af0b Save lid action to config file during startup if user has set it to hibernate or shutdown. 2023-07-26 23:15:28 +02:00
IceStormNG
e16a50f1f2 Safeguard to prevent users from choosing invalid options. 2023-07-26 21:16:30 +02:00
IceStormNG
254e6a8633 Users can set a config option clamshell_default_lid_action to set their desired option when clamshell is not engaged. 2023-07-26 21:14:03 +02:00
IceStormNG
ccb413b2e6 Clamshell mode is now properly off by default 2023-07-26 21:13:24 +02:00
Serge
e2ea79b758 Merge pull request #904 from IceStormNG/asus-mouse-support
Asus mouse fixes
2023-07-26 21:09:30 +02:00
IceStormNG
c1043efc53 Merge branch 'seerge:main' into asus-mouse-support 2023-07-26 21:02:30 +02:00
IceStormNG
6c6c93b378 Better handling of wireless devies that get turned off. The dongle still responds but it sends empty packets. 2023-07-26 21:01:39 +02:00
IceStormNG
f9a8665290 Properly save the new dpi profile so it stays selected also when the mouse is powered off and on again. 2023-07-26 20:46:53 +02:00
IceStormNG
54d7dfe4f8 Safeguards to prevent crash when closing the window in the exact moment the battery is updated. 2023-07-26 20:32:09 +02:00
Serge
eeb53cb483 New translations Strings.resx (Lithuanian) 2023-07-26 20:23:50 +02:00
Serge
b9625f2748 Aura color 2023-07-26 19:26:23 +02:00
Serge
8d41c228e0 Merge branch 'main' of https://github.com/seerge/g-helper 2023-07-26 19:13:12 +02:00
Serge
0146a40244 Heatmap fix 2023-07-26 19:13:10 +02:00
Serge
98534c9b43 Merge pull request #899 from seerge/l10n_main
New Crowdin updates
2023-07-26 18:11:16 +02:00
Serge
67aa2b5af8 New translations Strings.resx (Lithuanian) 2023-07-26 17:47:40 +02:00
IceStormNG
a451125475 Additional logging for dispose and disconnet events. 2023-07-26 15:08:27 +02:00
IceStormNG
fb3ffba343 Log energy settings only as they're supported. 2023-07-26 15:08:03 +02:00
IceStormNG
86ded739d6 Allow enabling packet logger through variable for test builds. 2023-07-26 15:07:39 +02:00
IceStormNG
80e8d54b57 UI fixes for mouse. Only register for events once the view is shown to prevent crashes. Add some additional logging for troubleshooting. Run Mouse sync asynchronously 2023-07-26 15:06:06 +02:00
Serge
f0f05fa1fd New translations Strings.resx (Chinese Traditional) 2023-07-26 09:40:55 +02:00
Serge
b7a4027b41 New translations Strings.resx (Chinese Traditional) 2023-07-26 08:27:58 +02:00
Serge
5f3958ce2b Merge branch 'main' of https://github.com/seerge/g-helper 2023-07-26 00:48:38 +02:00
Serge
dcf4fa5a48 TUF Heatmap fix 2023-07-26 00:48:37 +02:00
Serge
6ace1fdd63 Merge pull request #897 from seerge/l10n_main
New Crowdin updates
2023-07-25 23:55:36 +02:00
Serge
243e307f0a New translations Strings.resx (Spanish) 2023-07-25 23:04:52 +02:00
Serge
8e53a94a13 Merge pull request #896 from seerge/l10n_main
New Crowdin updates
2023-07-25 22:09:53 +02:00
Serge
4f337a7100 New translations Strings.resx (Spanish) 2023-07-25 22:03:23 +02:00
Serge
b1a9bfe68d G14 2020 Extra fix 2023-07-25 22:01:03 +02:00
49 changed files with 3545 additions and 934 deletions

View File

@@ -7,7 +7,7 @@ about: Create a report to help us improve
## NOTE
Bug reports without clear information or scenario to reproduce and logs from ``%AppData%\GHelper`` will be closed without answer.
Please respect time of the developer. Thanks.
Please respect the time of the developer. Thanks.
**Describe the bug**
@@ -34,7 +34,7 @@ If applicable, add screenshots to help explain your problem.
- Laptop model
**Asus software**
- Armoury crate (or it's services installed)
- Armoury Crate (or it's services installed)
- MyASUS installed
- Other Asus services running in background

View File

@@ -70,6 +70,7 @@ namespace GHelper.AnimeMatrix
if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online))
{
mat.SetDisplayState(false);
mat.SetDisplayState(false); // some devices are dumb
Logger.WriteLine("Matrix Off");
}
else

View File

@@ -96,8 +96,15 @@ public static class AppConfig
public static int Get(string name, int empty = -1)
{
if (config.ContainsKey(name))
{
//Debug.WriteLine(name);
return int.Parse(config[name].ToString());
else return empty;
}
else
{
//Debug.WriteLine(name + "E");
return empty;
}
}
public static bool Is(string name)
@@ -253,4 +260,95 @@ public static class AppConfig
Set(name + "_" + Modes.GetCurrent(), value);
}
public static bool IsAlly()
{
return ContainsModel("RC71");
}
public static bool NoMKeys()
{
return ContainsModel("Z13") ||
ContainsModel("FX706") ||
ContainsModel("FA506") ||
ContainsModel("FX506") ||
ContainsModel("Duo") ||
ContainsModel("FX505");
}
public static bool IsTUF()
{
return ContainsModel("TUF");
}
// Devices with bugged bios command to change brightness
public static bool SwappedBrightness()
{
return ContainsModel("FA506IH") || ContainsModel("FX506LU");
}
public static bool IsDUO()
{
return ContainsModel("Duo");
}
// G14 2020 has no aura, but media keys instead
public static bool NoAura()
{
return ContainsModel("GA401I") && !ContainsModel("GA401IHR");
}
public static bool NoAuraColor()
{
return ContainsModel("GA401") || ContainsModel("X13") || ContainsModel("GA503RM");
}
public static bool IsStrix()
{
return ContainsModel("Strix") || ContainsModel("Scar");
}
public static bool IsZ13()
{
return ContainsModel("Z13");
}
public static bool HasTabletMode()
{
return ContainsModel("X16") || ContainsModel("X13");
}
public static bool IsAdvantageEdition()
{
return ContainsModel("13QY");
}
public static bool NoAutoUltimate()
{
return ContainsModel("G614") || ContainsModel("GU604");
}
public static bool IsManualModeRequired()
{
if (!IsMode("auto_apply_power"))
return false;
return
Is("manual_mode") ||
ContainsModel("GU604") ||
ContainsModel("G733");
}
public static bool IsFanRequired()
{
return ContainsModel("GA402X") || ContainsModel("G513");
}
public static bool IsPowerRequired()
{
return ContainsModel("FX507") || ContainsModel("FX517") || ContainsModel("FX707");
}
}

View File

@@ -109,7 +109,7 @@ public class AsusACPI
public const int GPUModeStandard = 1;
public const int GPUModeUltimate = 2;
public static int MaxTotal => AppConfig.ContainsModel("13QY") ? 250 : 150;
public static int MaxTotal => AppConfig.IsAdvantageEdition() ? 250 : 150;
public const int MinTotal = 5;
public const int DefaultTotal = 125;

View File

@@ -33,13 +33,20 @@
labelProfile = new Label();
panelPerformance = new Panel();
panelPerformanceOther = new Panel();
comboBoxLiftOffDistance = new UI.RComboBox();
panelLiftOffDistance = new Panel();
labelLiftOffDistance = new Label();
labelAngleAdjustmentValue = new Label();
comboBoxLiftOffDistance = new UI.RComboBox();
panelDebounce = new Panel();
labelButtonDebounce = new Label();
sliderButtonDebounce = new UI.Slider();
labelButtonDebounceValue = new Label();
panelAngleSnapping = new Panel();
sliderAngleAdjustment = new UI.Slider();
checkBoxAngleSnapping = new CheckBox();
comboBoxPollingRate = new UI.RComboBox();
labelAngleAdjustmentValue = new Label();
panelPollingRate = new Panel();
labelPollingRate = new Label();
comboBoxPollingRate = new UI.RComboBox();
panelDPISettings = new Panel();
sliderDPI = new UI.Slider();
tableLayoutPanel1 = new TableLayoutPanel();
@@ -60,6 +67,12 @@
labelPerformance = new Label();
panelLighting = new Panel();
panelLightingContent = new Panel();
tableLayoutLightingZones = new TableLayoutPanel();
buttonLightingZoneScroll = new UI.RButton();
buttonLightingZoneLogo = new UI.RButton();
buttonLightingZoneAll = new UI.RButton();
buttonLightingZoneUnderglow = new UI.RButton();
buttonLightingZoneDock = new UI.RButton();
comboBoxAnimationDirection = new UI.RComboBox();
labelAnimationDirection = new Label();
checkBoxRandomColor = new CheckBox();
@@ -89,9 +102,16 @@
pictureBoxBatteryState = new PictureBox();
buttonSync = new UI.RButton();
panelBottomButtons = new Panel();
tableLayoutPanel2 = new TableLayoutPanel();
rButton1 = new UI.RButton();
rButton2 = new UI.RButton();
panelProfiles.SuspendLayout();
panelPerformance.SuspendLayout();
panelPerformanceOther.SuspendLayout();
panelLiftOffDistance.SuspendLayout();
panelDebounce.SuspendLayout();
panelAngleSnapping.SuspendLayout();
panelPollingRate.SuspendLayout();
panelDPISettings.SuspendLayout();
tableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownCurrentDPI).BeginInit();
@@ -102,6 +122,7 @@
((System.ComponentModel.ISupportInitialize)pictureKeyboard).BeginInit();
panelLighting.SuspendLayout();
panelLightingContent.SuspendLayout();
tableLayoutLightingZones.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxLightingColor).BeginInit();
panelLightingHeader.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxLighting).BeginInit();
@@ -112,6 +133,7 @@
panelBatteryState.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxBatteryState).BeginInit();
panelBottomButtons.SuspendLayout();
tableLayoutPanel2.SuspendLayout();
SuspendLayout();
//
// panelProfiles
@@ -160,27 +182,46 @@
panelPerformance.Location = new Point(11, 68);
panelPerformance.Name = "panelPerformance";
panelPerformance.Padding = new Padding(0, 11, 0, 25);
panelPerformance.Size = new Size(654, 408);
panelPerformance.Size = new Size(654, 461);
panelPerformance.TabIndex = 1;
//
// panelPerformanceOther
//
panelPerformanceOther.AutoSize = true;
panelPerformanceOther.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelPerformanceOther.Controls.Add(comboBoxLiftOffDistance);
panelPerformanceOther.Controls.Add(labelLiftOffDistance);
panelPerformanceOther.Controls.Add(labelAngleAdjustmentValue);
panelPerformanceOther.Controls.Add(sliderAngleAdjustment);
panelPerformanceOther.Controls.Add(checkBoxAngleSnapping);
panelPerformanceOther.Controls.Add(comboBoxPollingRate);
panelPerformanceOther.Controls.Add(labelPollingRate);
panelPerformanceOther.Controls.Add(panelLiftOffDistance);
panelPerformanceOther.Controls.Add(panelDebounce);
panelPerformanceOther.Controls.Add(panelAngleSnapping);
panelPerformanceOther.Controls.Add(panelPollingRate);
panelPerformanceOther.Dock = DockStyle.Top;
panelPerformanceOther.Location = new Point(0, 240);
panelPerformanceOther.Name = "panelPerformanceOther";
panelPerformanceOther.Padding = new Padding(0, 11, 0, 11);
panelPerformanceOther.Size = new Size(654, 143);
panelPerformanceOther.Size = new Size(654, 196);
panelPerformanceOther.TabIndex = 49;
//
// panelLiftOffDistance
//
panelLiftOffDistance.AutoSize = true;
panelLiftOffDistance.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelLiftOffDistance.Controls.Add(labelLiftOffDistance);
panelLiftOffDistance.Controls.Add(comboBoxLiftOffDistance);
panelLiftOffDistance.Dock = DockStyle.Top;
panelLiftOffDistance.Location = new Point(0, 142);
panelLiftOffDistance.Name = "panelLiftOffDistance";
panelLiftOffDistance.Padding = new Padding(5);
panelLiftOffDistance.Size = new Size(654, 43);
panelLiftOffDistance.TabIndex = 56;
//
// labelLiftOffDistance
//
labelLiftOffDistance.Location = new Point(5, 5);
labelLiftOffDistance.Margin = new Padding(6, 0, 6, 0);
labelLiftOffDistance.Name = "labelLiftOffDistance";
labelLiftOffDistance.Size = new Size(348, 33);
labelLiftOffDistance.TabIndex = 48;
labelLiftOffDistance.Text = "Lift Off Distance";
//
// comboBoxLiftOffDistance
//
comboBoxLiftOffDistance.BorderColor = Color.White;
@@ -188,35 +229,77 @@
comboBoxLiftOffDistance.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxLiftOffDistance.FlatStyle = FlatStyle.Flat;
comboBoxLiftOffDistance.FormattingEnabled = true;
comboBoxLiftOffDistance.Location = new Point(368, 99);
comboBoxLiftOffDistance.Location = new Point(367, 5);
comboBoxLiftOffDistance.Margin = new Padding(16, 0, 16, 0);
comboBoxLiftOffDistance.Name = "comboBoxLiftOffDistance";
comboBoxLiftOffDistance.Size = new Size(281, 33);
comboBoxLiftOffDistance.TabIndex = 49;
//
// labelLiftOffDistance
// panelDebounce
//
labelLiftOffDistance.Location = new Point(6, 99);
labelLiftOffDistance.Margin = new Padding(6, 0, 6, 0);
labelLiftOffDistance.Name = "labelLiftOffDistance";
labelLiftOffDistance.Size = new Size(348, 33);
labelLiftOffDistance.TabIndex = 48;
labelLiftOffDistance.Text = "Lift Off Distance";
panelDebounce.AutoSize = true;
panelDebounce.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelDebounce.Controls.Add(labelButtonDebounce);
panelDebounce.Controls.Add(sliderButtonDebounce);
panelDebounce.Controls.Add(labelButtonDebounceValue);
panelDebounce.Dock = DockStyle.Top;
panelDebounce.Location = new Point(0, 95);
panelDebounce.Name = "panelDebounce";
panelDebounce.Padding = new Padding(5);
panelDebounce.Size = new Size(654, 47);
panelDebounce.TabIndex = 55;
//
// labelAngleAdjustmentValue
// labelButtonDebounce
//
labelAngleAdjustmentValue.Location = new Point(598, 61);
labelAngleAdjustmentValue.Margin = new Padding(6, 0, 6, 0);
labelAngleAdjustmentValue.Name = "labelAngleAdjustmentValue";
labelAngleAdjustmentValue.Size = new Size(48, 30);
labelAngleAdjustmentValue.TabIndex = 47;
labelAngleAdjustmentValue.Text = "";
labelAngleAdjustmentValue.TextAlign = ContentAlignment.MiddleRight;
labelButtonDebounce.Location = new Point(6, 7);
labelButtonDebounce.Margin = new Padding(6, 0, 6, 0);
labelButtonDebounce.Name = "labelButtonDebounce";
labelButtonDebounce.Size = new Size(348, 33);
labelButtonDebounce.TabIndex = 52;
labelButtonDebounce.Text = "Button Response";
//
// sliderButtonDebounce
//
sliderButtonDebounce.AccessibleName = "DPI Slider";
sliderButtonDebounce.Location = new Point(368, 9);
sliderButtonDebounce.Max = 7;
sliderButtonDebounce.Min = 2;
sliderButtonDebounce.Name = "sliderButtonDebounce";
sliderButtonDebounce.Size = new Size(213, 30);
sliderButtonDebounce.Step = 1;
sliderButtonDebounce.TabIndex = 50;
sliderButtonDebounce.TabStop = false;
sliderButtonDebounce.Text = "sliderBattery";
sliderButtonDebounce.Value = 2;
//
// labelButtonDebounceValue
//
labelButtonDebounceValue.Location = new Point(590, 9);
labelButtonDebounceValue.Margin = new Padding(6, 0, 6, 0);
labelButtonDebounceValue.Name = "labelButtonDebounceValue";
labelButtonDebounceValue.Size = new Size(60, 30);
labelButtonDebounceValue.TabIndex = 51;
labelButtonDebounceValue.Text = "12ms";
labelButtonDebounceValue.TextAlign = ContentAlignment.MiddleRight;
//
// panelAngleSnapping
//
panelAngleSnapping.AutoSize = true;
panelAngleSnapping.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelAngleSnapping.Controls.Add(sliderAngleAdjustment);
panelAngleSnapping.Controls.Add(checkBoxAngleSnapping);
panelAngleSnapping.Controls.Add(labelAngleAdjustmentValue);
panelAngleSnapping.Dock = DockStyle.Top;
panelAngleSnapping.Location = new Point(0, 51);
panelAngleSnapping.Name = "panelAngleSnapping";
panelAngleSnapping.Padding = new Padding(5);
panelAngleSnapping.Size = new Size(654, 44);
panelAngleSnapping.TabIndex = 54;
//
// sliderAngleAdjustment
//
sliderAngleAdjustment.AccessibleName = "DPI Slider";
sliderAngleAdjustment.Location = new Point(397, 61);
sliderAngleAdjustment.Location = new Point(396, 6);
sliderAngleAdjustment.Max = 20;
sliderAngleAdjustment.Min = -20;
sliderAngleAdjustment.Name = "sliderAngleAdjustment";
@@ -230,7 +313,7 @@
// checkBoxAngleSnapping
//
checkBoxAngleSnapping.CheckAlign = ContentAlignment.MiddleRight;
checkBoxAngleSnapping.Location = new Point(6, 61);
checkBoxAngleSnapping.Location = new Point(5, 6);
checkBoxAngleSnapping.Margin = new Padding(6, 0, 6, 0);
checkBoxAngleSnapping.Name = "checkBoxAngleSnapping";
checkBoxAngleSnapping.Size = new Size(384, 30);
@@ -239,6 +322,38 @@
checkBoxAngleSnapping.TextAlign = ContentAlignment.TopLeft;
checkBoxAngleSnapping.UseVisualStyleBackColor = true;
//
// labelAngleAdjustmentValue
//
labelAngleAdjustmentValue.Location = new Point(597, 6);
labelAngleAdjustmentValue.Margin = new Padding(6, 0, 6, 0);
labelAngleAdjustmentValue.Name = "labelAngleAdjustmentValue";
labelAngleAdjustmentValue.Size = new Size(48, 30);
labelAngleAdjustmentValue.TabIndex = 47;
labelAngleAdjustmentValue.Text = "0°";
labelAngleAdjustmentValue.TextAlign = ContentAlignment.MiddleRight;
//
// panelPollingRate
//
panelPollingRate.AutoSize = true;
panelPollingRate.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelPollingRate.Controls.Add(labelPollingRate);
panelPollingRate.Controls.Add(comboBoxPollingRate);
panelPollingRate.Dock = DockStyle.Top;
panelPollingRate.Location = new Point(0, 11);
panelPollingRate.Name = "panelPollingRate";
panelPollingRate.Padding = new Padding(5);
panelPollingRate.Size = new Size(654, 40);
panelPollingRate.TabIndex = 53;
//
// labelPollingRate
//
labelPollingRate.Location = new Point(6, 5);
labelPollingRate.Margin = new Padding(6, 0, 6, 0);
labelPollingRate.Name = "labelPollingRate";
labelPollingRate.Size = new Size(348, 30);
labelPollingRate.TabIndex = 45;
labelPollingRate.Text = "Polling Rate";
//
// comboBoxPollingRate
//
comboBoxPollingRate.BorderColor = Color.White;
@@ -246,21 +361,12 @@
comboBoxPollingRate.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxPollingRate.FlatStyle = FlatStyle.Flat;
comboBoxPollingRate.FormattingEnabled = true;
comboBoxPollingRate.Location = new Point(368, 8);
comboBoxPollingRate.Location = new Point(368, 2);
comboBoxPollingRate.Margin = new Padding(16, 0, 16, 0);
comboBoxPollingRate.Name = "comboBoxPollingRate";
comboBoxPollingRate.Size = new Size(281, 33);
comboBoxPollingRate.TabIndex = 44;
//
// labelPollingRate
//
labelPollingRate.Location = new Point(6, 9);
labelPollingRate.Margin = new Padding(6, 0, 6, 0);
labelPollingRate.Name = "labelPollingRate";
labelPollingRate.Size = new Size(348, 30);
labelPollingRate.TabIndex = 45;
labelPollingRate.Text = "Polling Rate";
//
// panelDPISettings
//
panelDPISettings.AutoSize = true;
@@ -550,15 +656,16 @@
panelLighting.Controls.Add(panelLightingContent);
panelLighting.Controls.Add(panelLightingHeader);
panelLighting.Dock = DockStyle.Top;
panelLighting.Location = new Point(11, 476);
panelLighting.Location = new Point(11, 529);
panelLighting.Name = "panelLighting";
panelLighting.Padding = new Padding(0, 0, 0, 25);
panelLighting.Size = new Size(654, 271);
panelLighting.Size = new Size(654, 329);
panelLighting.TabIndex = 42;
//
// panelLightingContent
//
panelLightingContent.AutoSize = true;
panelLightingContent.Controls.Add(tableLayoutLightingZones);
panelLightingContent.Controls.Add(comboBoxAnimationDirection);
panelLightingContent.Controls.Add(labelAnimationDirection);
panelLightingContent.Controls.Add(checkBoxRandomColor);
@@ -572,9 +679,148 @@
panelLightingContent.Location = new Point(0, 30);
panelLightingContent.Name = "panelLightingContent";
panelLightingContent.Padding = new Padding(0, 0, 0, 11);
panelLightingContent.Size = new Size(654, 216);
panelLightingContent.Size = new Size(654, 274);
panelLightingContent.TabIndex = 42;
//
// tableLayoutLightingZones
//
tableLayoutLightingZones.AutoSize = true;
tableLayoutLightingZones.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableLayoutLightingZones.ColumnCount = 5;
tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableLayoutLightingZones.Controls.Add(buttonLightingZoneScroll, 0, 0);
tableLayoutLightingZones.Controls.Add(buttonLightingZoneLogo, 0, 0);
tableLayoutLightingZones.Controls.Add(buttonLightingZoneAll, 0, 0);
tableLayoutLightingZones.Controls.Add(buttonLightingZoneUnderglow, 1, 0);
tableLayoutLightingZones.Controls.Add(buttonLightingZoneDock, 2, 0);
tableLayoutLightingZones.Dock = DockStyle.Top;
tableLayoutLightingZones.Location = new Point(0, 0);
tableLayoutLightingZones.Margin = new Padding(6, 3, 6, 3);
tableLayoutLightingZones.Name = "tableLayoutLightingZones";
tableLayoutLightingZones.RowCount = 1;
tableLayoutLightingZones.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
tableLayoutLightingZones.Size = new Size(654, 60);
tableLayoutLightingZones.TabIndex = 56;
//
// buttonLightingZoneScroll
//
buttonLightingZoneScroll.AccessibleName = "DPI Setting 4";
buttonLightingZoneScroll.Activated = false;
buttonLightingZoneScroll.AutoSize = true;
buttonLightingZoneScroll.AutoSizeMode = AutoSizeMode.GrowAndShrink;
buttonLightingZoneScroll.BackColor = SystemColors.ControlLightLight;
buttonLightingZoneScroll.BorderColor = Color.LightGreen;
buttonLightingZoneScroll.BorderRadius = 5;
buttonLightingZoneScroll.Dock = DockStyle.Fill;
buttonLightingZoneScroll.FlatAppearance.BorderSize = 0;
buttonLightingZoneScroll.FlatStyle = FlatStyle.Flat;
buttonLightingZoneScroll.ForeColor = SystemColors.ControlText;
buttonLightingZoneScroll.ImageAlign = ContentAlignment.BottomCenter;
buttonLightingZoneScroll.Location = new Point(263, 3);
buttonLightingZoneScroll.Name = "buttonLightingZoneScroll";
buttonLightingZoneScroll.Secondary = false;
buttonLightingZoneScroll.Size = new Size(124, 54);
buttonLightingZoneScroll.TabIndex = 7;
buttonLightingZoneScroll.Text = "Scrollwheel";
buttonLightingZoneScroll.TextImageRelation = TextImageRelation.ImageAboveText;
buttonLightingZoneScroll.UseVisualStyleBackColor = false;
//
// buttonLightingZoneLogo
//
buttonLightingZoneLogo.AccessibleName = "DPI Setting 2";
buttonLightingZoneLogo.Activated = false;
buttonLightingZoneLogo.AutoSize = true;
buttonLightingZoneLogo.AutoSizeMode = AutoSizeMode.GrowAndShrink;
buttonLightingZoneLogo.BackColor = SystemColors.ControlLightLight;
buttonLightingZoneLogo.BorderColor = Color.LightGreen;
buttonLightingZoneLogo.BorderRadius = 5;
buttonLightingZoneLogo.Dock = DockStyle.Fill;
buttonLightingZoneLogo.FlatAppearance.BorderSize = 0;
buttonLightingZoneLogo.FlatStyle = FlatStyle.Flat;
buttonLightingZoneLogo.ForeColor = SystemColors.ControlText;
buttonLightingZoneLogo.ImageAlign = ContentAlignment.BottomCenter;
buttonLightingZoneLogo.Location = new Point(133, 3);
buttonLightingZoneLogo.Name = "buttonLightingZoneLogo";
buttonLightingZoneLogo.Secondary = false;
buttonLightingZoneLogo.Size = new Size(124, 54);
buttonLightingZoneLogo.TabIndex = 4;
buttonLightingZoneLogo.Text = "Logo";
buttonLightingZoneLogo.TextImageRelation = TextImageRelation.ImageAboveText;
buttonLightingZoneLogo.UseVisualStyleBackColor = false;
//
// buttonLightingZoneAll
//
buttonLightingZoneAll.AccessibleName = "DPI Setting 1";
buttonLightingZoneAll.Activated = false;
buttonLightingZoneAll.AutoSize = true;
buttonLightingZoneAll.AutoSizeMode = AutoSizeMode.GrowAndShrink;
buttonLightingZoneAll.BackColor = SystemColors.ControlLightLight;
buttonLightingZoneAll.BorderColor = Color.LightGreen;
buttonLightingZoneAll.BorderRadius = 5;
buttonLightingZoneAll.CausesValidation = false;
buttonLightingZoneAll.Dock = DockStyle.Fill;
buttonLightingZoneAll.FlatAppearance.BorderSize = 0;
buttonLightingZoneAll.FlatStyle = FlatStyle.Flat;
buttonLightingZoneAll.ForeColor = SystemColors.ControlText;
buttonLightingZoneAll.Location = new Point(3, 3);
buttonLightingZoneAll.Name = "buttonLightingZoneAll";
buttonLightingZoneAll.Secondary = false;
buttonLightingZoneAll.Size = new Size(124, 54);
buttonLightingZoneAll.TabIndex = 4;
buttonLightingZoneAll.Text = "All";
buttonLightingZoneAll.TextImageRelation = TextImageRelation.ImageAboveText;
buttonLightingZoneAll.UseVisualStyleBackColor = false;
//
// buttonLightingZoneUnderglow
//
buttonLightingZoneUnderglow.AccessibleName = "DPI Setting 3";
buttonLightingZoneUnderglow.Activated = false;
buttonLightingZoneUnderglow.AutoSize = true;
buttonLightingZoneUnderglow.AutoSizeMode = AutoSizeMode.GrowAndShrink;
buttonLightingZoneUnderglow.BackColor = SystemColors.ControlLightLight;
buttonLightingZoneUnderglow.BorderColor = Color.LightGreen;
buttonLightingZoneUnderglow.BorderRadius = 5;
buttonLightingZoneUnderglow.Dock = DockStyle.Fill;
buttonLightingZoneUnderglow.FlatAppearance.BorderSize = 0;
buttonLightingZoneUnderglow.FlatStyle = FlatStyle.Flat;
buttonLightingZoneUnderglow.ForeColor = SystemColors.ControlText;
buttonLightingZoneUnderglow.ImageAlign = ContentAlignment.BottomCenter;
buttonLightingZoneUnderglow.Location = new Point(393, 3);
buttonLightingZoneUnderglow.Name = "buttonLightingZoneUnderglow";
buttonLightingZoneUnderglow.Secondary = false;
buttonLightingZoneUnderglow.Size = new Size(124, 54);
buttonLightingZoneUnderglow.TabIndex = 5;
buttonLightingZoneUnderglow.Text = "Underglow";
buttonLightingZoneUnderglow.TextImageRelation = TextImageRelation.ImageAboveText;
buttonLightingZoneUnderglow.UseVisualStyleBackColor = false;
//
// buttonLightingZoneDock
//
buttonLightingZoneDock.AccessibleName = "DPI Setting 4";
buttonLightingZoneDock.Activated = false;
buttonLightingZoneDock.AutoSize = true;
buttonLightingZoneDock.AutoSizeMode = AutoSizeMode.GrowAndShrink;
buttonLightingZoneDock.BackColor = SystemColors.ControlLightLight;
buttonLightingZoneDock.BorderColor = Color.LightGreen;
buttonLightingZoneDock.BorderRadius = 5;
buttonLightingZoneDock.Dock = DockStyle.Fill;
buttonLightingZoneDock.FlatAppearance.BorderSize = 0;
buttonLightingZoneDock.FlatStyle = FlatStyle.Flat;
buttonLightingZoneDock.ForeColor = SystemColors.ControlText;
buttonLightingZoneDock.ImageAlign = ContentAlignment.BottomCenter;
buttonLightingZoneDock.Location = new Point(523, 3);
buttonLightingZoneDock.Name = "buttonLightingZoneDock";
buttonLightingZoneDock.Secondary = false;
buttonLightingZoneDock.Size = new Size(128, 54);
buttonLightingZoneDock.TabIndex = 6;
buttonLightingZoneDock.Text = "Dock";
buttonLightingZoneDock.TextImageRelation = TextImageRelation.ImageAboveText;
buttonLightingZoneDock.UseVisualStyleBackColor = false;
//
// comboBoxAnimationDirection
//
comboBoxAnimationDirection.BorderColor = Color.White;
@@ -582,7 +828,7 @@
comboBoxAnimationDirection.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxAnimationDirection.FlatStyle = FlatStyle.Flat;
comboBoxAnimationDirection.FormattingEnabled = true;
comboBoxAnimationDirection.Location = new Point(366, 172);
comboBoxAnimationDirection.Location = new Point(366, 230);
comboBoxAnimationDirection.Margin = new Padding(16, 0, 16, 0);
comboBoxAnimationDirection.Name = "comboBoxAnimationDirection";
comboBoxAnimationDirection.Size = new Size(284, 33);
@@ -590,7 +836,7 @@
//
// labelAnimationDirection
//
labelAnimationDirection.Location = new Point(6, 172);
labelAnimationDirection.Location = new Point(6, 230);
labelAnimationDirection.Margin = new Padding(6, 0, 6, 0);
labelAnimationDirection.Name = "labelAnimationDirection";
labelAnimationDirection.Size = new Size(316, 33);
@@ -599,7 +845,7 @@
//
// checkBoxRandomColor
//
checkBoxRandomColor.Location = new Point(520, 53);
checkBoxRandomColor.Location = new Point(520, 111);
checkBoxRandomColor.Margin = new Padding(6, 0, 6, 0);
checkBoxRandomColor.Name = "checkBoxRandomColor";
checkBoxRandomColor.Size = new Size(128, 37);
@@ -614,7 +860,7 @@
comboBoxAnimationSpeed.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxAnimationSpeed.FlatStyle = FlatStyle.Flat;
comboBoxAnimationSpeed.FormattingEnabled = true;
comboBoxAnimationSpeed.Location = new Point(366, 130);
comboBoxAnimationSpeed.Location = new Point(366, 188);
comboBoxAnimationSpeed.Margin = new Padding(16, 0, 16, 0);
comboBoxAnimationSpeed.Name = "comboBoxAnimationSpeed";
comboBoxAnimationSpeed.Size = new Size(284, 33);
@@ -622,7 +868,7 @@
//
// labelAnimationSpeed
//
labelAnimationSpeed.Location = new Point(6, 130);
labelAnimationSpeed.Location = new Point(6, 188);
labelAnimationSpeed.Margin = new Padding(6, 0, 6, 0);
labelAnimationSpeed.Name = "labelAnimationSpeed";
labelAnimationSpeed.Size = new Size(316, 33);
@@ -632,7 +878,7 @@
// pictureBoxLightingColor
//
pictureBoxLightingColor.Anchor = AnchorStyles.Top | AnchorStyles.Right;
pictureBoxLightingColor.Location = new Point(480, 62);
pictureBoxLightingColor.Location = new Point(480, 120);
pictureBoxLightingColor.Margin = new Padding(6);
pictureBoxLightingColor.Name = "pictureBoxLightingColor";
pictureBoxLightingColor.Size = new Size(20, 20);
@@ -649,7 +895,7 @@
buttonLightingColor.BorderRadius = 2;
buttonLightingColor.FlatStyle = FlatStyle.Flat;
buttonLightingColor.ForeColor = SystemColors.ControlText;
buttonLightingColor.Location = new Point(373, 53);
buttonLightingColor.Location = new Point(373, 111);
buttonLightingColor.Margin = new Padding(3, 6, 3, 6);
buttonLightingColor.Name = "buttonLightingColor";
buttonLightingColor.Secondary = false;
@@ -666,7 +912,7 @@
comboBoxLightingMode.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxLightingMode.FlatStyle = FlatStyle.Flat;
comboBoxLightingMode.FormattingEnabled = true;
comboBoxLightingMode.Location = new Point(367, 14);
comboBoxLightingMode.Location = new Point(367, 72);
comboBoxLightingMode.Margin = new Padding(16, 0, 16, 0);
comboBoxLightingMode.Name = "comboBoxLightingMode";
comboBoxLightingMode.Size = new Size(284, 33);
@@ -674,7 +920,7 @@
//
// labelLightingMode
//
labelLightingMode.Location = new Point(7, 14);
labelLightingMode.Location = new Point(7, 72);
labelLightingMode.Margin = new Padding(6, 0, 6, 0);
labelLightingMode.Name = "labelLightingMode";
labelLightingMode.Size = new Size(316, 33);
@@ -739,7 +985,7 @@
panelEnergy.Controls.Add(labelAutoPowerOff);
panelEnergy.Controls.Add(panelEnergyHeader);
panelEnergy.Dock = DockStyle.Top;
panelEnergy.Location = new Point(11, 747);
panelEnergy.Location = new Point(11, 858);
panelEnergy.Name = "panelEnergy";
panelEnergy.Padding = new Padding(0, 0, 0, 25);
panelEnergy.Size = new Size(654, 143);
@@ -920,11 +1166,72 @@
panelBottomButtons.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelBottomButtons.Controls.Add(buttonSync);
panelBottomButtons.Dock = DockStyle.Top;
panelBottomButtons.Location = new Point(11, 890);
panelBottomButtons.Location = new Point(11, 1001);
panelBottomButtons.Name = "panelBottomButtons";
panelBottomButtons.Size = new Size(654, 67);
panelBottomButtons.TabIndex = 47;
//
// tableLayoutPanel2
//
tableLayoutPanel2.AutoSize = true;
tableLayoutPanel2.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableLayoutPanel2.ColumnCount = 4;
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableLayoutPanel2.Controls.Add(rButton1, 0, 0);
tableLayoutPanel2.Location = new Point(0, 0);
tableLayoutPanel2.Name = "tableLayoutPanel2";
tableLayoutPanel2.RowCount = 1;
tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
tableLayoutPanel2.Size = new Size(200, 100);
tableLayoutPanel2.TabIndex = 0;
//
// rButton1
//
rButton1.AccessibleName = "DPI Setting 2";
rButton1.Activated = false;
rButton1.BackColor = SystemColors.ControlLightLight;
rButton1.BorderColor = Color.Transparent;
rButton1.BorderRadius = 5;
rButton1.Dock = DockStyle.Top;
rButton1.FlatAppearance.BorderSize = 0;
rButton1.FlatStyle = FlatStyle.Flat;
rButton1.ForeColor = SystemColors.ControlText;
rButton1.Image = Properties.Resources.lighting_dot_32;
rButton1.ImageAlign = ContentAlignment.BottomCenter;
rButton1.Location = new Point(3, 3);
rButton1.Name = "rButton1";
rButton1.Secondary = false;
rButton1.Size = new Size(44, 90);
rButton1.TabIndex = 4;
rButton1.Text = "DPI 2\r\n1000";
rButton1.TextImageRelation = TextImageRelation.ImageAboveText;
rButton1.UseVisualStyleBackColor = false;
//
// rButton2
//
rButton2.AccessibleName = "DPI Setting 1";
rButton2.Activated = false;
rButton2.BackColor = SystemColors.ControlLightLight;
rButton2.BorderColor = Color.Transparent;
rButton2.BorderRadius = 5;
rButton2.CausesValidation = false;
rButton2.Dock = DockStyle.Top;
rButton2.FlatAppearance.BorderSize = 0;
rButton2.FlatStyle = FlatStyle.Flat;
rButton2.ForeColor = SystemColors.ControlText;
rButton2.Image = Properties.Resources.lighting_dot_32;
rButton2.Location = new Point(3, 3);
rButton2.Name = "rButton2";
rButton2.Secondary = false;
rButton2.Size = new Size(44, 90);
rButton2.TabIndex = 4;
rButton2.Text = "DPI 1\r\n800";
rButton2.TextImageRelation = TextImageRelation.ImageAboveText;
rButton2.UseVisualStyleBackColor = false;
//
// AsusMouseSettings
//
AutoScaleDimensions = new SizeF(144F, 144F);
@@ -932,7 +1239,7 @@
AutoScroll = true;
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
ClientSize = new Size(676, 1030);
ClientSize = new Size(676, 1183);
Controls.Add(panelBottomButtons);
Controls.Add(panelEnergy);
Controls.Add(panelLighting);
@@ -952,6 +1259,11 @@
panelPerformance.ResumeLayout(false);
panelPerformance.PerformLayout();
panelPerformanceOther.ResumeLayout(false);
panelPerformanceOther.PerformLayout();
panelLiftOffDistance.ResumeLayout(false);
panelDebounce.ResumeLayout(false);
panelAngleSnapping.ResumeLayout(false);
panelPollingRate.ResumeLayout(false);
panelDPISettings.ResumeLayout(false);
panelDPISettings.PerformLayout();
tableLayoutPanel1.ResumeLayout(false);
@@ -966,6 +1278,9 @@
panelLighting.ResumeLayout(false);
panelLighting.PerformLayout();
panelLightingContent.ResumeLayout(false);
panelLightingContent.PerformLayout();
tableLayoutLightingZones.ResumeLayout(false);
tableLayoutLightingZones.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxLightingColor).EndInit();
panelLightingHeader.ResumeLayout(false);
panelLightingHeader.PerformLayout();
@@ -979,6 +1294,7 @@
panelBatteryState.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxBatteryState).EndInit();
panelBottomButtons.ResumeLayout(false);
tableLayoutPanel2.ResumeLayout(false);
ResumeLayout(false);
PerformLayout();
}
@@ -1047,5 +1363,21 @@
private UI.RButton buttonSync;
private Panel panelBottomButtons;
private NumericUpDown numericUpDownCurrentDPI;
private TableLayoutPanel tableLayoutLightingZones;
private UI.RButton buttonLightingZoneScroll;
private UI.RButton buttonLightingZoneLogo;
private UI.RButton buttonLightingZoneAll;
private UI.RButton buttonLightingZoneUnderglow;
private UI.RButton buttonLightingZoneDock;
private TableLayoutPanel tableLayoutPanel2;
private UI.RButton rButton1;
private UI.RButton rButton2;
private Label labelButtonDebounce;
private Label labelButtonDebounceValue;
private UI.Slider sliderButtonDebounce;
private Panel panelPollingRate;
private Panel panelAngleSnapping;
private Panel panelLiftOffDistance;
private Panel panelDebounce;
}
}

View File

@@ -20,6 +20,7 @@ namespace GHelper
private readonly AsusMouse mouse;
private readonly RButton[] dpiButtons;
private LightingZone visibleZone = LightingZone.All;
private bool updateMouseDPI = true;
@@ -33,6 +34,7 @@ namespace GHelper
labelPollingRate.Text = Properties.Strings.PollingRate;
labelLighting.Text = Properties.Strings.Lighting;
labelLightingMode.Text = Properties.Strings.AuraLightingMode;
labelEnergy.Text = Properties.Strings.EnergySettings;
labelPerformance.Text = Properties.Strings.MousePerformance;
checkBoxRandomColor.Text = Properties.Strings.AuraRandomColor;
@@ -43,6 +45,13 @@ namespace GHelper
labelLiftOffDistance.Text = Properties.Strings.MouseLiftOffDistance;
labelChargingState.Text = "(" + Properties.Strings.Charging + ")";
labelProfile.Text = Properties.Strings.Profile;
labelButtonDebounce.Text = Properties.Strings.MouseButtonResponse;
buttonLightingZoneLogo.Text = Properties.Strings.AuraZoneLogo;
buttonLightingZoneScroll.Text = Properties.Strings.AuraZoneScroll;
buttonLightingZoneUnderglow.Text = Properties.Strings.AuraZoneUnderglow;
buttonLightingZoneAll.Text = Properties.Strings.AuraZoneAll;
buttonLightingZoneDock.Text = Properties.Strings.AuraZoneDock;
InitTheme();
@@ -51,8 +60,6 @@ namespace GHelper
Shown += AsusMouseSettings_Shown;
FormClosing += AsusMouseSettings_FormClosing;
mouse.Disconnect += Mouse_Disconnect;
mouse.BatteryUpdated += Mouse_BatteryUpdated;
comboProfile.DropDownClosed += ComboProfile_DropDownClosed;
sliderDPI.ValueChanged += SliderDPI_ValueChanged;
@@ -70,6 +77,8 @@ namespace GHelper
sliderAngleAdjustment.ValueChanged += SliderAngleAdjustment_ValueChanged;
sliderAngleAdjustment.MouseUp += SliderAngleAdjustment_MouseUp;
comboBoxLiftOffDistance.DropDownClosed += ComboBoxLiftOffDistance_DropDownClosed;
sliderButtonDebounce.ValueChanged += SliderButtonDebounce_ValueChanged;
sliderButtonDebounce.MouseUp += SliderButtonDebounce_MouseUp;
buttonLightingColor.Click += ButtonLightingColor_Click;
comboBoxLightingMode.DropDownClosed += ComboBoxLightingMode_DropDownClosed;
@@ -82,18 +91,96 @@ namespace GHelper
sliderLowBatteryWarning.MouseUp += SliderLowBatteryWarning_MouseUp;
comboBoxAutoPowerOff.DropDownClosed += ComboBoxAutoPowerOff_DropDownClosed;
buttonLightingZoneAll.Click += ButtonLightingZoneAll_Click;
buttonLightingZoneDock.Click += ButtonLightingZoneDock_Click;
buttonLightingZoneLogo.Click += ButtonLightingZoneLogo_Click;
buttonLightingZoneUnderglow.Click += ButtonLightingZoneUnderglow_Click;
buttonLightingZoneScroll.Click += ButtonLightingZoneScroll_Click;
InitMouseCapabilities();
Logger.WriteLine(mouse.GetDisplayName() + " (GUI): Initialized capabilities. Synchronizing mouse data");
RefreshMouseData();
}
private void SliderButtonDebounce_MouseUp(object? sender, MouseEventArgs e)
{
DebounceTime dbt = (DebounceTime)sliderButtonDebounce.Value;
mouse.SetDebounce(dbt);
}
private void SliderButtonDebounce_ValueChanged(object? sender, EventArgs e)
{
DebounceTime dbt = (DebounceTime)sliderButtonDebounce.Value;
int time = mouse.DebounceTimeInMS(dbt);
labelButtonDebounceValue.Text = time + "ms";
}
private void SwitchLightingZone(LightingZone zone)
{
if (!mouse.HasRGB())
{
return;
}
visibleZone = zone;
InitLightingModes();
VisusalizeLightingSettings();
}
private void ButtonLightingZoneScroll_Click(object? sender, EventArgs e)
{
SwitchLightingZone(LightingZone.Scrollwheel);
}
private void ButtonLightingZoneUnderglow_Click(object? sender, EventArgs e)
{
SwitchLightingZone(LightingZone.Underglow);
}
private void ButtonLightingZoneLogo_Click(object? sender, EventArgs e)
{
SwitchLightingZone(LightingZone.Logo);
}
private void ButtonLightingZoneDock_Click(object? sender, EventArgs e)
{
SwitchLightingZone(LightingZone.Dock);
}
private void ButtonLightingZoneAll_Click(object? sender, EventArgs e)
{
SwitchLightingZone(LightingZone.All);
}
private void AsusMouseSettings_FormClosing(object? sender, FormClosingEventArgs e)
{
mouse.BatteryUpdated -= Mouse_BatteryUpdated;
mouse.Disconnect -= Mouse_Disconnect;
mouse.MouseReadyChanged -= Mouse_MouseReadyChanged;
}
private void Mouse_MouseReadyChanged(object? sender, EventArgs e)
{
if (Disposing || IsDisposed)
{
return;
}
if (!mouse.IsDeviceReady)
{
this.Invoke(delegate
{
Close();
});
}
}
private void Mouse_BatteryUpdated(object? sender, EventArgs e)
{
if (Disposing || IsDisposed)
{
return;
}
this.Invoke(delegate
{
VisualizeBatteryState();
@@ -103,6 +190,11 @@ namespace GHelper
private void ComboProfile_DropDownClosed(object? sender, EventArgs e)
{
if (mouse.Profile == comboProfile.SelectedIndex)
{
return;
}
mouse.SetProfile(comboProfile.SelectedIndex);
RefreshMouseData();
}
@@ -156,51 +248,63 @@ namespace GHelper
VisualizeCurrentDPIProfile();
}
private void UpdateLightingSettings(LightingSetting settings, LightingZone zone)
{
mouse.SetLightingSetting(settings, visibleZone);
VisusalizeLightingSettings();
}
private void CheckBoxRandomColor_CheckedChanged(object? sender, EventArgs e)
{
LightingSetting? ls = mouse.LightingSetting;
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
ls.RandomColor = checkBoxRandomColor.Checked;
mouse.SetLightingSetting(ls);
VisusalizeLightingSettings();
UpdateLightingSettings(ls, visibleZone);
}
private void ComboBoxAnimationDirection_DropDownClosed(object? sender, EventArgs e)
{
LightingSetting? ls = mouse.LightingSetting;
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
ls.AnimationDirection = (AnimationDirection)comboBoxAnimationDirection.SelectedIndex;
mouse.SetLightingSetting(ls);
VisusalizeLightingSettings();
UpdateLightingSettings(ls, visibleZone);
}
private void ComboBoxAnimationSpeed_DropDownClosed(object? sender, EventArgs e)
{
LightingSetting? ls = mouse.LightingSetting;
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
ls.AnimationSpeed = (AnimationSpeed)comboBoxAnimationSpeed.SelectedIndex;
mouse.SetLightingSetting(ls);
VisusalizeLightingSettings();
UpdateLightingSettings(ls, visibleZone);
}
private void SliderBrightness_MouseUp(object? sender, MouseEventArgs e)
{
LightingSetting? ls = mouse.LightingSetting;
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
ls.Brightness = sliderBrightness.Value;
mouse.SetLightingSetting(ls);
UpdateLightingSettings(ls, visibleZone);
}
private void ComboBoxLightingMode_DropDownClosed(object? sender, EventArgs e)
{
if (!mouse.HasRGB())
{
return;
}
LightingMode lm = supportedLightingModes[comboBoxLightingMode.SelectedIndex];
LightingSetting? ls = mouse.LightingSetting;
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
if (ls.LightingMode == lm)
{
//Nothing to do here.
return;
}
ls.LightingMode = lm;
mouse.SetLightingSetting(ls);
VisusalizeLightingSettings();
UpdateLightingSettings(ls, visibleZone);
}
private void ButtonLightingColor_Click(object? sender, EventArgs e)
@@ -213,11 +317,10 @@ namespace GHelper
if (colorDlg.ShowDialog() == DialogResult.OK)
{
LightingSetting? ls = mouse.LightingSetting;
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
ls.RGBColor = colorDlg.Color;
mouse.SetLightingSetting(ls);
VisusalizeLightingSettings();
UpdateLightingSettings(ls, visibleZone);
}
}
@@ -305,6 +408,10 @@ namespace GHelper
private void Mouse_Disconnect(object? sender, EventArgs e)
{
if (Disposing || IsDisposed)
{
return;
}
//Mouse disconnected. Bye bye.
this.Invoke(delegate
{
@@ -316,15 +423,19 @@ namespace GHelper
private void RefreshMouseData()
{
mouse.SynchronizeDevice();
Logger.WriteLine(mouse.GetDisplayName() + " (GUI): Mouse data synchronized");
if (!mouse.IsDeviceReady)
{
this.Invoke(delegate
{
this.Close();
});
Logger.WriteLine(mouse.GetDisplayName() + " (GUI): Mouse is not ready. Closing view.");
Mouse_Disconnect(this, EventArgs.Empty);
return;
}
if (Disposing || IsDisposed)
{
return;
}
VisualizeMouseSettings();
VisualizeBatteryState();
@@ -343,9 +454,16 @@ namespace GHelper
sliderDPI.Max = mouse.MaxDPI();
sliderDPI.Min = mouse.MinDPI();
sliderDPI.Step = mouse.DPIIncrements();
numericUpDownCurrentDPI.Minimum = mouse.MinDPI();
numericUpDownCurrentDPI.Maximum = mouse.MaxDPI();
numericUpDownCurrentDPI.Increment = mouse.DPIIncrements();
if (!mouse.HasDebounceSetting())
{
panelDebounce.Visible = false;
}
if (!mouse.HasDPIColors())
@@ -358,9 +476,9 @@ namespace GHelper
buttonDPI4.Image = ControlHelper.TintImage(Properties.Resources.lighting_dot_24, Color.Green);
buttonDPI1.BorderColor = Color.Red;
buttonDPI1.BorderColor = Color.Purple;
buttonDPI1.BorderColor = Color.Blue;
buttonDPI1.BorderColor = Color.Green;
buttonDPI2.BorderColor = Color.Purple;
buttonDPI3.BorderColor = Color.Blue;
buttonDPI4.BorderColor = Color.Green;
}
if (mouse.CanSetPollingRate())
@@ -373,8 +491,7 @@ namespace GHelper
}
else
{
comboBoxPollingRate.Visible = false;
labelPollingRate.Visible = false;
panelPollingRate.Visible = false;
}
if (!mouse.HasAngleSnapping())
@@ -386,6 +503,14 @@ namespace GHelper
{
labelAngleAdjustmentValue.Visible = false;
sliderAngleAdjustment.Visible = false;
sliderAngleAdjustment.Max = mouse.AngleTuningMax();
sliderAngleAdjustment.Min = mouse.AngleTuningMin();
sliderAngleAdjustment.Step = mouse.AngleTuningStep();
}
if (!mouse.HasAngleTuning() && !mouse.HasAngleSnapping())
{
panelAngleSnapping.Visible = false;
}
if (mouse.HasLiftOffSetting())
@@ -397,8 +522,7 @@ namespace GHelper
}
else
{
comboBoxLiftOffDistance.Visible = false;
labelLiftOffDistance.Visible = false;
panelLiftOffDistance.Visible = false;
}
if (mouse.DPIProfileCount() < 4)
@@ -440,14 +564,24 @@ namespace GHelper
if (mouse.HasRGB())
{
foreach (LightingMode lm in Enum.GetValues(typeof(LightingMode)))
if (mouse.SupportedLightingZones().Length > 1)
{
if (mouse.IsLightingModeSupported(lm))
{
comboBoxLightingMode.Items.Add(lightingModeNames.GetValueOrDefault(lm));
supportedLightingModes.Add(lm);
}
buttonLightingZoneLogo.Visible = mouse.SupportedLightingZones().Contains(LightingZone.Logo);
buttonLightingZoneScroll.Visible = mouse.SupportedLightingZones().Contains(LightingZone.Scrollwheel);
buttonLightingZoneUnderglow.Visible = mouse.SupportedLightingZones().Contains(LightingZone.Underglow);
buttonLightingZoneDock.Visible = mouse.SupportedLightingZones().Contains(LightingZone.Dock);
}
else
{
buttonLightingZoneLogo.Visible = false;
buttonLightingZoneScroll.Visible = false;
buttonLightingZoneUnderglow.Visible = false;
buttonLightingZoneDock.Visible = false;
}
sliderBrightness.Max = mouse.MaxBrightness();
InitLightingModes();
comboBoxAnimationDirection.Items.AddRange(new string[] {
Properties.Strings.AuraClockwise,
@@ -466,11 +600,37 @@ namespace GHelper
}
}
private void InitLightingModes()
{
comboBoxLightingMode.Items.Clear();
supportedLightingModes.Clear();
foreach (LightingMode lm in Enum.GetValues(typeof(LightingMode)))
{
if (mouse.IsLightingModeSupported(lm) && mouse.IsLightingModeSupportedForZone(lm, visibleZone))
{
comboBoxLightingMode.Items.Add(lightingModeNames.GetValueOrDefault(lm));
supportedLightingModes.Add(lm);
}
}
}
private void VisualizeMouseSettings()
{
comboProfile.SelectedIndex = mouse.Profile;
if (mouse.HasRGB())
{
//If current lighting mode is zoned, pre-select the first zone and not "All".
bool zoned = mouse.IsLightingZoned();
if (zoned)
{
visibleZone = mouse.SupportedLightingZones()[0];
InitLightingModes();
}
}
VisualizeDPIButtons();
VisualizeCurrentDPIProfile();
VisusalizeLightingSettings();
@@ -516,6 +676,11 @@ namespace GHelper
{
comboBoxLiftOffDistance.SelectedIndex = (int)mouse.LiftOffDistance;
}
if (mouse.HasDebounceSetting())
{
sliderButtonDebounce.Value = (int)mouse.Debounce;
}
}
private void VisualizeBatteryState()
@@ -538,6 +703,29 @@ namespace GHelper
}
}
public void VisusalizeLightingZones()
{
bool zoned = mouse.IsLightingZoned();
buttonLightingZoneAll.Activated = visibleZone == LightingZone.All;
buttonLightingZoneLogo.Activated = visibleZone == LightingZone.Logo;
buttonLightingZoneScroll.Activated = visibleZone == LightingZone.Scrollwheel;
buttonLightingZoneUnderglow.Activated = visibleZone == LightingZone.Underglow;
buttonLightingZoneDock.Activated = visibleZone == LightingZone.Dock;
buttonLightingZoneAll.Secondary = zoned;
buttonLightingZoneLogo.Secondary = !zoned;
buttonLightingZoneScroll.Secondary = !zoned;
buttonLightingZoneUnderglow.Secondary = !zoned;
buttonLightingZoneDock.Secondary = !zoned;
buttonLightingZoneAll.BackColor = buttonLightingZoneAll.Secondary ? RForm.buttonSecond : RForm.buttonMain;
buttonLightingZoneLogo.BackColor = buttonLightingZoneLogo.Secondary ? RForm.buttonSecond : RForm.buttonMain;
buttonLightingZoneScroll.BackColor = buttonLightingZoneScroll.Secondary ? RForm.buttonSecond : RForm.buttonMain;
buttonLightingZoneUnderglow.BackColor = buttonLightingZoneUnderglow.Secondary ? RForm.buttonSecond : RForm.buttonMain;
buttonLightingZoneDock.BackColor = buttonLightingZoneDock.Secondary ? RForm.buttonSecond : RForm.buttonMain;
}
private void VisusalizeLightingSettings()
{
if (!mouse.HasRGB())
@@ -545,7 +733,9 @@ namespace GHelper
return;
}
LightingSetting? ls = mouse.LightingSetting;
VisusalizeLightingZones();
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
if (ls is null)
{
@@ -586,20 +776,24 @@ namespace GHelper
private void VisualizeDPIButtons()
{
if (mouse.HasDPIColors())
for (int i = 0; i < mouse.DPIProfileCount() && i < 4; ++i)
{
for (int i = 0; i < mouse.DPIProfileCount() && i < 4; ++i)
AsusMouseDPI dpi = mouse.DpiSettings[i];
if (dpi is null)
{
AsusMouseDPI dpi = mouse.DpiSettings[i];
dpiButtons[i].Image = ControlHelper.TintImage(Properties.Resources.lighting_dot_24, dpi.Color);
dpiButtons[i].Activated = (mouse.DpiProfile - 1) == i;
dpiButtons[i].BorderColor = dpi.Color;
dpiButtons[i].Text = "DPI " + (i + 1) + "\n" + dpi.DPI;
continue;
}
if (mouse.HasDPIColors())
{
dpiButtons[i].Image = ControlHelper.TintImage(Properties.Resources.lighting_dot_24, dpi.Color);
dpiButtons[i].BorderColor = dpi.Color;
}
dpiButtons[i].Activated = (mouse.DpiProfile - 1) == i;
dpiButtons[i].Text = "DPI " + (i + 1) + "\n" + dpi.DPI;
}
}
private void VisualizeCurrentDPIProfile()
{
AsusMouseDPI dpi = mouse.DpiSettings[mouse.DpiProfile - 1];
@@ -620,6 +814,11 @@ namespace GHelper
}
Left = Program.settingsForm.Left - Width - 5;
mouse.Disconnect += Mouse_Disconnect;
mouse.BatteryUpdated += Mouse_BatteryUpdated;
mouse.MouseReadyChanged += Mouse_MouseReadyChanged;
}
private void ButtonSync_Click(object sender, EventArgs e)

View File

@@ -1,51 +1,37 @@
using GHelper.Helpers;
using HidLibrary;
using System.Diagnostics;
using System.Text;
namespace GHelper
{
[Flags]
public enum AuraDev19b6 : uint
public class AuraPower
{
BootLogo = 1,
BootKeyb = 1 << 1,
AwakeLogo = 1 << 2,
AwakeKeyb = 1 << 3,
SleepLogo = 1 << 4,
SleepKeyb = 1 << 5,
ShutdownLogo = 1 << 6,
ShutdownKeyb = 1 << 7,
public bool BootLogo;
public bool BootKeyb;
public bool AwakeLogo;
public bool AwakeKeyb;
public bool SleepLogo;
public bool SleepKeyb;
public bool ShutdownLogo;
public bool ShutdownKeyb;
BootBar = 1 << (7 + 2),
AwakeBar = 1 << (7 + 3),
SleepBar = 1 << (7 + 4),
ShutdownBar = 1 << (7 + 5),
public bool BootBar;
public bool AwakeBar;
public bool SleepBar;
public bool ShutdownBar;
BootLid = 1 << (15 + 1),
AwakeLid = 1 << (15 + 2),
SleepLid = 1 << (15 + 3),
ShutdownLid = 1 << (15 + 4),
BootRear = 1 << (23 + 1),
AwakeRear = 1 << (23 + 2),
SleepRear = 1 << (23 + 3),
ShutdownRear = 1 << (23 + 4),
}
public static class AuraDev19b6Extensions
{
public static byte[] ToBytes(this AuraDev19b6[] controls)
{
uint a = 0;
foreach (var n in controls)
{
a |= (uint)n;
}
return new byte[] { 0x5d, 0xbd, 0x01, (byte)(a & 0xff), (byte)((a & 0xff00) >> 8), (byte)((a & 0xff0000) >> 16), (byte)((a & 0xff000000) >> 24) };
}
public bool BootLid;
public bool AwakeLid;
public bool SleepLid;
public bool ShutdownLid;
public bool BootRear;
public bool AwakeRear;
public bool SleepRear;
public bool ShutdownRear;
}
@@ -60,12 +46,12 @@ namespace GHelper
public static readonly byte[] LED_INIT1 = new byte[] { AURA_HID_ID, 0xb9 };
public static readonly byte[] LED_INIT2 = Encoding.ASCII.GetBytes("]ASUS Tech.Inc.");
public static readonly byte[] LED_INIT3 = new byte[] { AURA_HID_ID, 0x05, 0x20, 0x31, 0, 0x08 };
public static readonly byte[] LED_INIT3 = new byte[] { AURA_HID_ID, 0x05, 0x20, 0x31, 0, 0x1a };
public static readonly byte[] LED_INIT4 = Encoding.ASCII.GetBytes("^ASUS Tech.Inc.");
public static readonly byte[] LED_INIT5 = new byte[] { 0x5e, 0x05, 0x20, 0x31, 0, 0x08 };
public static readonly byte[] LED_INIT5 = new byte[] { 0x5e, 0x05, 0x20, 0x31, 0, 0x1a };
static byte[] MESSAGE_SET = { AURA_HID_ID, 0xb5, 0, 0, 0 };
static byte[] MESSAGE_APPLY = { AURA_HID_ID, 0xb4 };
static byte[] MESSAGE_SET = { AURA_HID_ID, 0xb5, 0, 0, 0 };
static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0, 0x18c6, 0x1abe };
@@ -74,16 +60,67 @@ namespace GHelper
public static Color Color1 = Color.White;
public static Color Color2 = Color.Black;
static bool isTuf = AppConfig.IsTUF();
static bool isStrix = AppConfig.IsStrix();
static System.Timers.Timer timer = new System.Timers.Timer(1000);
static System.Timers.Timer timer = new System.Timers.Timer(2000);
static HidDevice? auraDevice = null;
static bool Manual = false;
static byte[] AuraPowerMessage(AuraPower flags)
{
byte keyb = 0, bar = 0, lid = 0, rear = 0;
if (flags.BootLogo) keyb |= 1 << 0;
if (flags.BootKeyb) keyb |= 1 << 1;
if (flags.AwakeLogo) keyb |= 1 << 2;
if (flags.AwakeKeyb) keyb |= 1 << 3;
if (flags.SleepLogo) keyb |= 1 << 4;
if (flags.SleepKeyb) keyb |= 1 << 5;
if (flags.ShutdownLogo) keyb |= 1 << 6;
if (flags.ShutdownKeyb) keyb |= 1 << 7;
if (flags.BootBar) bar |= 1 << 1;
if (flags.AwakeBar) bar |= 1 << 2;
if (flags.SleepBar) bar |= 1 << 3;
if (flags.ShutdownBar) bar |= 1 << 4;
if (flags.BootLid) lid |= 1 << 0;
if (flags.AwakeLid) lid |= 1 << 1;
if (flags.SleepLid) lid |= 1 << 2;
if (flags.ShutdownLid) lid |= 1 << 3;
if (flags.BootLid) lid |= 1 << 4;
if (flags.AwakeLid) lid |= 1 << 5;
if (flags.SleepLid) lid |= 1 << 6;
if (flags.ShutdownLid) lid |= 1 << 7;
if (flags.BootRear) rear |= 1 << 0;
if (flags.AwakeRear) rear |= 1 << 1;
if (flags.SleepRear) rear |= 1 << 2;
if (flags.ShutdownRear) rear |= 1 << 3;
if (flags.BootRear) rear |= 1 << 4;
if (flags.AwakeRear) rear |= 1 << 5;
if (flags.SleepRear) rear |= 1 << 6;
if (flags.ShutdownRear) rear |= 1 << 7;
return new byte[] { 0x5d, 0xbd, 0x01, keyb, bar, lid, rear, 0xFF };
}
static AsusUSB()
{
timer.Elapsed += Timer_Elapsed;
}
private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
SetHeatmap();
}
static void SetHeatmap(bool init = false)
{
float cpuTemp = (float)HardwareControl.GetCPUTemp();
int freeze = 20, cold = 40, warm = 65, hot = 90;
@@ -96,7 +133,7 @@ namespace GHelper
else if (cpuTemp < hot) color = ColorUtilities.GetWeightedAverage(Color.Yellow, Color.Red, ((float)cpuTemp - warm) / (hot - warm));
else color = Color.Red;
ApplyColor(color);
ApplyColor(color, init);
}
public static Dictionary<int, string> GetSpeeds()
@@ -140,23 +177,23 @@ namespace GHelper
public static Dictionary<int, string> GetModes()
{
if (AppConfig.ContainsModel("TUF"))
if (isTuf)
{
_modes.Remove(3);
}
if (AppConfig.ContainsModel("401") || AppConfig.ContainsModel("X13"))
if (AppConfig.NoAuraColor())
{
_modes.Remove(2);
_modes.Remove(3);
}
if (AppConfig.ContainsModel("G513QY"))
if (AppConfig.IsAdvantageEdition())
{
return _modes;
}
if (AppConfig.ContainsModel("Strix") || AppConfig.ContainsModel("Scar"))
if (AppConfig.IsStrix())
{
return _modesStrix;
}
@@ -177,14 +214,10 @@ namespace GHelper
}
}
public static bool HasColor()
{
return AppConfig.ContainsModel("GA401") || AppConfig.ContainsModel("X13");
}
public static bool HasSecondColor()
{
return (mode == 1 && !AppConfig.ContainsModel("TUF"));
return (mode == 1 && !isTuf);
}
public static int Speed
@@ -256,6 +289,7 @@ namespace GHelper
msg[6] = (byte)(color.B); // B
msg[7] = (byte)speed; // aura.speed as u8;
msg[8] = 0; // aura.direction as u8;
msg[9] = (mode == 1) ? (byte)1 : (byte)0;
msg[10] = (byte)(color2.R); // R
msg[11] = (byte)(color2.G); // G
msg[12] = (byte)(color2.B); // B
@@ -288,8 +322,7 @@ namespace GHelper
Task.Run(async () =>
{
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardBrightness(brightness);
if (isTuf) Program.acpi.TUFKeyboardBrightness(brightness);
byte[] msg = { AURA_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
byte[] msgBackup = { INPUT_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
@@ -342,41 +375,40 @@ namespace GHelper
Task.Run(async () =>
{
List<AuraDev19b6> flags = new();
AuraPower flags = new();
// Keyboard
if (AppConfig.IsNotFalse("keyboard_awake")) flags.Add(AuraDev19b6.AwakeKeyb);
if (AppConfig.IsNotFalse("keyboard_boot")) flags.Add(AuraDev19b6.BootKeyb);
if (AppConfig.IsNotFalse("keyboard_sleep")) flags.Add(AuraDev19b6.SleepKeyb);
if (AppConfig.IsNotFalse("keyboard_shutdown")) flags.Add(AuraDev19b6.ShutdownKeyb);
flags.AwakeKeyb = AppConfig.IsNotFalse("keyboard_awake");
flags.BootKeyb = AppConfig.IsNotFalse("keyboard_boot");
flags.SleepKeyb = AppConfig.IsNotFalse("keyboard_sleep");
flags.ShutdownKeyb = AppConfig.IsNotFalse("keyboard_shutdown");
// Logo
if (AppConfig.IsNotFalse("keyboard_awake_logo")) flags.Add(AuraDev19b6.AwakeLogo);
if (AppConfig.IsNotFalse("keyboard_boot_logo")) flags.Add(AuraDev19b6.BootLogo);
if (AppConfig.IsNotFalse("keyboard_sleep_logo")) flags.Add(AuraDev19b6.SleepLogo);
if (AppConfig.IsNotFalse("keyboard_shutdown_logo")) flags.Add(AuraDev19b6.ShutdownLogo);
flags.AwakeLogo = AppConfig.IsNotFalse("keyboard_awake_logo");
flags.BootLogo = AppConfig.IsNotFalse("keyboard_boot_logo");
flags.SleepLogo = AppConfig.IsNotFalse("keyboard_sleep_logo");
flags.ShutdownLogo = AppConfig.IsNotFalse("keyboard_shutdown_logo");
// Lightbar
if (AppConfig.IsNotFalse("keyboard_awake_bar")) flags.Add(AuraDev19b6.AwakeBar);
if (AppConfig.IsNotFalse("keyboard_boot_bar")) flags.Add(AuraDev19b6.BootBar);
if (AppConfig.IsNotFalse("keyboard_sleep_bar")) flags.Add(AuraDev19b6.SleepBar);
if (AppConfig.IsNotFalse("keyboard_shutdown_bar")) flags.Add(AuraDev19b6.ShutdownBar);
flags.AwakeBar = AppConfig.IsNotFalse("keyboard_awake_bar");
flags.BootBar = AppConfig.IsNotFalse("keyboard_boot_bar");
flags.SleepBar = AppConfig.IsNotFalse("keyboard_sleep_bar");
flags.ShutdownBar = AppConfig.IsNotFalse("keyboard_shutdown_bar");
// Lid
if (AppConfig.IsNotFalse("keyboard_awake_lid")) flags.Add(AuraDev19b6.AwakeLid);
if (AppConfig.IsNotFalse("keyboard_boot_lid")) flags.Add(AuraDev19b6.BootLid);
if (AppConfig.IsNotFalse("keyboard_sleep_lid")) flags.Add(AuraDev19b6.SleepLid);
if (AppConfig.IsNotFalse("keyboard_shutdown_lid")) flags.Add(AuraDev19b6.ShutdownLid);
if (AppConfig.IsNotFalse("keyboard_awake_lid")) flags.Add(AuraDev19b6.AwakeRear);
if (AppConfig.IsNotFalse("keyboard_boot_lid")) flags.Add(AuraDev19b6.BootRear);
if (AppConfig.IsNotFalse("keyboard_sleep_lid")) flags.Add(AuraDev19b6.SleepRear);
if (AppConfig.IsNotFalse("keyboard_shutdown_lid")) flags.Add(AuraDev19b6.ShutdownRear);
byte[] msg = AuraDev19b6Extensions.ToBytes(flags.ToArray());
flags.AwakeLid = AppConfig.IsNotFalse("keyboard_awake_lid");
flags.BootLid = AppConfig.IsNotFalse("keyboard_boot_lid");
flags.SleepLid = AppConfig.IsNotFalse("keyboard_sleep_lid");
flags.ShutdownLid = AppConfig.IsNotFalse("keyboard_shutdown_lid");
// Rear Bar
flags.AwakeRear = AppConfig.IsNotFalse("keyboard_awake_lid");
flags.BootRear = AppConfig.IsNotFalse("keyboard_boot_lid");
flags.SleepRear = AppConfig.IsNotFalse("keyboard_sleep_lid");
flags.ShutdownRear = AppConfig.IsNotFalse("keyboard_shutdown_lid");
var devices = GetHidDevices(deviceIds);
byte[] msg = AuraPowerMessage(flags);
foreach (HidDevice device in devices)
{
@@ -389,12 +421,12 @@ namespace GHelper
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF"))
if (isTuf)
Program.acpi.TUFKeyboardPower(
flags.Contains(AuraDev19b6.AwakeKeyb),
flags.Contains(AuraDev19b6.BootKeyb),
flags.Contains(AuraDev19b6.SleepKeyb),
flags.Contains(AuraDev19b6.ShutdownKeyb));
flags.AwakeKeyb,
flags.BootKeyb,
flags.SleepKeyb,
flags.ShutdownKeyb);
});
@@ -409,6 +441,7 @@ namespace GHelper
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
Logger.WriteLine("Aura Device:" + device.DevicePath);
auraDevice = device;
return;
}
@@ -419,16 +452,74 @@ namespace GHelper
}
}
public static void ApplyColor(Color color)
public static void ApplyColor(Color color, bool init = false)
{
Task.Run(async () =>
if (isTuf)
{
if (auraDevice is null || !auraDevice.IsConnected) GetAuraDevice();
if (auraDevice is null || !auraDevice.IsConnected) return;
auraDevice.WriteFeatureData(AuraMessage(0, color, color, 0));
auraDevice.WriteFeatureData(MESSAGE_SET);
//auraDevice.WriteFeatureData(MESSAGE_APPLY);
});
Program.acpi.TUFKeyboardRGB(0, color, 0);
return;
}
if (auraDevice is null || !auraDevice.IsConnected) GetAuraDevice();
if (auraDevice is null || !auraDevice.IsConnected) return;
if (isStrix)
{
byte[] msg = new byte[0x40];
byte start = 9;
byte maxLeds = 0x93;
msg[0] = AURA_HID_ID;
msg[1] = 0xbc;
msg[2] = 0;
msg[3] = 1;
msg[4] = 1;
msg[5] = 1;
msg[6] = 0;
msg[7] = 0x10;
for (byte i = 0; i < 0x12; i++)
{
msg[start + i * 3] = color.R; // R
msg[start + 1 + i * 3] = color.G; // G
msg[start + 2 + i * 3] = color.B; // B
}
if (init)
{
auraDevice.Write(LED_INIT1);
auraDevice.Write(LED_INIT2);
auraDevice.Write(LED_INIT3);
auraDevice.Write(LED_INIT4);
auraDevice.Write(LED_INIT5);
auraDevice.Write(new byte[] { AURA_HID_ID, 0xbc});
}
for (byte b = 0; b < maxLeds; b += 0x10)
{
msg[6] = b;
auraDevice.Write(msg);
}
msg[6] = maxLeds;
auraDevice.Write(msg);
msg[4] = 4;
msg[5] = 0;
msg[6] = 0;
msg[7] = 0;
auraDevice.Write(msg);
}
else
{
auraDevice.Write(AuraMessage(0, color, color, 0));
auraDevice.Write(MESSAGE_SET);
}
}
@@ -442,6 +533,7 @@ namespace GHelper
if (Mode == HEATMAP)
{
SetHeatmap(true);
timer.Enabled = true;
return;
}
@@ -478,14 +570,14 @@ namespace GHelper
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
device.WriteFeatureData(msg);
device.WriteFeatureData(MESSAGE_SET);
device.WriteFeatureData(MESSAGE_APPLY);
device.WriteFeatureData(MESSAGE_SET);
Logger.WriteLine("USB-KB " + device.Capabilities.FeatureReportByteLength + "|" + device.Capabilities.InputReportByteLength + device.Description + device.DevicePath + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF"))
if (isTuf)
Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed);
});
@@ -513,6 +605,15 @@ namespace GHelper
return 0;
}
public static void InitXGM()
{
SetXGM(LED_INIT1);
SetXGM(LED_INIT2);
SetXGM(LED_INIT3);
SetXGM(LED_INIT4);
SetXGM(LED_INIT5);
}
public static void ApplyXGMLight(bool status)
{
SetXGM(new byte[] { 0x5e, 0xc5, status ? (byte)0x50 : (byte)0 });
@@ -529,6 +630,8 @@ namespace GHelper
if (AsusACPI.IsInvalidCurve(curve)) return -1;
//InitXGM();
byte[] msg = new byte[19];
Array.Copy(new byte[] { 0x5e, 0xd1, 0x01 }, msg, 3);
Array.Copy(curve, 0, msg, 3, curve.Length);

View File

@@ -41,6 +41,8 @@ namespace GHelper.AutoUpdate
async void CheckForUpdatesAsync()
{
if (AppConfig.Is("skip_updates")) return;
try
{

269
app/Extra.Designer.cs generated
View File

@@ -41,8 +41,11 @@ namespace GHelper
labelBindings = new Label();
panelBindings = new Panel();
tableBindings = new TableLayoutPanel();
label1 = new Label();
textBox1 = new TextBox();
labelFNE = new Label();
comboFNE = new RComboBox();
textFNE = new TextBox();
labelFNC = new Label();
textM2 = new TextBox();
textM1 = new TextBox();
comboM1 = new RComboBox();
labelM1 = new Label();
@@ -60,8 +63,6 @@ namespace GHelper
comboFNC = new RComboBox();
textFNC = new TextBox();
tableKeys = new TableLayoutPanel();
labelFNC = new Label();
textM2 = new TextBox();
panelBacklightHeader = new Panel();
sliderBrightness = new Slider();
pictureBacklight = new PictureBox();
@@ -116,7 +117,6 @@ namespace GHelper
((System.ComponentModel.ISupportInitialize)pictureHelp).BeginInit();
panelBindings.SuspendLayout();
tableBindings.SuspendLayout();
tableKeys.SuspendLayout();
panelBacklightHeader.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBacklight).BeginInit();
panelBacklight.SuspendLayout();
@@ -137,7 +137,7 @@ namespace GHelper
panelServices.Controls.Add(labelServices);
panelServices.Controls.Add(buttonServices);
panelServices.Dock = DockStyle.Top;
panelServices.Location = new Point(15, 1216);
panelServices.Location = new Point(15, 1267);
panelServices.Name = "panelServices";
panelServices.Size = new Size(983, 75);
panelServices.TabIndex = 3;
@@ -156,7 +156,7 @@ namespace GHelper
//
labelServices.AutoSize = true;
labelServices.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelServices.Location = new Point(57, 18);
labelServices.Location = new Point(57, 19);
labelServices.Name = "labelServices";
labelServices.Size = new Size(273, 32);
labelServices.TabIndex = 20;
@@ -189,15 +189,15 @@ namespace GHelper
panelBindingsHeader.Dock = DockStyle.Top;
panelBindingsHeader.Location = new Point(15, 15);
panelBindingsHeader.Name = "panelBindingsHeader";
panelBindingsHeader.Padding = new Padding(10, 5, 10, 5);
panelBindingsHeader.Size = new Size(983, 50);
panelBindingsHeader.Padding = new Padding(11, 5, 11, 5);
panelBindingsHeader.Size = new Size(983, 51);
panelBindingsHeader.TabIndex = 4;
//
// pictureBindings
//
pictureBindings.BackgroundImage = Resources.icons8_keyboard_32;
pictureBindings.BackgroundImageLayout = ImageLayout.Zoom;
pictureBindings.Location = new Point(20, 10);
pictureBindings.Location = new Point(20, 11);
pictureBindings.Name = "pictureBindings";
pictureBindings.Size = new Size(32, 32);
pictureBindings.TabIndex = 1;
@@ -209,7 +209,7 @@ namespace GHelper
pictureHelp.BackgroundImage = Resources.icons8_help_32;
pictureHelp.BackgroundImageLayout = ImageLayout.Zoom;
pictureHelp.Cursor = Cursors.Hand;
pictureHelp.Location = new Point(930, 10);
pictureHelp.Location = new Point(931, 11);
pictureHelp.Margin = new Padding(4, 3, 4, 3);
pictureHelp.Name = "pictureHelp";
pictureHelp.Size = new Size(32, 32);
@@ -232,10 +232,10 @@ namespace GHelper
panelBindings.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelBindings.Controls.Add(tableBindings);
panelBindings.Dock = DockStyle.Top;
panelBindings.Location = new Point(15, 65);
panelBindings.Location = new Point(15, 66);
panelBindings.Name = "panelBindings";
panelBindings.Padding = new Padding(0, 0, 10, 5);
panelBindings.Size = new Size(983, 305);
panelBindings.Padding = new Padding(0, 0, 11, 5);
panelBindings.Size = new Size(983, 351);
panelBindings.TabIndex = 5;
//
// tableBindings
@@ -243,11 +243,14 @@ namespace GHelper
tableBindings.AutoSize = true;
tableBindings.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableBindings.ColumnCount = 3;
tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15.45389F));
tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40.94511F));
tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 43.6010056F));
tableBindings.Controls.Add(label1, 0, 5);
tableBindings.Controls.Add(textBox1, 2, 1);
tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableBindings.Controls.Add(labelFNE, 0, 6);
tableBindings.Controls.Add(comboFNE, 0, 6);
tableBindings.Controls.Add(textFNE, 0, 6);
tableBindings.Controls.Add(labelFNC, 0, 5);
tableBindings.Controls.Add(textM2, 2, 1);
tableBindings.Controls.Add(textM1, 2, 0);
tableBindings.Controls.Add(comboM1, 1, 0);
tableBindings.Controls.Add(labelM1, 0, 0);
@@ -269,45 +272,80 @@ namespace GHelper
tableBindings.Margin = new Padding(0, 3, 4, 3);
tableBindings.Name = "tableBindings";
tableBindings.Padding = new Padding(16, 12, 0, 12);
tableBindings.RowCount = 6;
tableBindings.RowCount = 7;
tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle());
tableBindings.Size = new Size(973, 300);
tableBindings.RowStyles.Add(new RowStyle());
tableBindings.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
tableBindings.Size = new Size(972, 346);
tableBindings.TabIndex = 12;
//
// label1
// labelFNE
//
label1.AutoSize = true;
label1.Location = new Point(16, 242);
label1.Margin = new Padding(0);
label1.Name = "label1";
label1.Padding = new Padding(5, 10, 0, 0);
label1.Size = new Size(85, 42);
label1.TabIndex = 15;
label1.Text = "FN+C:";
labelFNE.AutoSize = true;
labelFNE.Location = new Point(16, 288);
labelFNE.Margin = new Padding(0);
labelFNE.Name = "labelFNE";
labelFNE.Padding = new Padding(5, 11, 0, 0);
labelFNE.Size = new Size(143, 43);
labelFNE.TabIndex = 20;
labelFNE.Text = "FN+NmEnt:";
//
// textBox1
// comboFNE
//
textBox1.Dock = DockStyle.Top;
textBox1.Location = new Point(558, 61);
textBox1.Margin = new Padding(4, 3, 4, 3);
textBox1.Name = "textBox1";
textBox1.PlaceholderText = "action";
textBox1.Size = new Size(411, 39);
textBox1.TabIndex = 14;
comboFNE.BorderColor = Color.White;
comboFNE.ButtonColor = Color.FromArgb(255, 255, 255);
comboFNE.Dock = DockStyle.Top;
comboFNE.FormattingEnabled = true;
comboFNE.Location = new Point(211, 291);
comboFNE.Margin = new Padding(4, 3, 4, 3);
comboFNE.Name = "comboFNE";
comboFNE.Size = new Size(374, 40);
comboFNE.TabIndex = 19;
//
// textFNE
//
textFNE.Dock = DockStyle.Top;
textFNE.Location = new Point(593, 291);
textFNE.Margin = new Padding(4, 3, 4, 3);
textFNE.Name = "textFNE";
textFNE.PlaceholderText = "action";
textFNE.Size = new Size(375, 39);
textFNE.TabIndex = 18;
//
// labelFNC
//
labelFNC.AutoSize = true;
labelFNC.Location = new Point(16, 242);
labelFNC.Margin = new Padding(0);
labelFNC.Name = "labelFNC";
labelFNC.Padding = new Padding(5, 11, 0, 0);
labelFNC.Size = new Size(85, 43);
labelFNC.TabIndex = 15;
labelFNC.Text = "FN+C:";
//
// textM2
//
textM2.Dock = DockStyle.Top;
textM2.Location = new Point(594, 61);
textM2.Margin = new Padding(5, 3, 5, 3);
textM2.Name = "textM2";
textM2.PlaceholderText = "action";
textM2.Size = new Size(373, 39);
textM2.TabIndex = 14;
//
// textM1
//
textM1.Dock = DockStyle.Top;
textM1.Location = new Point(558, 15);
textM1.Location = new Point(593, 15);
textM1.Margin = new Padding(4, 3, 4, 3);
textM1.Name = "textM1";
textM1.PlaceholderText = "action";
textM1.Size = new Size(411, 39);
textM1.Size = new Size(375, 39);
textM1.TabIndex = 13;
//
// comboM1
@@ -317,10 +355,10 @@ namespace GHelper
comboM1.Dock = DockStyle.Top;
comboM1.FormattingEnabled = true;
comboM1.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });
comboM1.Location = new Point(167, 15);
comboM1.Location = new Point(211, 15);
comboM1.Margin = new Padding(4, 3, 4, 3);
comboM1.Name = "comboM1";
comboM1.Size = new Size(383, 40);
comboM1.Size = new Size(374, 40);
comboM1.TabIndex = 11;
//
// labelM1
@@ -329,8 +367,8 @@ namespace GHelper
labelM1.Location = new Point(16, 12);
labelM1.Margin = new Padding(0);
labelM1.Name = "labelM1";
labelM1.Padding = new Padding(5, 10, 0, 0);
labelM1.Size = new Size(59, 42);
labelM1.Padding = new Padding(5, 11, 0, 0);
labelM1.Size = new Size(59, 43);
labelM1.TabIndex = 9;
labelM1.Text = "M1:";
//
@@ -341,10 +379,10 @@ namespace GHelper
comboM4.Dock = DockStyle.Top;
comboM4.FormattingEnabled = true;
comboM4.Items.AddRange(new object[] { Strings.PerformanceMode, Strings.OpenGHelper, Strings.Custom });
comboM4.Location = new Point(167, 153);
comboM4.Location = new Point(211, 153);
comboM4.Margin = new Padding(4, 3, 4, 3);
comboM4.Name = "comboM4";
comboM4.Size = new Size(383, 40);
comboM4.Size = new Size(374, 40);
comboM4.TabIndex = 3;
//
// comboM3
@@ -354,30 +392,30 @@ namespace GHelper
comboM3.Dock = DockStyle.Top;
comboM3.FormattingEnabled = true;
comboM3.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });
comboM3.Location = new Point(167, 107);
comboM3.Location = new Point(211, 107);
comboM3.Margin = new Padding(4, 3, 4, 3);
comboM3.Name = "comboM3";
comboM3.Size = new Size(383, 40);
comboM3.Size = new Size(374, 40);
comboM3.TabIndex = 1;
//
// textM4
//
textM4.Dock = DockStyle.Top;
textM4.Location = new Point(558, 153);
textM4.Location = new Point(593, 153);
textM4.Margin = new Padding(4, 3, 4, 3);
textM4.Name = "textM4";
textM4.PlaceholderText = "action";
textM4.Size = new Size(411, 39);
textM4.Size = new Size(375, 39);
textM4.TabIndex = 5;
//
// textM3
//
textM3.Dock = DockStyle.Top;
textM3.Location = new Point(558, 107);
textM3.Location = new Point(593, 107);
textM3.Margin = new Padding(4, 3, 4, 3);
textM3.Name = "textM3";
textM3.PlaceholderText = "action";
textM3.Size = new Size(411, 39);
textM3.Size = new Size(375, 39);
textM3.TabIndex = 4;
//
// labelM4
@@ -386,8 +424,8 @@ namespace GHelper
labelM4.Location = new Point(16, 150);
labelM4.Margin = new Padding(0);
labelM4.Name = "labelM4";
labelM4.Padding = new Padding(5, 10, 0, 0);
labelM4.Size = new Size(116, 42);
labelM4.Padding = new Padding(5, 11, 0, 0);
labelM4.Size = new Size(116, 43);
labelM4.TabIndex = 2;
labelM4.Text = "M4/ROG:";
//
@@ -397,8 +435,8 @@ namespace GHelper
labelM3.Location = new Point(16, 104);
labelM3.Margin = new Padding(0);
labelM3.Name = "labelM3";
labelM3.Padding = new Padding(5, 10, 0, 0);
labelM3.Size = new Size(59, 42);
labelM3.Padding = new Padding(5, 11, 0, 0);
labelM3.Size = new Size(59, 43);
labelM3.TabIndex = 0;
labelM3.Text = "M3:";
//
@@ -408,8 +446,8 @@ namespace GHelper
labelM2.Location = new Point(16, 58);
labelM2.Margin = new Padding(0);
labelM2.Name = "labelM2";
labelM2.Padding = new Padding(5, 10, 0, 0);
labelM2.Size = new Size(59, 42);
labelM2.Padding = new Padding(5, 11, 0, 0);
labelM2.Size = new Size(59, 43);
labelM2.TabIndex = 10;
labelM2.Text = "M2:";
//
@@ -420,10 +458,10 @@ namespace GHelper
comboM2.Dock = DockStyle.Top;
comboM2.FormattingEnabled = true;
comboM2.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });
comboM2.Location = new Point(167, 61);
comboM2.Location = new Point(211, 61);
comboM2.Margin = new Padding(4, 3, 4, 3);
comboM2.Name = "comboM2";
comboM2.Size = new Size(383, 40);
comboM2.Size = new Size(374, 40);
comboM2.TabIndex = 12;
//
// labelFNF4
@@ -432,8 +470,8 @@ namespace GHelper
labelFNF4.Location = new Point(16, 196);
labelFNF4.Margin = new Padding(0);
labelFNF4.Name = "labelFNF4";
labelFNF4.Padding = new Padding(5, 10, 0, 0);
labelFNF4.Size = new Size(95, 42);
labelFNF4.Padding = new Padding(5, 11, 0, 0);
labelFNF4.Size = new Size(95, 43);
labelFNF4.TabIndex = 6;
labelFNF4.Text = "FN+F4:";
//
@@ -443,20 +481,20 @@ namespace GHelper
comboFNF4.ButtonColor = Color.FromArgb(255, 255, 255);
comboFNF4.Dock = DockStyle.Top;
comboFNF4.FormattingEnabled = true;
comboFNF4.Location = new Point(167, 199);
comboFNF4.Location = new Point(211, 199);
comboFNF4.Margin = new Padding(4, 3, 4, 3);
comboFNF4.Name = "comboFNF4";
comboFNF4.Size = new Size(383, 40);
comboFNF4.Size = new Size(374, 40);
comboFNF4.TabIndex = 7;
//
// textFNF4
//
textFNF4.Dock = DockStyle.Top;
textFNF4.Location = new Point(558, 199);
textFNF4.Location = new Point(593, 199);
textFNF4.Margin = new Padding(4, 3, 4, 3);
textFNF4.Name = "textFNF4";
textFNF4.PlaceholderText = "action";
textFNF4.Size = new Size(411, 39);
textFNF4.Size = new Size(375, 39);
textFNF4.TabIndex = 8;
//
// comboFNC
@@ -465,20 +503,20 @@ namespace GHelper
comboFNC.ButtonColor = Color.FromArgb(255, 255, 255);
comboFNC.Dock = DockStyle.Top;
comboFNC.FormattingEnabled = true;
comboFNC.Location = new Point(167, 245);
comboFNC.Location = new Point(211, 245);
comboFNC.Margin = new Padding(4, 3, 4, 3);
comboFNC.Name = "comboFNC";
comboFNC.Size = new Size(383, 40);
comboFNC.Size = new Size(374, 40);
comboFNC.TabIndex = 16;
//
// textFNC
//
textFNC.Dock = DockStyle.Top;
textFNC.Location = new Point(558, 245);
textFNC.Location = new Point(593, 245);
textFNC.Margin = new Padding(4, 3, 4, 3);
textFNC.Name = "textFNC";
textFNC.PlaceholderText = "action";
textFNC.Size = new Size(411, 39);
textFNC.Size = new Size(375, 39);
textFNC.TabIndex = 17;
//
// tableKeys
@@ -487,7 +525,6 @@ namespace GHelper
tableKeys.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableKeys.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableKeys.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableKeys.Controls.Add(labelFNC, 0, 5);
tableKeys.Location = new Point(0, 0);
tableKeys.Name = "tableKeys";
tableKeys.RowCount = 6;
@@ -500,26 +537,6 @@ namespace GHelper
tableKeys.Size = new Size(200, 100);
tableKeys.TabIndex = 0;
//
// labelFNC
//
labelFNC.AutoSize = true;
labelFNC.Location = new Point(4, 100);
labelFNC.Margin = new Padding(4, 0, 4, 0);
labelFNC.Name = "labelFNC";
labelFNC.Size = new Size(32, 20);
labelFNC.TabIndex = 15;
labelFNC.Text = "FN+C:";
//
// textM2
//
textM2.Dock = DockStyle.Top;
textM2.Location = new Point(124, 2);
textM2.Margin = new Padding(4, 2, 4, 2);
textM2.Name = "textM2";
textM2.PlaceholderText = "action";
textM2.Size = new Size(72, 39);
textM2.TabIndex = 14;
//
// panelBacklightHeader
//
panelBacklightHeader.AutoSize = true;
@@ -528,20 +545,21 @@ namespace GHelper
panelBacklightHeader.Controls.Add(pictureBacklight);
panelBacklightHeader.Controls.Add(labelBacklightTitle);
panelBacklightHeader.Dock = DockStyle.Top;
panelBacklightHeader.Location = new Point(15, 370);
panelBacklightHeader.Location = new Point(15, 417);
panelBacklightHeader.Name = "panelBacklightHeader";
panelBacklightHeader.Padding = new Padding(10, 5, 10, 5);
panelBacklightHeader.Size = new Size(983, 50);
panelBacklightHeader.Padding = new Padding(11, 5, 11, 5);
panelBacklightHeader.Size = new Size(983, 51);
panelBacklightHeader.TabIndex = 44;
//
// sliderBrightness
//
sliderBrightness.Anchor = AnchorStyles.Top | AnchorStyles.Right;
sliderBrightness.Location = new Point(546, 6);
sliderBrightness.Location = new Point(467, 5);
sliderBrightness.Margin = new Padding(0);
sliderBrightness.Max = 3;
sliderBrightness.Min = 0;
sliderBrightness.Name = "sliderBrightness";
sliderBrightness.Size = new Size(419, 36);
sliderBrightness.Size = new Size(500, 40);
sliderBrightness.Step = 1;
sliderBrightness.TabIndex = 50;
sliderBrightness.Text = "sliderBrightness";
@@ -551,7 +569,7 @@ namespace GHelper
//
pictureBacklight.BackgroundImage = Resources.backlight;
pictureBacklight.BackgroundImageLayout = ImageLayout.Zoom;
pictureBacklight.Location = new Point(20, 10);
pictureBacklight.Location = new Point(20, 11);
pictureBacklight.Name = "pictureBacklight";
pictureBacklight.Size = new Size(32, 32);
pictureBacklight.TabIndex = 3;
@@ -574,7 +592,7 @@ namespace GHelper
panelBacklight.Controls.Add(panelXMG);
panelBacklight.Controls.Add(tableBacklight);
panelBacklight.Dock = DockStyle.Top;
panelBacklight.Location = new Point(15, 420);
panelBacklight.Location = new Point(15, 468);
panelBacklight.Name = "panelBacklight";
panelBacklight.Padding = new Padding(0, 5, 0, 5);
panelBacklight.Size = new Size(983, 402);
@@ -622,7 +640,7 @@ namespace GHelper
labelBacklightTimeout.Location = new Point(16, 63);
labelBacklightTimeout.Margin = new Padding(4, 0, 4, 0);
labelBacklightTimeout.Name = "labelBacklightTimeout";
labelBacklightTimeout.Size = new Size(646, 47);
labelBacklightTimeout.Size = new Size(612, 47);
labelBacklightTimeout.TabIndex = 46;
labelBacklightTimeout.Text = "Timeout when plugged / on battery";
//
@@ -631,7 +649,7 @@ namespace GHelper
labelSpeed.Location = new Point(16, 16);
labelSpeed.Margin = new Padding(4, 0, 4, 0);
labelSpeed.Name = "labelSpeed";
labelSpeed.Size = new Size(646, 43);
labelSpeed.Size = new Size(612, 43);
labelSpeed.TabIndex = 44;
labelSpeed.Text = "Animation Speed";
//
@@ -665,7 +683,7 @@ namespace GHelper
// checkXMG
//
checkXMG.AutoSize = true;
checkXMG.Location = new Point(4, 10);
checkXMG.Location = new Point(4, 11);
checkXMG.Margin = new Padding(4, 3, 4, 3);
checkXMG.Name = "checkXMG";
checkXMG.Padding = new Padding(16, 3, 7, 3);
@@ -963,10 +981,10 @@ namespace GHelper
panelSettingsHeader.Controls.Add(pictureSettings);
panelSettingsHeader.Controls.Add(labelSettings);
panelSettingsHeader.Dock = DockStyle.Top;
panelSettingsHeader.Location = new Point(15, 822);
panelSettingsHeader.Location = new Point(15, 870);
panelSettingsHeader.Name = "panelSettingsHeader";
panelSettingsHeader.Padding = new Padding(10, 5, 10, 5);
panelSettingsHeader.Size = new Size(983, 50);
panelSettingsHeader.Padding = new Padding(11, 5, 11, 5);
panelSettingsHeader.Size = new Size(983, 51);
panelSettingsHeader.TabIndex = 45;
//
// pictureLog
@@ -975,7 +993,7 @@ namespace GHelper
pictureLog.BackgroundImage = Resources.icons8_log_32;
pictureLog.BackgroundImageLayout = ImageLayout.Zoom;
pictureLog.Cursor = Cursors.Hand;
pictureLog.Location = new Point(930, 10);
pictureLog.Location = new Point(931, 11);
pictureLog.Margin = new Padding(4, 3, 4, 3);
pictureLog.Name = "pictureLog";
pictureLog.Size = new Size(32, 32);
@@ -986,7 +1004,7 @@ namespace GHelper
//
pictureSettings.BackgroundImage = Resources.icons8_settings_32;
pictureSettings.BackgroundImageLayout = ImageLayout.Zoom;
pictureSettings.Location = new Point(20, 10);
pictureSettings.Location = new Point(20, 11);
pictureSettings.Name = "pictureSettings";
pictureSettings.Size = new Size(32, 32);
pictureSettings.TabIndex = 1;
@@ -1015,10 +1033,10 @@ namespace GHelper
panelSettings.Controls.Add(checkGpuApps);
panelSettings.Controls.Add(checkFnLock);
panelSettings.Dock = DockStyle.Top;
panelSettings.Location = new Point(15, 872);
panelSettings.Location = new Point(15, 921);
panelSettings.Name = "panelSettings";
panelSettings.Padding = new Padding(20, 5, 10, 5);
panelSettings.Size = new Size(983, 344);
panelSettings.Padding = new Padding(20, 5, 11, 5);
panelSettings.Size = new Size(983, 346);
panelSettings.TabIndex = 46;
//
// checkAutoToggleClamshellMode
@@ -1026,10 +1044,9 @@ namespace GHelper
checkAutoToggleClamshellMode.AutoSize = true;
checkAutoToggleClamshellMode.Dock = DockStyle.Top;
checkAutoToggleClamshellMode.Location = new Point(20, 299);
checkAutoToggleClamshellMode.Margin = new Padding(2);
checkAutoToggleClamshellMode.Name = "checkAutoToggleClamshellMode";
checkAutoToggleClamshellMode.Padding = new Padding(2);
checkAutoToggleClamshellMode.Size = new Size(953, 40);
checkAutoToggleClamshellMode.Padding = new Padding(3);
checkAutoToggleClamshellMode.Size = new Size(952, 42);
checkAutoToggleClamshellMode.TabIndex = 58;
checkAutoToggleClamshellMode.Text = "Auto Toggle Clamshell Mode";
checkAutoToggleClamshellMode.UseVisualStyleBackColor = true;
@@ -1042,7 +1059,7 @@ namespace GHelper
checkAutoApplyWindowsPowerMode.Margin = new Padding(4, 3, 4, 3);
checkAutoApplyWindowsPowerMode.Name = "checkAutoApplyWindowsPowerMode";
checkAutoApplyWindowsPowerMode.Padding = new Padding(3);
checkAutoApplyWindowsPowerMode.Size = new Size(953, 42);
checkAutoApplyWindowsPowerMode.Size = new Size(952, 42);
checkAutoApplyWindowsPowerMode.TabIndex = 54;
checkAutoApplyWindowsPowerMode.Text = "Auto Adjust Windows Power Mode";
checkAutoApplyWindowsPowerMode.UseVisualStyleBackColor = true;
@@ -1055,7 +1072,7 @@ namespace GHelper
checkTopmost.Margin = new Padding(4, 3, 4, 3);
checkTopmost.Name = "checkTopmost";
checkTopmost.Padding = new Padding(3);
checkTopmost.Size = new Size(953, 42);
checkTopmost.Size = new Size(952, 42);
checkTopmost.TabIndex = 51;
checkTopmost.Text = Strings.WindowTop;
checkTopmost.UseVisualStyleBackColor = true;
@@ -1068,7 +1085,7 @@ namespace GHelper
checkNoOverdrive.Margin = new Padding(4, 3, 4, 3);
checkNoOverdrive.Name = "checkNoOverdrive";
checkNoOverdrive.Padding = new Padding(3);
checkNoOverdrive.Size = new Size(953, 42);
checkNoOverdrive.Size = new Size(952, 42);
checkNoOverdrive.TabIndex = 52;
checkNoOverdrive.Text = Strings.DisableOverdrive;
checkNoOverdrive.UseVisualStyleBackColor = true;
@@ -1081,7 +1098,7 @@ namespace GHelper
checkUSBC.Margin = new Padding(4, 3, 4, 3);
checkUSBC.Name = "checkUSBC";
checkUSBC.Padding = new Padding(3);
checkUSBC.Size = new Size(953, 42);
checkUSBC.Size = new Size(952, 42);
checkUSBC.TabIndex = 53;
checkUSBC.Text = "Keep GPU disabled on USB-C charger in Optimized mode";
checkUSBC.UseVisualStyleBackColor = true;
@@ -1094,7 +1111,7 @@ namespace GHelper
checkVariBright.Margin = new Padding(4, 3, 4, 3);
checkVariBright.Name = "checkVariBright";
checkVariBright.Padding = new Padding(3);
checkVariBright.Size = new Size(953, 42);
checkVariBright.Size = new Size(952, 42);
checkVariBright.TabIndex = 57;
checkVariBright.Text = "AMD Display VariBright";
checkVariBright.UseVisualStyleBackColor = true;
@@ -1107,7 +1124,7 @@ namespace GHelper
checkGpuApps.Margin = new Padding(4, 3, 4, 3);
checkGpuApps.Name = "checkGpuApps";
checkGpuApps.Padding = new Padding(3);
checkGpuApps.Size = new Size(953, 42);
checkGpuApps.Size = new Size(952, 42);
checkGpuApps.TabIndex = 55;
checkGpuApps.Text = "Stop all apps using GPU when switching to Eco";
checkGpuApps.UseVisualStyleBackColor = true;
@@ -1133,7 +1150,7 @@ namespace GHelper
AutoScroll = true;
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
ClientSize = new Size(1013, 1355);
ClientSize = new Size(1013, 1431);
Controls.Add(panelServices);
Controls.Add(panelSettings);
Controls.Add(panelSettingsHeader);
@@ -1146,7 +1163,7 @@ namespace GHelper
MaximizeBox = false;
MdiChildrenMinimizedAnchorBottom = false;
MinimizeBox = false;
MinimumSize = new Size(1034, 71);
MinimumSize = new Size(1033, 71);
Name = "Extra";
Padding = new Padding(15);
ShowIcon = false;
@@ -1163,8 +1180,6 @@ namespace GHelper
panelBindings.PerformLayout();
tableBindings.ResumeLayout(false);
tableBindings.PerformLayout();
tableKeys.ResumeLayout(false);
tableKeys.PerformLayout();
panelBacklightHeader.ResumeLayout(false);
panelBacklightHeader.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBacklight).EndInit();
@@ -1193,8 +1208,8 @@ namespace GHelper
private Panel panelBindingsHeader;
private Panel panelBindings;
private TableLayoutPanel tableBindings;
private Label label1;
private TextBox textBox1;
private Label labelFNC;
private TextBox textM2;
private TextBox textM1;
private RComboBox comboM1;
private Label labelM1;
@@ -1213,8 +1228,6 @@ namespace GHelper
private TextBox textFNC;
private PictureBox pictureHelp;
private TableLayoutPanel tableKeys;
private Label labelFNC;
private TextBox textM2;
private PictureBox pictureBindings;
private Label labelBindings;
private Panel panelBacklightHeader;
@@ -1265,5 +1278,9 @@ namespace GHelper
private Slider sliderBrightness;
private PictureBox pictureLog;
private CheckBox checkAutoToggleClamshellMode;
private Label labelFNE;
private RComboBox comboFNE;
private TextBox textFNE;
private Slider slider1;
}
}

View File

@@ -13,9 +13,11 @@ namespace GHelper
ScreenControl screenControl = new ScreenControl();
ClamshellModeControl clamshellControl = new ClamshellModeControl();
const string EMPTY = "--------------";
Dictionary<string, string> customActions = new Dictionary<string, string>
{
{"","--------------" },
{"", EMPTY},
{"mute", Properties.Strings.VolumeMute},
{"screenshot", Properties.Strings.PrintScreen},
{"play", Properties.Strings.PlayPause},
@@ -54,6 +56,16 @@ namespace GHelper
customActions[""] = Properties.Strings.ToggleFnLock;
customActions.Remove("fnlock");
break;
case "fne":
customActions[""] = "Calculator";
customActions["ghelper"] = Properties.Strings.OpenGHelper;
break;
case "paddle":
customActions[""] = EMPTY;
break;
case "cc":
customActions[""] = EMPTY;
break;
}
combo.DropDownStyle = ComboBoxStyle.DropDownList;
@@ -118,38 +130,76 @@ namespace GHelper
Text = Properties.Strings.ExtraSettings;
if (AppConfig.ContainsModel("Duo"))
if (AppConfig.IsDUO())
{
customActions.Add("screenpad_down", Properties.Strings.ScreenPadDown);
customActions.Add("screenpad_up", Properties.Strings.ScreenPadUp);
}
if (InputDispatcher.NoMKeys())
if (AppConfig.NoMKeys())
{
labelM1.Text = "FN+F2";
labelM2.Text = "FN+F3";
labelM3.Text = "FN+F4";
labelM4.Text = "FN+NmEnter";
//labelM4.Visible = comboM4.Visible = textM4.Visible = false;
labelM4.Visible = comboM4.Visible = textM4.Visible = false;
labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;
}
if (AppConfig.NoAura())
{
labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;
}
if (!AppConfig.IsTUF())
{
labelFNE.Visible = comboFNE.Visible = textFNE.Visible = false;
}
if (Program.acpi.DeviceGet(AsusACPI.GPUEco) < 0)
{
checkGpuApps.Visible = false;
checkUSBC.Visible = false;
}
// Change text and hide irrelevant options on the ROG Ally,
// which is a bit of a special case piece of hardware.
if (AppConfig.IsAlly())
{
labelM1.Visible = comboM1.Visible = textM1.Visible = false;
labelM2.Visible = comboM2.Visible = textM2.Visible = false;
// Re-label M3 and M4 and FNF4 to match the front labels.
labelM3.Text = "Ctrl Center";
labelM4.Text = "ROG";
labelFNF4.Text = "Back Paddles";
// Hide all of the FN options, as the Ally has no special keyboard FN key.
labelFNC.Visible = false;
comboFNC.Visible = false;
textFNC.Visible = false;
SetKeyCombo(comboM3, textM3, "cc");
SetKeyCombo(comboM4, textM4, "m4");
SetKeyCombo(comboFNF4, textFNF4, "paddle");
}
else
{
SetKeyCombo(comboM1, textM1, "m1");
SetKeyCombo(comboM2, textM2, "m2");
SetKeyCombo(comboM3, textM3, "m3");
SetKeyCombo(comboM4, textM4, "m4");
SetKeyCombo(comboFNF4, textFNF4, "fnf4");
SetKeyCombo(comboFNC, textFNC, "fnc");
SetKeyCombo(comboFNE, textFNE, "fne");
}
InitTheme();
SetKeyCombo(comboM1, textM1, "m1");
SetKeyCombo(comboM2, textM2, "m2");
SetKeyCombo(comboM3, textM3, "m3");
SetKeyCombo(comboM4, textM4, "m4");
SetKeyCombo(comboFNF4, textFNF4, "fnf4");
SetKeyCombo(comboFNC, textFNC, "fnc");
Shown += Keyboard_Shown;
comboKeyboardSpeed.DropDownStyle = ComboBoxStyle.DropDownList;
@@ -203,7 +253,7 @@ namespace GHelper
checkSleepLogo.CheckedChanged += CheckPower_CheckedChanged;
checkShutdownLogo.CheckedChanged += CheckPower_CheckedChanged;
if (!AppConfig.ContainsModel("Strix"))
if (!AppConfig.IsStrix())
{
labelBacklightBar.Visible = false;
checkAwakeBar.Visible = false;
@@ -211,7 +261,7 @@ namespace GHelper
checkSleepBar.Visible = false;
checkShutdownBar.Visible = false;
if (!AppConfig.ContainsModel("Z13"))
if (!AppConfig.IsZ13())
{
labelBacklightLid.Visible = false;
checkAwakeLid.Visible = false;

View File

@@ -18,7 +18,7 @@
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing"">Blue</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>

View File

@@ -59,7 +59,7 @@ namespace GHelper
InitTheme(true);
MinRPM = 18;
MaxRPM = HardwareControl.GetFanMax();
MaxRPM = HardwareControl.fanMax;
labelTip.Visible = false;
labelTip.BackColor = Color.Transparent;

View File

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

View File

@@ -49,11 +49,12 @@ namespace GHelper.Gpu
}
public void SetGPUMode(int GPUMode)
public void SetGPUMode(int GPUMode, int auto = 0)
{
int CurrentGPU = AppConfig.Get("gpu_mode");
AppConfig.Set("gpu_auto", 0);
AppConfig.Set("gpu_auto", auto);
if (CurrentGPU == GPUMode)
{
@@ -79,6 +80,11 @@ namespace GHelper.Gpu
DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertUltimateOn, Properties.Strings.AlertUltimateTitle, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
if (AppConfig.NoAutoUltimate())
{
Program.acpi.SetGPUEco(0);
Thread.Sleep(100);
}
Program.acpi.DeviceSet(AsusACPI.GPUMux, 0, "GPUMux");
restart = true;
changed = true;
@@ -166,10 +172,14 @@ namespace GHelper.Gpu
public static bool IsPlugged()
{
bool optimizedUSBC = AppConfig.Get("optimized_usbc") != 1;
if (SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online) return false;
if (!AppConfig.Is("optimized_usbc")) return true;
return SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online &&
(optimizedUSBC || Program.acpi.DeviceGet(AsusACPI.ChargerMode) < AsusACPI.ChargerUSB);
int chargerMode = Program.acpi.DeviceGet(AsusACPI.ChargerMode);
Logger.WriteLine("ChargerStatus: " + chargerMode);
if (chargerMode < 0) return true;
return (chargerMode & AsusACPI.ChargerBarrel) > 0;
}
@@ -188,14 +198,12 @@ namespace GHelper.Gpu
if (mux == 0)
{
if (optimized) SetGPUMode(AsusACPI.GPUModeStandard);
if (optimized) SetGPUMode(AsusACPI.GPUModeStandard, 1);
return false;
}
else
{
if (ReEnableGPU()) return true;
if (eco == 1)
if ((GpuAuto && IsPlugged()) || (ForceGPU && GpuMode == AsusACPI.GPUModeStandard))
{
@@ -256,21 +264,6 @@ namespace GHelper.Gpu
}
public bool ReEnableGPU()
{
if (AppConfig.Get("gpu_reenable") != 1) return false;
if (Screen.AllScreens.Length <= 1) return false;
Logger.WriteLine("Re-enabling gpu for 503 model");
Thread.Sleep(1000);
SetGPUEco(1);
Thread.Sleep(1000);
SetGPUEco(0);
return true;
}
public void InitXGM()
{
bool connected = Program.acpi.IsXGConnected();
@@ -304,6 +297,9 @@ namespace GHelper.Gpu
if (AppConfig.IsMode("auto_apply"))
AsusUSB.SetXGMFan(AppConfig.GetFanConfig(AsusFan.XGM));
HardwareControl.RecreateGpuControl();
}
settings.Invoke(delegate

View File

@@ -9,13 +9,22 @@ using System.Management;
public static class HardwareControl
{
const int DEFAULT_FAN_MAX = 58;
const int INADEQUATE_MAX = 80;
public static IGpuControl? GpuControl;
public static float? cpuTemp = -1;
public static decimal? batteryRate = 0;
public static decimal batteryHealth = -1;
public static decimal batteryCapacity = -1;
public static decimal? designCapacity;
public static decimal? fullCapacity;
public static decimal? chargeCapacity;
public static int? gpuTemp = null;
public static string? cpuFan;
@@ -26,21 +35,48 @@ public static class HardwareControl
static long lastUpdate;
public static int GetFanMax()
{
int max = 58;
int configMax = AppConfig.Get("fan_max");
if (configMax > 80) configMax = 0; // skipping inadvequate settings
static int _fanMax = DEFAULT_FAN_MAX;
static bool _fanRpm = false;
if (AppConfig.ContainsModel("401")) max = 72;
else if (AppConfig.ContainsModel("503")) max = 68;
return Math.Max(max, configMax);
public static int fanMax
{
get
{
return _fanMax;
}
set
{
AppConfig.Set("fan_max", value);
_fanMax = value;
}
}
public static void SetFanMax(int fan)
public static bool fanRpm
{
AppConfig.Set("fan_max", fan);
get
{
return _fanRpm;
}
set
{
AppConfig.Set("fan_rpm", value ? 1 : 0);
_fanRpm = value;
}
}
static HardwareControl()
{
_fanMax = AppConfig.Get("fan_max");
if (_fanMax > INADEQUATE_MAX) _fanMax = -1; // skipping inadvequate settings
if (_fanMax < 0 && AppConfig.ContainsModel("401")) _fanMax = 72;
if (_fanMax < 0 && AppConfig.ContainsModel("503")) _fanMax = 68;
if (_fanMax < 0) _fanMax = DEFAULT_FAN_MAX;
_fanRpm = AppConfig.Is("fan_rpm");
}
public static string FormatFan(int fan)
{
// fix for old models
@@ -50,10 +86,9 @@ public static class HardwareControl
if (fan <= 0 || fan > 100) return null; //nothing reasonable
}
int fanMax = GetFanMax();
if (fan > fanMax && fan < 80) SetFanMax(fan);
if (fan > fanMax && fan <= INADEQUATE_MAX) fanMax = fan;
if (AppConfig.Is("fan_rpm"))
if (fanRpm)
return GHelper.Properties.Strings.FanSpeed + ": " + (fan * 100).ToString() + "RPM";
else
return GHelper.Properties.Strings.FanSpeed + ": " + Math.Min(Math.Round((float)fan / fanMax * 100), 100).ToString() + "%"; // relatively to 6000 rpm
@@ -76,9 +111,12 @@ public static class HardwareControl
}
public static decimal GetBatteryRate()
public static void GetBatteryStatus()
{
batteryRate = 0;
chargeCapacity = 0;
try
{
ManagementScope scope = new ManagementScope("root\\WMI");
@@ -87,26 +125,29 @@ public static class HardwareControl
using ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject obj in searcher.Get().Cast<ManagementObject>())
{
chargeCapacity = Convert.ToDecimal(obj["RemainingCapacity"]);
decimal chargeRate = Convert.ToDecimal(obj["ChargeRate"]);
decimal dischargeRate = Convert.ToDecimal(obj["DischargeRate"]);
if (chargeRate > 0)
return chargeRate;
batteryRate = chargeRate / 1000;
else
return -dischargeRate;
}
batteryRate = -dischargeRate / 1000;
return 0;
}
}
catch (Exception ex)
{
Logger.WriteLine("Discharge Reading: " + ex.Message);
return 0;
}
}
public static void ReadFullChargeCapacity()
{
if (fullCapacity > 0) return;
try
{
@@ -129,6 +170,8 @@ public static class HardwareControl
public static void ReadDesignCapacity()
{
if (designCapacity > 0) return;
try
{
ManagementScope scope = new ManagementScope("root\\WMI");
@@ -174,8 +217,9 @@ public static class HardwareControl
public static float? GetCPUTemp() {
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastUpdate) < 1000) return cpuTemp;
lastUpdate = DateTimeOffset.Now.ToUnixTimeMilliseconds();
var last = DateTimeOffset.Now.ToUnixTimeSeconds();
if (Math.Abs(last - lastUpdate) < 2) return cpuTemp;
lastUpdate = last;
cpuTemp = Program.acpi.DeviceGet(AsusACPI.Temp_CPU);
@@ -191,6 +235,7 @@ public static class HardwareControl
Debug.WriteLine("Failed reading CPU temp :" + ex.Message);
}
return cpuTemp;
}
@@ -221,7 +266,15 @@ public static class HardwareControl
if (gpuTemp is null || gpuTemp < 0)
gpuTemp = Program.acpi.DeviceGet(AsusACPI.Temp_GPU);
batteryRate = GetBatteryRate() / 1000;
ReadFullChargeCapacity();
GetBatteryStatus();
if (fullCapacity > 0 && chargeCapacity > 0)
{
batteryCapacity = Math.Min(100, ((decimal)chargeCapacity / (decimal)fullCapacity) * 100);
}
}
public static bool IsUsedGPU(int threshold = 10)

View File

@@ -6,6 +6,13 @@ namespace GHelper.Helpers
{
internal class ClamshellModeControl
{
public ClamshellModeControl()
{
//Save current setting if hibernate or shutdown to prevent reverting the user set option.
CheckAndSaveLidAction();
}
public bool IsExternalDisplayConnected()
{
var devices = ScreenInterrogatory.GetAllDevices().ToArray();
@@ -31,7 +38,7 @@ namespace GHelper.Helpers
public bool IsClamshellEnabled()
{
return AppConfig.Get("toggle_clamshell_mode") != 0;
return AppConfig.Is("toggle_clamshell_mode");
}
public bool IsChargerConnected()
@@ -62,7 +69,7 @@ namespace GHelper.Helpers
}
public static void DisableClamshellMode()
{
PowerNative.SetLidAction(1, true);
PowerNative.SetLidAction(GetDefaultLidAction(), true);
Logger.WriteLine("Disengaging Clamshell Mode");
}
@@ -89,5 +96,43 @@ namespace GHelper.Helpers
if (IsClamshellEnabled())
ToggleLidAction();
}
private static int CheckAndSaveLidAction()
{
if (AppConfig.Get("clamshell_default_lid_action", -1) != -1)
{
//Seting was alredy set. Do not touch it
return AppConfig.Get("clamshell_default_lid_action", -1);
}
int val = PowerNative.GetLidAction(true);
//If it is 0 then it is likely already set by clamshell mdoe
//If 0 was set by the user, then why do they even use clamshell mode?
//We only care about hibernate or shutdown setting here
if (val == 2 || val == 3)
{
AppConfig.Set("clamshell_default_lid_action", val);
return val;
}
return 1;
}
//Power users can change that setting.
//0 = Do nothing
//1 = Sleep (default)
//2 = Hibernate
//3 = Shutdown
private static int GetDefaultLidAction()
{
int val = AppConfig.Get("clamshell_default_lid_action", 1);
if (val < 0 || val > 3)
{
val = 1;
}
return val;
}
}
}

View File

@@ -2,7 +2,6 @@
using GHelper.Helpers;
using GHelper.Mode;
using Microsoft.Win32;
using NAudio.CoreAudioApi;
using System.Diagnostics;
using System.Management;
@@ -20,6 +19,8 @@ namespace GHelper.Input
static ModeControl modeControl = Program.modeControl;
static ScreenControl screenControl = new ScreenControl();
static bool isTUF = AppConfig.IsTUF();
KeyboardListener listener;
KeyboardHook hook = new KeyboardHook();
@@ -105,14 +106,20 @@ namespace GHelper.Input
if (keyProfile != Keys.None) hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control, keyProfile);
if (keyApp != Keys.None) hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control, keyApp);
hook.RegisterHotKey(ModifierKeys.Control, Keys.VolumeDown);
hook.RegisterHotKey(ModifierKeys.Control, Keys.VolumeUp);
hook.RegisterHotKey(ModifierKeys.Shift, Keys.VolumeDown);
hook.RegisterHotKey(ModifierKeys.Shift, Keys.VolumeUp);
if (!AppConfig.Is("skip_hotkeys"))
{
hook.RegisterHotKey(ModifierKeys.Control, Keys.VolumeDown);
hook.RegisterHotKey(ModifierKeys.Control, Keys.VolumeUp);
hook.RegisterHotKey(ModifierKeys.Shift, Keys.VolumeDown);
hook.RegisterHotKey(ModifierKeys.Shift, Keys.VolumeUp);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control, Keys.F20);
}
if (!AppConfig.ContainsModel("Z13"))
if (!AppConfig.IsZ13() && !AppConfig.IsAlly())
{
if (actionM1 is not null && actionM1.Length > 0) hook.RegisterHotKey(ModifierKeys.None, Keys.VolumeDown);
if (actionM2 is not null && actionM2.Length > 0) hook.RegisterHotKey(ModifierKeys.None, Keys.VolumeUp);
if (actionM2 is not null && actionM2.Length > 0) hook.RegisterHotKey(ModifierKeys.None, Keys.VolumeUp);
}
// FN-Lock group
@@ -143,17 +150,27 @@ namespace GHelper.Input
}
static bool IsManualBrightness()
{
return AppConfig.ContainsModel("TUF") && !AppConfig.ContainsModel("FA506");
}
public static bool NoMKeys()
static void SetBrightness(int delta)
{
return AppConfig.ContainsModel("Z13") ||
AppConfig.ContainsModel("FA506") ||
AppConfig.ContainsModel("FX506") ||
AppConfig.ContainsModel("FX505");
int brightness = -1;
if (isTUF) brightness = ScreenBrightness.Get();
if (AppConfig.SwappedBrightness()) delta = -delta;
Program.acpi.DeviceSet(AsusACPI.UniversalControl, delta > 0 ? 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;
Thread.Sleep(100);
if (brightness == ScreenBrightness.Get())
Program.toast.RunToast(ScreenBrightness.Adjust(delta) + "%", (delta < 0 ) ? ToastIcon.BrightnessDown : ToastIcon.BrightnessUp);
}
}
public void KeyPressed(object sender, KeyPressedEventArgs e)
@@ -163,7 +180,7 @@ namespace GHelper.Input
{
Logger.WriteLine(e.Key.ToString());
if (NoMKeys())
if (AppConfig.NoMKeys())
{
switch (e.Key)
{
@@ -179,7 +196,7 @@ namespace GHelper.Input
}
}
if (AppConfig.ContainsModel("Z13"))
if (AppConfig.IsZ13() || AppConfig.IsDUO())
{
switch (e.Key)
{
@@ -189,7 +206,7 @@ namespace GHelper.Input
}
}
if (AppConfig.ContainsModel("GA401I") && !AppConfig.ContainsModel("GA401IHR"))
if (AppConfig.NoAura())
{
switch (e.Key)
{
@@ -227,12 +244,10 @@ namespace GHelper.Input
KeyboardHook.KeyPress(Keys.Snapshot);
break;
case Keys.F7:
if (IsManualBrightness()) Program.toast.RunToast(ScreenBrightness.Adjust(-10) + "%", ToastIcon.BrightnessDown);
HandleOptimizationEvent(16);
SetBrightness(-10);
break;
case Keys.F8:
if (IsManualBrightness()) Program.toast.RunToast(ScreenBrightness.Adjust(+10) + "%", ToastIcon.BrightnessUp);
HandleOptimizationEvent(32);
SetBrightness(+10);
break;
case Keys.F9:
KeyboardHook.KeyWinPress(Keys.P);
@@ -255,12 +270,14 @@ namespace GHelper.Input
default:
break;
}
}
if (e.Modifier == (ModifierKeys.Control | ModifierKeys.Shift))
{
if (e.Key == keyProfile) modeControl.CyclePerformanceMode();
if (e.Key == keyApp) Program.SettingsToggle();
if (e.Key == Keys.F20) KeyProcess("m3");
}
if (e.Modifier == (ModifierKeys.Control))
@@ -269,11 +286,11 @@ namespace GHelper.Input
{
case Keys.VolumeDown:
// Screen brightness down on CTRL+VolDown
HandleOptimizationEvent(16);
SetBrightness(-10);
break;
case Keys.VolumeUp:
// Screen brightness up on CTRL+VolUp
HandleOptimizationEvent(32);
SetBrightness(+10);
break;
}
}
@@ -311,6 +328,8 @@ namespace GHelper.Input
action = "micmute";
if (name == "fnc")
action = "fnlock";
if (name == "fne")
action = "calculator";
}
switch (action)
@@ -351,10 +370,10 @@ namespace GHelper.Input
Program.toast.RunToast(muteStatus ? "Muted" : "Unmuted", muteStatus ? ToastIcon.MicrophoneMute : ToastIcon.Microphone);
break;
case "brightness_up":
HandleOptimizationEvent(32);
SetBrightness(+10);
break;
case "brightness_down":
HandleOptimizationEvent(16);
SetBrightness(-10);
break;
case "screenpad_up":
SetScreenpad(10);
@@ -365,7 +384,9 @@ namespace GHelper.Input
case "custom":
CustomKey(name);
break;
case "calculator":
LaunchProcess("calc");
break;
default:
break;
}
@@ -408,43 +429,73 @@ namespace GHelper.Input
static void HandleEvent(int EventID)
{
switch (EventID)
// The ROG Ally uses different M-key codes.
// We'll special-case the translation of those.
if (AppConfig.IsAlly())
{
case 124: // M3
KeyProcess("m3");
return;
case 56: // M4 / Rog button
case 181: // FN + Numpad Enter
KeyProcess("m4");
return;
case 174: // FN+F5
modeControl.CyclePerformanceMode();
return;
case 179: // FN+F4
case 178: // FN+F4
KeyProcess("fnf4");
return;
case 158: // Fn + C
KeyProcess("fnc");
return;
case 78: // Fn + ESC
ToggleFnLock();
return;
case 189: // Tablet mode
TabletMode();
return;
case 197: // FN+F2
SetBacklight(-1);
return;
case 196: // FN+F3
SetBacklight(1);
return;
case 199: // ON Z13 - FN+F11 - cycles backlight
SetBacklight(4);
return;
case 53: // FN+F6 on GA-502DU model
NativeMethods.TurnOffScreen(Program.settingsForm.Handle);
return;
switch(EventID)
{
// This is both the M1 and M2 keys.
// There's a way to differentiate, apparently, but it isn't over USB or any other obvious protocol.
case 165:
KeyProcess("paddle");
return;
// The Command Center ("play-looking") button below the select key.
case 166:
KeyProcess("cc");
return;
// The M4/ROG key.
case 56:
KeyProcess("m4");
return;
}
}
// All other devices seem to use the same HID key-codes,
// so we can process them all the same.
else
{
switch (EventID)
{
case 124: // M3
KeyProcess("m3");
return;
case 56: // M4 / Rog button
KeyProcess("m4");
return;
case 181: // FN + Numpad Enter
KeyProcess("fne");
return;
case 174: // FN+F5
modeControl.CyclePerformanceMode();
return;
case 179: // FN+F4
case 178: // FN+F4
KeyProcess("fnf4");
return;
case 158: // Fn + C
KeyProcess("fnc");
return;
case 78: // Fn + ESC
ToggleFnLock();
return;
case 189: // Tablet mode
TabletMode();
return;
case 197: // FN+F2
SetBacklight(-1);
return;
case 196: // FN+F3
SetBacklight(1);
return;
case 199: // ON Z13 - FN+F11 - cycles backlight
SetBacklight(4);
return;
case 53: // FN+F6 on GA-502DU model
NativeMethods.TurnOffScreen(Program.settingsForm.Handle);
return;
}
}
if (!OptimizationService.IsRunning())
@@ -467,7 +518,7 @@ namespace GHelper.Input
break;
case 107: // FN+F10
AsusUSB.TouchpadToggle();
Thread.Sleep(50);
Thread.Sleep(200);
Program.toast.RunToast(GetTouchpadState() ? "On" : "Off", ToastIcon.Touchpad);
break;
case 108: // FN+F11
@@ -534,7 +585,7 @@ namespace GHelper.Input
AppConfig.Set("screenpad", brightness);
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, (brightness*255/100), "Screenpad");
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, (brightness * 255 / 100), "Screenpad");
if (brightness == 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, brightness, "ScreenpadToggle");
Program.toast.RunToast($"Screen Pad {brightness}", delta > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);

View File

@@ -65,7 +65,7 @@ namespace GHelper.Mode
Modes.SetCurrent(mode);
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, IsManualModeRequired() ? AsusACPI.PerformanceManual : Modes.GetBase(mode), "Mode");
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.IsManualModeRequired() ? AsusACPI.PerformanceManual : Modes.GetBase(mode), "Mode");
if (AppConfig.Is("xgm_fan") && Program.acpi.IsXGConnected()) AsusUSB.ResetXGM();
@@ -143,7 +143,7 @@ namespace GHelper.Mode
}
// force set PPTs for missbehaving bios on FX507/517 series
if ((AppConfig.ContainsModel("FX507") || AppConfig.ContainsModel("FX517") || xgmFan) && !AppConfig.IsMode("auto_apply_power"))
if ((AppConfig.IsPowerRequired() || xgmFan) && !AppConfig.IsMode("auto_apply_power"))
{
Task.Run(async () =>
{
@@ -159,22 +159,6 @@ namespace GHelper.Mode
}
private static bool IsManualModeRequired()
{
if (!AppConfig.IsMode("auto_apply_power"))
return false;
return
AppConfig.Is("manual_mode") ||
AppConfig.ContainsModel("GU604") ||
AppConfig.ContainsModel("G733");
}
private static bool IsFanRequired()
{
return AppConfig.ContainsModel("GA402X") || AppConfig.ContainsModel("G513");
}
public void AutoPower(int delay = 0)
{
@@ -184,17 +168,17 @@ namespace GHelper.Mode
bool applyFans = AppConfig.IsMode("auto_apply");
//bool applyGPU = true;
if (applyPower)
if (applyPower && !applyFans)
{
// force fan curve for misbehaving bios PPTs on some models
if (!applyFans && IsFanRequired())
if (AppConfig.IsFanRequired())
{
delay = 500;
AutoFans(true);
}
// Fix for models that don't support PPT settings in all modes, setting a "manual" mode for them
if (IsManualModeRequired() && !applyFans)
if (AppConfig.IsManualModeRequired())
{
AutoFans(true);
}

View File

@@ -167,6 +167,28 @@ namespace GHelper.Mode
}
}
public static int GetLidAction(bool ac)
{
Guid activeSchemeGuid = GetActiveScheme();
IntPtr activeIndex;
if (ac)
PowerReadACValueIndex(IntPtr.Zero,
activeSchemeGuid,
GUID_SYSTEM_BUTTON_SUBGROUP,
GUID_LIDACTION, out activeIndex);
else
PowerReadDCValueIndex(IntPtr.Zero,
activeSchemeGuid,
GUID_SYSTEM_BUTTON_SUBGROUP,
GUID_LIDACTION, out activeIndex);
return activeIndex.ToInt32();
}
public static void SetLidAction(int action, bool acOnly = false)
{
/**

View File

@@ -15,6 +15,17 @@ namespace GHelper.Peripherals.Mouse
Never = 0xFF
}
public enum DebounceTime
{
Disabled = 0x00, //?? not sure because mice with this setting have no "disabled". But the mouse accepts and stores 0x00 just fine
MS12 = 0x02,
MS16 = 0x03,
MS20 = 0x04,
MS24 = 0x05,
MS28 = 0x06,
MS32 = 0x07
}
public enum PollingRate
{
PR125Hz = 0,
@@ -56,6 +67,15 @@ namespace GHelper.Peripherals.Mouse
BatteryState = 0x6
}
public enum LightingZone
{
Logo = 0x00,
Scrollwheel = 0x01,
Underglow = 0x02,
All = 0x03,
Dock = 0x04,
}
public class LightingSetting
{
public LightingSetting()
@@ -77,11 +97,29 @@ namespace GHelper.Peripherals.Mouse
public AnimationDirection AnimationDirection { get; set; }
public override bool Equals(object? obj)
{
return obj is LightingSetting setting &&
LightingMode == setting.LightingMode &&
Brightness == setting.Brightness &&
RGBColor.Equals(setting.RGBColor) &&
RandomColor == setting.RandomColor &&
AnimationSpeed == setting.AnimationSpeed &&
AnimationDirection == setting.AnimationDirection;
}
public override int GetHashCode()
{
return HashCode.Combine(LightingMode, Brightness, RGBColor, RandomColor, AnimationSpeed, AnimationDirection);
}
public override string? ToString()
{
return "LightingMode: " + LightingMode + ", Color (" + RGBColor.R + ", " + RGBColor.G + ", " + RGBColor.B
+ "), Brightness: " + Brightness + "%, LightingSpeed: " + AnimationSpeed + ", RandomColor:" + RandomColor + ", AnimationDirection:" + AnimationDirection;
}
}
public class AsusMouseDPI
@@ -102,19 +140,36 @@ namespace GHelper.Peripherals.Mouse
public abstract class AsusMouse : Device, IPeripheral
{
private static string[] POLLING_RATES = { "125 Hz", "250 Hz", "500 Hz", "1000 Hz", "2000 Hz", "4000 Hz", "8000 Hz", "16000 Hz" };
internal const bool PACKET_LOGGER_ALWAYS_ON = false;
internal const int ASUS_MOUSE_PACKET_SIZE = 65;
public event EventHandler? Disconnect;
public event EventHandler? BatteryUpdated;
public event EventHandler? MouseReadyChanged;
private readonly string path;
public bool IsDeviceReady { get; protected set; }
private void SetDeviceReady(bool ready)
{
bool notify = false;
if (IsDeviceReady != ready)
{
notify = true;
}
IsDeviceReady = ready;
if (MouseReadyChanged is not null && notify)
{
MouseReadyChanged(this, EventArgs.Empty);
}
}
public bool Wireless { get; protected set; }
public int Battery { get; protected set; }
public bool Charging { get; protected set; }
public LightingSetting? LightingSetting { get; protected set; }
public LightingSetting[] LightingSetting { get; protected set; }
public int LowBatteryWarning { get; protected set; }
public PowerOffSetting PowerOffSetting { get; protected set; }
public LiftOffDistance LiftOffDistance { get; protected set; }
@@ -124,12 +179,23 @@ namespace GHelper.Peripherals.Mouse
public PollingRate PollingRate { get; protected set; }
public bool AngleSnapping { get; protected set; }
public short AngleAdjustmentDegrees { get; protected set; }
public DebounceTime Debounce { get; protected set; }
public AsusMouse(ushort vendorId, ushort productId, string path, bool wireless) : base(vendorId, productId)
{
this.path = path;
this.Wireless = wireless;
DpiSettings = new AsusMouseDPI[1];
if (SupportedLightingZones().Length == 0)
{
LightingSetting = new LightingSetting[1];
}
else
{
LightingSetting = new LightingSetting[SupportedLightingZones().Length];
}
}
public override bool Equals(object? obj)
@@ -161,6 +227,7 @@ namespace GHelper.Peripherals.Mouse
public override void Dispose()
{
Logger.WriteLine(GetDisplayName() + ": Disposing");
HidSharp.DeviceList.Local.Changed -= Device_Changed;
base.Dispose();
}
@@ -193,13 +260,19 @@ namespace GHelper.Peripherals.Mouse
}
}
public virtual int USBTimeout()
{
return 300;
}
public override void SetProvider()
{
_usbProvider = new WindowsUsbProvider(_vendorId, _productId, path);
_usbProvider = new WindowsUsbProvider(_vendorId, _productId, path, USBTimeout());
}
protected virtual void OnDisconnect()
{
Logger.WriteLine(GetDisplayName() + ": OnDisconnect()");
if (Disconnect is not null)
{
Disconnect(this, EventArgs.Empty);
@@ -212,10 +285,25 @@ namespace GHelper.Peripherals.Mouse
return true;
#else
return AppConfig.Get("usb_packet_logger") == 1;
return AppConfig.Get("usb_packet_logger") == 1 || PACKET_LOGGER_ALWAYS_ON;
#endif
}
protected virtual bool IsMouseError(byte[] packet)
{
return packet[1] == 0xFF && packet[2] == 0xAA;
}
protected virtual long MeasuredIO(Action<byte[]> ioFunc, byte[] param)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
ioFunc(param);
watch.Stop();
return watch.ElapsedMilliseconds;
}
[MethodImpl(MethodImplOptions.Synchronized)]
protected virtual byte[]? WriteForResponse(byte[] packet)
{
@@ -226,12 +314,31 @@ namespace GHelper.Peripherals.Mouse
if (IsPacketLoggerEnabled())
Logger.WriteLine(GetDisplayName() + ": Sending packet: " + ByteArrayToString(packet));
Write(packet);
long time = MeasuredIO(Write, packet);
Logger.WriteLine(GetDisplayName() + ": Write took " + time + "ms");
Read(response);
time = MeasuredIO(Read, response);
Logger.WriteLine(GetDisplayName() + ": Read took " + time + "ms");
if (IsPacketLoggerEnabled())
Logger.WriteLine(GetDisplayName() + ": Read packet: " + ByteArrayToString(response));
if (IsMouseError(response))
{
Logger.WriteLine(GetDisplayName() + ": Mouse returned error (FF AA). Packet probably not supported by mouse firmware.");
//Error. Mouse could not understand or process the sent packet
return response;
}
//Not the response we were looking for, continue reading
while (response[0] != packet[0] || response[1] != packet[1] || response[2] != packet[2])
{
Logger.WriteLine(GetDisplayName() + ": Read wrong packet left in buffer: " + ByteArrayToString(response) + ". Retrying...");
//Read again
time = MeasuredIO(Read, response);
Logger.WriteLine(GetDisplayName() + ": Read took " + time + "ms");
}
}
catch (IOException e)
{
@@ -239,12 +346,12 @@ namespace GHelper.Peripherals.Mouse
OnDisconnect();
return null;
}
catch (System.TimeoutException e)
catch (TimeoutException e)
{
Logger.WriteLine(GetDisplayName() + ": Timeout reading packet " + e.Message);
return null;
}
catch (System.ObjectDisposedException e)
catch (ObjectDisposedException)
{
Logger.WriteLine(GetDisplayName() + ": Channel closed ");
OnDisconnect();
@@ -269,16 +376,17 @@ namespace GHelper.Peripherals.Mouse
{
//Likely only the dongle connected and the mouse is either sleeping or turned off.
//The mouse will not respond with proper data, but empty responses at this point
IsDeviceReady = false;
SetDeviceReady(false);
return;
}
IsDeviceReady = true;
SetDeviceReady(true);
ReadProfile();
ReadDPI();
ReadLightingSetting();
ReadLiftOffDistance();
ReadPollingRate();
ReadLiftOffDistance();
ReadDebounce();
ReadLightingSetting();
}
// ------------------------------------------------------------------------------
@@ -378,7 +486,13 @@ namespace GHelper.Peripherals.Mouse
Charging = ParseChargingState(response);
//If the device goes to standby it will not report battery state anymore.
IsDeviceReady = Battery > 0;
SetDeviceReady(Battery > 0);
if (!IsDeviceReady)
{
Logger.WriteLine(GetDisplayName() + ": Device gone");
return;
}
Logger.WriteLine(GetDisplayName() + ": Got Battery Percentage " + Battery + "% - Charging:" + Charging);
@@ -400,7 +514,9 @@ namespace GHelper.Peripherals.Mouse
if (HasLowBatteryWarning() || HasAutoPowerOff())
{
Logger.WriteLine(GetDisplayName() + ": Got Auto Power Off: " + PowerOffSetting + " - Low Battery Warnning at: " + LowBatteryWarning + "%");
string pos = HasAutoPowerOff() ? PowerOffSetting.ToString() : "Not Supported";
string lbw = HasLowBatteryWarning() ? LowBatteryWarning.ToString() : "Not Supported";
Logger.WriteLine(GetDisplayName() + ": Got Auto Power Off: " + pos + " - Low Battery Warnning at: " + lbw + "%");
}
}
@@ -499,6 +615,21 @@ namespace GHelper.Peripherals.Mouse
return false;
}
public virtual int AngleTuningStep()
{
return 1;
}
public virtual int AngleTuningMin()
{
return -20;
}
public virtual int AngleTuningMax()
{
return 20;
}
public virtual string PollingRateDisplayString(PollingRate pollingRate)
{
return POLLING_RATES[(int)pollingRate];
@@ -646,9 +777,10 @@ namespace GHelper.Peripherals.Mouse
return;
}
if (angleAdjustment < -20 || angleAdjustment > 20)
if (angleAdjustment < AngleTuningMin() || angleAdjustment > AngleTuningMax())
{
Logger.WriteLine(GetDisplayName() + ": Angle Adjustment:" + angleAdjustment + " is outside of range [-20;20].");
Logger.WriteLine(GetDisplayName() + ": Angle Adjustment:" + angleAdjustment
+ " is outside of range [" + AngleTuningMin() + "; " + AngleTuningMax() + "].");
return;
}
@@ -668,6 +800,11 @@ namespace GHelper.Peripherals.Mouse
return false;
}
public virtual int DPIIncrements()
{
return 50;
}
public virtual bool CanChangeDPIProfile()
{
return DPIProfileCount() > 1;
@@ -682,16 +819,27 @@ namespace GHelper.Peripherals.Mouse
return 100;
}
public virtual bool HasXYDPI()
{
return false;
}
protected virtual byte[] GetChangeDPIProfilePacket(int profile)
{
return new byte[] { 0x00, 0x51, 0x31, 0x0A, 0x00, (byte)profile };
}
protected virtual byte[] GetChangeDPIProfilePacket2(int profile)
{
return new byte[] { 0x00, 0x51, 0x31, 0x09, 0x00, (byte)profile };
}
//profiles start to count at 1
public void SetDPIProfile(int profile)
public virtual void SetDPIProfile(int profile)
{
if (!CanChangeDPIProfile())
{
this.DpiProfile = profile;
return;
}
@@ -703,6 +851,8 @@ namespace GHelper.Peripherals.Mouse
//The first DPI profile is 1
WriteForResponse(GetChangeDPIProfilePacket(profile));
//For whatever reason that is required or the mouse will not store the change and reverts once you power it off.
WriteForResponse(GetChangeDPIProfilePacket2(profile));
FlushSettings();
Logger.WriteLine(GetDisplayName() + ": DPI Profile set to " + profile);
@@ -711,6 +861,11 @@ namespace GHelper.Peripherals.Mouse
protected virtual byte[] GetReadDPIPacket()
{
if (!HasXYDPI())
{
return new byte[] { 0x00, 0x12, 0x04, 0x00 };
}
return new byte[] { 0x00, 0x12, 0x04, 0x02 };
}
@@ -724,7 +879,7 @@ namespace GHelper.Peripherals.Mouse
{
return null;
}
ushort dpiEncoded = (ushort)((dpi.DPI - 50) / 50);
ushort dpiEncoded = (ushort)((dpi.DPI - DPIIncrements()) / DPIIncrements());
if (HasDPIColors())
{
@@ -739,7 +894,7 @@ namespace GHelper.Peripherals.Mouse
protected virtual void ParseDPI(byte[] packet)
{
if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x02)
if (packet[1] != 0x12 || packet[2] != 0x04 || (packet[3] != 0x02 && HasXYDPI()))
{
return;
}
@@ -751,12 +906,13 @@ namespace GHelper.Peripherals.Mouse
DpiSettings[i] = new AsusMouseDPI();
}
int offset = 5 + (i * 4);
int offset = HasXYDPI() ? (5 + (i * 4)) : (5 + (i * 2));
uint b1 = packet[offset];
uint b2 = packet[offset + 1];
DpiSettings[i].DPI = (uint)(b2 << 8 | b1) * 50 + 50;
DpiSettings[i].DPI = (uint)((b2 << 8 | b1) * DPIIncrements() + DPIIncrements());
}
}
@@ -888,6 +1044,91 @@ namespace GHelper.Peripherals.Mouse
this.LiftOffDistance = liftOffDistance;
}
// ------------------------------------------------------------------------------
// Debounce
// ------------------------------------------------------------------------------
public virtual bool HasDebounceSetting()
{
return false;
}
public virtual int DebounceTimeInMS(DebounceTime dbt)
{
switch (dbt)
{
case DebounceTime.MS12: return 12;
case DebounceTime.MS16: return 16;
case DebounceTime.MS20: return 20;
case DebounceTime.MS24: return 24;
case DebounceTime.MS28: return 28;
case DebounceTime.MS32: return 32;
default: return 0;
}
}
protected virtual byte[] GetReadDebouncePacket()
{
return new byte[] { 0x00, 0x12, 0x04, 0x00 };
}
protected virtual byte[] GetUpdateDebouncePacket(DebounceTime debounce)
{
return new byte[] { 0x00, 0x51, 0x31, 0x05, 0x00, ((byte)debounce) };
}
protected virtual DebounceTime ParseDebounce(byte[] packet)
{
if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00)
{
return DebounceTime.MS12;
}
if (packet[15] < 0x02)
{
return DebounceTime.MS12;
}
if (packet[15] > 0x07)
{
return DebounceTime.MS32;
}
return (DebounceTime)packet[15];
}
public void ReadDebounce()
{
if (!HasDebounceSetting())
{
return;
}
byte[]? response = WriteForResponse(GetReadDebouncePacket());
if (response is null) return;
Debounce = ParseDebounce(response);
Logger.WriteLine(GetDisplayName() + ": Read Debouce Setting: " + Debounce);
}
public void SetDebounce(DebounceTime debounce)
{
if (!HasDebounceSetting())
{
return;
}
WriteForResponse(GetUpdateDebouncePacket(debounce));
FlushSettings();
Logger.WriteLine(GetDisplayName() + ": Set Debouce to " + debounce);
this.Debounce = debounce;
}
// ------------------------------------------------------------------------------
// RGB
// ------------------------------------------------------------------------------
@@ -897,6 +1138,11 @@ namespace GHelper.Peripherals.Mouse
return false;
}
public virtual int MaxBrightness()
{
return 100;
}
//Override to remap lighting mode IDs.
//From OpenRGB code it looks like some mice have different orders of the modes or do not support some modes at all.
protected virtual byte IndexForLightingMode(LightingMode lightingMode)
@@ -944,31 +1190,102 @@ namespace GHelper.Peripherals.Mouse
|| lightingMode == LightingMode.React;
}
protected virtual byte[] GetReadLightingModePacket()
public virtual LightingZone[] SupportedLightingZones()
{
return new byte[] { 0x00, 0x12, 0x03 };
return new LightingZone[] { LightingZone.Logo };
}
protected virtual byte[] GetUpdateLightingModePacket(LightingSetting lightingSetting)
public virtual int IndexForZone(LightingZone zone)
{
if (lightingSetting.Brightness < 0 || lightingSetting.Brightness > 100)
LightingZone[] lz = SupportedLightingZones();
for (int i = 0; i < lz.Length; ++i)
{
Logger.WriteLine(GetDisplayName() + ": Brightness " + lightingSetting.Brightness + " is out of range [0;100]. Setting to 25.");
lightingSetting.Brightness = 25;
if (lz[i] == zone)
{
return i;
}
}
return 0;
}
public virtual bool IsLightingZoned()
{
if (LightingSetting.Length < 2)
{
return false;
}
//Check whether all zones are the same or not
for (int i = 1; i < LightingSetting.Length; ++i)
{
if (LightingSetting[i] is null
|| LightingSetting[i - 1] is null
|| !LightingSetting[i].Equals(LightingSetting[i - 1]))
{
return true;
}
}
return false;
}
public virtual bool IsLightingModeSupportedForZone(LightingMode lm, LightingZone lz)
{
if (lz == LightingZone.All)
{
return true;
}
return lm == LightingMode.Static
|| lm == LightingMode.Breathing
|| lm == LightingMode.ColorCycle
|| lm == LightingMode.React;
}
public virtual LightingSetting LightingSettingForZone(LightingZone zone)
{
if (zone == LightingZone.All)
{
//First zone is treated as ALL for reading purpose
return LightingSetting[0];
}
return LightingSetting[IndexForZone(zone)];
}
protected virtual byte[] GetReadLightingModePacket(LightingZone zone)
{
int idx = 0;
if (zone != LightingZone.All)
{
idx = IndexForZone(zone);
}
return new byte[] { 0x00, 0x12, 0x03, (byte)idx };
}
protected virtual byte[] GetUpdateLightingModePacket(LightingSetting lightingSetting, LightingZone zone)
{
if (lightingSetting.Brightness < 0 || lightingSetting.Brightness > MaxBrightness())
{
Logger.WriteLine(GetDisplayName() + ": Brightness " + lightingSetting.Brightness
+ " is out of range [0;" + MaxBrightness() + "]. Setting to " + (MaxBrightness() / 4) + " .");
lightingSetting.Brightness = MaxBrightness() / 4; // set t0 25% of max brightness
}
if (!IsLightingModeSupported(lightingSetting.LightingMode))
{
Logger.WriteLine(GetDisplayName() + ": Lighting Mode " + lightingSetting.LightingMode + " is not supported. Setting to Rainbow ;)");
lightingSetting.LightingMode = LightingMode.Rainbow;
Logger.WriteLine(GetDisplayName() + ": Lighting Mode " + lightingSetting.LightingMode + " is not supported. Setting to Color Cycle ;)");
lightingSetting.LightingMode = LightingMode.ColorCycle;
}
return new byte[] { 0x00, 0x51, 0x28, 0x03, 0x00,
return new byte[] { 0x00, 0x51, 0x28, (byte)zone, 0x00,
IndexForLightingMode(lightingSetting.LightingMode),
(byte)lightingSetting.Brightness,
lightingSetting.RGBColor.R, lightingSetting.RGBColor.G, lightingSetting.RGBColor.B,
(byte)lightingSetting.AnimationDirection,
(byte)(lightingSetting.RandomColor ? 0x01: 0x00),
(byte)lightingSetting.AnimationSpeed
(byte)(SupportsAnimationDirection(lightingSetting.LightingMode) ? lightingSetting.AnimationDirection : 0x00),
(byte)((lightingSetting.RandomColor && SupportsRandomColor(lightingSetting.LightingMode)) ? 0x01: 0x00),
(byte)(SupportsAnimationSpeed(lightingSetting.LightingMode) ? lightingSetting.AnimationSpeed : 0x00)
};
}
@@ -985,11 +1302,18 @@ namespace GHelper.Peripherals.Mouse
setting.Brightness = packet[6];
setting.RGBColor = Color.FromArgb(packet[7], packet[8], packet[9]);
setting.AnimationDirection = (AnimationDirection)packet[11];
setting.RandomColor = packet[12] == 0x01;
setting.AnimationSpeed = (AnimationSpeed)packet[13];
//If the mouse reports 0, which it does when the current setting has no speed option, chose medium as default
setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode)
? (AnimationDirection)packet[11]
: AnimationDirection.Clockwise;
setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[12] == 0x01;
setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode)
? (AnimationSpeed)packet[13]
: AnimationSpeed.Medium;
//If the mouse reports an out of range value, which it does when the current setting has no speed option, chose medium as default
if (setting.AnimationSpeed != AnimationSpeed.Fast
&& setting.AnimationSpeed != AnimationSpeed.Medium
&& setting.AnimationSpeed != AnimationSpeed.Slow)
@@ -1000,39 +1324,53 @@ namespace GHelper.Peripherals.Mouse
return setting;
}
public void ReadLightingSetting()
public virtual void ReadLightingSetting()
{
if (!HasRGB())
{
return;
}
byte[]? response = WriteForResponse(GetReadLightingModePacket());
if (response is null) return;
LightingSetting = ParseLightingSetting(response);
LightingZone[] lz = SupportedLightingZones();
for (int i = 0; i < lz.Length; ++i)
{
byte[]? response = WriteForResponse(GetReadLightingModePacket(lz[i]));
if (response is null) return;
if (LightingSetting is not null)
{
Logger.WriteLine(GetDisplayName() + ": Read RGB Setting" + LightingSetting.ToString());
}
else
{
Logger.WriteLine(GetDisplayName() + ": Failed to read RGB Setting");
LightingSetting? ls = ParseLightingSetting(response);
if (ls is null)
{
Logger.WriteLine(GetDisplayName() + ": Failed to read RGB Setting for Zone " + lz[i].ToString());
continue;
}
Logger.WriteLine(GetDisplayName() + ": Read RGB Setting for Zone " + lz[i].ToString() + ": " + ls.ToString());
LightingSetting[i] = ls;
}
}
public void SetLightingSetting(LightingSetting lightingSetting)
public void SetLightingSetting(LightingSetting lightingSetting, LightingZone zone)
{
if (!HasRGB() || lightingSetting is null)
{
return;
}
WriteForResponse(GetUpdateLightingModePacket(lightingSetting));
WriteForResponse(GetUpdateLightingModePacket(lightingSetting, zone));
FlushSettings();
Logger.WriteLine(GetDisplayName() + ": Set RGB Setting " + lightingSetting.ToString());
this.LightingSetting = lightingSetting;
Logger.WriteLine(GetDisplayName() + ": Set RGB Setting for zone " + zone.ToString() + ": " + lightingSetting.ToString());
if (zone == LightingZone.All)
{
for (int i = 0; i < this.LightingSetting.Length; ++i)
{
this.LightingSetting[i] = lightingSetting;
}
}
else
{
this.LightingSetting[IndexForZone(zone)] = lightingSetting;
}
}
protected virtual byte[] GetSaveProfilePacket()

View File

@@ -45,6 +45,16 @@ namespace GHelper.Peripherals.Mouse.Models
return 36_000;
}
public override bool HasXYDPI()
{
return true;
}
public override bool HasDebounceSetting()
{
return true;
}
public override bool HasLiftOffSetting()
{
return true;
@@ -55,6 +65,11 @@ namespace GHelper.Peripherals.Mouse.Models
return true;
}
public override LightingZone[] SupportedLightingZones()
{
return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };
}
public override bool HasAutoPowerOff()
{
return true;

View File

@@ -1,8 +1,9 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P706_Wireless
public class GladiusIII : AsusMouse
{
public GladiusIII() : base(0x0B05, 0x1A70, "mi_00", true)
public GladiusIII() : base(0x0B05, 0x197F, "mi_00", true)
{
}
@@ -37,7 +38,12 @@
}
public override int MaxDPI()
{
return 36_000;
return 26_000;
}
public override bool HasDebounceSetting()
{
return true;
}
public override bool HasLiftOffSetting()
@@ -50,6 +56,11 @@
return true;
}
public override LightingZone[] SupportedLightingZones()
{
return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };
}
public override bool HasAutoPowerOff()
{
return true;
@@ -60,25 +71,15 @@
return true;
}
public override bool HasAngleTuning()
{
return true;
}
public override bool HasLowBatteryWarning()
{
return true;
}
public override bool HasDPIColors()
{
return true;
}
}
public class GladiusIIIWired : GladiusIII
{
public GladiusIIIWired() : base(0x1A72, false)
public GladiusIIIWired() : base(0x197d, false)
{
}

View File

@@ -0,0 +1,106 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P711
public class GladiusIIIAimpoint : AsusMouse
{
public GladiusIIIAimpoint() : base(0x0B05, 0x1A70, "mi_00", true)
{
}
protected GladiusIIIAimpoint(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Gladius III Aimpoint (Wireless)";
}
public override PollingRate[] SupportedPollingrates()
{
return new PollingRate[] {
PollingRate.PR125Hz,
PollingRate.PR250Hz,
PollingRate.PR500Hz,
PollingRate.PR1000Hz
};
}
public override int ProfileCount()
{
return 5;
}
public override int MaxDPI()
{
return 36_000;
}
public override bool HasXYDPI()
{
return true;
}
public override bool HasDebounceSetting()
{
return true;
}
public override bool HasLiftOffSetting()
{
return true;
}
public override bool HasRGB()
{
return true;
}
public override LightingZone[] SupportedLightingZones()
{
return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };
}
public override bool HasAutoPowerOff()
{
return true;
}
public override bool HasAngleSnapping()
{
return true;
}
public override bool HasAngleTuning()
{
return true;
}
public override bool HasLowBatteryWarning()
{
return true;
}
public override bool HasDPIColors()
{
return true;
}
}
public class GladiusIIIAimpointWired : GladiusIIIAimpoint
{
public GladiusIIIAimpointWired() : base(0x1A72, false)
{
}
public override string GetDisplayName()
{
return "ROG Gladius III Aimpoint (Wired)";
}
}
}

View File

@@ -0,0 +1,197 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P513
public class ROGKerisWireless : AsusMouse
{
public ROGKerisWireless() : base(0x0B05, 0x1960, "mi_00", true)
{
}
protected ROGKerisWireless(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Keris (Wireless)";
}
public override PollingRate[] SupportedPollingrates()
{
return new PollingRate[] {
PollingRate.PR125Hz,
PollingRate.PR250Hz,
PollingRate.PR500Hz,
PollingRate.PR1000Hz
};
}
public override int ProfileCount()
{
return 3;
}
public override int MaxDPI()
{
return 16_000;
}
public override bool HasLiftOffSetting()
{
return true;
}
public override bool HasRGB()
{
return true;
}
public override bool HasAutoPowerOff()
{
return true;
}
public override bool HasAngleSnapping()
{
return true;
}
public override bool HasAngleTuning()
{
return false;
}
public override bool HasLowBatteryWarning()
{
return true;
}
public override bool HasDPIColors()
{
return false;
}
public override bool IsLightingModeSupported(LightingMode lightingMode)
{
return lightingMode == LightingMode.Static
|| lightingMode == LightingMode.Breathing
|| lightingMode == LightingMode.ColorCycle
|| lightingMode == LightingMode.React
|| lightingMode == LightingMode.BatteryState
|| lightingMode == LightingMode.Off;
}
//Has 25% increments
protected override int ParseBattery(byte[] packet)
{
if (packet[1] == 0x12 && packet[2] == 0x07)
{
return packet[5] * 25;
}
return -1;
}
public override int DPIIncrements()
{
return 100;
}
public override bool HasDebounceSetting()
{
return true;
}
public override bool CanChangeDPIProfile()
{
return false;
}
protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)
{
return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);
}
protected override int ParseLowBatteryWarning(byte[] packet)
{
int lowBat = base.ParseLowBatteryWarning(packet);
return lowBat * 25;
}
protected override LiftOffDistance ParseLiftOffDistance(byte[] packet)
{
if (packet[1] != 0x12 || packet[2] != 0x06)
{
return LiftOffDistance.Low;
}
return (LiftOffDistance)packet[5];
}
protected override byte[] GetUpdateLiftOffDistancePacket(LiftOffDistance liftOffDistance)
{
return new byte[] { 0x00, 0x51, 0x35, 0x00, 0x00, ((byte)liftOffDistance) };
}
public override LightingZone[] SupportedLightingZones()
{
return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel };
}
public override int MaxBrightness()
{
return 4;
}
protected override byte IndexForLightingMode(LightingMode lightingMode)
{
if (lightingMode == LightingMode.Off)
{
return 0xFF;
}
return ((byte)lightingMode);
}
}
public class ROGKerisWirelessWired : ROGKerisWireless
{
public ROGKerisWirelessWired() : base(0x195E, false)
{
}
public override string GetDisplayName()
{
return "ROG Keris (Wired)";
}
}
public class ROGKerisWirelessEvaEdition : ROGKerisWireless
{
public ROGKerisWirelessEvaEdition() : base(0x1A59, true)
{
}
public override string GetDisplayName()
{
return "ROG Keris EVA Edition";
}
}
public class ROGKerisWirelessEvaEditionWired : ROGKerisWireless
{
public ROGKerisWirelessEvaEditionWired() : base(0x1A57, false)
{
}
public override string GetDisplayName()
{
return "ROG Keris EVA Edition (Wired)";
}
}
}

View File

@@ -0,0 +1,226 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P513
public class StrixImpactIIWireless : AsusMouse
{
public StrixImpactIIWireless() : base(0x0B05, 0x1949, "mi_00", true)
{
}
protected StrixImpactIIWireless(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Strix Impact II (Wireless)";
}
public override PollingRate[] SupportedPollingrates()
{
return new PollingRate[] {
PollingRate.PR125Hz,
PollingRate.PR250Hz,
PollingRate.PR500Hz,
PollingRate.PR1000Hz
};
}
public override int ProfileCount()
{
return 3;
}
public override int MaxDPI()
{
return 16_000;
}
public override bool HasLiftOffSetting()
{
return true;
}
public override bool HasRGB()
{
return true;
}
public override bool HasAutoPowerOff()
{
return true;
}
public override bool HasAngleSnapping()
{
return true;
}
public override bool HasAngleTuning()
{
return false;
}
public override bool HasLowBatteryWarning()
{
return true;
}
public override bool HasDPIColors()
{
return false;
}
public override bool IsLightingModeSupported(LightingMode lightingMode)
{
return lightingMode == LightingMode.Static
|| lightingMode == LightingMode.Breathing
|| lightingMode == LightingMode.ColorCycle
|| lightingMode == LightingMode.React
|| lightingMode == LightingMode.BatteryState
|| lightingMode == LightingMode.Off;
}
public override LightingZone[] SupportedLightingZones()
{
return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel };
}
//Has 25% increments
protected override int ParseBattery(byte[] packet)
{
if (packet[1] == 0x12 && packet[2] == 0x07)
{
return packet[5] * 25;
}
return -1;
}
public override int DPIIncrements()
{
return 100;
}
public override bool CanChangeDPIProfile()
{
return false;
}
protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)
{
return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);
}
protected override int ParseLowBatteryWarning(byte[] packet)
{
int lowBat = base.ParseLowBatteryWarning(packet);
return lowBat * 25;
}
protected override LiftOffDistance ParseLiftOffDistance(byte[] packet)
{
if (packet[1] != 0x12 || packet[2] != 0x06)
{
return LiftOffDistance.Low;
}
return (LiftOffDistance)packet[5];
}
protected override byte[] GetUpdateLiftOffDistancePacket(LiftOffDistance liftOffDistance)
{
return new byte[] { 0x00, 0x51, 0x35, 0x00, 0x00, ((byte)liftOffDistance) };
}
public override int MaxBrightness()
{
return 4;
}
public override bool HasDebounceSetting()
{
return true;
}
protected override byte IndexForLightingMode(LightingMode lightingMode)
{
if (lightingMode == LightingMode.Off)
{
return 0xFF;
}
return ((byte)lightingMode);
}
protected override byte[] GetReadLightingModePacket(LightingZone zone)
{
return new byte[] { 0x00, 0x12, 0x03, 0x00 };
}
protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)
{
if (packet[1] != 0x12 || packet[2] != 0x03)
{
return null;
}
int offset = 5 + (((int)zone) * 5);
LightingSetting setting = new LightingSetting();
setting.LightingMode = LightingModeForIndex(packet[offset + 0]);
setting.Brightness = packet[offset + 1];
setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);
return setting;
}
public override void ReadLightingSetting()
{
if (!HasRGB())
{
return;
}
//Mouse sends all lighting zones in one response
//00 12 03 00 00 [00 04 ff 00 80] [00 04 00 ff ff] [00 04 ff ff ff] 00 00 00 00 00 00 00 00 00 00 00 00 00 0
//No idea what the 3rd zone is as the mouse only has 2
byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));
if (response is null) return;
LightingZone[] lz = SupportedLightingZones();
for (int i = 0; i < lz.Length; ++i)
{
LightingSetting? ls = ParseLightingSetting(response, lz[i]);
if (ls is null)
{
Logger.WriteLine(GetDisplayName() + ": Failed to read RGB Setting for Zone " + lz[i].ToString());
continue;
}
Logger.WriteLine(GetDisplayName() + ": Read RGB Setting for Zone " + lz[i].ToString() + ": " + ls.ToString());
LightingSetting[i] = ls;
}
}
}
public class StrixImpactIIWirelessWired : StrixImpactIIWireless
{
public StrixImpactIIWirelessWired() : base(0x1947, false)
{
}
public override string GetDisplayName()
{
return "ROG Strix Impact II (Wired)";
}
}
}

View File

@@ -0,0 +1,112 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P306_Wireless
public class TUFM3 : AsusMouse
{
public TUFM3() : base(0x0B05, 0x1910, "mi_01", false)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "TUF GAMING M3";
}
public override PollingRate[] SupportedPollingrates()
{
return new PollingRate[] {
PollingRate.PR125Hz,
PollingRate.PR250Hz,
PollingRate.PR500Hz,
PollingRate.PR1000Hz
};
}
//Mouse has React mapped to 0x03 instead of 0x04 like other mice
protected override byte IndexForLightingMode(LightingMode lightingMode)
{
if (lightingMode == LightingMode.React)
{
return 0x03;
}
return ((byte)lightingMode);
}
//Mouse has React mapped to 0x03 instead of 0x04 like other mice
protected override LightingMode LightingModeForIndex(byte lightingMode)
{
if (lightingMode == 0x03)
{
return LightingMode.React;
}
return base.LightingModeForIndex(lightingMode);
}
public override int ProfileCount()
{
return 1;
}
public override int MaxDPI()
{
return 7_000;
}
public override bool HasBattery()
{
return false;
}
public override bool HasLiftOffSetting()
{
return false;
}
public override LightingZone[] SupportedLightingZones()
{
return new LightingZone[] { LightingZone.Logo };
}
public override bool HasRGB()
{
return true;
}
public override bool HasAngleSnapping()
{
return true;
}
public override int DPIIncrements()
{
return 100;
}
public override bool CanChangeDPIProfile()
{
return true;
}
public override bool HasDebounceSetting()
{
return true;
}
public override int MaxBrightness()
{
return 4;
}
public override bool IsLightingModeSupported(LightingMode lightingMode)
{
return lightingMode == LightingMode.Static
|| lightingMode == LightingMode.Breathing
|| lightingMode == LightingMode.ColorCycle
|| lightingMode == LightingMode.React;
}
}
}

View File

@@ -0,0 +1,85 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P306_Wireless
public class TUFM4Wirelss : AsusMouse
{
public TUFM4Wirelss() : base(0x0B05, 0x19F4, "mi_00", true)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "TUF GAMING M4 (Wireless)";
}
public override PollingRate[] SupportedPollingrates()
{
return new PollingRate[] {
PollingRate.PR125Hz,
PollingRate.PR250Hz,
PollingRate.PR500Hz,
PollingRate.PR1000Hz
};
}
public override int ProfileCount()
{
return 3;
}
public override int MaxDPI()
{
return 12_000;
}
public override bool HasLiftOffSetting()
{
return false;
}
public override bool HasDebounceSetting()
{
return true;
}
public override bool HasAutoPowerOff()
{
return true;
}
public override bool HasAngleSnapping()
{
return true;
}
public override bool HasAngleTuning()
{
return false;
}
public override bool HasLowBatteryWarning()
{
return true;
}
public override bool HasDPIColors()
{
return false;
}
public override int DPIIncrements()
{
return 100;
}
public override bool CanChangeDPIProfile()
{
return true;
}
}
}

View File

@@ -6,15 +6,33 @@ namespace GHelper.Peripherals
{
public class PeripheralsProvider
{
public static object _LOCK = new object();
private static readonly object _LOCK = new object();
public static List<AsusMouse> ConnectedMice = new List<AsusMouse>();
public static event EventHandler? DeviceChanged;
private static System.Timers.Timer timer = new System.Timers.Timer(1000);
static PeripheralsProvider()
{
timer.Elapsed += DeviceTimer_Elapsed;
}
private static long lastRefresh;
public static bool IsMouseConnected()
{
return ConnectedMice.Count > 0;
lock (_LOCK)
{
return ConnectedMice.Count > 0;
}
}
public static bool IsDeviceConnected(IPeripheral peripheral)
{
return AllPeripherals().Contains(peripheral);
}
//Expand if keyboards or other device get supported later.
@@ -26,84 +44,111 @@ namespace GHelper.Peripherals
public static List<IPeripheral> AllPeripherals()
{
List<IPeripheral> l = new List<IPeripheral>();
l.AddRange(ConnectedMice);
lock (_LOCK)
{
l.AddRange(ConnectedMice);
}
return l;
}
public static void RefreshBatteryForAllDevices()
{
lock (_LOCK)
RefreshBatteryForAllDevices(false);
}
public static void RefreshBatteryForAllDevices(bool force)
{
//Polling the battery every 20s should be enough
if (!force && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastRefresh) < 20_000) return;
lastRefresh = DateTimeOffset.Now.ToUnixTimeMilliseconds();
List<IPeripheral> l = AllPeripherals();
foreach (IPeripheral m in l)
{
foreach (IPeripheral m in AllPeripherals())
if (!m.IsDeviceReady)
{
if (!m.IsDeviceReady)
{
//Try to sync the device if that hasn't been done yet
m.SynchronizeDevice();
}
else
{
m.ReadBattery();
}
//Try to sync the device if that hasn't been done yet
m.SynchronizeDevice();
}
else
{
m.ReadBattery();
}
}
}
public static void Disconnect(AsusMouse am)
{
lock (_LOCK)
{
am.Disconnect -= Mouse_Disconnect;
am.MouseReadyChanged -= MouseReadyChanged;
am.BatteryUpdated -= BatteryUpdated;
ConnectedMice.Remove(am);
if (DeviceChanged is not null)
{
DeviceChanged(am, EventArgs.Empty);
}
}
if (DeviceChanged is not null)
{
DeviceChanged(am, EventArgs.Empty);
}
}
public static void Connect(AsusMouse am)
{
if (IsDeviceConnected(am))
{
//Mouse already connected;
return;
}
try
{
am.Connect();
}
catch (IOException e)
{
Logger.WriteLine(am.GetDisplayName() + " failed to connect to device: " + e);
return;
}
//The Mouse might needs a few ms to register all its subdevices or the sync will fail.
//Retry 3 times. Do not call this on main thread! It would block the UI
int tries = 0;
while (!am.IsDeviceReady && tries < 3)
{
Thread.Sleep(250);
Logger.WriteLine(am.GetDisplayName() + " synchronising. Try " + (tries + 1));
am.SynchronizeDevice();
++tries;
}
lock (_LOCK)
{
if (ConnectedMice.Contains(am))
{
//Mouse already connected;
return;
}
try
{
am.Connect();
}
catch (IOException e)
{
Logger.WriteLine(am.GetDisplayName() + " failed to connect to device: " + e);
return;
}
am.Disconnect += Mouse_Disconnect;
//The Mouse might needs a few ms to register all its subdevices or the sync will fail.
//Retry 3 times. Do not call this on main thread! It would block the UI
int tries = 0;
while (!am.IsDeviceReady && tries < 3)
{
Thread.Sleep(250);
Logger.WriteLine(am.GetDisplayName() + " synchronising. Try " + (tries + 1));
am.SynchronizeDevice();
++tries;
}
ConnectedMice.Add(am);
Logger.WriteLine(am.GetDisplayName() + " added to the list: " + ConnectedMice.Count + " device are conneted.");
if (DeviceChanged is not null)
{
DeviceChanged(am, EventArgs.Empty);
}
UpdateSettingsView();
}
Logger.WriteLine(am.GetDisplayName() + " added to the list: " + ConnectedMice.Count + " device are conneted.");
am.Disconnect += Mouse_Disconnect;
am.MouseReadyChanged += MouseReadyChanged;
am.BatteryUpdated += BatteryUpdated;
if (DeviceChanged is not null)
{
DeviceChanged(am, EventArgs.Empty);
}
UpdateSettingsView();
}
private static void BatteryUpdated(object? sender, EventArgs e)
{
UpdateSettingsView();
}
private static void MouseReadyChanged(object? sender, EventArgs e)
{
UpdateSettingsView();
}
private static void Mouse_Disconnect(object? sender, EventArgs e)
@@ -112,14 +157,17 @@ namespace GHelper.Peripherals
{
return;
}
AsusMouse am = (AsusMouse)sender;
lock (_LOCK)
{
AsusMouse am = (AsusMouse)sender;
ConnectedMice.Remove(am);
Logger.WriteLine(am.GetDisplayName() + " reported disconnect. " + ConnectedMice.Count + " device are conneted.");
am.Dispose();
UpdateSettingsView();
}
Logger.WriteLine(am.GetDisplayName() + " reported disconnect. " + ConnectedMice.Count + " device are conneted.");
am.Dispose();
UpdateSettingsView();
}
@@ -137,13 +185,23 @@ namespace GHelper.Peripherals
//Add one line for every supported mouse class here to support them.
DetectMouse(new ChakramX());
DetectMouse(new ChakramXWired());
DetectMouse(new GladiusIIIAimpoint());
DetectMouse(new GladiusIIIAimpointWired());
DetectMouse(new ROGKerisWireless());
DetectMouse(new ROGKerisWirelessWired());
DetectMouse(new ROGKerisWirelessEvaEdition());
DetectMouse(new ROGKerisWirelessEvaEditionWired());
DetectMouse(new TUFM4Wirelss());
DetectMouse(new StrixImpactIIWireless());
DetectMouse(new StrixImpactIIWirelessWired());
DetectMouse(new GladiusIII());
DetectMouse(new GladiusIIIWired());
DetectMouse(new TUFM3());
}
public static void DetectMouse(AsusMouse am)
{
if (am.IsDeviceConnected() && !ConnectedMice.Contains(am))
if (am.IsDeviceConnected() && !IsDeviceConnected(am))
{
Logger.WriteLine("Detected a new" + am.GetDisplayName() + " . Connecting...");
Connect(am);
@@ -162,8 +220,14 @@ namespace GHelper.Peripherals
private static void Device_Changed(object? sender, HidSharp.DeviceListChangedEventArgs e)
{
timer.Start();
}
private static void DeviceTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
timer.Stop();
Logger.WriteLine("HID Device Event: Checking for new ASUS Mice");
Task task = Task.Run((Action)DetectAllAsusMice);
DetectAllAsusMice();
}
}
}

View File

@@ -258,6 +258,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Lighting Mode.
/// </summary>
internal static string AuraLightingMode {
get {
return ResourceManager.GetString("AuraLightingMode", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Normal.
/// </summary>
@@ -321,6 +330,51 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to All.
/// </summary>
internal static string AuraZoneAll {
get {
return ResourceManager.GetString("AuraZoneAll", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Dock.
/// </summary>
internal static string AuraZoneDock {
get {
return ResourceManager.GetString("AuraZoneDock", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Logo.
/// </summary>
internal static string AuraZoneLogo {
get {
return ResourceManager.GetString("AuraZoneLogo", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Scrollwheel.
/// </summary>
internal static string AuraZoneScroll {
get {
return ResourceManager.GetString("AuraZoneScroll", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Underglow.
/// </summary>
internal static string AuraZoneUnderglow {
get {
return ResourceManager.GetString("AuraZoneUnderglow", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Auto Apply.
/// </summary>
@@ -375,6 +429,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Charge.
/// </summary>
internal static string BatteryCharge {
get {
return ResourceManager.GetString("BatteryCharge", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Battery Charge Limit.
/// </summary>
@@ -383,7 +446,7 @@ namespace GHelper.Properties {
return ResourceManager.GetString("BatteryChargeLimit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Battery Health.
/// </summary>
@@ -1007,6 +1070,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Button Response.
/// </summary>
internal static string MouseButtonResponse {
get {
return ResourceManager.GetString("MouseButtonResponse", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lift Off Distance.
/// </summary>
@@ -1087,7 +1159,7 @@ namespace GHelper.Properties {
return ResourceManager.GetString("NoNewUpdates", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Not Connected.
/// </summary>
@@ -1393,7 +1465,7 @@ namespace GHelper.Properties {
return ResourceManager.GetString("ToggleAura", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Auto Toggle Clamshell Mode.
/// </summary>

View File

@@ -183,6 +183,9 @@
<data name="AuraFast" xml:space="preserve">
<value>Schnell</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Beleuchtungsmodus</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Stroboskop</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>Alle</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollrad</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Front</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Automatisch anwenden</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Ausbalanciert</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Akkustand</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Ladebegrenzung</value>
</data>
@@ -434,6 +455,9 @@ Trotzdem fortfahren?</value>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Automatisch abschalten nach</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Tastenreaktionsgeschwindigkeit</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>

View File

@@ -163,26 +163,29 @@
<value>Servicios de Asus en ejecución</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>Estado de la batería</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Respiración</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>Sentido horario</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Ciclo de color</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Comet</value>
<value>Cometa</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>Sentido anti-horario</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Rápido</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Modo de iluminación</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
@@ -190,10 +193,10 @@
<value>Arcoíris</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>Aleatorio</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
<value>Sensible</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Lento</value>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Estroboscópico</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>Todo</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Rueda de desplazamiento</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Autoaplicar</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Equilibrado</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Límite de carga</value>
</data>
@@ -285,7 +306,7 @@
<value>Modo de Pantalla NVIDIA no está configurado en Optimus</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Energy Settings</value>
<value>Ajustes de energía</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Adicional</value>
@@ -354,7 +375,7 @@
<value>Temperatura objetivo</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value>Alto</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Atajos de teclado</value>
@@ -381,13 +402,13 @@
<value>Barra de luz</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
<value>Iluminación</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="Low" xml:space="preserve">
<value>Low</value>
<value>Bajo</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Visualizador de audio</value>
@@ -423,28 +444,31 @@
<value>Frecuencia de actualización de 60Hz para ahorrar batería</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Minute</value>
<value>Minuto</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Minutes</value>
<value>Minutos</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value>
<value>Ajuste de ángulo</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
<value>Auto-apagar tras</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Respuesta del botón</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
<value>Distancia de despegue (LOD)</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Low Battery Warning at</value>
<value>Aviso de batería baja al</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performance</value>
<value>Rendimiento</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Synchronize with mouse</value>
<value>Sincronizar con el ratón</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multizona</value>
@@ -453,7 +477,7 @@
<value>Silenciar micrófono</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>Nunca</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>Nuevas actualizaciones</value>
@@ -462,7 +486,7 @@
<value>No hay actualizaciones</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Not Connected</value>
<value>No conectado</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Abrir ventana G-Helper</value>
@@ -486,7 +510,7 @@
<value>Modo</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Peripherals</value>
<value>Periféricos</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Imagen / Gif</value>
@@ -495,7 +519,7 @@
<value>Reproducir / Pausar</value>
</data>
<data name="PollingRate" xml:space="preserve">
<value>Polling Rate</value>
<value>Velocidad de respuesta</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Límites de energía</value>
@@ -507,7 +531,7 @@
<value>Capturar pantalla</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>Perfil</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Quitar</value>

View File

@@ -163,26 +163,29 @@
<value>Services Asus actifs</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>État de la batterie</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Pulsation</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>Sens horaire</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Cycle de couleur</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Comet</value>
<value>Comète</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>Sens antihoraire</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Rapide</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
@@ -190,7 +193,7 @@
<value>Arc-en-ciel</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>Aléatoire</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
@@ -204,8 +207,23 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Stroboscopique</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Applicage automatique</value>
<value>Appliquer automatiquement</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Automatique</value>
@@ -222,11 +240,14 @@
<data name="Balanced" xml:space="preserve">
<value>Équilibré</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limite de charge </value>
</data>
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
<value>Santé de la batterie</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Mise à jour BIOS et pilotes</value>
@@ -285,7 +306,7 @@ Voulez-vous continuer ?</value>
<value>Le mode d'affichage NVIDIA n'est pas réglé sur Optimus</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Energy Settings</value>
<value>Paramètres d'énergie</value>
</data>
<data name="Extra" xml:space="preserve">
<value>+ d'options</value>
@@ -381,7 +402,7 @@ Voulez-vous continuer ?</value>
<value>Barre lumineuse</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
<value>Éclairage</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
@@ -432,19 +453,22 @@ Voulez-vous continuer ?</value>
<value>Angle Snapping</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
<value>Arrêt automatique après</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Low Battery Warning at</value>
<value>Avertissement de batterie faible à</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performance</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Synchronize with mouse</value>
<value>Synchroniser avec le pointeur</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multi-zone</value>
@@ -453,7 +477,7 @@ Voulez-vous continuer ?</value>
<value>Désactiver le micro</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>Jamais</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>Nouvelles mises à jour</value>
@@ -462,7 +486,7 @@ Voulez-vous continuer ?</value>
<value>Aucune mise à jour disponible</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Not Connected</value>
<value>Non connecté</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Ouvrir G-Helper</value>
@@ -486,7 +510,7 @@ Voulez-vous continuer ?</value>
<value>Mode Performance</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Peripherals</value>
<value>Périphériques</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Image / Gif</value>
@@ -507,7 +531,7 @@ Voulez-vous continuer ?</value>
<value>Capture d'écran</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>Profil</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Quitter</value>

View File

@@ -183,6 +183,9 @@
<data name="AuraFast" xml:space="preserve">
<value>Gyors</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normál</value>
</data>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Stroboszkóp</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Automatikus alkalmazás</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Teljesítmény</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Töltési korlát</value>
</data>
@@ -434,6 +455,9 @@ Do you still want to continue?</value>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>

View File

@@ -183,6 +183,9 @@
<data name="AuraFast" xml:space="preserve">
<value>Veloce</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normale</value>
</data>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Strobo</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Auto Applica</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Bilanciato</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limite Ricarica Batteria</value>
</data>
@@ -434,6 +455,9 @@ Sei sicuro di voler continuare?</value>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>

View File

@@ -183,6 +183,9 @@
<data name="AuraFast" xml:space="preserve">
<value>빠르게</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>보통</value>
</data>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Strobe</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>자동 적용</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>균형</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>배터리 충전 제한</value>
</data>
@@ -434,6 +455,9 @@
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>

View File

@@ -163,13 +163,13 @@
<value>Veikiančios Asus tarnybos</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>Būsena</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Kvėpavimas</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>Pagal laikrodžio rodyklę</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Spalvų ciklas</value>
@@ -178,11 +178,14 @@
<value>Comet</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>Prieš laikrodžio rodyklę</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Greitas</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Apšvietimo režimas</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normalus</value>
</data>
@@ -190,7 +193,7 @@
<value>Vaivorykštė</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>Atsitiktinė</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Blyksniai</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>Visi</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Jungčių stotelė</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logotipas</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Ratukas</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Apatinis apšvietimas</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Taikyti automatiškai</value>
</data>
@@ -211,7 +229,7 @@
<value>Automatinis</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>Nustato 60Hz, kad stokotų akumuliatorių, ir atgal, kai prijungtas prie lizdo</value>
<value>Nustato 60Hz, kad taupytų energiją, ir atgal, kai įjungtas į lizdą</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Pabudęs</value>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Balansuotas</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Įkrova</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Įkrovos riba</value>
</data>
@@ -271,7 +292,7 @@
<value>Tvarkyklės ir programinė įranga</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Išjungia dGPU, kad stokotų akumuliatorių</value>
<value>Išjungia dGPU, kad taupytų energiją</value>
</data>
<data name="EcoMode" xml:space="preserve">
<value>Ekonomiškas</value>
@@ -285,7 +306,7 @@ Vis tiek norite tęsti?</value>
<value>NVIDIA ekrano režimas nenustatytas į Optimus</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Energy Settings</value>
<value>Energijos nustatymai</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Išplėstiniai</value>
@@ -354,7 +375,7 @@ Vis tiek norite tęsti?</value>
<value>Temperatūros tikslas</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value>Aukštas</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Klavišų priskyrimas</value>
@@ -375,19 +396,19 @@ Vis tiek norite tęsti?</value>
<value>Ekranas</value>
</data>
<data name="Lid" xml:space="preserve">
<value>Korpusas</value>
<value>Dangtis</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>Šviesos juosta</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
<value>Apšvietimas</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logotipas</value>
</data>
<data name="Low" xml:space="preserve">
<value>Low</value>
<value>Žemas</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Garso vizualizatorius</value>
@@ -420,49 +441,52 @@ Vis tiek norite tęsti?</value>
<value>Maksimalus kadrų dažnis už mažesnę delsą</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<value>60Hz kadrų dažnis, kad stokotumėte akumuliatorių</value>
<value>60Hz kadrų dažnis, kad taupytumėte energiją</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Minute</value>
<value>min.</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Minutes</value>
<value>min.</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
<value>Automatiškai išjungti po</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Klavišo atsakas</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
<value>Pakilimo atstumas</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Low Battery Warning at</value>
<value>Senkančio akumuliatoriaus įspėjimas</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performance</value>
<value>Našumas</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Synchronize with mouse</value>
<value>Sinchronizuoti su pele</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Daugiazonė</value>
<value>Daugiazonis</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Mikrofono nutildymas</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>Niekada</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>Prieinami naujinimai</value>
<value>Naujinimai</value>
</data>
<data name="NoNewUpdates" xml:space="preserve">
<value>Nėra prieinamų naujinimų</value>
<value>Nėra naujinimų</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Not Connected</value>
<value>Neprijungta</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Atidaryti G-Helper langą</value>
@@ -471,7 +495,7 @@ Vis tiek norite tęsti?</value>
<value>Optimizuotas</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Perjungti į ekonomišką, kai naudojamas akumuliatorius, ir į standartinį, kai prijungtas prie lizdo</value>
<value>Perjungti į ekonomišką, kai naudojamas akumuliatorius, ir į standartinį, kai įjungtas į lizdą</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>Neįjungti GPU, kai naudojamas USB-C įkroviklis optimizuotame režime</value>
@@ -486,7 +510,7 @@ Vis tiek norite tęsti?</value>
<value>Režimas</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Peripherals</value>
<value>Išoriniai įrenginiai</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Paveikslėlis / GIF</value>
@@ -495,7 +519,7 @@ Vis tiek norite tęsti?</value>
<value>Paleisti / Pristabdyti</value>
</data>
<data name="PollingRate" xml:space="preserve">
<value>Polling Rate</value>
<value>Iškvietų dažnis</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Galios ribos</value>
@@ -507,7 +531,7 @@ Vis tiek norite tęsti?</value>
<value>Ekrano kopija</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>Profilis</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Išeiti</value>

View File

@@ -163,26 +163,29 @@
<value>Uruchomione usługi Asus</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>Stan baterii</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Oddychanie</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>W prawo</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Pętla kolorów</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Comet</value>
<value>Kometa</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>W lewo</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Szybka</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Tryb oświetlenia</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normalna</value>
</data>
@@ -190,10 +193,10 @@
<value>Tęcza</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>Losowo</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
<value>Tryb reaktywny</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Powolna</value>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Stroboskop</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>Wszystko</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Rolka</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Dolna poświata</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Zastosuj automatycznie</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Balans</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limit ładowania baterii</value>
</data>
@@ -285,7 +306,7 @@ Nadal chcesz kontynuować?</value>
<value>Tryb wyświetlania NVIDIA nie jest ustawiony na Optimus</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Energy Settings</value>
<value>Ustawienia zasilania</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Ustawienia</value>
@@ -354,7 +375,7 @@ Nadal chcesz kontynuować?</value>
<value>Temperatura docelowa</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value>Wysoka</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Ustawienia klawiszy skrótów</value>
@@ -381,13 +402,13 @@ Nadal chcesz kontynuować?</value>
<value>Lightbar</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
<value>Oświetlenie</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="Low" xml:space="preserve">
<value>Low</value>
<value>Niska</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Wizualizer muzyki</value>
@@ -423,28 +444,31 @@ Nadal chcesz kontynuować?</value>
<value>Częstotliwość odświeżania 60 Hz dla oszczędzania baterii</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Minute</value>
<value>min.</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Minutes</value>
<value>min.</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value>
<value>Korekcja kąta ruchu</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
<value>Przejście w tryb uśpienia po</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
<value>Wysokość reakcji sensora</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Low Battery Warning at</value>
<value>Ostrzeżenie o niskim poziomie baterii</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performance</value>
<value>Wydajność</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Synchronize with mouse</value>
<value>Synchronizuj z myszką</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multizone</value>
@@ -453,7 +477,7 @@ Nadal chcesz kontynuować?</value>
<value>Wyciszenie mikrofonu</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>Nigdy</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>Nowe aktualizacje</value>
@@ -462,7 +486,7 @@ Nadal chcesz kontynuować?</value>
<value>Brak aktualizacji</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Not Connected</value>
<value>Nie połączono</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Otwórz okno G-Helper</value>
@@ -486,7 +510,7 @@ Nadal chcesz kontynuować?</value>
<value>Tryb zasilania</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Peripherals</value>
<value>Urządzenia peryferyjne</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Obraz / GIF</value>
@@ -495,7 +519,7 @@ Nadal chcesz kontynuować?</value>
<value>Odtwórz / Pauza</value>
</data>
<data name="PollingRate" xml:space="preserve">
<value>Polling Rate</value>
<value>Częstotliwość raportowania</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Limit mocy</value>
@@ -507,7 +531,7 @@ Nadal chcesz kontynuować?</value>
<value>Zrzut ekranu</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>Profil</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Zamknij</value>

View File

@@ -183,6 +183,9 @@
<data name="AuraFast" xml:space="preserve">
<value>Rápido</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Estroboscópio</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Auto Apply</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Equilibrado</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limite de carga</value>
</data>
@@ -434,6 +455,9 @@ Do you still want to continue?</value>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>

View File

@@ -183,6 +183,9 @@
<data name="AuraFast" xml:space="preserve">
<value>Fast</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Strobe</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Auto Apply</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Balanced</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Battery Charge Limit</value>
</data>
@@ -434,6 +455,9 @@ Do you still want to continue?</value>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>

View File

@@ -183,6 +183,9 @@
<data name="AuraFast" xml:space="preserve">
<value>Rapid</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Stroboscop</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Aplicare automată</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Echilibrat</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limita de încărcare a bateriei</value>
</data>
@@ -434,6 +455,9 @@
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>

View File

@@ -183,6 +183,9 @@
<data name="AuraFast" xml:space="preserve">
<value>Hızlı</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Flaş</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Auto Apply</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Dengeli</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Pil Şarj Limiti</value>
</data>
@@ -434,6 +455,9 @@ Do you still want to continue?</value>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>

View File

@@ -163,26 +163,29 @@
<value>Кількість запущених сервісів Asus</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>Стан батареї</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Дихання</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>Направо</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Зміна Кольорів</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Comet</value>
<value>Комета</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>Наліво</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Швидка</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Підсвітка</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Нормальна</value>
</data>
@@ -190,10 +193,10 @@
<value>Веселка</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>Випадкова</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
<value>Реактивна</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Повільна</value>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Стробоскоп</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>Все</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Док</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Лого</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Колесо</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Низ</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Автоматично</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Баланс</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Заряд</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Ліміт заряду батареї</value>
</data>
@@ -285,7 +306,7 @@
<value>NVIDIA Display Mode не в режимі Optimus</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Energy Settings</value>
<value>Налаштування Енергії</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Додатково</value>
@@ -354,7 +375,7 @@
<value>Temperature Target</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value>Висока</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Прив'язки клавіш</value>
@@ -381,13 +402,13 @@
<value>Лайтбар</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
<value>Ілюмінація</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Лого</value>
</data>
<data name="Low" xml:space="preserve">
<value>Low</value>
<value>Низька</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Аудіо візуалізатор</value>
@@ -423,28 +444,31 @@
<value>Частота 60Гц, щоб зберегти заряд батареї</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Minute</value>
<value>Хвил.</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Minutes</value>
<value>Хвилини</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value>
<value>Фіксація Кута</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
<value>Авто-вимикання</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Відповідь Кнопок</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
<value>Відстань підйому</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Low Battery Warning at</value>
<value>Попередження про низький заряд</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performance</value>
<value>Режим Швидкодії</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Synchronize with mouse</value>
<value>Синхронізувати з мишею</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Мультизони</value>
@@ -453,7 +477,7 @@
<value>Вимкнути мікрофон</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>Ніколи</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>Є оновлення</value>
@@ -462,7 +486,7 @@
<value>Немає оновлень</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Not Connected</value>
<value>Не під'єднано</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Відкрити вікно G-Helper</value>
@@ -486,7 +510,7 @@
<value>Режим</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Peripherals</value>
<value>Периферія</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Картинка / GIF</value>
@@ -495,7 +519,7 @@
<value>Відтворення / Пауза</value>
</data>
<data name="PollingRate" xml:space="preserve">
<value>Polling Rate</value>
<value>Частота опитування</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Ліміти Потужності</value>
@@ -507,7 +531,7 @@
<value>Print Screen</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>Профіль</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Вихід</value>

View File

@@ -183,6 +183,9 @@
<data name="AuraFast" xml:space="preserve">
<value>Nhanh</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Bình thường</value>
</data>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>Nhấp nháy</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Áp dụng tự động</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>Cân bằng</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Giới hạn sạc</value>
</data>
@@ -434,6 +455,9 @@ Do you still want to continue?</value>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
</data>

View File

@@ -163,26 +163,29 @@
<value>正在运行的 Asus 服务</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>电池状态</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>呼吸</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>顺时针</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>彩色循环</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Comet</value>
<value>彗星</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>逆时针</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>快速</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>灯效模式</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>正常</value>
</data>
@@ -190,10 +193,10 @@
<value>彩虹</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>随机</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
<value>触发</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>慢</value>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>闪烁</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>全部</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>滚轮</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>自动应用</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>平衡模式</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>电池电量</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>电池充电限制</value>
</data>
@@ -282,10 +303,10 @@
确定还要继续吗?</value>
</data>
<data name="EnableOptimusTitle" xml:space="preserve">
<value>nVIDIA显示模式未设置至Optimus</value>
<value>NVIDIA 显示模式未设置为自动切换</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Energy Settings</value>
<value>电源设置</value>
</data>
<data name="Extra" xml:space="preserve">
<value>更多</value>
@@ -318,7 +339,7 @@
<value>风扇</value>
</data>
<data name="FansPower" xml:space="preserve">
<value>高级设置</value>
<value>风扇 + 功率</value>
</data>
<data name="FnLock" xml:space="preserve">
<value>打开FnLock (无需按下FN使用FN+(F1-F12)热键)</value>
@@ -354,7 +375,7 @@
<value>温度目标</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value></value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>按键绑定</value>
@@ -381,13 +402,13 @@
<value>灯条</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
<value>背光</value>
</data>
<data name="Logo" xml:space="preserve">
<value>徽标</value>
</data>
<data name="Low" xml:space="preserve">
<value>Low</value>
<value></value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>音频可视化器</value>
@@ -423,28 +444,31 @@
<value>调整刷新率为60Hz以节省电量</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Minute</value>
<value>分钟</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Minutes</value>
<value>分组</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value>
<value>角度校正</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
<value>自动关闭时间</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>按键响应</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
<value>静默高度</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Low Battery Warning at</value>
<value>低于该电量时警告</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performance</value>
<value>性能</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Synchronize with mouse</value>
<value>和鼠标同步</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>多区域设置</value>
@@ -453,7 +477,7 @@
<value>静音麦克风</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>从不</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>有更新</value>
@@ -462,7 +486,7 @@
<value>无更新</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Not Connected</value>
<value>未连接</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>打开G-Helper窗口</value>
@@ -480,13 +504,13 @@
<value>其他</value>
</data>
<data name="Overdrive" xml:space="preserve">
<value>OD</value>
<value>超频</value>
</data>
<data name="PerformanceMode" xml:space="preserve">
<value>性能模式</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Peripherals</value>
<value>外设</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>图片/动图</value>
@@ -495,7 +519,7 @@
<value>播放/暂停</value>
</data>
<data name="PollingRate" xml:space="preserve">
<value>Polling Rate</value>
<value>回报率</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>功率限制</value>
@@ -507,7 +531,7 @@
<value>截图</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>配置</value>
</data>
<data name="Quit" xml:space="preserve">
<value>退出</value>
@@ -564,7 +588,7 @@
<value>切换 Aura 模式</value>
</data>
<data name="ToggleClamshellMode" xml:space="preserve">
<value>自动启用外接显示器模式</value>
<value>自动切换合盖模式</value>
</data>
<data name="ToggleFnLock" xml:space="preserve">
<value>切换 Fn 锁定</value>

View File

@@ -163,26 +163,29 @@
<value>執行中的華碩服務</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>電池狀態</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>呼吸</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>順時針</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>循環</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Comet</value>
<value>彗星</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>逆時針</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>快速</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>燈效模式</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>正常</value>
</data>
@@ -190,10 +193,10 @@
<value>彩虹</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>隨機</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
<value>觸發</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>慢</value>
@@ -204,6 +207,21 @@
<data name="AuraStrobe" xml:space="preserve">
<value>閃爍</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>全部</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>滾輪</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>自動套用</value>
</data>
@@ -222,6 +240,9 @@
<data name="Balanced" xml:space="preserve">
<value>平衡模式</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>充電</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>電池充電上限</value>
</data>
@@ -285,7 +306,7 @@
<value>Nvidia顯示模式未設置為自動切換</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Energy Settings</value>
<value>電源設定</value>
</data>
<data name="Extra" xml:space="preserve">
<value>更多</value>
@@ -354,7 +375,7 @@
<value>GPU溫度上限</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value></value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>按鍵綁定</value>
@@ -381,13 +402,13 @@
<value>燈條</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
<value>亮度</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="Low" xml:space="preserve">
<value>Low</value>
<value></value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>音效視覺化</value>
@@ -423,28 +444,31 @@
<value>維持60Hz以節省電量</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Minute</value>
<value>分鐘</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Minutes</value>
<value>分鐘</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value>
<value>角度修正</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Auto Power Off After</value>
<value>自動關閉電源</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>按鍵回應</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
<value>響應高度(LOD)</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Low Battery Warning at</value>
<value>低電量警告</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performance</value>
<value>性能設定</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Synchronize with mouse</value>
<value>與滑鼠同步</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>多區域</value>
@@ -453,7 +477,7 @@
<value>麥克風開關</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>永不</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>新的更新</value>
@@ -462,7 +486,7 @@
<value>沒有新的更新</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Not Connected</value>
<value>未連線</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>開啟G-Helper視窗</value>
@@ -486,7 +510,7 @@
<value>性能模式:</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Peripherals</value>
<value>週邊設備</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>圖片/動圖</value>
@@ -495,7 +519,7 @@
<value>播放/暫停</value>
</data>
<data name="PollingRate" xml:space="preserve">
<value>Polling Rate</value>
<value>輪循率</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>功率限制</value>
@@ -507,7 +531,7 @@
<value>截圖</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>設定檔</value>
</data>
<data name="Quit" xml:space="preserve">
<value>退出</value>

123
app/Settings.Designer.cs generated
View File

@@ -47,8 +47,9 @@ namespace GHelper
labelBatteryTitle = new Label();
panelFooter = new Panel();
tableButtons = new TableLayoutPanel();
buttonUpdates = new RButton();
labelVersion = new Label();
buttonQuit = new RButton();
buttonUpdates = new RButton();
checkStartup = new CheckBox();
panelPerformance = new Panel();
tablePerf = new TableLayoutPanel();
@@ -95,8 +96,8 @@ namespace GHelper
panelKeyboardTitle = new Panel();
pictureKeyboard = new PictureBox();
labelKeyboard = new Label();
labelVersion = new Label();
panelVersion = new Panel();
labelCharge = new Label();
panelPeripherals = new Panel();
tableLayoutPeripherals = new TableLayoutPanel();
buttonPeripheral3 = new RButton();
@@ -173,7 +174,7 @@ namespace GHelper
tableLayoutMatrix.Name = "tableLayoutMatrix";
tableLayoutMatrix.RowCount = 1;
tableLayoutMatrix.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tableLayoutMatrix.Size = new Size(787, 60);
tableLayoutMatrix.Size = new Size(787, 64);
tableLayoutMatrix.TabIndex = 43;
//
// comboMatrix
@@ -215,8 +216,8 @@ namespace GHelper
buttonMatrix.Dock = DockStyle.Top;
buttonMatrix.FlatAppearance.BorderSize = 0;
buttonMatrix.FlatStyle = FlatStyle.Flat;
buttonMatrix.Location = new Point(528, 6);
buttonMatrix.Margin = new Padding(4, 6, 4, 6);
buttonMatrix.Location = new Point(528, 8);
buttonMatrix.Margin = new Padding(4, 8, 4, 8);
buttonMatrix.Name = "buttonMatrix";
buttonMatrix.Secondary = true;
buttonMatrix.Size = new Size(255, 48);
@@ -276,7 +277,7 @@ namespace GHelper
panelBattery.Controls.Add(sliderBattery);
panelBattery.Controls.Add(panelBatteryTitle);
panelBattery.Dock = DockStyle.Top;
panelBattery.Location = new Point(11, 1261);
panelBattery.Location = new Point(11, 1265);
panelBattery.Margin = new Padding(0);
panelBattery.Name = "panelBattery";
panelBattery.Padding = new Padding(20, 20, 20, 10);
@@ -350,7 +351,7 @@ namespace GHelper
panelFooter.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelFooter.Controls.Add(tableButtons);
panelFooter.Dock = DockStyle.Top;
panelFooter.Location = new Point(11, 1431);
panelFooter.Location = new Point(11, 1435);
panelFooter.Margin = new Padding(0);
panelFooter.Name = "panelFooter";
panelFooter.Padding = new Padding(20);
@@ -365,8 +366,9 @@ namespace GHelper
tableButtons.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));
tableButtons.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));
tableButtons.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 27F));
tableButtons.Controls.Add(buttonUpdates, 0, 0);
tableButtons.Controls.Add(labelVersion, 0, 0);
tableButtons.Controls.Add(buttonQuit, 2, 0);
tableButtons.Controls.Add(buttonUpdates, 1, 0);
tableButtons.Dock = DockStyle.Top;
tableButtons.Location = new Point(20, 20);
tableButtons.Margin = new Padding(4);
@@ -376,26 +378,20 @@ namespace GHelper
tableButtons.Size = new Size(787, 60);
tableButtons.TabIndex = 25;
//
// buttonUpdates
// labelVersion
//
buttonUpdates.AccessibleName = "BIOS and Driver Updates";
buttonUpdates.Activated = false;
buttonUpdates.BackColor = SystemColors.ControlLight;
buttonUpdates.BorderColor = Color.Transparent;
buttonUpdates.BorderRadius = 2;
buttonUpdates.Dock = DockStyle.Top;
buttonUpdates.FlatStyle = FlatStyle.Flat;
buttonUpdates.Image = Properties.Resources.icons8_software_32_white;
buttonUpdates.ImageAlign = ContentAlignment.MiddleRight;
buttonUpdates.Location = new Point(4, 6);
buttonUpdates.Margin = new Padding(4, 6, 4, 6);
buttonUpdates.Name = "buttonUpdates";
buttonUpdates.Secondary = true;
buttonUpdates.Size = new Size(254, 48);
buttonUpdates.TabIndex = 24;
buttonUpdates.Text = "Updates";
buttonUpdates.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonUpdates.UseVisualStyleBackColor = false;
labelVersion.Cursor = Cursors.Hand;
labelVersion.Dock = DockStyle.Fill;
labelVersion.Font = new Font("Segoe UI", 9F, FontStyle.Underline, GraphicsUnit.Point);
labelVersion.ForeColor = SystemColors.ControlDark;
labelVersion.Location = new Point(0, 0);
labelVersion.Margin = new Padding(0);
labelVersion.Name = "labelVersion";
labelVersion.Padding = new Padding(5);
labelVersion.Size = new Size(262, 60);
labelVersion.TabIndex = 37;
labelVersion.Text = "v.0";
labelVersion.TextAlign = ContentAlignment.MiddleLeft;
//
// buttonQuit
//
@@ -418,10 +414,31 @@ namespace GHelper
buttonQuit.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonQuit.UseVisualStyleBackColor = false;
//
// buttonUpdates
//
buttonUpdates.AccessibleName = "BIOS and Driver Updates";
buttonUpdates.Activated = false;
buttonUpdates.BackColor = SystemColors.ControlLight;
buttonUpdates.BorderColor = Color.Transparent;
buttonUpdates.BorderRadius = 2;
buttonUpdates.Dock = DockStyle.Top;
buttonUpdates.FlatStyle = FlatStyle.Flat;
buttonUpdates.Image = Properties.Resources.icons8_software_32_white;
buttonUpdates.ImageAlign = ContentAlignment.MiddleRight;
buttonUpdates.Location = new Point(266, 6);
buttonUpdates.Margin = new Padding(4, 6, 4, 6);
buttonUpdates.Name = "buttonUpdates";
buttonUpdates.Secondary = true;
buttonUpdates.Size = new Size(254, 48);
buttonUpdates.TabIndex = 24;
buttonUpdates.Text = "Updates";
buttonUpdates.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonUpdates.UseVisualStyleBackColor = false;
//
// checkStartup
//
checkStartup.AutoSize = true;
checkStartup.Location = new Point(36, 11);
checkStartup.Location = new Point(24, 11);
checkStartup.Margin = new Padding(11, 5, 11, 5);
checkStartup.Name = "checkStartup";
checkStartup.Size = new Size(206, 36);
@@ -1022,7 +1039,7 @@ namespace GHelper
panelKeyboard.Margin = new Padding(0);
panelKeyboard.Name = "panelKeyboard";
panelKeyboard.Padding = new Padding(20);
panelKeyboard.Size = new Size(827, 140);
panelKeyboard.Size = new Size(827, 144);
panelKeyboard.TabIndex = 3;
//
// tableLayoutKeyboard
@@ -1042,7 +1059,7 @@ namespace GHelper
tableLayoutKeyboard.Name = "tableLayoutKeyboard";
tableLayoutKeyboard.RowCount = 1;
tableLayoutKeyboard.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tableLayoutKeyboard.Size = new Size(787, 60);
tableLayoutKeyboard.Size = new Size(787, 64);
tableLayoutKeyboard.TabIndex = 39;
//
// buttonKeyboard
@@ -1057,8 +1074,8 @@ namespace GHelper
buttonKeyboard.FlatStyle = FlatStyle.Flat;
buttonKeyboard.Image = Properties.Resources.icons8_settings_32;
buttonKeyboard.ImageAlign = ContentAlignment.MiddleRight;
buttonKeyboard.Location = new Point(528, 6);
buttonKeyboard.Margin = new Padding(4, 6, 4, 6);
buttonKeyboard.Location = new Point(528, 8);
buttonKeyboard.Margin = new Padding(4, 8, 4, 8);
buttonKeyboard.Name = "buttonKeyboard";
buttonKeyboard.Secondary = true;
buttonKeyboard.Size = new Size(255, 48);
@@ -1074,8 +1091,8 @@ namespace GHelper
panelColor.Controls.Add(pictureColor);
panelColor.Controls.Add(buttonKeyboardColor);
panelColor.Dock = DockStyle.Fill;
panelColor.Location = new Point(266, 6);
panelColor.Margin = new Padding(4, 6, 4, 6);
panelColor.Location = new Point(266, 8);
panelColor.Margin = new Padding(4, 8, 4, 8);
panelColor.Name = "panelColor";
panelColor.Size = new Size(254, 48);
panelColor.TabIndex = 36;
@@ -1111,7 +1128,7 @@ namespace GHelper
buttonKeyboardColor.FlatStyle = FlatStyle.Flat;
buttonKeyboardColor.ForeColor = SystemColors.ControlText;
buttonKeyboardColor.Location = new Point(0, 0);
buttonKeyboardColor.Margin = new Padding(4, 6, 4, 6);
buttonKeyboardColor.Margin = new Padding(4, 8, 4, 8);
buttonKeyboardColor.Name = "buttonKeyboardColor";
buttonKeyboardColor.Secondary = false;
buttonKeyboardColor.Size = new Size(254, 48);
@@ -1169,31 +1186,29 @@ namespace GHelper
labelKeyboard.TabIndex = 34;
labelKeyboard.Text = "Laptop Keyboard";
//
// labelVersion
//
labelVersion.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelVersion.Cursor = Cursors.Hand;
labelVersion.Font = new Font("Segoe UI", 9F, FontStyle.Underline, GraphicsUnit.Point);
labelVersion.ForeColor = SystemColors.ControlDark;
labelVersion.Location = new Point(502, 13);
labelVersion.Margin = new Padding(11, 0, 11, 0);
labelVersion.Name = "labelVersion";
labelVersion.Size = new Size(300, 32);
labelVersion.TabIndex = 37;
labelVersion.Text = "v.0";
labelVersion.TextAlign = ContentAlignment.TopRight;
//
// panelVersion
//
panelVersion.Controls.Add(labelVersion);
panelVersion.Controls.Add(labelCharge);
panelVersion.Controls.Add(checkStartup);
panelVersion.Dock = DockStyle.Top;
panelVersion.Location = new Point(11, 1375);
panelVersion.Location = new Point(11, 1379);
panelVersion.Margin = new Padding(4);
panelVersion.Name = "panelVersion";
panelVersion.Size = new Size(827, 56);
panelVersion.TabIndex = 6;
//
// labelCharge
//
labelCharge.Dock = DockStyle.Right;
labelCharge.ForeColor = SystemColors.ControlDark;
labelCharge.Location = new Point(365, 0);
labelCharge.Margin = new Padding(0);
labelCharge.Name = "labelCharge";
labelCharge.Padding = new Padding(0, 0, 20, 0);
labelCharge.Size = new Size(462, 56);
labelCharge.TabIndex = 40;
labelCharge.TextAlign = ContentAlignment.MiddleRight;
//
// panelPeripherals
//
panelPeripherals.AutoSize = true;
@@ -1201,12 +1216,13 @@ namespace GHelper
panelPeripherals.Controls.Add(tableLayoutPeripherals);
panelPeripherals.Controls.Add(panelPeripheralsTile);
panelPeripherals.Dock = DockStyle.Top;
panelPeripherals.Location = new Point(11, 1063);
panelPeripherals.Location = new Point(11, 1067);
panelPeripherals.Margin = new Padding(0);
panelPeripherals.Name = "panelPeripherals";
panelPeripherals.Padding = new Padding(20, 20, 20, 10);
panelPeripherals.Size = new Size(827, 198);
panelPeripherals.TabIndex = 4;
panelPeripherals.Visible = false;
//
// tableLayoutPeripherals
//
@@ -1481,7 +1497,6 @@ namespace GHelper
private Label labelVersion;
private RButton buttonStopGPU;
private TableLayoutPanel tableButtons;
private RButton buttonUpdates;
private Panel panelPeripherals;
private TableLayoutPanel tableLayoutPeripherals;
private Panel panelPeripheralsTile;
@@ -1491,5 +1506,7 @@ namespace GHelper
private RButton buttonPeripheral3;
private RButton buttonPeripheral1;
private RButton buttonKeyboard;
private RButton buttonUpdates;
private Label labelCharge;
}
}

View File

@@ -178,16 +178,17 @@ namespace GHelper
sensorTimer.Elapsed += OnTimedEvent;
sensorTimer.Enabled = true;
labelBattery.MouseEnter += PanelBattery_MouseEnter;
labelBatteryTitle.MouseEnter += PanelBattery_MouseEnter;
labelBattery.MouseLeave += PanelBattery_MouseLeave;
labelBatteryTitle.MouseLeave += PanelBattery_MouseLeave;
labelCharge.MouseEnter += PanelBattery_MouseEnter;
labelCharge.MouseLeave += PanelBattery_MouseLeave;
buttonPeripheral1.Click += ButtonPeripheral_Click;
buttonPeripheral2.Click += ButtonPeripheral_Click;
buttonPeripheral3.Click += ButtonPeripheral_Click;
buttonPeripheral1.MouseEnter += ButtonPeripheral_MouseEnter;
buttonPeripheral2.MouseEnter += ButtonPeripheral_MouseEnter;
buttonPeripheral3.MouseEnter += ButtonPeripheral_MouseEnter;
Text = "G-Helper " + (ProcessHelper.IsUserAdministrator() ? "—" : "-") + " " + AppConfig.GetModelShort();
TopMost = AppConfig.Is("topmost");
@@ -225,7 +226,7 @@ namespace GHelper
if (HardwareControl.batteryHealth != -1)
{
labelBattery.Text = Properties.Strings.BatteryHealth + ": " + Math.Round(HardwareControl.batteryHealth, 1) + "%";
labelCharge.Text = Properties.Strings.BatteryHealth + ": " + Math.Round(HardwareControl.batteryHealth, 1) + "%";
}
}
@@ -236,10 +237,16 @@ namespace GHelper
{
screenControl.InitScreen();
gpuControl.InitXGM();
Task.Run((Action)RefreshPeripheralsBattery);
updateControl.CheckForUpdates();
}
}
private void RefreshPeripheralsBattery()
{
PeripheralsProvider.RefreshBatteryForAllDevices(true);
}
private void ButtonUpdates_Click(object? sender, EventArgs e)
{
if (updates == null || updates.Text == "")
@@ -524,7 +531,7 @@ namespace GHelper
private void LabelCPUFan_Click(object? sender, EventArgs e)
{
AppConfig.Set("fan_rpm", (AppConfig.Get("fan_rpm") == 1) ? 0 : 1);
HardwareControl.fanRpm = !HardwareControl.fanRpm;
RefreshSensors(true);
}
@@ -624,14 +631,14 @@ namespace GHelper
comboKeyboard.SelectedValueChanged += ComboKeyboard_SelectedValueChanged;
if (AsusUSB.HasColor())
if (AppConfig.NoAuraColor())
{
panelColor.Visible = false;
}
if (AppConfig.ContainsModel("GA401I"))
if (AppConfig.NoAura())
{
panelKeyboard.Visible = false;
comboKeyboard.Visible = false;
}
VisualiseAura();
@@ -762,6 +769,7 @@ namespace GHelper
this.Hide();
if (fans != null && fans.Text != "") fans.Close();
if (keyb != null && keyb.Text != "") keyb.Close();
if (updates != null && updates.Text != "") updates.Close();
}
@@ -811,26 +819,28 @@ namespace GHelper
string cpuTemp = "";
string gpuTemp = "";
string battery = "";
string charge = "";
HardwareControl.ReadSensors();
Task.Run((Action)PeripheralsProvider.RefreshBatteryForAllDevices);
if (HardwareControl.cpuTemp > 0)
cpuTemp = ": " + Math.Round((decimal)HardwareControl.cpuTemp).ToString() + "°C";
if (HardwareControl.batteryCapacity > 0)
charge = Properties.Strings.BatteryCharge + ": " + Math.Round(HardwareControl.batteryCapacity, 1) + "% ";
if (HardwareControl.batteryRate < 0)
battery = Properties.Strings.Discharging + ": " + Math.Round(-(decimal)HardwareControl.batteryRate, 1).ToString() + "W";
else if (HardwareControl.batteryRate > 0)
battery = Properties.Strings.Charging + ": " + Math.Round((decimal)HardwareControl.batteryRate, 1).ToString() + "W";
if (HardwareControl.gpuTemp > 0)
{
gpuTemp = $": {HardwareControl.gpuTemp}°C";
}
PeripheralsProvider.RefreshBatteryForAllDevices();
Program.settingsForm.BeginInvoke(delegate
{
labelCPUFan.Text = "CPU" + cpuTemp + " " + HardwareControl.cpuFan;
@@ -838,8 +848,8 @@ namespace GHelper
if (HardwareControl.midFan is not null)
labelMidFan.Text = "Mid " + HardwareControl.midFan;
if (!batteryMouseOver) labelBattery.Text = battery;
VisualizePeripherals();
labelBattery.Text = battery;
if (!batteryMouseOver) labelCharge.Text = charge;
});
string trayTip = "CPU" + cpuTemp + " " + HardwareControl.cpuFan;
@@ -920,7 +930,7 @@ namespace GHelper
if (Program.acpi.IsXGConnected())
AsusUSB.ApplyXGMLight(AppConfig.Is("xmg_light"));
if (AppConfig.ContainsModel("X16") || AppConfig.ContainsModel("X13")) InputDispatcher.TabletMode();
if (AppConfig.HasTabletMode()) InputDispatcher.TabletMode();
}
@@ -1096,13 +1106,11 @@ namespace GHelper
{
b.Text = m.GetDisplayName() + "\n" + m.Battery + "%"
+ (m.Charging ? "(" + Properties.Strings.Charging + ")" : "");
b.Enabled = true;
}
else
{
//Mouse is either not connected or in standby
b.Text = m.GetDisplayName() + "\n(" + Properties.Strings.NotConnected + ")";
b.Enabled = false;
}
switch (m.DeviceType())
@@ -1127,6 +1135,26 @@ namespace GHelper
panelPeripherals.Visible = true;
}
private void ButtonPeripheral_MouseEnter(object? sender, EventArgs e)
{
int index = 0;
if (sender == buttonPeripheral2) index = 1;
if (sender == buttonPeripheral3) index = 2;
IPeripheral iph = PeripheralsProvider.AllPeripherals().ElementAt(index);
if (iph is null)
{
return;
}
if (!iph.IsDeviceReady)
{
//Refresh battery on hover if the device is marked as "Not Ready"
iph.ReadBattery();
}
}
private void ButtonPeripheral_Click(object? sender, EventArgs e)
{
int index = 0;
@@ -1144,7 +1172,7 @@ namespace GHelper
if (iph.DeviceType() == PeripheralType.Mouse)
{
AsusMouse? am = iph as AsusMouse;
if (am is null)
if (am is null || !am.IsDeviceReady)
{
//Should not happen if all device classes are implemented correctly. But better safe than sorry.
return;

View File

@@ -1,147 +1,152 @@
# G-Helper (GHelper)
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total.svg)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub release](https://img.shields.io/github/release/seerge/g-helper.svg)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social&label=Star)](https://GitHub.com/seerge/g-helper/stargazers/)
# 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.svg)](https://GitHub.com/seerge/g-helper/releases/)
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total.svg)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social&label=Star)](https://GitHub.com/seerge/g-helper/stargazers/) <sup> Language: English | <a href="https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md">[中文]</a></sup>
Language: English | [中文](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)
Small and lightweight Armoury Crate alternative for Asus laptops offering almost same functionality without extra bloat and unnecessary services. Works on all popular models, such as ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, Flow Z13, TUF Series, Strix / Scar Series, ProArt, VivoBook and many more!
## Control tool for Asus laptops
# [:floppy_disk:Download](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
Lightweight Armoury Crate alternative for Asus laptops. A small utility that allows you to do almost everything you could do with Armoury Crate but without extra bloat and unnecessary services. Works on all popular models, such as ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar, ProArt and many more! Feel free to try :)
- Don't forget to [**Check Requirements**](#requirements-mandatory) and [**Read FAQ**](#question-faq)
- If you like this app, please give it a star :star: and spread the word about it!
## :gift: Main advantages
1. Seamless and automatic GPU switching (without asking you to close all apps, etc)
2. All performance modes can be fully customized (with fan curves and PPTs)
3. Very lightweight and consumes almost no resources, doesn't install any services. Just a single exe to run
4. Simple and clean native UI with easy access to all settings
5. FN-Lock
6. Doesn't need administrator privileges to run (*)
# [:floppy_disk: Download G-Helper App](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
If you like this app, please [star :star: it on Github](https://github.com/seerge/g-helper) and spread a word about it!
#### Support project in [:euro: EUR](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA) | [💵 USD](https://www.paypal.com/donate/?hosted_button_id=SRM6QUX6ACXDY) | [:credit_card: Stripe](https://buy.stripe.com/00gaFJ9Lf79v7WobII)
_If you post about the app - please include a link. Thanks._
#### Support project in [:euro: EUR](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA) | [💵 USD](https://www.paypal.com/donate/?hosted_button_id=SRM6QUX6ACXDY) | [:credit_card: Stripe](https://buy.stripe.com/00gaFJ9Lf79v7WobII)
![Gihhub](https://github.com/seerge/g-helper/assets/5920850/4d98465a-63a5-4498-ae14-afb3e67e7e82)
## :gift: Main Advantages
1. Seamless and automatic GPU switching
2. All performance modes can be fully customized with power limits and fan curves
3. Lightweight. Doesn't install anything in your system. Just a single exe to run
4. Simple and clean native UI with easy access to all settings
5. FN-Lock and custom hotkeys
![Screenshot 2023-08-05 190302](https://github.com/seerge/g-helper/assets/5920850/5d32b8d8-0eb8-4da8-9d5f-95120ea921cf)
### :zap: Features
1. **Performance modes**: Silent - Balanced - Turbo (built-in, with default fan curves)
2. **GPU modes**: Eco - Standard - Ultimate - Optimized
3. Laptop screen refresh rate 60hz or 120hz (144hz, etc) with display overdrive (OD) and miniled multizone switch
4. Custom fan curve editor, power limits (PPT) and turbo boost selection for every performance mode
5. Anime matrix control thanks to [Starlight](https://github.com/vddCore/Starlight) + some tweaks from my side including animated GIFs, clock and audio visualizer
6. Keyboard backlit animation and colors (including sleep animation and support for TUF models)
7. All basic and custom Keyboard hotkeys (M-keys, FN+X keys)
8. Monitor CPU / GPU temperature, fan speeds and battery discharge rate
1. Performance modes: Silent - Balanced - Turbo (built-in, with default fan curves)
2. GPU modes: Eco - Standard - Ultimate - Optimized
3. Screen refresh rate control with display overdrive (OD)
4. Custom fan curve editor, power limits and turbo boost selection for every performance mode
5. Anime matrix control including animated GIFs, clock and Audio visualizer
6. Backlight animation modes and colors
7. Custom hotkeys (M-keys, FN+X keys)
8. Monitor CPU / GPU temperature, fan speeds and battery status
9. Battery charge limit to preserve battery health
10. NVidia GPU overclocking
11. XG Mobile Control
12. AMD CPU Undervolting
![Screenshot 2023-04-13 190951](https://user-images.githubusercontent.com/5920850/231859391-c4963af4-491c-4523-95d4-0bdcfd7cfd6f.png)
13. BIOS and Driver Updates
14. Asus Mice settings
15. Mini-led multi-zone switch
### :gear: Automatic switching when on battery or plugged in
- Performance modes (app remembers last mode used on battery or when plugged)
- Optimized GPU mode - disables dGPU on battery and enables when plugged
- Auto Screen refresh rate (60hz on battery, 120+ hz when plugged)
- Keyboard backlight can be turned off on battery
- Performance Mode switching when on battery or plugged in
- Optimized GPU mode - disables dGPU on battery and enables when plugged in
- Auto Screen refresh rate (60Hz on battery and max Hz when plugged)
- Keyboard backlight timeout on battery or when plugged in
To keep auto switching and hotkeys working the app needs to stay running in the tray. It doesn't consume any resources.
_To keep auto switching and hotkeys working the app needs to stay running in the tray. It doesn't consume any resources._
### :rocket: Performance Modes
Modes are **same** as in Armoury Crate as they are stored in bios including default fan curves
Modes are **baked in BIOS** along with default fan curves and power limits. They are the **same** as in the Armoury Crate.
1. Silent (minimal or no fans, 70W PPT total, up to 45W PPT to CPU) + Best power efficiency setting in windows
2. Balanced (balanced fans, 100W PPT total, up to 45W PPT to CPU) + Balanced setting in windows
3. Turbo (intense fans, 125W PPT total, up to 80W PPT to CPU) + Best performance setting in windows
1. **Silent** (minimal or no fans, 45W CPU) + Best power efficiency setting in windows
2. **Balanced** (balanced fans, 45W CPU) + Balanced setting in windows
3. **Turbo** (intense fans, up to 80W CPU) + Best performance setting in windows
_PPTs are shown for G14 2022, for other models PPTs will be different as they are set in bios._
_Default power limits are measured for G14 2022. For other models they will be different._
### :video_game: GPU Modes
1. Eco mode : only low power integrated GPU enabled, iGPU drives built in display
2. Standard mode (MS Hybrid) : iGPU and dGPU enabled, iGPU drives built in display
3. Ultimate mode: iGPU and dGPU enabled, but dGPU drives built in display (supported only on G14 2022 model)
4. Optimized: disables dGPU on battery (Eco) and enables when plugged (Standard)
1. **Eco** : only low power integrated GPU enabled, iGPU drives built in display
2. **Standard** (MS Hybrid) : iGPU and dGPU enabled, iGPU drives built in display
3. **Ultimate**: iGPU and dGPU enabled, but dGPU drives built in display (supported on 2022+ models)
4. **Optimized**: disables dGPU on battery (Eco) and enables when plugged in (Standard)
![Screenshot 2023-05-07 182519](https://user-images.githubusercontent.com/5920850/236697890-26938ac4-8840-4fed-a7b1-9a7b839fb865.png)
![Screenshot 2023-08-05 170159](https://github.com/seerge/g-helper/assets/5920850/84a5beb3-2463-40f1-9188-930d3099aad9)
## :question: FAQ
#### How do I stop the Armory Crate install popup appearing every time I press the M4 / Rog key?
Stop ``ArmouryCrateControlInterface`` service under windows Services app or you can stop all asus services all together from ``Extra`` -> ``Stop services``
#### How do I stop the Armoury Crate install popup appearing every time I press the M4 / Rog key?
Stop ``ArmouryCrateControlInterface`` service under windows Services app or you can stop all asus services from ``Extra`` -> ``Stop services``
#### Why is Ultimate GPU mode not available on my laptop?
Ultimate mode is supported (by hardware) only on 2022+ models
#### Battery charge limiter is not working
It could be that Asus services are overwriting this limit after. You may want to stop them by clicking "Stop" in the Asus Services section (under Extra).
#### I don't see GPU modes section
Some older models (for example G14 2020) don't support disabling GPU on hardware level, therefore GPU section makes no sense for them and will be hidden
#### Should I apply custom power limits (PPT) and fan profiles?
You don't have to, it's purely optional. From my experience built in (in bios) performance modes work well. Limit your power or apply custom fan curves only if you have issues. As soon as you click Apply in the fan + power section bios will be considering the fan profile as "custom"! (no matter if you modified it or not)
#### Why is Ultimate GPU mode not available on my laptop?
Ultimate mode is supported (by hardware) only on 2022+ models
#### Should I apply custom power limits (PPT) and fan curves?
You don't have to, it's purely optional. From my experience built in (in BIOS) performance modes work well. Limit your power or apply custom fan curves only if you have issues. As soon as you click Apply in the ``Fans + Power`` section BIOS will consider your fan curve as "custom"! (no matter if you modified it or not)
#### How does G-helper control my fan speeds?
It doesn't. Your bios does (same as in case with armoury). What G-helper can do - is (optionally) set a custom fan profile to current performance mode consisting of 8 pairs of temperature + fan speed % via same endpoint armoury seem to use.
**It doesn't.** Your BIOS does (same as in case with Armoury). What G-helper can do - is (optionally) set a custom fan profile to current performance mode consisting of 8 pairs of temperature + fan speed % via same endpoint armoury seem to use.
#### How do I change fan % to fan RPM?
Click on them
#### When I try to apply a custom fan curve I get "BIOS rejected fan curve"
TUF models from 2021 and older don't support custom fan curves at all. Most probably you didn't have them in Armoury as well?
#### I don't see a GPU temperature in G-helper
Most probably either you are using Eco / Optimized mode and your dGPU is simply off, or your windows has put the dGPU into sleep (to preserve power). In this situations G-helper won't be able to reach your GPU and get readings
Most probably either you are using Eco / Optimized mode and your dGPU is simply off, or your windows has put the dGPU into sleep to preserve power.
#### I don't see app after starting it
Please check system tray for a (G) icon. By default windows is keen to hide all icons, so you may need to click ^ to see them all. I would advise to right click on Task Bar select Task Bar Settings -> Other System Tray icons -> Mark G-Helper to be always ON.
Please check the system tray for a ``(G)`` icon. By default Windows is keen to hide all icons, so you may need to click ``^`` to see them all. I would advise to right click on Taskbar select TaskBar Settings -> Other System Tray icons -> Mark G-Helper to be always ON.
#### App crash or doesn't work properly what should I do ?
Open "Event Viewer" from start menu, go to Windows Logs -> Application and check for recent Errors mentioning G-Helper. If you see one - please post a [new issue](https://github.com/seerge/g-helper/issues) with all details from this error.
#### Battery charge limiter is not working
It could be that Asus services are overwriting this limit after. You may want to stop them by clicking "Stop" in Asus Services section (under Extra).
#### App crashes or doesn't work properly
Open "Event Viewer" from the start menu, go to Windows Logs -> Application and check for recent Errors mentioning G-Helper. If you see one - please post a [new issue](https://github.com/seerge/g-helper/issues) with all details from this error.
#### Can I use MyASUS app along with G-Helper?
You can, the only problem is that MyASUS may override the battery charge limit that you set before. My advice in such a situation would be to set the same limit (i.e. 80%) in both MyASUS and G-Helper.
#### How do I set Mute Microphone to M3?
If you have Asus Optimization Service running, it's controlled by that service (therefore G-helper doesn't interfere and doesn't touch this function). Alternatively you can stop that service - and you can bind M3 to anything you want.
If you have the Asus Optimization Service running, it's controlled by that service (therefore G-helper doesn't interfere and doesn't touch this function). Alternatively you can stop that service - and you can bind M3 to anything you want.
#### How do I set different "Visual styles"?
Personally, i'm not a big fan of them, as they make colors very inaccurate. But if you want so - you can adjust display colors using either Nvidia Control panel or AMD Adrenaline (appropriate display sections). If you really want you can also use [own ASUS utility from MS Store](https://apps.microsoft.com/store/detail/gamevisual/9P4K1LFTXSH8?hl=nl-nl&gl=nl&rtc=1)
Personally, I'm not a big fan of them, as they make colors very inaccurate. But if you want so - you can adjust display colors using either Nvidia Control panel or AMD Adrenaline (appropriate display sections). If you really want you can also use [own ASUS utility from MS Store](https://apps.microsoft.com/store/detail/gamevisual/9P4K1LFTXSH8?hl=nl-nl&gl=nl&rtc=1)
#### Can I overclock Nvidia GPU core / memory?
Make sure that your dGPU is enabled (i.e. it's not in Eco mode). Open Fans + Power section and adjust core / memory clock offsets. They work same as in armoury's manual mode. Please keep in mind that (unfortunately) you need admin permissions for that, and app will ask you for them. (*)
Make sure that your dGPU is enabled (i.e. it's not in Eco mode). Open Fans + Power section and adjust core / memory clock offsets. They work the same as in armoury's manual mode. Please keep in mind that (unfortunately) you need admin permissions for that, and the app will ask you for them. (*)
#### Windows defender marks app download as malware / virus
False positives from Windows Defender (or any other similar system that uses machine learning for detection) is possible as application is not digitally signed with a certificate. You can always download a version below or compile app by yourself. All application sources are open and can be monitored from A to Z :)
#### Windows Defender marks app as malware / virus
False positives from Windows Defender (or any other similar system that uses machine learning for detection) is possible as the application is not digitally signed with a certificate. You can always download a version below or compile the app by yourself. All application sources are open and can be monitored from A to Z :)
#### Where can I find app settings or logs ?
You can find them under ``%AppData%\GHelper`` folder. Please include them when posting a new bug-report or issue.
You can find them under the ``%AppData%\GHelper`` folder. Please include them when posting a new bug-report or issue.
#### App refuses to run on startup / runs without icon in tray on startup
Open app, and uncheck and check again "run on startup". If it still doesn't help (by some reason), you can try to manually edit "GHelper" task in windows Task Scheduler, and add couple of seconds delay to start.
#### App refuses to run on startup or runs without any icon in tray on startup
Open the app, and uncheck and check again "run on startup". If it still doesn't help (for some reason), you can try to manually edit the "GHelper" task in Windows Task Scheduler, and add a couple of seconds delay to start.
#### How do I uninstall G-helper?
G-helper is a single exe, and it doesn't install anything in the system. To remove it - you can simply delete exe :) If you have applied any custom fan profiles or PPTs - before removing I would recommend selecting your
favorite performance mode (for example balanced) and clicking "Factory defaults" under Fans + Power.
#### Can I undervolt my CPU ?
Currently you can undervolt AMD CPUs. If your model supports that - you will see undervolting slider under ``Fans+Power -> Advanced``. If you don't see slider there, it means your CPU doesn't support undervolting. Full list of models that suppor that [can be found here](https://github.com/seerge/g-helper/discussions/736)
Currently you can undervolt AMD CPUs. If your model supports that - you will see an undervolting slider under ``Fans+Power -> Advanced``. If you don't see a slider there, it means your CPU doesn't support undervolting. Full list of models that support that [can be found here](https://github.com/seerge/g-helper/discussions/736)
#### I have G14 2023 and my GPU refuses to disable/enable
It seem to be an issue in older BIOS versions. As [users report](https://github.com/seerge/g-helper/issues/680) - latest BIOS 310 (installable via myasus / g-helper -> updates) resolves all issues :) So please update.
It seems to be an issue in older BIOS versions. As [users report](https://github.com/seerge/g-helper/issues/680) - latest BIOS 312 (installable via MyASUS or G-Helper -> Updates) resolves all issues :) So please update.
#### I have uninstalled Armoury andmy GPU performance is lower than it was
#### I have G15 2022 and my GPU refuses to disable/enable or my fans misbehave
G15 2022 is known to have a notoriously bugged BIOS (last one 313). Multiple users have reported that problems can be solved by rolling back to a [previous BIOS 311 from Asus Support website](https://rog.asus.com/nl/laptops/rog-zephyrus/rog-zephyrus-g15-2022-series/helpdesk_bios/).
#### I have uninstalled Armoury and my GPU performance is lower than it was
Check your NVidia Experience settings and make sure that you have **Whisper Mode** set to ``OFF``. Also you can go to reset all settings ``Nvidia Control panel -> Manage 3D Settings -> Reset to defaults``
#### How do I do a hardware reset on a laptop?
All Asus laptops have an option to do a hardware reset that can be handy sometimes. It doesn't touch your data, but resets all main hardware-related things (enables your dGPU, wakes up wifi/bt adapter if it hanged by some reason, etc). Turn OFF laptop. Press and hold "power" button for 30-40 seconds. Then boot normally (it will take a bit longer to boot)
All Asus laptops have an option to do a hardware reset that can be handy sometimes. It doesn't touch your data, but resets all main hardware-related things (enables your dGPU, wakes up wifi/bt adapter if it hangs for some reason, etc.).
Turn OFF laptop. Press and hold the "power" button for 30-40 seconds. Then boot normally (it will take a bit longer to boot)
#### What is G-helper ?
G-Helper is a lightweight Armoury Crate alternative for Asus laptops. A small utility that allows you to do almost everything you could do with Armoury Crate but without extra bloat and unnecessary services.
Small and lightweight Armoury Crate alternative for Asus laptops offering almost same functionality without extra bloat and unnecessary services. Works on ROG G14, G15, G16, M16, X13, Z13, X16, TUF, Scar, Vivobook, ProArt and all other popular models.
-----------------------------
@@ -164,11 +169,11 @@ G-Helper is a lightweight Armoury Crate alternative for Asus laptops. A small ut
- [Microsoft .NET7](https://dotnet.microsoft.com/en-us/download). Most probably you already have it. Otherwise [download it](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/sdk-7.0.202-windows-x64-installer) from the official website.
- [Asus System Control Interface v3+](https://dlcdnets.asus.com/pub/ASUS/nb/Image/CustomComponent/ASUSSystemControlInterfaceV3/ASUSSystemControlInterfaceV3.exe). This "driver" from asus should be installed automatically by windows update or along other asus apps. If it's not the case by some reason - you can download and install it manually.
- [Asus System Control Interface v3+](https://dlcdnets.asus.com/pub/ASUS/nb/Image/CustomComponent/ASUSSystemControlInterfaceV3/ASUSSystemControlInterfaceV3.exe). This "driver" from asus should be installed automatically by windows update or along other asus apps. If it's not the case for some reason - you can download and install it manually.
### Recommendations (optional)
- It's **not recommended** to use an app in combination with Armoury Crate services, because they adjust the same settings. You can [uninstall it using AC own uninstall tool](https://dlcdnets.asus.com/pub/ASUS/mb/14Utilities/Armoury_Crate_Uninstall_Tool.zip?model=armoury%20crate). Just in case, you can always install it back later.
- It's **not recommended** to use the app in combination with Armoury Crate services, because they adjust the same settings. You can [uninstall it using AC own uninstall tool](https://dlcdnets.asus.com/pub/ASUS/mb/14Utilities/Armoury_Crate_Uninstall_Tool.zip?model=armoury%20crate). Just in case, you can always install it back later.
- It's **not recommended** to have "ASUS Smart Display Control" app running, as it will try to change refresh rates and fight with g-helper for the same function. You can safely uninstall it.
@@ -179,72 +184,80 @@ G-Helper is a lightweight Armoury Crate alternative for Asus laptops. A small ut
-------------------------------
_Designed and developed for Asus Zephyrus G14 2022 (with AMD Radeon iGPU and dGPU). But could and should potentially work for G14 of 2021 and 2020, G15, X FLOW, and other ROG models for relevant and supported features._
I don't have a Microsoft certificate to sign the app yet, so if you get a warning from Windows Defender on launch (Windows Protected your PC), click More Info -> Run anyway. Alternatively you can compile and run project by yourself using Visual Studio :)
I don't have a Microsoft certificate to sign the app yet, so if you get a warning from Windows Defender on launch (Windows Protected your PC), click More Info -> Run anyway.
------------------
## Power user settings
_GENERAL NOTE: "Power user" settings require some config edits. Before making any changes to ``config.json`` - quit G-Helper. Make your changes. Run G-Helper again._
GENERAL NOTE: "Power user" settings require editing config located at ``%AppData%\GHelper\config.json``.
- Quit G-Helper
- Make your changes / additions co ``config.json``
- Start G-Helper again
_Make sure to keep json structure (i.e. not to break it with extra or missing commas, etc.) or the app will fail to read it and will just recreate an empty config instead._
### Manual app language setting
By default app will use your windows language setting. But you can set language manually (if it supported of course)
By default the app will use your windows language setting. But you can set language manually (if it supported of course)
Add following line to ``%AppData%\GHelper\config.json`` : ``"language" : "en"`` (by replacing "en" with language of your choice)
``"language" : "en"`` (by replacing "en" with language of your choice)
### Custom windows power plans with each mode
In ``%AppData%\GHelper\config.json`` you can manually add custom power plan (or power mode) GUID. It can be either "real" power plan that can be switched or "overlay" power plan like the ones g-helper sets by default.
You can manually assign a custom power plan (or power mode) GUID to each mode. It can be either "real" power plan that can be switched or "overlay" power plan like the ones g-helper sets by default.
Format is following : ``"scheme_<mode>" : "GUID" ``
Where ``mode = 0 (balanced), 1 (turbo), 2 (silent)``
Default behaviour is :
Default behavior is :
```
"scheme_0": "00000000-0000-0000-0000-000000000000",
"scheme_1": "ded574b5-45a0-4f42-8737-46345c09c238",
"scheme_2": "961cc777-2547-4f9d-8174-7d86181b8a7a",
```
Make sure to keep json structure (i.e. not to break it with extra or missing comas, etc) - or app will fail to read it and will just recreate a new config instead.
### Custom hotkey actions
App supports custom actions for M3, M4 and FN+F4 hotkeys. To set them select "Custom" next to appropriate hotkey and do one of the following:
Select ``Custom`` next to appropriate hotkey under ``Extra`` settings and do one of the following:
1. To run any custom application - put a full path to exe into "action" text field, for example:
``C:\Program Files\EA Games\Battlefield 2042\BF2042.exe``
2. To simulate any windows key - put appropriate keycode into "action" field, for example ``0x2C`` for Print screen.
2. To simulate any windows key - put appropriate keycode into the "action" field, for example ``0x2C`` for Print Screen.
Full list of keycodes https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
![Screenshot 2023-07-17 192155](https://github.com/seerge/g-helper/assets/5920850/e450e124-1589-4787-bce8-7c37ffe72fbd)
### Force Standard mode on shutdown / hibernation
In some rare cases G14 2023 seem to have issues with enabling / disabling dGPU - i.e. Eco mode. Till we wait for a fix from asus on BIOS level, one of the proposed solutions is to always shutdown laptop in Standard mode (then everything seem to work fine). To enable "forced" Standard mode on shutdown add following line to ``%AppData%\GHelper\config.json``
In some rare cases G14 2023 seem to have issues with enabling / disabling dGPU - i.e. Eco mode. Till we wait for a fix from asus on BIOS level, one of the proposed solutions is to always shutdown the laptop in Standard mode (then everything seems to work fine). To enable "forced" Standard mode on shutdown add following line config
```
"gpu_fix" : 1,
```
### Disable OSD
You can disable app's OSD (for performance modes, keyboard backlight, etc) by adding following line to ``%AppData%\GHelper\config.json``
Disable app's OSD (for performance modes, keyboard backlight, etc.)
```
"disable_osd": 1,
```
### Extra Keybindings
- ``Ctrl + Shift + F5`` - Toggle Performance Modes
- ``Ctrl + Shift + F12`` - Open G-Helper window
- ``Ctrl + M1 / M2`` - Screen brightness Down / Up
- ``Shift + M1 / M2`` - Backlight brightness Down / Up
If you don't want this bindings to work you can add ``"skip_hotkeys":1,``
### Keybinding to toggle performance modes (on external keyboards)
By default app will toggle performance modes with Ctr+Shift+F5. You can change this binding by adding ``"keybind_profile": 116`` in config.json (under ``%AppData%\GHelper``), where 116 is [numerical code for desired key](https://www.oreilly.com/library/view/javascript-dhtml/9780596514082/apb.html). Put 0 to completely disable this binding.
### Keybinding to open G-helper from external keyboards
Ctrl + Shift + F12
By default the app will toggle performance modes with Ctr+Shift+F5. You can change this binding by adding ``"keybind_profile": 116`` in config.json (under ``%AppData%\GHelper``), where 116 is [numerical code for desired key](https://www.oreilly.com/library/view/javascript-dhtml/9780596514082/apb.html). Put 0 to completely disable this binding.
------------
**Libraries / projects used**
**Libraries and projects used**
- [Linux Kernel](https://github.com/torvalds/linux/blob/master/drivers/platform/x86/asus-wmi.c) for some basic endpoints in ASUS ACPI/WMI interface
- [NvAPIWrapper](https://github.com/falahati/NvAPIWrapper) for accessing Nvidia API
- [Starlight](https://github.com/vddCore/Starlight) for anime matrix communication protocol
@@ -253,4 +266,4 @@ Ctrl + Shift + F12
**Disclaimers**
"ROG", "TUF", and "Armoury Crate" are trademarked by and belong to AsusTek Computer, Inc. I make no claims to these or any assets belonging to AsusTek Computer and use them purely for informational purposes only.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. MISUSE OF THIS SOFTWARE COULD CAUSE SYSTEM INSTABILITY OR MALFUNCTION.
THE SOFTWARE IS PROVIDED “AS IS” AND WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. MISUSE OF THIS SOFTWARE COULD CAUSE SYSTEM INSTABILITY OR MALFUNCTION.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB