Compare commits

...

327 Commits

Author SHA1 Message Date
Serge
5701a287aa Version bump 2023-10-10 13:28:26 +02:00
Serge
1968b6487c Merge pull request #1436 from IceStormNG/asus-mouse-support
Remove unsupported lighting modes for  Keris Wireless Aimpoint
2023-10-07 12:20:16 +02:00
IceStormNG
95103108f2 Remove unsupported modes from the keris wireless aimpoint 2023-10-07 12:09:52 +02:00
Serge
defb0790e5 Merge pull request #1434 from seerge/l10n_main
New Crowdin updates
2023-10-07 01:13:17 +02:00
Serge
9da45b43ea New translations strings.resx (Turkish) 2023-10-06 22:30:11 +02:00
Serge
32a20c3cce New translations strings.resx (Turkish) 2023-10-06 21:32:57 +02:00
Serge
763337aedd Keyboard label https://github.com/seerge/g-helper/issues/1428 2023-10-06 11:59:17 +02:00
Serge
f1b51a726b Added FX517Z to list of single-color RGB devices https://github.com/seerge/g-helper/issues/1425 2023-10-06 10:51:27 +02:00
Serge
a085615398 Merge branch 'main' of https://github.com/seerge/g-helper 2023-10-06 10:48:36 +02:00
Serge
d32a3452f9 Swapped F7/F8 actions for FX506LH https://github.com/seerge/g-helper/issues/1429 2023-10-06 10:48:34 +02:00
Serge
433022b65d Removed unsupported RGB flags for G614J https://github.com/seerge/g-helper/issues/1428 2023-10-06 10:42:23 +02:00
Serge
460f921836 Removed unsupported RGB modes for G614J https://github.com/seerge/g-helper/issues/1420 2023-10-06 10:35:21 +02:00
Serge
1e2620c484 Merge pull request #1422 from seerge/l10n_main
New Crowdin updates
2023-10-05 21:57:40 +02:00
Serge
e774f704dd New translations strings.resx (Chinese Simplified) 2023-10-05 21:28:34 +02:00
Serge
aa327f563f New translations strings.resx (Chinese Simplified) 2023-10-05 19:29:35 +02:00
Serge
b9de97ecf4 Merge pull request #1419 from IceStormNG/asus-mouse-support
Support for ROG Chakram P704
2023-10-05 18:55:38 +02:00
IceStormNG
5d7af9bdcd Merge branch 'seerge:main' into asus-mouse-support 2023-10-05 18:23:47 +02:00
IceStormNG
c2ca761d99 Adds support for the ROG Chakram (P704) 2023-10-05 18:21:53 +02:00
Serge
e480ee6f12 Merge pull request #1416 from seerge/l10n_main
New Crowdin updates
2023-10-04 18:16:53 +02:00
nopeless
393cb3300c fix: breaking workflow and upload artifact (#1417)
* feat: allow manual executable build for github

* fix: manual dispatch behavior

* fix: use full sha
2023-10-04 18:14:31 +02:00
nopeless
ee90fe4a3d feat: allow manual executable build for github (#1415) 2023-10-04 17:35:04 +02:00
Serge
a0628ef368 New translations strings.resx (Polish) 2023-10-04 17:32:21 +02:00
Serge
701a7d99c4 Tray icon-click fix https://github.com/seerge/g-helper/pull/1407#issuecomment-1746823625 2023-10-04 15:03:07 +02:00
IceStormNG
667d365992 Merge branch 'seerge:main' into asus-mouse-support 2023-10-04 13:44:05 +02:00
IceStormNG
6232fb1cfb Support for TUF Gaming M5 Mouse. (#1414) 2023-10-04 13:10:26 +02:00
IceStormNG
a92924840b Support for TUF Gaming M5 Mouse. 2023-10-04 13:05:21 +02:00
Serge
7a4d885e1b Fn-lock fix https://github.com/seerge/g-helper/issues/1413 2023-10-04 10:29:03 +02:00
Serge
1c5e46131f Tray icon click fix 2023-10-03 18:35:48 +02:00
Serge
49d5df9bac Toggle one time 100% charge limit https://github.com/seerge/g-helper/issues/1390 2023-10-03 13:37:56 +02:00
Serge
b8870ba3d5 Existence check 2023-10-03 12:25:53 +02:00
Serge
2d7009d8fb Startup re-scheduling https://github.com/seerge/g-helper/issues/1410 2023-10-03 12:22:47 +02:00
Serge
46bfda3ad5 Cleanup 2023-10-03 00:31:07 +02:00
Serge
72b1842520 New translations strings.resx (Chinese Traditional) (#1406) 2023-10-02 23:56:21 +02:00
Serge
2f7b008557 Merge pull request #1407 from nopeless/main
feat: improve focus behavior
2023-10-02 23:49:49 +02:00
nopeless
97361e010e refactor: use AddOwnedForm for group behavior 2023-10-02 14:30:57 -05:00
nopeless
a30920ed70 fix: respect tray icon behavior 2023-10-02 14:09:52 -05:00
nopeless
4509b67ed9 feat: improve focus behavior 2023-10-02 14:00:52 -05:00
Serge
e6fd618900 Update README.md 2023-10-02 14:32:18 +02:00
Serge
9a48e442d5 Refresh rate delay parameter https://github.com/seerge/g-helper/issues/1395 2023-10-02 11:05:45 +02:00
Serge
9e3afe73c6 Merge branch 'main' of https://github.com/seerge/g-helper 2023-10-01 19:47:40 +02:00
Serge
d90da6571e Default screen fix 2023-10-01 19:47:37 +02:00
Serge
19e1014f07 Merge pull request #1397 from seerge/l10n_main
New Crowdin updates
2023-10-01 16:58:09 +02:00
Serge
cd5806ed22 New translations strings.resx (Portuguese, Brazilian) 2023-10-01 13:19:06 +02:00
Serge
0c63e96d0f New translations strings.resx (Vietnamese) 2023-10-01 13:19:05 +02:00
Serge
2271df172c New translations strings.resx (Chinese Traditional) 2023-10-01 13:19:04 +02:00
Serge
5995079e17 New translations strings.resx (Chinese Simplified) 2023-10-01 13:19:03 +02:00
Serge
49e6412c3c New translations strings.resx (Ukrainian) 2023-10-01 13:19:02 +02:00
Serge
3316e88d38 New translations strings.resx (Turkish) 2023-10-01 13:19:02 +02:00
Serge
5501c9c587 New translations strings.resx (Portuguese) 2023-10-01 13:19:01 +02:00
Serge
1d0bb67227 New translations strings.resx (Polish) 2023-10-01 13:19:00 +02:00
Serge
2dd5e93a7c New translations strings.resx (Lithuanian) 2023-10-01 13:18:59 +02:00
Serge
31f19303ec New translations strings.resx (Korean) 2023-10-01 13:18:58 +02:00
Serge
eaa1df636d New translations strings.resx (Italian) 2023-10-01 13:18:57 +02:00
Serge
2c07a1922c New translations strings.resx (Hungarian) 2023-10-01 13:18:56 +02:00
Serge
0d4fc5d94a New translations strings.resx (German) 2023-10-01 13:18:55 +02:00
Serge
b641a87455 New translations strings.resx (Spanish) 2023-10-01 13:18:54 +02:00
Serge
773be3cfd1 New translations strings.resx (French) 2023-10-01 13:18:53 +02:00
Serge
2b7a89b27f New translations strings.resx (Romanian) 2023-10-01 13:18:52 +02:00
Serge
ba1607686f Merge branch 'main' of https://github.com/seerge/g-helper 2023-10-01 13:12:51 +02:00
Serge
6375586ff9 One time 100% battery charge https://github.com/seerge/g-helper/issues/1390 2023-10-01 13:12:49 +02:00
Serge
17da3c7a5c Update README.md 2023-10-01 11:25:10 +02:00
Serge
9f836ff356 Custom hotkey combos https://github.com/seerge/g-helper/issues/1386 2023-10-01 11:22:20 +02:00
Serge
35355f6cb7 Update README.md 2023-10-01 10:36:43 +02:00
Serge
60be68b217 Font tweaks 2023-10-01 10:16:48 +02:00
Serge
4fe8953a48 Incomplete fan curve crash https://github.com/seerge/g-helper/issues/1396 2023-10-01 10:10:13 +02:00
Serge
7845f278f8 Option to bind G-Helper window to any macro key https://github.com/seerge/g-helper/issues/1389
Auto refresh tweaks https://github.com/seerge/g-helper/issues/1395
Anime Matrix tweaks
2023-09-30 23:08:34 +02:00
Serge
03944dc208 Merge pull request #1378 from seerge/l10n_main
New Crowdin updates
2023-09-27 19:53:22 +02:00
Serge
3b6caf1a52 New translations strings.resx (Turkish) 2023-09-27 19:52:47 +02:00
Serge
7ede6e3cb0 Merge pull request #1375 from seerge/l10n_main
New Crowdin updates
2023-09-27 18:40:30 +02:00
Serge
1a3ae449d6 New translations strings.resx (Turkish) 2023-09-27 15:03:01 +02:00
Serge
78a384d760 Merge pull request #1365 from seerge/l10n_main
New Crowdin updates
2023-09-26 15:27:06 +02:00
Serge
26828f5c93 New translations strings.resx (Hungarian) 2023-09-26 13:25:15 +02:00
Serge
594bf061e1 New translations strings.resx (Hungarian) 2023-09-26 11:36:26 +02:00
Serge
aa32942c92 Merge pull request #1362 from IceStormNG/asus-mouse-support
Support for ROG Strix Impact II (P506)
2023-09-25 15:13:44 +02:00
IceStormNG
4a3108a5e0 Corrected a comment. The mouse has 3 zones. 2023-09-25 14:35:09 +02:00
IceStormNG
82f5afa278 Only show battery percentage when the mouse has a battery. 2023-09-25 14:31:23 +02:00
IceStormNG
cd95802912 Support for Strix Impact II (P506) 2023-09-25 14:30:47 +02:00
Serge
0fed74e069 M16 Fan fix for older BIOS only 2023-09-24 12:23:31 +02:00
Serge
8773e26219 Version bump 2023-09-22 12:11:11 +02:00
Serge
45cce72af5 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-21 13:57:50 +02:00
Serge
4a43710d50 Removed unsuported hotkeys for ARCNM https://github.com/seerge/g-helper/issues/1341 2023-09-21 13:57:47 +02:00
Serge
8c12a230a8 Update README.md 2023-09-21 13:17:07 +02:00
Serge
50fed1ba2a Merge pull request #1335 from seerge/l10n_main
New Crowdin updates
2023-09-20 18:06:54 +02:00
Serge
63ba5dc9e8 New translations strings.resx (German) 2023-09-20 13:03:08 +02:00
Serge
b75d24b4ca Merge pull request #1330 from seerge/l10n_main
New Crowdin updates
2023-09-20 10:59:31 +02:00
Serge
9488a12dc2 New translations strings.resx (German) 2023-09-20 10:58:56 +02:00
Serge
701b3a126e New translations strings.resx (Chinese Traditional) 2023-09-20 00:33:54 +02:00
Serge
e3335ef803 New translations strings.resx (Spanish) 2023-09-20 00:33:47 +02:00
seerge
f16a6248cb Added Z13 to GPU fix list 2023-09-20 00:15:51 +02:00
Serge
9c0cd15115 HDR Detection / Multi-Zone switch improvements https://github.com/seerge/g-helper/issues/1319 2023-09-19 12:52:35 +02:00
Serge
524b84fc38 Detect Battery Saver state 2023-09-18 13:45:12 +02:00
Serge
3bd59a4c4d Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-18 12:04:48 +02:00
Serge
96f07606f5 Version bump 2023-09-18 12:04:43 +02:00
Serge
ea96af51b8 Update README.md 2023-09-18 10:00:08 +02:00
Serge
0669bcb2d1 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-17 11:49:08 +02:00
Serge
67a42c4a21 Touchpad toggle https://github.com/seerge/g-helper/issues/1313
Miniled status tweak https://github.com/seerge/g-helper/issues/1319
2023-09-17 11:49:05 +02:00
Serge
de98588235 Update README.md 2023-09-14 11:26:56 +02:00
Serge
dffb239ea7 MUX switch for Vivobooks / Zenbooks https://github.com/seerge/g-helper/issues/1301 2023-09-13 13:26:35 +02:00
Serge
6a6c1f1455 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-12 19:31:53 +02:00
Serge
bd3b2647b4 Fixed exception at Fans+Power https://github.com/seerge/g-helper/issues/1303 2023-09-12 19:31:51 +02:00
Serge
cebc42126a Merge pull request #1296 from seerge/l10n_main
New Crowdin updates
2023-09-12 11:10:03 +02:00
Serge
2985b2f31c New translations Strings.resx (Polish) 2023-09-11 21:48:15 +02:00
Serge
335f5b38a5 Hide Calibrate button on not supported models 2023-09-11 19:40:58 +02:00
Serge
4dd9daa95c Version Bump 2023-09-11 14:34:23 +02:00
Serge
10db075ece Custom command arguments https://github.com/seerge/g-helper/issues/1292 2023-09-11 12:03:52 +02:00
Serge
a800eae020 Pre-entered max fan speeds 2023-09-10 12:31:18 +02:00
Serge
eb21fb2020 Backlight init delay 2023-09-09 17:01:02 +02:00
Serge
600e6a9404 Cleanup 2023-09-09 14:27:43 +02:00
Serge
4b0fbcbf10 Cleanup 2023-09-09 13:52:29 +02:00
Serge
215aec34b9 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-09 13:07:57 +02:00
Serge
9cba686a3c Fan Calibration 2023-09-09 13:07:55 +02:00
Serge
43a7eb8b32 Merge pull request #1284 from seerge/l10n_main
New Crowdin updates
2023-09-09 12:40:55 +02:00
Serge
08eb867ae7 New translations Strings.resx (Lithuanian) 2023-09-09 10:32:25 +02:00
Serge
5c59c34a6c Merge pull request #1278 from seerge/l10n_main
New Crowdin updates
2023-09-09 00:48:26 +02:00
Serge
ae2dae8a97 New translations Strings.resx (Portuguese, Brazilian) 2023-09-08 23:12:31 +02:00
Serge
c06969ba8f New translations Strings.resx (Vietnamese) 2023-09-08 23:12:31 +02:00
Serge
496d55f88b New translations Strings.resx (Chinese Simplified) 2023-09-08 23:12:30 +02:00
Serge
2b16372ec4 New translations Strings.resx (Ukrainian) 2023-09-08 23:12:29 +02:00
Serge
041aa40a6d New translations Strings.resx (Turkish) 2023-09-08 23:12:28 +02:00
Serge
55c1dd7e16 New translations Strings.resx (Portuguese) 2023-09-08 23:12:27 +02:00
Serge
2ec2f669fb New translations Strings.resx (Polish) 2023-09-08 23:12:26 +02:00
Serge
17ea6157a6 New translations Strings.resx (Lithuanian) 2023-09-08 23:12:25 +02:00
Serge
d5bdf180a8 New translations Strings.resx (Korean) 2023-09-08 23:12:24 +02:00
Serge
a7d5ac5de9 New translations Strings.resx (Italian) 2023-09-08 23:12:24 +02:00
Serge
b103623099 New translations Strings.resx (Hungarian) 2023-09-08 23:12:23 +02:00
Serge
751f4d0331 New translations Strings.resx (German) 2023-09-08 23:12:22 +02:00
Serge
1f536d8d84 New translations Strings.resx (Spanish) 2023-09-08 23:12:21 +02:00
Serge
c900121644 New translations Strings.resx (French) 2023-09-08 23:12:20 +02:00
Serge
9ce038fe19 New translations Strings.resx (Romanian) 2023-09-08 23:12:19 +02:00
Serge
1f66038ab9 Version bump 2023-09-08 22:04:41 +02:00
Serge
04d2eb53a2 Merge pull request #1277 from seerge/Fan-Calibration
Fan calibration
2023-09-08 21:45:41 +02:00
Serge
f55a3c0824 Merge pull request #1276 from seerge/l10n_main
New Crowdin updates
2023-09-08 21:45:18 +02:00
Serge
8f0e4431e6 Label 2023-09-08 21:45:17 +02:00
Serge
bff2676b64 Calibrate in turbo mode 2023-09-08 19:47:12 +02:00
Serge
e9e5fe1cc9 Simplification 2023-09-08 19:37:09 +02:00
Serge
e6a78fc8f7 Fan Calibration 2023-09-08 19:32:37 +02:00
Serge
0e3efcf547 Calibration 2023-09-08 19:12:57 +02:00
Serge
5c5b4f297c New translations Strings.resx (Polish) 2023-09-08 19:03:48 +02:00
Serge
6f1c2ce7c1 Merge pull request #1272 from seerge/l10n_main
New Crowdin updates
2023-09-08 13:24:48 +02:00
Serge
e26feb7025 New translations Strings.resx (Chinese Simplified) 2023-09-08 05:33:49 +02:00
Serge
fef0042870 New translations Strings.resx (Chinese Traditional) 2023-09-08 02:51:36 +02:00
Serge
5a1a303ce7 Merge pull request #1270 from seerge/l10n_main
New Crowdin updates
2023-09-07 17:36:23 +02:00
Serge
5849dc0ce9 New translations Strings.resx (Portuguese, Brazilian) 2023-09-07 17:30:25 +02:00
Serge
31ca13692b New translations Strings.resx (Vietnamese) 2023-09-07 17:30:23 +02:00
Serge
49cfbc6235 New translations Strings.resx (Chinese Traditional) 2023-09-07 17:30:22 +02:00
Serge
b577e5ed90 New translations Strings.resx (Chinese Simplified) 2023-09-07 17:30:21 +02:00
Serge
3c9dca0c62 New translations Strings.resx (Ukrainian) 2023-09-07 17:30:20 +02:00
Serge
818b87fe87 New translations Strings.resx (Turkish) 2023-09-07 17:30:19 +02:00
Serge
e177207799 New translations Strings.resx (Portuguese) 2023-09-07 17:30:18 +02:00
Serge
df4cf40a5b New translations Strings.resx (Lithuanian) 2023-09-07 17:30:17 +02:00
Serge
23082d59ba New translations Strings.resx (Korean) 2023-09-07 17:30:16 +02:00
Serge
708170b1ef New translations Strings.resx (Italian) 2023-09-07 17:30:15 +02:00
Serge
3a0131a577 New translations Strings.resx (Hungarian) 2023-09-07 17:30:14 +02:00
Serge
d1f4da5473 New translations Strings.resx (German) 2023-09-07 17:30:13 +02:00
Serge
91967638af New translations Strings.resx (Spanish) 2023-09-07 17:30:12 +02:00
Serge
d9a972f6a9 New translations Strings.resx (French) 2023-09-07 17:30:11 +02:00
Serge
ce4c9bb48c New translations Strings.resx (Romanian) 2023-09-07 17:30:10 +02:00
Serge
26c74fa1df New translations Strings.resx (Polish) 2023-09-07 17:30:09 +02:00
Serge
4ae3fb4e3d Boot Sound 2023-09-07 17:29:35 +02:00
Serge
20e7dd96a1 Cleanup 2023-09-07 17:07:34 +02:00
Serge
d36cd409a4 XGM Config Flag 2023-09-07 15:37:09 +02:00
Serge
082eceed9a Update checker 2023-09-07 13:44:31 +02:00
Serge
46c91d1956 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-07 10:06:58 +02:00
Serge
edfb829988 XGM activation https://github.com/seerge/g-helper/issues/729 2023-09-07 10:06:56 +02:00
Serge
83cb28e99c Update README.md 2023-09-06 22:11:38 +02:00
Serge
957916bfdf XGM Special Activation 2023-09-06 21:51:09 +02:00
Serge
2f98606a7d XG Mobile tweaks 2023-09-06 19:58:14 +02:00
Serge
c791421c3e Merge pull request #1264 from seerge/G14-2021-Matrix
Anime Matrix tweaks
2023-09-06 19:04:55 +02:00
Serge
fa79a72247 Anime Matrix tweaks 2023-09-06 19:03:27 +02:00
Serge
831f7b8989 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-06 16:01:20 +02:00
Serge
77800475cb Matrix Clock 2023-09-06 16:01:18 +02:00
Serge
96553a162c Merge pull request #1262 from seerge/l10n_main
New Crowdin updates
2023-09-06 13:56:27 +02:00
Serge
d1e987f4da New translations Strings.resx (Polish) 2023-09-06 13:54:28 +02:00
Serge
a1fb740c27 TUF Backlight for new models https://github.com/seerge/g-helper/issues/1250 2023-09-06 13:50:48 +02:00
Serge
cff47002e1 Matrix memory optimisations 2023-09-05 23:51:14 +02:00
Serge
c34ba9c620 Cleanup 2023-09-05 23:31:18 +02:00
Serge
3da2d042c8 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-05 21:39:00 +02:00
Serge
b93499c20d Anime Matrix Editor 2023-09-05 21:38:58 +02:00
Serge
feb7f1915e Update README.md 2023-09-04 22:37:53 +02:00
Serge
bd7f494830 Merge pull request #1247 from seerge/l10n_main
New Crowdin updates
2023-09-03 19:07:33 +02:00
Serge
1fc5095a65 New translations Strings.resx (Chinese Traditional) 2023-09-03 19:07:10 +02:00
Serge
920ed5e176 Update README.md 2023-09-03 18:33:26 +02:00
Serge
fce9cddd02 XGM for devices without dGPU https://github.com/seerge/g-helper/issues/1235 2023-09-03 15:53:43 +02:00
Serge
3332bd4b36 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-03 14:14:55 +02:00
Serge
56289abc36 Allow XGM connection from any dGPU mode for models w/o dGPU https://github.com/seerge/g-helper/issues/1235
Hide Backlight OSD if asus OSD is running
2023-09-03 14:14:54 +02:00
Serge
9be02a102d Merge pull request #1240 from seerge/l10n_main
New Crowdin updates
2023-09-02 17:52:56 +02:00
Serge
e1e94e1118 New translations Strings.resx (Portuguese) 2023-09-02 15:26:19 +02:00
Serge
2ffd08e754 Merge pull request #1236 from IceStormNG/asus-mouse-support
Pugio II (P705) Support
2023-09-02 00:56:42 +02:00
IceStormNG
0378b65763 Added Pugio II (P705) Mouse configuration 2023-09-02 00:54:16 +02:00
IceStormNG
5dd3760e90 Fixed mapping of animation speed values in the UI (how was that bug not found yet?) 2023-09-02 00:53:33 +02:00
IceStormNG
e7eb7fab8a Make low battery warning values configureable per mouse 2023-09-02 00:53:00 +02:00
IceStormNG
ce128adc4f Only open one Mouse settings window and also make it the topmost window. 2023-09-02 00:52:15 +02:00
Serge
a794f8ed5f Single color backlight for keyboard version 22/23 https://github.com/seerge/g-helper/issues/1230 2023-08-31 23:33:44 +02:00
Serge
9d30f2f83e Version bump 2023-08-31 12:09:27 +02:00
Serge
b93f1a385b Arrow lock for DUO https://github.com/seerge/g-helper/issues/1224 2023-08-30 23:49:32 +02:00
Serge
6bb4ba4119 Screenpad hotkey for DUO https://github.com/seerge/g-helper/issues/1215 2023-08-30 14:41:20 +02:00
Serge
178cb04002 Turn off display fix https://github.com/seerge/g-helper/issues/1218
Zephyrus DUO Screenpad hotkey https://github.com/seerge/g-helper/issues/1215
2023-08-30 12:45:07 +02:00
Serge
2d41cd62a8 Clasmshell tooltip https://github.com/seerge/g-helper/issues/1207 2023-08-29 11:48:59 +02:00
Serge
f9e4e89c15 Vivobook backlight control https://github.com/seerge/g-helper/issues/1208 2023-08-29 00:00:55 +02:00
Serge
02717c47be Fan ranges for ancient devices https://github.com/seerge/g-helper/issues/1206 2023-08-28 19:11:32 +02:00
Serge
cc010053b2 Minor tweaks 2023-08-27 13:05:10 +02:00
Serge
9bcc0fccd7 Update README.md 2023-08-24 18:09:20 +02:00
Serge
d8df9b03bf Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-24 15:07:54 +02:00
Serge
abfa2388e4 Cleanup 2023-08-24 15:07:52 +02:00
Serge
670f91efa8 Merge pull request #1170 from Oleg52/force-set-gpu-mode
add force set gpu param
2023-08-24 15:03:15 +02:00
Serge
70d442c409 Merge pull request #1171 from seerge/l10n_main
New Crowdin updates
2023-08-24 15:00:39 +02:00
Serge
5f018fa7b5 New translations Strings.resx (Portuguese) 2023-08-24 14:45:40 +02:00
Oleg Yermolenko
94f0b900de add force set gpu param 2023-08-24 14:06:52 +03:00
Serge
e17ff8fc94 Version Bump 2023-08-24 12:37:18 +02:00
Serge
bd4ee506ac Vivo Mode swap https://github.com/seerge/g-helper/issues/1168 2023-08-24 12:03:44 +02:00
Serge
8c5b224dc2 Vivobook modes swap https://github.com/seerge/g-helper/issues/1168 2023-08-24 12:01:26 +02:00
Serge
f111b5449e Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-24 11:54:11 +02:00
Serge
47f86d222f Minior tweaks 2023-08-24 11:54:09 +02:00
Serge
f9b7073dd7 Merge pull request #1166 from seerge/l10n_main
New Crowdin updates
2023-08-23 19:11:30 +02:00
Serge
a6c11f2ce3 New translations Strings.resx (Portuguese) 2023-08-23 14:01:14 +02:00
Serge
46fad77bac Update README.md 2023-08-23 12:31:14 +02:00
Serge
22a96fcce0 Update README.md 2023-08-23 12:29:37 +02:00
Serge
6df0dc8e9e Merge pull request #1155 from seerge/l10n_main
New Crowdin updates
2023-08-22 18:46:43 +02:00
Serge
ee7c0c6dab New translations Strings.resx (Portuguese) 2023-08-22 15:16:03 +02:00
Serge
6e086da024 New translations Strings.resx (Portuguese) 2023-08-22 14:12:34 +02:00
Serge
292d2a8ebc New translations Strings.resx (Portuguese) 2023-08-22 12:50:32 +02:00
Serge
52e78a8665 Merge pull request #1150 from seerge/l10n_main
New Crowdin updates
2023-08-22 10:49:58 +02:00
Serge
a97bfc2a58 Version bump 2023-08-22 10:39:34 +02:00
Serge
15001d987a Fix Default Curve 2023-08-22 10:37:31 +02:00
Serge
ecbeee82d8 Merge pull request #1153 from charlespeng/fix-default-fan-curve-buffer-size
Fix default fan curve buffer size
2023-08-22 10:28:04 +02:00
Charles Peng
e6c59283c1 Fix default fan curve buffer size 2023-08-22 15:08:30 +08:00
Serge
495b695589 New translations Strings.resx (Polish) 2023-08-22 01:31:34 +02:00
Serge
6ac7d7cc4d New translations Strings.resx (Portuguese) 2023-08-21 23:56:19 +02:00
Serge
0c328b1fda Update README.md 2023-08-21 18:35:01 +02:00
Serge
bd8a670424 Merge pull request #1146 from charlespeng/save-backlight-level-according-to-power-status
Save backlight level according to power status
2023-08-21 12:13:36 +02:00
Charles Peng
5f1139f132 Save backlight level according to power status 2023-08-21 16:04:05 +08:00
Serge
188b01c158 Merge pull request #1142 from seerge/l10n_main
New Crowdin updates
2023-08-21 00:59:32 +02:00
Serge
8307fabe15 New translations Strings.resx (Portuguese) 2023-08-20 19:25:59 +02:00
Serge
cead02eed2 Merge pull request #1141 from seerge/l10n_main
New Crowdin updates
2023-08-20 17:26:42 +02:00
Serge
fabf63655b New translations Strings.resx (Portuguese, Brazilian) 2023-08-20 17:26:04 +02:00
Serge
da2f887c68 New translations Strings.resx (Portuguese, Brazilian) 2023-08-20 17:24:25 +02:00
Serge
26dbd77b05 PT-BR 2023-08-20 17:24:02 +02:00
Serge
63382b748f Merge pull request #1140 from seerge/l10n_main
New Crowdin updates
2023-08-20 17:21:53 +02:00
Serge
1e2a5b0479 New translations Strings.resx (Portuguese, Brazilian) 2023-08-20 17:21:18 +02:00
Serge
341e747f7e New translations Strings.resx (Portuguese) 2023-08-20 17:21:15 +02:00
Serge
348f5a8ea1 Merge pull request #1139 from seerge/l10n_main
New Crowdin updates
2023-08-20 17:17:03 +02:00
Serge
c0b6c444b4 New translations Strings.resx (Portuguese, Brazilian) 2023-08-20 17:16:34 +02:00
Serge
f8d07bad1b New translations Strings.resx (Portuguese) 2023-08-20 17:16:30 +02:00
Serge
a138ebe0e7 New translations Strings.resx (French) 2023-08-20 16:42:09 +02:00
Serge
2260b01480 Merge pull request #1137 from IceStormNG/asus-mouse-support
Support for ROG Harpe Ace Aim Lab Edition (P713).
2023-08-20 15:13:25 +02:00
IceStormNG
9761f10398 Support for Harpe Ace Aim Lab Edition (P713). 2023-08-20 15:08:11 +02:00
Serge
984cb2f53e GPU detection https://github.com/seerge/g-helper/issues/1112 2023-08-19 12:51:33 +02:00
Serge
7c80a02cef Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-19 12:40:32 +02:00
Serge
f545d48179 GPU detection https://github.com/seerge/g-helper/issues/1114
Resetting custom fan curve on XGM on disconnect https://github.com/seerge/g-helper/issues/1123
2023-08-19 12:40:30 +02:00
Serge
07df99aaae Merge pull request #1126 from seerge/l10n_main
New Crowdin updates
2023-08-19 10:31:34 +02:00
Serge
6f60e1af1f Merge pull request #1129 from IceStormNG/main
Added windows based dark mode detection via config override
2023-08-19 10:14:45 +02:00
Serge
e0080ca879 New translations Strings.resx (Italian) 2023-08-19 09:33:58 +02:00
IceStormNG
eaf2483558 Added windows based dark mode detection via config override 2023-08-19 09:06:54 +02:00
Serge
8cac276925 New translations Strings.resx (Vietnamese) 2023-08-19 05:38:10 +02:00
Serge
499c83e3b0 New translations Strings.resx (Vietnamese) 2023-08-19 04:07:58 +02:00
Serge
ba0764aa85 New translations Strings.resx (Spanish) 2023-08-18 20:11:36 +02:00
Serge
53c1ee4c71 New translations Strings.resx (Lithuanian) 2023-08-18 18:51:34 +02:00
Serge
fe1891a2a9 New translations Strings.resx (German) 2023-08-18 18:51:33 +02:00
Serge
0ffb9f11d4 Merge pull request #1122 from seerge/l10n_main
New Crowdin updates
2023-08-18 18:49:52 +02:00
Serge
307cc81f18 Merge pull request #1125 from IceStormNG/main
Dark/Light Mode override
2023-08-18 18:48:44 +02:00
IceStormNG
2384649e09 Better handling for null values. 2023-08-18 18:37:58 +02:00
IceStormNG
4952675749 Light/Dark mode override 2023-08-18 18:36:34 +02:00
Serge
e2596ed9cb Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-18 18:15:14 +02:00
Serge
190786a15a Internal screen detection 2023-08-18 18:15:12 +02:00
Serge
9bcf3f36f8 New translations Strings.resx (Vietnamese) 2023-08-18 16:34:05 +02:00
Serge
26e1ae4d7b New translations Strings.resx (Chinese Traditional) 2023-08-18 16:34:04 +02:00
Serge
98af882970 New translations Strings.resx (Chinese Simplified) 2023-08-18 16:34:03 +02:00
Serge
5835e71947 New translations Strings.resx (Ukrainian) 2023-08-18 16:34:02 +02:00
Serge
f46580bd1b New translations Strings.resx (Turkish) 2023-08-18 16:34:01 +02:00
Serge
a282da6fd7 New translations Strings.resx (Portuguese) 2023-08-18 16:34:00 +02:00
Serge
1420d17413 New translations Strings.resx (Polish) 2023-08-18 16:33:59 +02:00
Serge
b7b6270565 New translations Strings.resx (Lithuanian) 2023-08-18 16:33:58 +02:00
Serge
49eb45749a New translations Strings.resx (Korean) 2023-08-18 16:33:57 +02:00
Serge
ec709f37e8 New translations Strings.resx (Italian) 2023-08-18 16:33:56 +02:00
Serge
615c58ac3c New translations Strings.resx (Hungarian) 2023-08-18 16:33:55 +02:00
Serge
20d698febd New translations Strings.resx (German) 2023-08-18 16:33:54 +02:00
Serge
3bb6bf3228 New translations Strings.resx (Spanish) 2023-08-18 16:33:53 +02:00
Serge
9674f034dd New translations Strings.resx (French) 2023-08-18 16:33:51 +02:00
Serge
f11ed679d9 New translations Strings.resx (Romanian) 2023-08-18 16:33:51 +02:00
Serge
2bb5087a63 Merge pull request #1120 from IceStormNG/asus-mouse-support
Internal improvements for mouse support
2023-08-18 15:20:11 +02:00
IceStormNG
e4aa5f0283 Cleanup of left-overs that shouldn't be there 2023-08-18 15:17:03 +02:00
IceStormNG
18b664a123 Default Profile is 0, so use that if decoding fails to have a sane fallback. 2023-08-18 15:09:12 +02:00
IceStormNG
1d03eb064a Allow subclasses to read whether packet logger is enabled or not 2023-08-18 15:08:40 +02:00
IceStormNG
0ad058ec4a Added feature to read and edit Acceleration and Deceleration values. It seems like only the Harpe Ace really does something with it even though all AimPoint Mice respond to it and store the value. 2023-08-18 15:08:08 +02:00
IceStormNG
18b54886ed Improved packet handling to deal better with empty packets and errors. 2023-08-18 15:05:55 +02:00
IceStormNG
f79a91fb78 Make reportId a constructor variable as some mice might not require 0x00 as most do. 2023-08-18 15:04:49 +02:00
Serge
584755ea93 Cleanup 2023-08-18 12:29:21 +02:00
Serge
3652e4d0ff 50W limit max for Ally 2023-08-18 12:16:19 +02:00
Serge
0069234563 Version bump 2023-08-18 01:23:02 +02:00
Serge
d92a1880ee Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-17 20:28:51 +02:00
Serge
dd72e2b573 Screen detection fix 2023-08-17 20:28:48 +02:00
Serge
10714d1002 Update README.md 2023-08-17 19:58:22 +02:00
Serge
daad1bca53 Merge pull request #1109 from IceStormNG/asus-mouse-support
Support for ROG Keris Wireless Aimpoint (P709_Wireless)
2023-08-17 14:29:17 +02:00
IceStormNG
c82ec8a005 Adds ROG Keris Wireless Aimpoint (P709_Wireless) 2023-08-17 14:25:31 +02:00
IceStormNG
9fbea0a3d3 Fixes crash when DPI was not read yet. 2023-08-17 14:23:55 +02:00
Serge
ed06247206 Merge branch 'main' of https://github.com/seerge/g-helper 2023-08-17 10:52:10 +02:00
Serge
1e7bd816f2 Config overrides https://github.com/seerge/g-helper/issues/1105 2023-08-17 10:52:09 +02:00
Serge
592c4aa07a Update README.md 2023-08-16 14:57:06 +02:00
Serge
59f3aa9af4 Merge pull request #1096 from IceStormNG/main
AniMeMatrix fix for GU604
2023-08-15 23:52:43 +02:00
IceStormNG
8df825e250 AniMeMatrix fix for GU604 2023-08-15 23:27:14 +02:00
Serge
a985cc5bbb Darktheme fix https://github.com/seerge/g-helper/issues/1092
ACPI modes support for Vivobook https://github.com/seerge/g-helper/issues/1089
2023-08-15 13:59:07 +02:00
Serge
bd7985e817 Merge pull request #1093 from seerge/l10n_main
New Crowdin updates
2023-08-15 13:57:22 +02:00
Serge
8706f9f03c New translations Strings.resx (Ukrainian) 2023-08-15 12:53:23 +02:00
Serge
5c6a587745 App dark/light theme detection https://github.com/seerge/g-helper/issues/1092 2023-08-15 12:00:08 +02:00
Serge
de4905f84f Power mode saving https://github.com/seerge/g-helper/issues/1091 2023-08-15 11:21:20 +02:00
Serge
121a9224e9 Power mode saving 2023-08-15 11:19:10 +02:00
Serge
af9626e385 Version bump 2023-08-14 17:32:15 +02:00
Serge
6b3db926fc GPU Aura Mode 2023-08-14 17:19:22 +02:00
Serge
8f8be7a13e Single Color Modes 2023-08-14 16:55:25 +02:00
Serge
12450dbba4 Merge pull request #1084 from seerge/gpu_clock_limit
Gpu clock limit
2023-08-14 16:51:45 +02:00
Serge
4f6de3c6a3 GPU Mode Backlight 2023-08-14 16:48:16 +02:00
Serge
d89420e0f1 Merge pull request #1074 from seerge/l10n_main
New Crowdin updates
2023-08-14 12:06:32 +02:00
Serge
ddc13e0dec New translations Strings.resx (Korean) 2023-08-14 10:07:50 +02:00
Serge
61a3d782e8 New translations Strings.resx (Korean) 2023-08-14 08:37:33 +02:00
Serge
b1c8aa97c8 New translations Strings.resx (Korean) 2023-08-14 07:06:19 +02:00
Serge
3a50ee1784 New translations Strings.resx (Korean) 2023-08-14 05:31:39 +02:00
Serge
a69ce3592f New translations Strings.resx (Polish) 2023-08-13 18:48:23 +02:00
Serge
b49ae96dfe New translations Strings.resx (Polish) 2023-08-13 17:48:00 +02:00
Serge
4c989c9d75 Clock Limit tweaks 2023-08-13 15:48:54 +02:00
Serge
2282e56aad GPU Clock Limiting 2023-08-13 12:53:28 +02:00
Serge
982f2e8e32 Merge pull request #1069 from seerge/l10n_main
New Crowdin updates
2023-08-13 12:14:23 +02:00
Serge
e90f19e3e2 New translations Strings.resx (Chinese Simplified) 2023-08-13 05:08:45 +02:00
Serge
6d6a9c68f2 Merge pull request #1063 from seerge/l10n_main
New Crowdin updates
2023-08-12 17:49:57 +02:00
Serge
8138e44cdd New translations Strings.resx (Chinese Traditional) 2023-08-12 17:16:01 +02:00
Serge
ef788798b7 Version Bump 2023-08-12 16:27:51 +02:00
Serge
07d81e6072 Merge pull request #1062 from seerge/power_modes
Power Mode control
2023-08-12 16:23:24 +02:00
Serge
708e3aa40f Update README.md 2023-08-12 16:22:48 +02:00
73 changed files with 6051 additions and 1249 deletions

View File

@@ -3,6 +3,8 @@ name: Release
on:
release:
types: [ published ]
workflow_dispatch:
permissions:
contents: write
@@ -20,9 +22,18 @@ jobs:
- name: Publish
run: |
dotnet publish app/GHelper.sln --configuration Release --runtime win-x64 -p:PublishSingleFile=true --no-self-contained
powershell Compress-Archive app/bin/x64/Release/net7.0-windows/win-x64/publish/* GHelper.zip
powershell Compress-Archive app/bin/x64/Release/net7.0-windows/win-x64/publish/* GHelper-${{ github.sha }}.zip
- name: Upload
if: github.event_name != 'workflow_dispatch'
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release upload ${{ github.ref_name }} GHelper.zip
- name: Artifact
if: github.event_name == 'workflow_dispatch'
uses: actions/upload-artifact@v3
with:
name: GHelper-release-${{ github.sha }}
path: GHelper-*.zip

View File

@@ -2,7 +2,9 @@
using NAudio.Wave;
using Starlight.AnimeMatrix;
using System.Diagnostics;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Timers;
namespace GHelper.AnimeMatrix
@@ -14,12 +16,12 @@ namespace GHelper.AnimeMatrix
SettingsForm settings;
System.Timers.Timer matrixTimer = default!;
AnimeMatrixDevice? mat;
public AnimeMatrixDevice? device;
double[]? AudioValues;
WasapiCapture? AudioDevice;
public bool IsValid => mat != null;
public bool IsValid => device != null;
private long lastPresent;
private List<double> maxes = new List<double>();
@@ -30,14 +32,14 @@ namespace GHelper.AnimeMatrix
try
{
mat = new AnimeMatrixDevice();
Task.Run(mat.WakeUp);
device = new AnimeMatrixDevice();
Task.Run(device.WakeUp);
matrixTimer = new System.Timers.Timer(100);
matrixTimer.Elapsed += MatrixTimer_Elapsed;
}
catch
{
mat = null;
device = null;
}
}
@@ -65,20 +67,28 @@ namespace GHelper.AnimeMatrix
StopMatrixTimer();
StopMatrixAudio();
mat.SetProvider();
try
{
device.SetProvider();
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
return;
}
if (wakeUp && AppConfig.ContainsModel("401")) mat.WakeUp();
if (wakeUp && AppConfig.ContainsModel("401")) device.WakeUp();
if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online))
{
mat.SetDisplayState(false);
mat.SetDisplayState(false); // some devices are dumb
device.SetDisplayState(false);
device.SetDisplayState(false); // some devices are dumb
Logger.WriteLine("Matrix Off");
}
else
{
mat.SetDisplayState(true);
mat.SetBrightness((BrightnessMode)brightness);
device.SetDisplayState(true);
device.SetBrightness((BrightnessMode)brightness);
switch (running)
{
@@ -92,7 +102,7 @@ namespace GHelper.AnimeMatrix
SetMatrixAudio();
break;
default:
mat.SetBuiltInAnimation(true, animation);
device.SetBuiltInAnimation(true, animation);
Logger.WriteLine("Matrix builtin " + animation.AsByte);
break;
@@ -121,10 +131,10 @@ namespace GHelper.AnimeMatrix
switch (AppConfig.Get("matrix_running"))
{
case 2:
mat.PresentNextFrame();
device.PresentNextFrame();
break;
case 3:
mat.PresentClock();
device.PresentClock();
break;
}
@@ -133,7 +143,7 @@ namespace GHelper.AnimeMatrix
public void SetMatrixClock()
{
mat.SetBuiltInAnimation(false);
device.SetBuiltInAnimation(false);
StartMatrixTimer(1000);
Logger.WriteLine("Matrix Clock");
}
@@ -163,7 +173,7 @@ namespace GHelper.AnimeMatrix
{
if (!IsValid) return;
mat.SetBuiltInAnimation(false);
device.SetBuiltInAnimation(false);
StopMatrixTimer();
StopMatrixAudio();
@@ -232,8 +242,8 @@ namespace GHelper.AnimeMatrix
for (int x = 0; x < 2 - (y % 2); x++)
{
//color = (byte)(Math.Min(1,(h - y - 2)*2) * 255);
mat.SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));
mat.SetLedPlanar(x + dx, dy - y, 255);
device.SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));
device.SetLedPlanar(x + dx, dy - y, 255);
}
}
@@ -243,7 +253,7 @@ namespace GHelper.AnimeMatrix
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastPresent) < 70) return;
lastPresent = DateTimeOffset.Now.ToUnixTimeMilliseconds();
mat.Clear();
device.Clear();
int size = 20;
double[] bars = new double[size];
@@ -261,7 +271,7 @@ namespace GHelper.AnimeMatrix
for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i] * 20 / maxAverage);
mat.Present();
device.Present();
}
@@ -296,22 +306,30 @@ namespace GHelper.AnimeMatrix
}
public void SetMatrixPicture(string fileName)
public void SetMatrixPicture(string fileName, bool visualise = true)
{
if (!IsValid) return;
StopMatrixTimer();
Image image;
try
{
using (var fs = new FileStream(fileName, FileMode.Open))
//using (var ms = new MemoryStream())
{
var ms = new MemoryStream();
/*
ms.SetLength(0);
fs.CopyTo(ms);
ms.Position = 0;
image = Image.FromStream(ms);
*/
using (Image image = Image.FromStream(fs))
{
ProcessPicture(image);
Logger.WriteLine("Matrix " + fileName);
}
fs.Close();
if (visualise) settings.VisualiseMatrix(fileName);
}
}
catch
@@ -320,30 +338,60 @@ namespace GHelper.AnimeMatrix
return;
}
mat.SetBuiltInAnimation(false);
mat.ClearFrames();
}
protected void ProcessPicture(Image image)
{
device.SetBuiltInAnimation(false);
device.ClearFrames();
int matrixX = AppConfig.Get("matrix_x", 0);
int matrixY = AppConfig.Get("matrix_y", 0);
int matrixZoom = AppConfig.Get("matrix_zoom", 100);
int matrixSpeed = AppConfig.Get("matrix_speed", 50);
MatrixRotation rotation = (MatrixRotation)AppConfig.Get("matrix_rotation", 0);
InterpolationMode matrixQuality = (InterpolationMode)AppConfig.Get("matrix_quality", 0);
FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]);
int frameCount = image.GetFrameCount(dimension);
if (frameCount > 1)
{
var delayPropertyBytes = image.GetPropertyItem(0x5100).Value;
var frameDelay = BitConverter.ToInt32(delayPropertyBytes) * 10;
for (int i = 0; i < frameCount; i++)
{
image.SelectActiveFrame(dimension, i);
mat.GenerateFrame(image);
mat.AddFrame();
if (rotation == MatrixRotation.Planar)
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality);
else
device.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality);
device.AddFrame();
}
StartMatrixTimer();
Logger.WriteLine("Matrix GIF " + fileName);
Logger.WriteLine("GIF Delay:" + frameDelay);
StartMatrixTimer(Math.Max(matrixSpeed, frameDelay));
//image.SelectActiveFrame(dimension, 0);
}
else
{
mat.GenerateFrame(image);
mat.Present();
Logger.WriteLine("Matrix " + fileName);
if (rotation == MatrixRotation.Planar)
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality);
else
device.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality);
device.Present();
}
}

View File

@@ -3,7 +3,6 @@
using GHelper.AnimeMatrix.Communication;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Globalization;
using System.Management;
using System.Text;
@@ -51,6 +50,12 @@ namespace Starlight.AnimeMatrix
}
}
public enum MatrixRotation
{
Planar,
Diagonal
}
internal class AnimeMatrixPacket : Packet
{
public AnimeMatrixPacket(byte[] command)
@@ -77,6 +82,7 @@ namespace Starlight.AnimeMatrix
}
public class AnimeMatrixDevice : Device
{
int UpdatePageLength = 490;
@@ -86,35 +92,36 @@ namespace Starlight.AnimeMatrix
List<byte[]> frames = new List<byte[]>();
public int MaxRows = 61;
//public int FullRows = 11;
//public int FullEvenRows = -1;
public int dx = 0;
//Shifts the whole frame to the left or right to align with the diagonal cut
public int frameShiftX = 0;
public int MaxColumns = 34;
public int LedStart = 0;
public int FullRows = 11;
private int frameIndex = 0;
private static AnimeType _model = AnimeType.GA402;
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [System.Runtime.InteropServices.In] ref uint pcFonts);
private PrivateFontCollection fonts = new PrivateFontCollection();
public AnimeMatrixDevice()
: base(0x0B05, 0x193B, 640)
public AnimeMatrixDevice() : base(0x0B05, 0x193B, 640)
{
string model = GetModel();
if (model.Contains("401"))
{
_model = AnimeType.GA401;
MaxColumns = 33;
dx = 1;
MaxRows = 55;
LedCount = 1245;
UpdatePageLength = 410;
FullRows = 5;
LedStart = 1;
}
if (model.Contains("GU604"))
@@ -124,14 +131,28 @@ namespace Starlight.AnimeMatrix
MaxColumns = 39;
MaxRows = 92;
LedCount = 1711;
frameShiftX = -5;
UpdatePageLength = 630;
FullRows = 9;
}
_displayBuffer = new byte[LedCount];
LoadMFont();
}
private void LoadMFont()
{
byte[] fontData = GHelper.Properties.Resources.MFont;
IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length);
System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length);
uint dummy = 0;
fonts.AddMemoryFont(fontPtr, GHelper.Properties.Resources.MFont.Length);
AddFontMemResourceEx(fontPtr, (uint)GHelper.Properties.Resources.MFont.Length, IntPtr.Zero, ref dummy);
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);
}
public string GetModel()
{
@@ -175,28 +196,7 @@ namespace Starlight.AnimeMatrix
}
public static int FirstX(int y)
{
switch (_model)
{
case AnimeType.GA401:
if (y < 5)
{
return 0;
}
else
{
return (y + 1) / 2 - 3;
}
case AnimeType.GU604:
return (int)Math.Ceiling(Math.Max(0, y - 9) / 2F);
default:
return (int)Math.Ceiling(Math.Max(0, y - 11) / 2F);
}
}
public static int Width(int y)
public int Width()
{
switch (_model)
{
@@ -209,7 +209,30 @@ namespace Starlight.AnimeMatrix
}
}
public static int Pitch(int y)
public int FirstX(int y)
{
switch (_model)
{
case AnimeType.GA401:
if (y < 5 && y % 2 == 0)
{
return 1;
}
return (int)Math.Ceiling(Math.Max(0, y - 5) / 2F);
case AnimeType.GU604:
if (y < 9 && y % 2 == 0)
{
return 1;
}
return (int)Math.Ceiling(Math.Max(0, y - 9) / 2F);
default:
return (int)Math.Ceiling(Math.Max(0, y - 11) / 2F);
}
}
public int Pitch(int y)
{
switch (_model)
{
@@ -226,15 +249,38 @@ namespace Starlight.AnimeMatrix
default:
return 36 - y / 2;
}
case AnimeType.GU604:
switch (y)
{
case 0:
case 2:
case 4:
case 6:
case 8:
return 38;
case 1:
case 3:
case 5:
case 7:
case 9:
return 39;
default:
return Width() - FirstX(y);
}
default:
return Width(y) - FirstX(y);
return Width() - FirstX(y);
}
}
public int RowToLinearAddress(int y)
{
int ret = 0;
int ret = LedStart;
for (var i = 0; i < y; i++)
ret += Pitch(i);
@@ -245,10 +291,21 @@ namespace Starlight.AnimeMatrix
{
if (!IsRowInRange(y)) return;
if (x >= FirstX(y) && x < Width(y))
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x + dx + frameShiftX, value);
if (x >= FirstX(y) && x < Width())
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x, value);
}
public void SetLedDiagonal(int x, int y, byte color, int deltaX = 0, int deltaY = 0)
{
x += deltaX;
y -= deltaY;
int plX = (x - y) / 2;
int plY = x + y;
SetLedPlanar(plX, plY, color);
}
public void WakeUp()
{
Set(Packet<AnimeMatrixPacket>(Encoding.ASCII.GetBytes("ASUS Tech.Inc.")));
@@ -342,57 +399,77 @@ namespace Starlight.AnimeMatrix
}
public void PresentClock()
private void SetBitmapDiagonal(Bitmap bmp, int deltaX = 0, int deltaY = 0)
{
int second = DateTime.Now.Second;
string time;
if (CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern.Contains("H"))
time = DateTime.Now.ToString("H" + ((second % 2 == 0) ? ":" : " ") + "mm");
else
time = DateTime.Now.ToString("h" + ((second % 2 == 0) ? ":" : " ") + "mmtt");
if (_model == AnimeType.GA401)
PresentText(time);
else
PresentTextDiagonal(time);
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
if (color > 20)
SetLedDiagonal(x, y, (byte)color, deltaX + (FullRows / 2) + 1, deltaY - (FullRows / 2) - 1);
}
}
}
public void PresentText(string text1, string text2 = "")
private void SetBitmapLinear(Bitmap bmp)
{
using (Bitmap bmp = new Bitmap(MaxColumns * 3, MaxRows))
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
if (x % 2 == y % 2)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
if (color > 20)
SetLedPlanar(x / 2, y, (byte)color);
}
}
}
public void Text(string text, float fontSize = 10, int x = 0, int y = 0)
{
int width = MaxRows - FullRows;
int height = MaxRows - FullRows;
int textHeight, textWidth;
using (Bitmap bmp = new Bitmap(width, height))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
using (Font font = new Font("Consolas", 21F, FontStyle.Regular, GraphicsUnit.Pixel))
using (Font font = new Font(fonts.Families[0], fontSize, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text1, font);
g.DrawString(text1, font, Brushes.White, (MaxColumns * 3 - textSize.Width) + 3, -4);
SizeF textSize = g.MeasureString(text, font);
textHeight = (int)textSize.Height;
textWidth = (int)textSize.Width;
g.DrawString(text, font, Brushes.White, x, height - y);
}
if (text2.Length > 0)
using (Font font = new Font("Consolas", 18F, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text2, font);
g.DrawString(text2, font, Brushes.White, (MaxColumns * 3 - textSize.Width) + 1, 25);
}
}
GenerateFrame(bmp, InterpolationMode.Bicubic);
Present();
}
SetBitmapDiagonal(bmp, (width - textWidth), height);
}
}
public void GenerateFrame(Image image, InterpolationMode interpolation = InterpolationMode.High)
public void PresentClock()
{
string second = (DateTime.Now.Second % 2 == 0) ? ":" : " ";
string time = DateTime.Now.ToString("HH" + second + "mm");
Clear();
Text(time, 15, 0, 25);
Text(DateTime.Now.ToString("yy'. 'MM'. 'dd"), 11.5F, 0, 14);
Present();
}
public void GenerateFrame(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
{
int width = MaxColumns / 2 * 6;
int height = MaxRows;
@@ -402,99 +479,55 @@ namespace Starlight.AnimeMatrix
using (Bitmap bmp = new Bitmap(targetWidth, height))
{
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height);
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height) * zoom / 100;
using (var graph = Graphics.FromImage(bmp))
{
var scaleWidth = (float)(image.Width * scale);
var scaleHeight = (float)(image.Height * scale);
graph.InterpolationMode = interpolation;
graph.InterpolationMode = quality;
graph.CompositingQuality = CompositingQuality.HighQuality;
graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, (float)Math.Round(targetWidth - scaleWidth * targetWidth / width), 0, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);
graph.DrawImage(image, (float)Math.Round(targetWidth - (scaleWidth + panX) * targetWidth / width), -panY, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);
}
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
if (x % 2 == (y + dx) % 2)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
if (color < 10) color = 0;
SetLedPlanar(x / 2, y, (byte)color);
}
}
Clear();
SetBitmapLinear(bmp);
}
}
public void SetLedDiagonal(int x, int y, byte color, int delta = 10)
public void GenerateFrameDiagonal(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
{
//x+=delta;
y -= delta;
int width = MaxRows - FullRows;
int height = MaxRows - FullRows*2;
float scale;
int dx = (x - y) / 2;
int dy = x + y;
SetLedPlanar(dx, dy, color);
}
public void PresentTextDiagonal(string text)
{
Clear();
InstalledFontCollection installedFontCollection = new InstalledFontCollection();
string familyName;
string familyList = "";
FontFamily[] fontFamilies;
// Get the array of FontFamily objects.
fontFamilies = installedFontCollection.Families;
int count = fontFamilies.Length;
for (int j = 0; j < count; ++j)
using (Bitmap bmp = new Bitmap(width, height))
{
familyName = fontFamilies[j].Name;
familyList = familyList + familyName;
familyList = familyList + ", ";
}
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height) * zoom / 100;
int maxX = (int)Math.Sqrt(MaxRows * MaxRows + MaxColumns * MaxColumns);
using (Bitmap bmp = new Bitmap(maxX, MaxRows))
{
using (Graphics g = Graphics.FromImage(bmp))
using (var graph = Graphics.FromImage(bmp))
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
var scaleWidth = (float)(image.Width * scale);
var scaleHeight = (float)(image.Height * scale);
graph.InterpolationMode = quality;
graph.CompositingQuality = CompositingQuality.HighQuality;
graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, width - scaleWidth, height - scaleHeight, scaleWidth, scaleHeight);
using (Font font = new Font("Consolas", 13F, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text, font);
g.DrawString(text, font, Brushes.White, 4, 1);
}
}
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
SetLedDiagonal(x, y, (byte)color);
}
}
Clear();
SetBitmapDiagonal(bmp, -panX, height + panY);
}
Present();
}
private bool IsRowInRange(int row)
{
return (row >= 0 && row < MaxRows);

View File

@@ -7,7 +7,10 @@ public static class AppConfig
{
private static string configFile;
private static string? _model;
private static string? _modelShort;
private static string? _bios;
private static Dictionary<string, object> config = new Dictionary<string, object>();
@@ -69,6 +72,34 @@ public static class AppConfig
return _model;
}
public static (string, string) GetBiosAndModel()
{
if (_bios is not null && _modelShort is not null) return (_bios, _modelShort);
using (ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_BIOS"))
{
using (ManagementObjectCollection objCollection = objSearcher.Get())
{
foreach (ManagementObject obj in objCollection)
if (obj["SMBIOSBIOSVersion"] is not null)
{
string[] results = obj["SMBIOSBIOSVersion"].ToString().Split(".");
if (results.Length > 1)
{
_modelShort = results[0];
_bios = results[1];
}
else
{
_modelShort = obj["SMBIOSBIOSVersion"].ToString();
}
}
return (_bios, _modelShort);
}
}
}
public static string GetModelShort()
{
string model = GetModel();
@@ -79,7 +110,6 @@ public static class AppConfig
public static bool ContainsModel(string contains)
{
GetModel();
return (_model is not null && _model.ToLower().Contains(contains.ToLower()));
}
@@ -272,7 +302,7 @@ public static class AppConfig
public static bool NoMKeys()
{
return ContainsModel("Z13") ||
return (ContainsModel("Z13") && !IsARCNM()) ||
ContainsModel("FX706") ||
ContainsModel("FA506") ||
ContainsModel("FX506") ||
@@ -280,15 +310,25 @@ public static class AppConfig
ContainsModel("FX505");
}
public static bool IsARCNM()
{
return ContainsModel("GZ301VIC");
}
public static bool IsTUF()
{
return ContainsModel("TUF");
}
public static bool IsVivobook()
{
return ContainsModel("Vivobook");
}
// Devices with bugged bios command to change brightness
public static bool SwappedBrightness()
{
return ContainsModel("FA506IH") || ContainsModel("FX506LU");
return ContainsModel("FA506IH") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH");
}
@@ -305,7 +345,7 @@ public static class AppConfig
public static bool IsSingleColor()
{
return ContainsModel("GA401");
return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("X13");
}
public static bool IsStrix()
@@ -313,6 +353,11 @@ public static class AppConfig
return ContainsModel("Strix") || ContainsModel("Scar");
}
public static bool IsStrixLimitedRGB()
{
return ContainsModel("G614JV") || ContainsModel("G614JZ");
}
public static bool IsZ13()
{
return ContainsModel("Z13");
@@ -336,7 +381,7 @@ public static class AppConfig
public static bool NoAutoUltimate()
{
return ContainsModel("G614") || ContainsModel("GU604");
return ContainsModel("G614") || ContainsModel("GU604") || ContainsModel("FX507") || ContainsModel("G513");
}
@@ -348,12 +393,27 @@ public static class AppConfig
return
Is("manual_mode") ||
ContainsModel("GU604") ||
ContainsModel("G733");
ContainsModel("G733") ||
ContainsModel("FX507Z");
}
public static bool IsFanScale()
{
if (!ContainsModel("GU604")) return false;
try
{
var (bios, model) = GetBiosAndModel();
return (Int32.Parse(bios) < 312);
} catch
{
return false;
}
}
public static bool IsFanRequired()
{
return ContainsModel("GA402X") || ContainsModel("G513");
return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R") || ContainsModel("G713P");
}
public static bool IsPowerRequired()
@@ -363,7 +423,7 @@ public static class AppConfig
public static bool IsGPUFixNeeded()
{
return ContainsModel("GA402X") || ContainsModel("GV302");
return ContainsModel("GA402X") || ContainsModel("GV302") || ContainsModel("GZ301") || ContainsModel("FX506") || ContainsModel("GU603V");
}
public static bool IsGPUFix()
@@ -371,4 +431,14 @@ public static class AppConfig
return Is("gpu_fix") || (ContainsModel("GA402X") && IsNotFalse("gpu_fix"));
}
public static bool IsForceSetGPUMode()
{
return Is("gpu_mode_force_set") || ContainsModel("503");
}
public static bool IsNoGPUModes()
{
return ContainsModel("GV301RA") || ContainsModel("GV302XA") || IsAlly();
}
}

View File

@@ -1,4 +1,5 @@
using System.Management;
using GHelper;
using System.Management;
using System.Runtime.InteropServices;
public enum AsusFan
@@ -55,17 +56,24 @@ public class AsusACPI
public const uint GPU_Fan = 0x00110014;
public const uint Mid_Fan = 0x00110031;
public const uint PerformanceMode = 0x00120075; // Thermal Control
public const uint PerformanceMode = 0x00120075; // Performance modes
public const uint VivoBookMode = 0x00110019; // Vivobook performance modes
public const uint GPUEco = 0x00090020;
public const uint GPUXGConnected = 0x00090018;
public const uint GPUXG = 0x00090019;
public const uint GPUMux = 0x00090016;
public const uint GPUMuxVivo = 0x00090026;
public const uint BatteryLimit = 0x00120057;
public const uint ScreenOverdrive = 0x00050019;
public const uint ScreenMiniled = 0x0005001E;
public const uint DevsCPUFan = 0x00110022;
public const uint DevsGPUFan = 0x00110023;
public const uint DevsCPUFanCurve = 0x00110024;
public const uint DevsGPUFanCurve = 0x00110025;
public const uint DevsMidFanCurve = 0x00110032;
@@ -87,14 +95,19 @@ public class AsusACPI
public const int TUF_KB_BRIGHTNESS = 0x00050021;
public const int TUF_KB = 0x00100056;
public const int TUF_KB2 = 0x0010005a;
public const int TUF_KB_STATE = 0x00100057;
public const int MICMUTE_LED = 0x00040017;
public const int TabletState = 0x00060077;
public const int FnLock = 0x00100023;
public const int ScreenPadToggle = 0x00050031;
public const int ScreenPadBrightness = 0x00050032;
public const int BootSound = 0x00130022;
public const int Tablet_Notebook = 0;
public const int Tablet_Tablet = 1;
public const int Tablet_Tent = 2;
@@ -220,6 +233,11 @@ public class AsusACPI
DefaultTotal = 50;
}
if (AppConfig.IsAlly())
{
MaxTotal = 50;
DefaultTotal = 30;
}
}
@@ -248,7 +266,7 @@ public class AsusACPI
protected byte[] CallMethod(uint MethodID, byte[] args)
{
byte[] acpiBuf = new byte[8 + args.Length];
byte[] outBuffer = new byte[20];
byte[] outBuffer = new byte[16];
BitConverter.GetBytes((uint)MethodID).CopyTo(acpiBuf, 0);
BitConverter.GetBytes((uint)args.Length).CopyTo(acpiBuf, 4);
@@ -269,7 +287,7 @@ public class AsusACPI
}
public int DeviceSet(uint DeviceID, int Status, string logName)
public int DeviceSet(uint DeviceID, int Status, string? logName)
{
byte[] args = new byte[8];
BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
@@ -278,12 +296,14 @@ public class AsusACPI
byte[] status = CallMethod(DEVS, args);
int result = BitConverter.ToInt32(status, 0);
Logger.WriteLine(logName + " = " + Status + " : " + (result == 1 ? "OK" : result));
if (logName is not null)
Logger.WriteLine(logName + " = " + Status + " : " + (result == 1 ? "OK" : result));
return result;
}
public int DeviceSet(uint DeviceID, byte[] Params, string logName)
public int DeviceSet(uint DeviceID, byte[] Params, string? logName)
{
byte[] args = new byte[4 + Params.Length];
BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
@@ -292,7 +312,9 @@ public class AsusACPI
byte[] status = CallMethod(DEVS, args);
int result = BitConverter.ToInt32(status, 0);
Logger.WriteLine(logName + " = " + BitConverter.ToString(Params) + " : " + (result == 1 ? "OK" : result));
if (logName is not null)
Logger.WriteLine(logName + " = " + BitConverter.ToString(Params) + " : " + (result == 1 ? "OK" : result));
return BitConverter.ToInt32(status, 0);
}
@@ -330,6 +352,56 @@ public class AsusACPI
return -1;
}
public int GetFan(AsusFan device)
{
int fan = -1;
switch (device)
{
case AsusFan.GPU:
fan = Program.acpi.DeviceGet(GPU_Fan);
break;
case AsusFan.Mid:
fan = Program.acpi.DeviceGet(Mid_Fan);
break;
default:
fan = Program.acpi.DeviceGet(CPU_Fan);
break;
}
if (fan < 0)
{
fan += 65536;
if (fan <= 0 || fan > 100) fan = -1;
}
return fan;
}
public int SetFanRange(AsusFan device, byte[] curve)
{
if (curve.Length != 16) return -1;
if (curve.All(singleByte => singleByte == 0)) return -1;
byte min = (byte)(curve[8] * 255 / 100);
byte max = (byte)(curve[15] * 255 / 100);
byte[] range = { min, max};
int result;
switch (device)
{
case AsusFan.GPU:
result = DeviceSet(DevsGPUFan, range, "FanRangeGPU");
break;
default:
result = DeviceSet(DevsCPUFan, range, "FanRangeCPU");
break;
}
return result;
}
public int SetFanCurve(AsusFan device, byte[] curve)
{
@@ -338,13 +410,15 @@ public class AsusACPI
if (curve.All(singleByte => singleByte == 0)) return -1;
int result;
int fanScale = AppConfig.Get("fan_scale", 100);
int defaultScale = (AppConfig.IsFanScale() && (device == AsusFan.CPU || device == AsusFan.GPU)) ? 130 : 100;
int fanScale = AppConfig.Get("fan_scale", defaultScale);
if (fanScale != 100 && device == AsusFan.CPU) Logger.WriteLine("Custom fan scale: " + fanScale);
// it seems to be a bug, when some old model's bios can go nuts if fan is set to 100%
for (int i = 8; i < curve.Length; i++) curve[i] = (byte)(Math.Max((byte)0, Math.Min((byte)99, curve[i])) * fanScale / 100);
for (int i = 8; i < curve.Length; i++) curve[i] = (byte)(Math.Max((byte)0, Math.Min((byte)100, curve[i])) * fanScale / 100);
switch (device)
{
@@ -401,7 +475,14 @@ public class AsusACPI
if (curve.Length != 16) throw new Exception("Incorrect curve");
var points = new Dictionary<byte, byte>();
for (int i = 0; i < 8; i++) points[curve[i]] = curve[i + 8];
byte old = 0;
for (int i = 0; i < 8; i++)
{
if (curve[i] == old) curve[i]++; // preventing 2 points in same spot from default asus profiles
points[curve[i]] = curve[i + 8];
old = curve[i];
}
var pointsFixed = new Dictionary<byte, byte>();
bool fix = false;
@@ -468,19 +549,20 @@ public class AsusACPI
DeviceSet(TUF_KB_BRIGHTNESS, param, "TUF Brightness");
}
public void TUFKeyboardRGB(int mode, Color color, int speed)
public void TUFKeyboardRGB(int mode, Color color, int speed, string? log = "TUF RGB")
{
byte[] setting = new byte[12];
setting[0] = (byte)0xB4;
byte[] setting = new byte[6];
setting[0] = (byte)0xb4;
setting[1] = (byte)mode;
setting[2] = color.R;
setting[3] = color.G;
setting[4] = color.B;
setting[5] = (byte)speed;
DeviceSet(TUF_KB, setting, "TUF RGB");
//Debug.WriteLine(BitConverter.ToString(setting));
int result = DeviceSet(TUF_KB, setting, log);
if (result != 1) DeviceSet(TUF_KB2, setting, log);
}

View File

@@ -33,6 +33,14 @@
labelProfile = new Label();
panelPerformance = new Panel();
panelPerformanceOther = new Panel();
panelDeceleration = new Panel();
labelDeceleration = new Label();
sliderDeceleration = new UI.Slider();
labelDecelerationValue = new Label();
panelAcceleration = new Panel();
labelAcceleration = new Label();
sliderAcceleration = new UI.Slider();
labelAccelerationValue = new Label();
panelLiftOffDistance = new Panel();
labelLiftOffDistance = new Label();
comboBoxLiftOffDistance = new UI.RComboBox();
@@ -108,6 +116,8 @@
panelProfiles.SuspendLayout();
panelPerformance.SuspendLayout();
panelPerformanceOther.SuspendLayout();
panelDeceleration.SuspendLayout();
panelAcceleration.SuspendLayout();
panelLiftOffDistance.SuspendLayout();
panelDebounce.SuspendLayout();
panelAngleSnapping.SuspendLayout();
@@ -182,13 +192,15 @@
panelPerformance.Location = new Point(11, 68);
panelPerformance.Name = "panelPerformance";
panelPerformance.Padding = new Padding(0, 11, 0, 25);
panelPerformance.Size = new Size(654, 461);
panelPerformance.Size = new Size(654, 555);
panelPerformance.TabIndex = 1;
//
// panelPerformanceOther
//
panelPerformanceOther.AutoSize = true;
panelPerformanceOther.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelPerformanceOther.Controls.Add(panelDeceleration);
panelPerformanceOther.Controls.Add(panelAcceleration);
panelPerformanceOther.Controls.Add(panelLiftOffDistance);
panelPerformanceOther.Controls.Add(panelDebounce);
panelPerformanceOther.Controls.Add(panelAngleSnapping);
@@ -197,9 +209,103 @@
panelPerformanceOther.Location = new Point(0, 240);
panelPerformanceOther.Name = "panelPerformanceOther";
panelPerformanceOther.Padding = new Padding(0, 11, 0, 11);
panelPerformanceOther.Size = new Size(654, 196);
panelPerformanceOther.Size = new Size(654, 290);
panelPerformanceOther.TabIndex = 49;
//
// panelDeceleration
//
panelDeceleration.AutoSize = true;
panelDeceleration.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelDeceleration.Controls.Add(labelDeceleration);
panelDeceleration.Controls.Add(sliderDeceleration);
panelDeceleration.Controls.Add(labelDecelerationValue);
panelDeceleration.Dock = DockStyle.Top;
panelDeceleration.Location = new Point(0, 232);
panelDeceleration.Name = "panelDeceleration";
panelDeceleration.Padding = new Padding(5);
panelDeceleration.Size = new Size(654, 47);
panelDeceleration.TabIndex = 58;
//
// labelDeceleration
//
labelDeceleration.Location = new Point(6, 7);
labelDeceleration.Margin = new Padding(6, 0, 6, 0);
labelDeceleration.Name = "labelDeceleration";
labelDeceleration.Size = new Size(348, 33);
labelDeceleration.TabIndex = 52;
labelDeceleration.Text = "Deceleration";
//
// sliderDeceleration
//
sliderDeceleration.AccessibleName = "DPI Slider";
sliderDeceleration.Location = new Point(368, 9);
sliderDeceleration.Max = 9;
sliderDeceleration.Min = 0;
sliderDeceleration.Name = "sliderDeceleration";
sliderDeceleration.Size = new Size(213, 30);
sliderDeceleration.Step = 1;
sliderDeceleration.TabIndex = 50;
sliderDeceleration.TabStop = false;
sliderDeceleration.Text = "sliderBattery";
sliderDeceleration.Value = 0;
//
// labelDecelerationValue
//
labelDecelerationValue.Location = new Point(590, 9);
labelDecelerationValue.Margin = new Padding(6, 0, 6, 0);
labelDecelerationValue.Name = "labelDecelerationValue";
labelDecelerationValue.Size = new Size(60, 30);
labelDecelerationValue.TabIndex = 51;
labelDecelerationValue.Text = "0";
labelDecelerationValue.TextAlign = ContentAlignment.MiddleRight;
//
// panelAcceleration
//
panelAcceleration.AutoSize = true;
panelAcceleration.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelAcceleration.Controls.Add(labelAcceleration);
panelAcceleration.Controls.Add(sliderAcceleration);
panelAcceleration.Controls.Add(labelAccelerationValue);
panelAcceleration.Dock = DockStyle.Top;
panelAcceleration.Location = new Point(0, 185);
panelAcceleration.Name = "panelAcceleration";
panelAcceleration.Padding = new Padding(5);
panelAcceleration.Size = new Size(654, 47);
panelAcceleration.TabIndex = 57;
//
// labelAcceleration
//
labelAcceleration.Location = new Point(6, 7);
labelAcceleration.Margin = new Padding(6, 0, 6, 0);
labelAcceleration.Name = "labelAcceleration";
labelAcceleration.Size = new Size(348, 33);
labelAcceleration.TabIndex = 52;
labelAcceleration.Text = "Acceleration";
//
// sliderAcceleration
//
sliderAcceleration.AccessibleName = "DPI Slider";
sliderAcceleration.Location = new Point(368, 9);
sliderAcceleration.Max = 9;
sliderAcceleration.Min = 0;
sliderAcceleration.Name = "sliderAcceleration";
sliderAcceleration.Size = new Size(213, 30);
sliderAcceleration.Step = 1;
sliderAcceleration.TabIndex = 50;
sliderAcceleration.TabStop = false;
sliderAcceleration.Text = "sliderBattery";
sliderAcceleration.Value = 0;
//
// labelAccelerationValue
//
labelAccelerationValue.Location = new Point(590, 9);
labelAccelerationValue.Margin = new Padding(6, 0, 6, 0);
labelAccelerationValue.Name = "labelAccelerationValue";
labelAccelerationValue.Size = new Size(60, 30);
labelAccelerationValue.TabIndex = 51;
labelAccelerationValue.Text = "0";
labelAccelerationValue.TextAlign = ContentAlignment.MiddleRight;
//
// panelLiftOffDistance
//
panelLiftOffDistance.AutoSize = true;
@@ -656,7 +762,7 @@
panelLighting.Controls.Add(panelLightingContent);
panelLighting.Controls.Add(panelLightingHeader);
panelLighting.Dock = DockStyle.Top;
panelLighting.Location = new Point(11, 529);
panelLighting.Location = new Point(11, 623);
panelLighting.Name = "panelLighting";
panelLighting.Padding = new Padding(0, 0, 0, 25);
panelLighting.Size = new Size(654, 329);
@@ -985,7 +1091,7 @@
panelEnergy.Controls.Add(labelAutoPowerOff);
panelEnergy.Controls.Add(panelEnergyHeader);
panelEnergy.Dock = DockStyle.Top;
panelEnergy.Location = new Point(11, 858);
panelEnergy.Location = new Point(11, 952);
panelEnergy.Name = "panelEnergy";
panelEnergy.Padding = new Padding(0, 0, 0, 25);
panelEnergy.Size = new Size(654, 143);
@@ -1166,7 +1272,7 @@
panelBottomButtons.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelBottomButtons.Controls.Add(buttonSync);
panelBottomButtons.Dock = DockStyle.Top;
panelBottomButtons.Location = new Point(11, 1001);
panelBottomButtons.Location = new Point(11, 1095);
panelBottomButtons.Name = "panelBottomButtons";
panelBottomButtons.Size = new Size(654, 67);
panelBottomButtons.TabIndex = 47;
@@ -1260,6 +1366,8 @@
panelPerformance.PerformLayout();
panelPerformanceOther.ResumeLayout(false);
panelPerformanceOther.PerformLayout();
panelDeceleration.ResumeLayout(false);
panelAcceleration.ResumeLayout(false);
panelLiftOffDistance.ResumeLayout(false);
panelDebounce.ResumeLayout(false);
panelAngleSnapping.ResumeLayout(false);
@@ -1379,5 +1487,13 @@
private Panel panelAngleSnapping;
private Panel panelLiftOffDistance;
private Panel panelDebounce;
private Panel panelDeceleration;
private Label labelDeceleration;
private UI.Slider sliderDeceleration;
private Label labelDecelerationValue;
private Panel panelAcceleration;
private Label labelAcceleration;
private UI.Slider sliderAcceleration;
private Label labelAccelerationValue;
}
}

View File

@@ -46,6 +46,8 @@ namespace GHelper
labelChargingState.Text = "(" + Properties.Strings.Charging + ")";
labelProfile.Text = Properties.Strings.Profile;
labelButtonDebounce.Text = Properties.Strings.MouseButtonResponse;
labelAcceleration.Text = Properties.Strings.Acceleration;
labelDeceleration.Text = Properties.Strings.Deceleration;
buttonLightingZoneLogo.Text = Properties.Strings.AuraZoneLogo;
buttonLightingZoneScroll.Text = Properties.Strings.AuraZoneScroll;
@@ -80,6 +82,12 @@ namespace GHelper
sliderButtonDebounce.ValueChanged += SliderButtonDebounce_ValueChanged;
sliderButtonDebounce.MouseUp += SliderButtonDebounce_MouseUp;
sliderAcceleration.MouseUp += SliderAcceleration_MouseUp;
sliderAcceleration.ValueChanged += SliderAcceleration_ValueChanged;
sliderDeceleration.MouseUp += SliderDeceleration_MouseUp;
sliderDeceleration.ValueChanged += SliderDeceleration_ValueChanged;
buttonLightingColor.Click += ButtonLightingColor_Click;
comboBoxLightingMode.DropDownClosed += ComboBoxLightingMode_DropDownClosed;
sliderBrightness.MouseUp += SliderBrightness_MouseUp;
@@ -103,6 +111,26 @@ namespace GHelper
RefreshMouseData();
}
private void SliderAcceleration_MouseUp(object? sender, MouseEventArgs e)
{
mouse.SetAcceleration(sliderAcceleration.Value);
}
private void SliderAcceleration_ValueChanged(object? sender, EventArgs e)
{
labelAccelerationValue.Text = sliderAcceleration.Value.ToString();
}
private void SliderDeceleration_MouseUp(object? sender, MouseEventArgs e)
{
mouse.SetDeceleration(sliderDeceleration.Value);
}
private void SliderDeceleration_ValueChanged(object? sender, EventArgs e)
{
labelDecelerationValue.Text = sliderDeceleration.Value.ToString();
}
private void SliderButtonDebounce_MouseUp(object? sender, MouseEventArgs e)
{
DebounceTime dbt = (DebounceTime)sliderButtonDebounce.Value;
@@ -273,8 +301,10 @@ namespace GHelper
private void ComboBoxAnimationSpeed_DropDownClosed(object? sender, EventArgs e)
{
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
ls.AnimationSpeed = (AnimationSpeed)comboBoxAnimationSpeed.SelectedIndex;
// 0 => 0x9
// 1 => 0x7
// 2 => 0x5
ls.AnimationSpeed = (AnimationSpeed)(0x9 - (comboBoxAnimationSpeed.SelectedIndex * 0x2));
UpdateLightingSettings(ls, visibleZone);
}
@@ -513,6 +543,24 @@ namespace GHelper
panelAngleSnapping.Visible = false;
}
if (mouse.HasAcceleration())
{
sliderAcceleration.Max = mouse.MaxAcceleration();
}
else
{
panelAcceleration.Visible = false;
}
if (mouse.HasDeceleration())
{
sliderDeceleration.Max = mouse.MaxDeceleration();
}
else
{
panelDeceleration.Visible = false;
}
if (mouse.HasLiftOffSetting())
{
comboBoxLiftOffDistance.Items.AddRange(new string[] {
@@ -556,6 +604,12 @@ namespace GHelper
labelLowBatteryWarningValue.Visible = false;
sliderLowBatteryWarning.Visible = false;
}
else
{
sliderLowBatteryWarning.Min = 0;
sliderLowBatteryWarning.Step = mouse.LowBatteryWarningStep();
sliderLowBatteryWarning.Max = mouse.LowBatteryWarningMax();
}
if (!mouse.HasAutoPowerOff() && !mouse.HasLowBatteryWarning())
{
@@ -681,6 +735,16 @@ namespace GHelper
{
sliderButtonDebounce.Value = (int)mouse.Debounce;
}
if (mouse.HasAcceleration())
{
sliderAcceleration.Value = mouse.Acceleration;
}
if (mouse.HasDeceleration())
{
sliderDeceleration.Value = mouse.Deceleration;
}
}
private void VisualizeBatteryState()
@@ -768,8 +832,10 @@ namespace GHelper
else
pictureBoxLightingColor.BackColor = ls.RGBColor;
comboBoxAnimationSpeed.SelectedIndex = (((int)ls.AnimationSpeed) - 5) / 2;
//0x09 => 0
//0x07 => 1
//0x05 => 2
comboBoxAnimationSpeed.SelectedIndex = 2 - ((((int)ls.AnimationSpeed) - 5) / 2);
comboBoxAnimationDirection.SelectedIndex = (int)ls.AnimationDirection;
}
@@ -797,6 +863,10 @@ namespace GHelper
private void VisualizeCurrentDPIProfile()
{
AsusMouseDPI dpi = mouse.DpiSettings[mouse.DpiProfile - 1];
if (dpi is null)
{
return;
}
sliderDPI.Value = (int)dpi.DPI;
pictureDPIColor.BackColor = dpi.Color;
}

View File

@@ -1,5 +1,9 @@
using GHelper.Helpers;
using GHelper.Gpu;
using GHelper.Helpers;
using HidLibrary;
using NAudio.Gui;
using System.Diagnostics;
using System.Drawing;
using System.Text;
namespace GHelper
@@ -37,6 +41,7 @@ namespace GHelper
public static class AsusUSB
{
public const int HEATMAP = 20;
public const int GPUMODE = 21;
public const int ASUS_ID = 0x0b05;
@@ -59,7 +64,7 @@ namespace GHelper
public static Color Color1 = Color.White;
public static Color Color2 = Color.Black;
static bool isTuf = AppConfig.IsTUF();
static bool isTuf = AppConfig.IsTUF() || AppConfig.IsVivobook();
static bool isStrix = AppConfig.IsStrix();
static public bool isSingleColor = false;
@@ -116,10 +121,10 @@ namespace GHelper
{
timer.Elapsed += Timer_Elapsed;
isSingleColor = AppConfig.ContainsModel("GA401") || AppConfig.ContainsModel("X13"); // Mono Color
isSingleColor = AppConfig.IsSingleColor(); // Mono Color
var device = GetDevice(AURA_HID_ID);
if (device is not null && device.Attributes.Version == 22 && AppConfig.ContainsModel("GA402X")) isSingleColor = true;
if (device is not null && (device.Attributes.Version == 22 || device.Attributes.Version == 23) && (AppConfig.ContainsModel("GA402X") || AppConfig.ContainsModel("GA402N"))) isSingleColor = true;
}
private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
@@ -153,33 +158,40 @@ namespace GHelper
};
}
static Dictionary<int, string> _modesSingleColor = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 10, Properties.Strings.AuraStrobe },
};
static Dictionary<int, string> _modes = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 10, Properties.Strings.AuraStrobe },
{ HEATMAP, "Heatmap"}
};
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 10, Properties.Strings.AuraStrobe },
{ HEATMAP, "Heatmap"},
{ GPUMODE, "GPU Mode" }
};
static Dictionary<int, string> _modesStrix = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 4, "Star" },
{ 5, "Rain" },
{ 6, "Highlight" },
{ 7, "Laser" },
{ 8, "Ripple" },
{ 10, Properties.Strings.AuraStrobe},
{ 11, "Comet" },
{ 12, "Flash" },
{ HEATMAP, "Heatmap"}
};
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 4, "Star" },
{ 5, "Rain" },
{ 6, "Highlight" },
{ 7, "Laser" },
{ 8, "Ripple" },
{ 10, Properties.Strings.AuraStrobe},
{ 11, "Comet" },
{ 12, "Flash" },
{ HEATMAP, "Heatmap"}
};
public static Dictionary<int, string> GetModes()
@@ -191,9 +203,7 @@ namespace GHelper
if (isSingleColor)
{
_modes.Remove(2);
_modes.Remove(3);
_modes.Remove(HEATMAP);
return _modesSingleColor;
}
if (AppConfig.IsAdvantageEdition())
@@ -201,7 +211,7 @@ namespace GHelper
return _modes;
}
if (AppConfig.IsStrix())
if (AppConfig.IsStrix() && !AppConfig.IsStrixLimitedRGB())
{
return _modesStrix;
}
@@ -323,13 +333,15 @@ namespace GHelper
}
public static void ApplyBrightness(int brightness, string log = "Backlight")
public static void ApplyBrightness(int brightness, string log = "Backlight", bool delay = false)
{
Task.Run(async () =>
{
if (delay) await Task.Delay(TimeSpan.FromSeconds(1));
if (isTuf) Program.acpi.TUFKeyboardBrightness(brightness);
byte[] msg = { AURA_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
@@ -380,63 +392,58 @@ namespace GHelper
public static void ApplyAuraPower()
{
Task.Run(async () =>
AuraPower flags = new();
// Keyboard
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
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
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
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)
{
AuraPower flags = new();
// Keyboard
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
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
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
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)
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
device.WriteFeatureData(msg);
Logger.WriteLine("USB-KB " + device.Attributes.ProductHexId + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
device.WriteFeatureData(msg);
Logger.WriteLine("USB-KB " + device.Attributes.ProductHexId + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
}
if (isTuf)
Program.acpi.TUFKeyboardPower(
flags.AwakeKeyb,
flags.BootKeyb,
flags.SleepKeyb,
flags.ShutdownKeyb);
});
if (isTuf)
Program.acpi.TUFKeyboardPower(
flags.AwakeKeyb,
flags.BootKeyb,
flags.SleepKeyb,
flags.ShutdownKeyb);
}
@@ -465,7 +472,7 @@ namespace GHelper
if (isTuf)
{
Program.acpi.TUFKeyboardRGB(0, color, 0);
Program.acpi.TUFKeyboardRGB(0, color, 0, null);
return;
}
@@ -524,6 +531,7 @@ namespace GHelper
else
{
//Debug.WriteLine(color.ToString());
auraDevice.Write(AuraMessage(0, color, color, 0));
auraDevice.Write(MESSAGE_SET);
}
@@ -531,6 +539,27 @@ namespace GHelper
}
public static void ApplyGPUColor()
{
if (AppConfig.Get("aura_mode") != GPUMODE) return;
Logger.WriteLine(GPUModeControl.gpuMode.ToString());
switch (GPUModeControl.gpuMode)
{
case AsusACPI.GPUModeUltimate:
ApplyColor(Color.Red, true);
break;
case AsusACPI.GPUModeEco:
ApplyColor(Color.Green, true);
break;
default:
ApplyColor(Color.Yellow, true);
break;
}
}
public static void ApplyAura()
{
@@ -539,56 +568,54 @@ namespace GHelper
SetColor(AppConfig.Get("aura_color"));
SetColor2(AppConfig.Get("aura_color2"));
timer.Enabled = false;
if (Mode == HEATMAP)
{
SetHeatmap(true);
timer.Enabled = true;
return;
}
else
}
if (Mode == GPUMODE)
{
timer.Enabled = false;
ApplyGPUColor();
return;
}
Task.Run(async () =>
int _speed;
switch (Speed)
{
case 1:
_speed = 0xeb;
break;
case 2:
_speed = 0xf5;
break;
default:
_speed = 0xe1;
break;
}
byte[] msg;
var devices = GetHidDevices(deviceIds);
int _speed;
switch (Speed)
foreach (HidDevice device in devices)
{
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
case 1:
_speed = 0xeb;
break;
case 2:
_speed = 0xf5;
break;
default:
_speed = 0xe1;
break;
msg = AuraMessage(Mode, Color1, Color2, _speed, isSingleColor);
device.WriteFeatureData(msg);
device.WriteFeatureData(MESSAGE_APPLY);
device.WriteFeatureData(MESSAGE_SET);
Logger.WriteLine("USB-KB " + device.Attributes.Version + device.Description + device.DevicePath + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
}
byte[] msg;
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
msg = AuraMessage(Mode, Color1, Color2, _speed, isSingleColor);
device.WriteFeatureData(msg);
device.WriteFeatureData(MESSAGE_APPLY);
device.WriteFeatureData(MESSAGE_SET);
Logger.WriteLine("USB-KB " + device.Attributes.Version + device.Description + device.DevicePath + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
}
if (isTuf)
Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed);
});
if (isTuf)
Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed);
}
@@ -616,11 +643,20 @@ namespace GHelper
public static void InitXGM()
{
SetXGM(LED_INIT1);
SetXGM(LED_INIT2);
SetXGM(LED_INIT3);
SetXGM(LED_INIT4);
SetXGM(LED_INIT5);
byte[] ASUS_INIT = Encoding.ASCII.GetBytes("^ASUS Tech.Inc.");
SetXGM(ASUS_INIT);
/*
SetXGM(new byte[] { 0x5e, 0xd0, 0x02 });
SetXGM(new byte[] { 0x5e, 0xd0, 0x03 });
SetXGM(ASUS_INIT);
SetXGM(new byte[] { 0x5e, 0xd1, 0x02 }); // reset fan
SetXGM(ASUS_INIT);
SetXGM(new byte[] { 0x5e, 0xce, 0x03 });
SetXGM(new byte[] { 0x5e, 0xd0, 0x04 });
SetXGM(new byte[] { 0x5e, 0xd0, 0x01 });
*/
}
public static void ApplyXGMLight(bool status)

View File

@@ -3,17 +3,33 @@
internal class BatteryControl
{
public static void ToggleBatteryLimitFull()
{
if (AppConfig.Is("charge_full")) SetBatteryChargeLimit();
else SetBatteryLimitFull();
}
public static void SetBatteryLimitFull()
{
AppConfig.Set("charge_full", 1);
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, 100, "BatteryLimit");
Program.settingsForm.VisualiseBatteryFull();
}
public static void SetBatteryChargeLimit(int limit = -1)
{
if (limit < 0) limit = AppConfig.Get("charge_limit");
if (limit < 40 || limit > 100) return;
Program.settingsForm.VisualiseBattery(limit);
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, limit, "BatteryLimit");
AppConfig.Set("charge_limit", limit);
AppConfig.Set("charge_full", 0);
Program.settingsForm.VisualiseBattery(limit);
}
}

388
app/Display/ScreenCCD.cs Normal file
View File

@@ -0,0 +1,388 @@
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace GHelper.Display
{
public class ScreenCCD
{
public static bool GetHDRStatus()
{
var err = GetDisplayConfigBufferSizes(QDC.QDC_ONLY_ACTIVE_PATHS, out var pathCount, out var modeCount);
if (err != 0)
throw new Win32Exception(err);
var paths = new DISPLAYCONFIG_PATH_INFO[pathCount];
var modes = new DISPLAYCONFIG_MODE_INFO[modeCount];
err = QueryDisplayConfig(QDC.QDC_ONLY_ACTIVE_PATHS, ref pathCount, paths, ref modeCount, modes, IntPtr.Zero);
if (err != 0)
throw new Win32Exception(err);
string internalName = AppConfig.GetString("internal_display");
foreach (var path in paths)
{
// get display name
var info = new DISPLAYCONFIG_TARGET_DEVICE_NAME();
info.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
info.header.size = Marshal.SizeOf<DISPLAYCONFIG_TARGET_DEVICE_NAME>();
info.header.adapterId = path.targetInfo.adapterId;
info.header.id = path.targetInfo.id;
err = DisplayConfigGetDeviceInfo(ref info);
if (err != 0)
throw new Win32Exception(err);
var colorInfo = new DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO();
colorInfo.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO;
colorInfo.header.size = Marshal.SizeOf<DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO>();
colorInfo.header.adapterId = path.targetInfo.adapterId;
colorInfo.header.id = path.targetInfo.id;
err = DisplayConfigGetDeviceInfo(ref colorInfo);
if (err != 0)
throw new Win32Exception(err);
if (info.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL ||
info.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED ||
info.monitorFriendlyDeviceName == internalName)
{
Logger.WriteLine(info.monitorFriendlyDeviceName + " HDR: " + colorInfo.advancedColorEnabled);
return colorInfo.advancedColorEnabled;
}
}
return false;
}
private enum DISPLAYCONFIG_DEVICE_INFO_TYPE
{
DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,
DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,
DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6,
DISPLAYCONFIG_DEVICE_INFO_GET_SUPPORT_VIRTUAL_RESOLUTION = 7,
DISPLAYCONFIG_DEVICE_INFO_SET_SUPPORT_VIRTUAL_RESOLUTION = 8,
DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO = 9,
DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE = 10,
DISPLAYCONFIG_DEVICE_INFO_GET_SDR_WHITE_LEVEL = 11,
}
private enum DISPLAYCONFIG_COLOR_ENCODING
{
DISPLAYCONFIG_COLOR_ENCODING_RGB = 0,
DISPLAYCONFIG_COLOR_ENCODING_YCBCR444 = 1,
DISPLAYCONFIG_COLOR_ENCODING_YCBCR422 = 2,
DISPLAYCONFIG_COLOR_ENCODING_YCBCR420 = 3,
DISPLAYCONFIG_COLOR_ENCODING_INTENSITY = 4,
}
private enum DISPLAYCONFIG_SCALING
{
DISPLAYCONFIG_SCALING_IDENTITY = 1,
DISPLAYCONFIG_SCALING_CENTERED = 2,
DISPLAYCONFIG_SCALING_STRETCHED = 3,
DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,
DISPLAYCONFIG_SCALING_CUSTOM = 5,
DISPLAYCONFIG_SCALING_PREFERRED = 128,
}
private enum DISPLAYCONFIG_ROTATION
{
DISPLAYCONFIG_ROTATION_IDENTITY = 1,
DISPLAYCONFIG_ROTATION_ROTATE90 = 2,
DISPLAYCONFIG_ROTATION_ROTATE180 = 3,
}
private enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY
{
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = -1,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INDIRECT_WIRED = 16,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INDIRECT_VIRTUAL = 17,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = unchecked((int)0x80000000),
}
private enum DISPLAYCONFIG_TOPOLOGY_ID
{
DISPLAYCONFIG_TOPOLOGY_INTERNAL = 0x00000001,
DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002,
DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004,
DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008,
}
private enum DISPLAYCONFIG_PATH
{
DISPLAYCONFIG_PATH_ACTIVE = 0x00000001,
DISPLAYCONFIG_PATH_PREFERRED_UNSCALED = 0x00000004,
DISPLAYCONFIG_PATH_SUPPORT_VIRTUAL_MODE = 0x00000008,
}
private enum DISPLAYCONFIG_SOURCE_FLAGS
{
DISPLAYCONFIG_SOURCE_IN_USE = 0x00000001,
}
private enum DISPLAYCONFIG_TARGET_FLAGS
{
DISPLAYCONFIG_TARGET_IN_USE = 0x00000001,
DISPLAYCONFIG_TARGET_FORCIBLE = 0x00000002,
DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_BOOT = 0x00000004,
DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_PATH = 0x00000008,
DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_SYSTEM = 0x00000010,
DISPLAYCONFIG_TARGET_IS_HMD = 0x00000020,
}
private enum QDC
{
QDC_ALL_PATHS = 0x00000001,
QDC_ONLY_ACTIVE_PATHS = 0x00000002,
QDC_DATABASE_CURRENT = 0x00000004,
QDC_VIRTUAL_MODE_AWARE = 0x00000010,
QDC_INCLUDE_HMD = 0x00000020,
}
private enum DISPLAYCONFIG_SCANLINE_ORDERING
{
DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,
DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,
}
private enum DISPLAYCONFIG_PIXELFORMAT
{
DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,
DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,
DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,
DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,
DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,
}
private enum DISPLAYCONFIG_MODE_INFO_TYPE
{
DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
DISPLAYCONFIG_MODE_INFO_TYPE_DESKTOP_IMAGE = 3,
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_DEVICE_INFO_HEADER
{
public DISPLAYCONFIG_DEVICE_INFO_TYPE type;
public int size;
public LUID adapterId;
public uint id;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO
{
public DISPLAYCONFIG_DEVICE_INFO_HEADER header;
public uint value;
public DISPLAYCONFIG_COLOR_ENCODING colorEncoding;
public int bitsPerColorChannel;
public bool advancedColorSupported => (value & 0x1) == 0x1;
public bool advancedColorEnabled => (value & 0x2) == 0x2;
public bool wideColorEnforced => (value & 0x4) == 0x4;
public bool advancedColorForceDisabled => (value & 0x8) == 0x8;
}
[StructLayout(LayoutKind.Sequential)]
private struct POINTL
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
private struct LUID
{
public uint LowPart;
public int HighPart;
public long Value => ((long)HighPart << 32) | LowPart;
public override string ToString() => Value.ToString();
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_SOURCE_MODE
{
public uint width;
public uint height;
public DISPLAYCONFIG_PIXELFORMAT pixelFormat;
public POINTL position;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_RATIONAL
{
public uint Numerator;
public uint Denominator;
public override string ToString() => Numerator + " / " + Denominator;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_2DREGION
{
public uint cx;
public uint cy;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_DESKTOP_IMAGE_INFO
{
public POINTL PathSourceSize;
public RECT DesktopImageRegion;
public RECT DesktopImageClip;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
{
public ulong pixelRate;
public DISPLAYCONFIG_RATIONAL hSyncFreq;
public DISPLAYCONFIG_RATIONAL vSyncFreq;
public DISPLAYCONFIG_2DREGION activeSize;
public DISPLAYCONFIG_2DREGION totalSize;
public uint videoStandard;
public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_TARGET_MODE
{
public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
}
[StructLayout(LayoutKind.Explicit)]
private struct DISPLAYCONFIG_MODE_INFO_union
{
[FieldOffset(0)]
public DISPLAYCONFIG_TARGET_MODE targetMode;
[FieldOffset(0)]
public DISPLAYCONFIG_SOURCE_MODE sourceMode;
[FieldOffset(0)]
public DISPLAYCONFIG_DESKTOP_IMAGE_INFO desktopImageInfo;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_PATH_SOURCE_INFO
{
public LUID adapterId;
public uint id;
public uint modeInfoIdx;
public DISPLAYCONFIG_SOURCE_FLAGS statusFlags;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_PATH_TARGET_INFO
{
public LUID adapterId;
public uint id;
public uint modeInfoIdx;
public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
public DISPLAYCONFIG_ROTATION rotation;
public DISPLAYCONFIG_SCALING scaling;
public DISPLAYCONFIG_RATIONAL refreshRate;
public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
public bool targetAvailable;
public DISPLAYCONFIG_TARGET_FLAGS statusFlags;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_PATH_INFO
{
public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;
public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;
public DISPLAYCONFIG_PATH flags;
}
[StructLayout(LayoutKind.Sequential)]
private struct DISPLAYCONFIG_MODE_INFO
{
public DISPLAYCONFIG_MODE_INFO_TYPE infoType;
public uint id;
public LUID adapterId;
public DISPLAYCONFIG_MODE_INFO_union info;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct DISPLAYCONFIG_SOURCE_DEVICE_NAME
{
public DISPLAYCONFIG_DEVICE_INFO_HEADER header;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string viewGdiDeviceName;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS
{
public uint value;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct DISPLAYCONFIG_TARGET_DEVICE_NAME
{
public DISPLAYCONFIG_DEVICE_INFO_HEADER header;
public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags;
public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
public ushort edidManufactureId;
public ushort edidProductCodeId;
public uint connectorInstance;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string monitorFriendlyDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string monitorDevicePat;
}
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("user32")]
private static extern int GetDisplayConfigBufferSizes(QDC flags, out int numPathArrayElements, out int numModeInfoArrayElements);
[DllImport("user32")]
private static extern int QueryDisplayConfig(QDC flags, ref int numPathArrayElements, [In, Out] DISPLAYCONFIG_PATH_INFO[] pathArray, ref int numModeInfoArrayElements, [In, Out] DISPLAYCONFIG_MODE_INFO[] modeInfoArray, out DISPLAYCONFIG_TOPOLOGY_ID currentTopologyId);
[DllImport("user32")]
private static extern int QueryDisplayConfig(QDC flags, ref int numPathArrayElements, [In, Out] DISPLAYCONFIG_PATH_INFO[] pathArray, ref int numModeInfoArrayElements, [In, Out] DISPLAYCONFIG_MODE_INFO[] modeInfoArray, IntPtr currentTopologyId);
[DllImport("user32")]
private static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO requestPacket);
[DllImport("user32")]
private static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_SOURCE_DEVICE_NAME requestPacket);
[DllImport("user32")]
private static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME requestPacket);
}
}

View File

@@ -59,7 +59,7 @@ namespace GHelper.Display
public void ToogleMiniled()
{
int miniled = (AppConfig.Get("miniled") == 1) ? 0 : 1;
int miniled = (Program.acpi.DeviceGet(AsusACPI.ScreenMiniled) == 1) ? 0 : 1;
AppConfig.Set("miniled", miniled);
SetScreen(-1, -1, miniled);
}
@@ -77,8 +77,13 @@ namespace GHelper.Display
int overdrive = Program.acpi.DeviceGet(AsusACPI.ScreenOverdrive);
int miniled = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled);
bool hdr = false;
if (miniled >= 0)
{
AppConfig.Set("miniled", miniled);
hdr = ScreenCCD.GetHDRStatus();
}
bool screenEnabled = (frequency >= 0);
@@ -94,7 +99,8 @@ namespace GHelper.Display
maxFrequency: maxFrequency,
overdrive: overdrive,
overdriveSetting: overdriveSetting,
miniled: miniled
miniled: miniled,
hdr: hdr
);
});

View File

@@ -1,4 +1,6 @@
using System.ComponentModel;
using GHelper.Helpers;
using NvAPIWrapper.Display;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace GHelper.Display
@@ -259,6 +261,49 @@ namespace GHelper.Display
#endregion
[Flags]
public enum DisplayDeviceStates : int
{
ATTACHED_TO_DESKTOP = 0x01,
PRIMARY_DEVICE = 0x04,
MIRRORING_DRIVER = 0x08,
VGA_COMPATIBLE = 0x10,
REMOVABLE = 0x20,
DISCONNECTED = 0x2000000,
REMOTE = 0x4000000,
MODESPRUNED = 0x8000000
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DISPLAY_DEVICE
{
public int cb;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string DeviceString;
public DisplayDeviceStates StateFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string DeviceID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string DeviceKey;
}
[DllImport(nameof(User32), CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool EnumDisplayDevices(
string? lpDevice,
uint iDevNum,
ref DISPLAY_DEVICE lpDisplayDevice,
uint dwFlags);
private static DISPLAYCONFIG_TARGET_DEVICE_NAME DeviceName(LUID adapterId, uint targetId)
{
var deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME
@@ -298,6 +343,33 @@ namespace GHelper.Display
}
public static IEnumerable<DISPLAY_DEVICE> GetDisplayDevices()
{
var displayAdapter = new DISPLAY_DEVICE();
displayAdapter.cb = Marshal.SizeOf<DISPLAY_DEVICE>();
var displayAdapterNumber = default(uint);
while (EnumDisplayDevices(null, displayAdapterNumber, ref displayAdapter, 1))
{
var displayMonitor = new DISPLAY_DEVICE();
displayMonitor.cb = Marshal.SizeOf<DISPLAY_DEVICE>();
var displayMonitorNumber = default(uint);
while (EnumDisplayDevices(displayAdapter.DeviceName, displayMonitorNumber, ref displayMonitor, 1))
{
var isAttached = (displayMonitor.StateFlags & DisplayDeviceStates.ATTACHED_TO_DESKTOP) == DisplayDeviceStates.ATTACHED_TO_DESKTOP;
var isMirroring = (displayMonitor.StateFlags & DisplayDeviceStates.MIRRORING_DRIVER) == DisplayDeviceStates.MIRRORING_DRIVER;
if (isAttached && !isMirroring) yield return displayMonitor;
displayMonitorNumber++;
}
displayAdapterNumber++;
}
}
}
}

View File

@@ -1,8 +1,35 @@
using System.Runtime.InteropServices;
using System.Collections;
using System.Runtime.InteropServices;
using static GHelper.Display.ScreenInterrogatory;
namespace GHelper.Display
{
class DeviceComparer : IComparer
{
public int Compare(object x, object y)
{
uint displayX = ((DISPLAYCONFIG_TARGET_DEVICE_NAME)x).connectorInstance;
uint displayY = ((DISPLAYCONFIG_TARGET_DEVICE_NAME)y).connectorInstance;
if (displayX > displayY)
return 1;
if (displayX < displayY)
return -1;
else
return 0;
}
}
class ScreenComparer : IComparer
{
public int Compare(object x, object y)
{
int displayX = Int32.Parse(((Screen)x).DeviceName.Replace(@"\\.\DISPLAY", ""));
int displayY = Int32.Parse(((Screen)y).DeviceName.Replace(@"\\.\DISPLAY", ""));
return (new CaseInsensitiveComparer()).Compare(displayX, displayY);
}
}
internal class ScreenNative
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
@@ -118,39 +145,12 @@ namespace GHelper.Display
public const int ENUM_CURRENT_SETTINGS = -1;
public const string defaultDevice = @"\\.\DISPLAY1";
static bool? _ultimate = null;
static bool isUltimate
private static string? FindInternalName(bool log = false)
{
get
{
if (_ultimate is null) _ultimate = (Program.acpi.DeviceGet(AsusACPI.GPUMux) == 0);
return (bool)_ultimate;
}
}
public static string? FindLaptopScreen(bool log = false)
{
string? laptopScreen = null;
var screens = Screen.AllScreens;
/*
if (!isUltimate)
{
foreach (var screen in screens )
{
if (log) Logger.WriteLine(screen.DeviceName);
if (screen.DeviceName == defaultDevice) return defaultDevice;
}
}
*/
try
{
var devices = GetAllDevices().ToArray();
int count = 0, displayNum = -1;
string internalName = AppConfig.GetString("internal_display");
foreach (var device in devices)
@@ -159,29 +159,71 @@ namespace GHelper.Display
device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED ||
device.monitorFriendlyDeviceName == internalName)
{
displayNum = count;
if (log) Logger.WriteLine(device.monitorDevicePath + " " + device.outputTechnology);
AppConfig.Set("internal_display", device.monitorFriendlyDeviceName);
var names = device.monitorDevicePath.Split("#");
if (names.Length > 1) return names[1];
else return "";
}
if (log) Logger.WriteLine(device.monitorFriendlyDeviceName + ":" + device.outputTechnology.ToString() + ": " + ((count < screens.Length) ? screens[count].DeviceName : ""));
count++;
}
count = 0;
foreach (var screen in screens)
{
if (count == displayNum) laptopScreen = screen.DeviceName;
count++;
}
if (displayNum > 0 && count == 0) laptopScreen = defaultDevice;
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
Logger.WriteLine("Can't detect internal screen");
laptopScreen = Screen.PrimaryScreen.DeviceName;
}
return null;
}
static string ExtractDisplay(string input)
{
int index = input.IndexOf('\\', 4); // Start searching from index 4 to skip ""
if (index != -1)
{
string extracted = input.Substring(0, index);
return extracted;
}
return input;
}
public static string? FindLaptopScreen(bool log = false)
{
string? laptopScreen = null;
string? internalName = FindInternalName(log);
if (internalName == null)
{
Logger.WriteLine("Internal screen off");
return null;
}
try
{
var displays = GetDisplayDevices().ToArray();
foreach (var display in displays)
{
if (log) Logger.WriteLine(display.DeviceID + " " + display.DeviceName);
if (display.DeviceID.Contains(internalName))
{
laptopScreen = ExtractDisplay(display.DeviceName);
break;
}
}
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
}
if (laptopScreen is null)
{
Logger.WriteLine("Default internal screen");
laptopScreen = Screen.PrimaryScreen.DeviceName;
}
return laptopScreen;
}

31
app/Extra.Designer.cs generated
View File

@@ -31,6 +31,7 @@ namespace GHelper
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
panelServices = new Panel();
pictureService = new PictureBox();
labelServices = new Label();
@@ -113,6 +114,8 @@ namespace GHelper
numericHibernateAfter = new NumericUpDown();
labelHibernateAfter = new Label();
pictureHibernate = new PictureBox();
toolTip = new ToolTip(components);
checkBootSound = new CheckBox();
panelServices.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureService).BeginInit();
panelBindingsHeader.SuspendLayout();
@@ -145,7 +148,7 @@ namespace GHelper
panelServices.Controls.Add(labelServices);
panelServices.Controls.Add(buttonServices);
panelServices.Dock = DockStyle.Top;
panelServices.Location = new Point(15, 1279);
panelServices.Location = new Point(15, 1321);
panelServices.Name = "panelServices";
panelServices.Size = new Size(983, 75);
panelServices.TabIndex = 5;
@@ -1063,6 +1066,7 @@ namespace GHelper
panelSettings.Controls.Add(checkAutoToggleClamshellMode);
panelSettings.Controls.Add(checkTopmost);
panelSettings.Controls.Add(checkNoOverdrive);
panelSettings.Controls.Add(checkBootSound);
panelSettings.Controls.Add(checkUSBC);
panelSettings.Controls.Add(checkVariBright);
panelSettings.Controls.Add(checkGpuApps);
@@ -1071,14 +1075,14 @@ namespace GHelper
panelSettings.Location = new Point(15, 921);
panelSettings.Name = "panelSettings";
panelSettings.Padding = new Padding(20, 5, 11, 5);
panelSettings.Size = new Size(983, 304);
panelSettings.Size = new Size(983, 346);
panelSettings.TabIndex = 3;
//
// checkAutoToggleClamshellMode
//
checkAutoToggleClamshellMode.AutoSize = true;
checkAutoToggleClamshellMode.Dock = DockStyle.Top;
checkAutoToggleClamshellMode.Location = new Point(20, 257);
checkAutoToggleClamshellMode.Location = new Point(20, 299);
checkAutoToggleClamshellMode.Name = "checkAutoToggleClamshellMode";
checkAutoToggleClamshellMode.Padding = new Padding(3);
checkAutoToggleClamshellMode.Size = new Size(952, 42);
@@ -1090,7 +1094,7 @@ namespace GHelper
//
checkTopmost.AutoSize = true;
checkTopmost.Dock = DockStyle.Top;
checkTopmost.Location = new Point(20, 215);
checkTopmost.Location = new Point(20, 257);
checkTopmost.Margin = new Padding(4, 3, 4, 3);
checkTopmost.Name = "checkTopmost";
checkTopmost.Padding = new Padding(3);
@@ -1103,7 +1107,7 @@ namespace GHelper
//
checkNoOverdrive.AutoSize = true;
checkNoOverdrive.Dock = DockStyle.Top;
checkNoOverdrive.Location = new Point(20, 173);
checkNoOverdrive.Location = new Point(20, 215);
checkNoOverdrive.Margin = new Padding(4, 3, 4, 3);
checkNoOverdrive.Name = "checkNoOverdrive";
checkNoOverdrive.Padding = new Padding(3);
@@ -1170,7 +1174,7 @@ namespace GHelper
panelPower.Controls.Add(labelHibernateAfter);
panelPower.Controls.Add(pictureHibernate);
panelPower.Dock = DockStyle.Top;
panelPower.Location = new Point(15, 1225);
panelPower.Location = new Point(15, 1267);
panelPower.Name = "panelPower";
panelPower.Size = new Size(983, 54);
panelPower.TabIndex = 4;
@@ -1207,6 +1211,19 @@ namespace GHelper
pictureHibernate.TabIndex = 22;
pictureHibernate.TabStop = false;
//
// checkBootSound
//
checkBootSound.AutoSize = true;
checkBootSound.Dock = DockStyle.Top;
checkBootSound.Location = new Point(20, 173);
checkBootSound.Margin = new Padding(4, 3, 4, 3);
checkBootSound.Name = "checkBootSound";
checkBootSound.Padding = new Padding(3);
checkBootSound.Size = new Size(952, 42);
checkBootSound.TabIndex = 10;
checkBootSound.Text = "Boot Sound";
checkBootSound.UseVisualStyleBackColor = true;
//
// Extra
//
AutoScaleDimensions = new SizeF(192F, 192F);
@@ -1353,5 +1370,7 @@ namespace GHelper
private Label labelHibernateAfter;
private NumericUpDown numericHibernateAfter;
private CheckBox checkGPUFix;
private ToolTip toolTip;
private CheckBox checkBootSound;
}
}

View File

@@ -16,25 +16,33 @@ namespace GHelper
const string EMPTY = "--------------";
Dictionary<string, string> customActions = new Dictionary<string, string>
{
{"", EMPTY},
{"mute", Properties.Strings.VolumeMute},
{"screenshot", Properties.Strings.PrintScreen},
{"play", Properties.Strings.PlayPause},
{"aura", Properties.Strings.ToggleAura},
{"performance", Properties.Strings.PerformanceMode},
{"screen", Properties.Strings.ToggleScreen},
{"miniled", Properties.Strings.ToggleMiniled},
{"fnlock", Properties.Strings.ToggleFnLock},
{"brightness_down", Properties.Strings.BrightnessDown},
{"brightness_up", Properties.Strings.BrightnessUp},
{"custom", Properties.Strings.Custom}
};
private void SetKeyCombo(ComboBox combo, TextBox txbox, string name)
{
Dictionary<string, string> customActions = new Dictionary<string, string>
{
{"", EMPTY},
{"mute", Properties.Strings.VolumeMute},
{"screenshot", Properties.Strings.PrintScreen},
{"play", Properties.Strings.PlayPause},
{"aura", Properties.Strings.ToggleAura},
{"performance", Properties.Strings.PerformanceMode},
{"screen", Properties.Strings.ToggleScreen},
{"miniled", Properties.Strings.ToggleMiniled},
{"fnlock", Properties.Strings.ToggleFnLock},
{"brightness_down", Properties.Strings.BrightnessDown},
{"brightness_up", Properties.Strings.BrightnessUp},
{"ghelper", Properties.Strings.OpenGHelper},
{"custom", Properties.Strings.Custom}
};
if (AppConfig.IsDUO())
{
customActions.Add("screenpad_down", Properties.Strings.ScreenPadDown);
customActions.Add("screenpad_up", Properties.Strings.ScreenPadUp);
}
switch (name)
{
case "m1":
@@ -48,6 +56,7 @@ namespace GHelper
break;
case "m4":
customActions[""] = Properties.Strings.OpenGHelper;
customActions.Remove("ghelper");
break;
case "fnf4":
customActions[""] = Properties.Strings.ToggleAura;
@@ -59,7 +68,6 @@ namespace GHelper
break;
case "fne":
customActions[""] = "Calculator";
customActions["ghelper"] = Properties.Strings.OpenGHelper;
break;
case "paddle":
customActions[""] = EMPTY;
@@ -108,6 +116,7 @@ namespace GHelper
checkSleep.Text = Properties.Strings.Sleep;
checkBoot.Text = Properties.Strings.Boot;
checkShutdown.Text = Properties.Strings.Shutdown;
checkBootSound.Text = Properties.Strings.BootSound;
labelSpeed.Text = Properties.Strings.AnimationSpeed;
//labelBrightness.Text = Properties.Strings.Brightness;
@@ -130,12 +139,15 @@ namespace GHelper
Text = Properties.Strings.ExtraSettings;
if (AppConfig.IsDUO())
if (AppConfig.IsARCNM())
{
customActions.Add("screenpad_down", Properties.Strings.ScreenPadDown);
customActions.Add("screenpad_up", Properties.Strings.ScreenPadUp);
}
labelM3.Text = "FN+F6";
labelM1.Visible = comboM1.Visible = textM1.Visible = false;
labelM2.Visible = comboM2.Visible = textM2.Visible = false;
labelM4.Visible = comboM4.Visible = textM4.Visible = false;
labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;
}
if (AppConfig.NoMKeys())
{
labelM1.Text = "FN+F2";
@@ -183,7 +195,6 @@ namespace GHelper
SetKeyCombo(comboFNF4, textFNF4, "paddle");
}
else
{
SetKeyCombo(comboM1, textM1, "m1");
@@ -197,6 +208,10 @@ namespace GHelper
SetKeyCombo(comboFNE, textFNE, "fne");
}
if (AppConfig.IsStrix())
{
labelM4.Text = "M5/ROG";
}
InitTheme();
@@ -261,22 +276,27 @@ namespace GHelper
checkSleepBar.Visible = false;
checkShutdownBar.Visible = false;
if (!AppConfig.IsZ13())
{
labelBacklightLid.Visible = false;
checkAwakeLid.Visible = false;
checkBootLid.Visible = false;
checkSleepLid.Visible = false;
checkShutdownLid.Visible = false;
}
labelBacklightLogo.Visible = false;
checkAwakeLogo.Visible = false;
checkBootLogo.Visible = false;
checkSleepLogo.Visible = false;
checkShutdownLogo.Visible = false;
if ((!AppConfig.IsStrix() && !AppConfig.IsZ13()) || AppConfig.IsStrixLimitedRGB())
{
labelBacklightLid.Visible = false;
checkAwakeLid.Visible = false;
checkBootLid.Visible = false;
checkSleepLid.Visible = false;
checkShutdownLid.Visible = false;
labelBacklightKeyboard.Visible = false;
}
labelBacklightLogo.Visible = false;
checkAwakeLogo.Visible = false;
checkBootLogo.Visible = false;
checkSleepLogo.Visible = false;
checkShutdownLogo.Visible = false;
}
if (!AppConfig.IsStrix() && !AppConfig.IsZ13())
{
labelBacklightKeyboard.Visible = false;
}
//checkAutoToggleClamshellMode.Visible = clamshellControl.IsExternalDisplayConnected();
@@ -308,6 +328,9 @@ namespace GHelper
checkGpuApps.Checked = AppConfig.Is("kill_gpu_apps");
checkGpuApps.CheckedChanged += CheckGpuApps_CheckedChanged;
checkBootSound.Checked = (Program.acpi.DeviceGet(AsusACPI.BootSound) == 1);
checkBootSound.CheckedChanged += CheckBootSound_CheckedChanged;
pictureHelp.Click += PictureHelp_Click;
buttonServices.Click += ButtonServices_Click;
@@ -317,11 +340,18 @@ namespace GHelper
checkGPUFix.Checked = AppConfig.IsGPUFix();
checkGPUFix.CheckedChanged += CheckGPUFix_CheckedChanged;
toolTip.SetToolTip(checkAutoToggleClamshellMode, "Disable sleep on lid close when plugged in and external monitor is connected");
InitVariBright();
InitServices();
InitHibernate();
}
private void CheckBootSound_CheckedChanged(object? sender, EventArgs e)
{
Program.acpi.DeviceSet(AsusACPI.BootSound, (checkBootSound.Checked ? 1 : 0), "BootSound");
}
private void CheckGPUFix_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.Set("gpu_fix", (checkGPUFix.Checked ? 1 : 0));
@@ -331,16 +361,10 @@ namespace GHelper
{
try
{
Task.Run(() =>
{
int hibernate = PowerNative.GetHibernateAfter();
if (hibernate < 0 || hibernate > numericHibernateAfter.Maximum) hibernate = 0;
BeginInvoke(delegate
{
numericHibernateAfter.Value = hibernate;
numericHibernateAfter.ValueChanged += NumericHibernateAfter_ValueChanged;
});
});
int hibernate = PowerNative.GetHibernateAfter();
if (hibernate < 0 || hibernate > numericHibernateAfter.Maximum) hibernate = 0;
numericHibernateAfter.Value = hibernate;
numericHibernateAfter.ValueChanged += NumericHibernateAfter_ValueChanged;
}
catch (Exception ex)
@@ -369,8 +393,13 @@ namespace GHelper
private void SliderBrightness_ValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("keyboard_brightness", sliderBrightness.Value);
AppConfig.Set("keyboard_brightness_ac", sliderBrightness.Value);
bool onBattery = SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online;
if (onBattery)
AppConfig.Set("keyboard_brightness_ac", sliderBrightness.Value);
else
AppConfig.Set("keyboard_brightness", sliderBrightness.Value);
AsusUSB.ApplyBrightness(sliderBrightness.Value, "Slider");
}
@@ -399,7 +428,7 @@ namespace GHelper
{
buttonServices.Enabled = false;
if (OptimizationService.IsRunning())
if (OptimizationService.GetRunningCount() > 0)
{
labelServices.Text = Properties.Strings.StoppingServices + " ...";
Task.Run(() =>

View File

@@ -117,4 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

185
app/Fan/FanSensorControl.cs Normal file
View File

@@ -0,0 +1,185 @@
using GHelper.Mode;
namespace GHelper.Fan
{
public class FanSensorControl
{
public const int DEFAULT_FAN_MIN = 18;
public const int DEFAULT_FAN_MAX = 58;
public const int XGM_FAN_MAX = 72;
public const int INADEQUATE_MAX = 92;
const int FAN_COUNT = 3;
Fans fansForm;
ModeControl modeControl = Program.modeControl;
static int[] measuredMax;
static int sameCount = 0;
static System.Timers.Timer timer = default!;
static int[] _fanMax = InitFanMax();
static bool _fanRpm = AppConfig.IsNotFalse("fan_rpm");
public FanSensorControl(Fans fansForm)
{
this.fansForm = fansForm;
timer = new System.Timers.Timer(1000);
timer.Elapsed += Timer_Elapsed;
}
static int[] InitFanMax()
{
int[] defaultMax = GetDefaultMax();
return new int[3] {
AppConfig.Get("fan_max_" + (int)AsusFan.CPU, defaultMax[(int)AsusFan.CPU]),
AppConfig.Get("fan_max_" + (int)AsusFan.GPU, defaultMax[(int)AsusFan.GPU]),
AppConfig.Get("fan_max_" + (int)AsusFan.Mid, defaultMax[(int)AsusFan.Mid])
};
}
static int[] GetDefaultMax()
{
if (AppConfig.ContainsModel("GA401I")) return new int[3] { 78, 76, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("GA401")) return new int[3] { 71, 73, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("GA402")) return new int[3] { 55, 56, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("G513R")) return new int[3] { 58, 60, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("G513Q")) return new int[3] { 69, 69, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("GA503")) return new int[3] { 64, 64, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("GU603")) return new int[3] { 62, 64, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("FA507R")) return new int[3] { 63, 57, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("FA507X")) return new int[3] { 63, 68, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("GX650")) return new int[3] { 62, 62, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("G732")) return new int[3] { 61, 60, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("G713")) return new int[3] { 56, 60, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("Z301")) return new int[3] { 72, 64, DEFAULT_FAN_MAX };
if (AppConfig.ContainsModel("GV601")) return new int[3] { 78, 59, 85 };
return new int[3] { DEFAULT_FAN_MAX, DEFAULT_FAN_MAX, DEFAULT_FAN_MAX };
}
public static int GetFanMax(AsusFan device)
{
if (device == AsusFan.XGM) return XGM_FAN_MAX;
if (_fanMax[(int)device] < 0 || _fanMax[(int)device] > INADEQUATE_MAX)
SetFanMax(device, DEFAULT_FAN_MAX);
return _fanMax[(int)device];
}
public static void SetFanMax(AsusFan device, int value)
{
_fanMax[(int)device] = value;
AppConfig.Set("fan_max_" + (int)device, value);
}
public static bool fanRpm
{
get
{
return _fanRpm;
}
set
{
AppConfig.Set("fan_rpm", value ? 1 : 0);
_fanRpm = value;
}
}
public static string FormatFan(AsusFan device, int value)
{
if (value < 0) return null;
if (value > GetFanMax(device) && value <= INADEQUATE_MAX) SetFanMax(device, value);
if (fanRpm)
return Properties.Strings.FanSpeed + ": " + (value * 100).ToString() + "RPM";
else
return Properties.Strings.FanSpeed + ": " + Math.Min(Math.Round((float)value / GetFanMax(device) * 100), 100).ToString() + "%"; // relatively to max RPM
}
public void StartCalibration()
{
measuredMax = new int[] { 0, 0, 0 };
timer.Enabled = true;
for (int i = 0; i < FAN_COUNT; i++)
AppConfig.Remove("fan_max_" + i);
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AsusACPI.PerformanceTurbo, "ModeCalibration");
for (int i = 0; i < FAN_COUNT; i++)
Program.acpi.SetFanCurve((AsusFan)i, new byte[] { 20, 30, 40, 50, 60, 70, 80, 90, 100, 100, 100, 100, 100, 100, 100, 100 });
}
private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
int fan;
bool same = true;
for (int i = 0; i < FAN_COUNT; i++)
{
fan = Program.acpi.GetFan((AsusFan)i);
if (fan > measuredMax[i])
{
measuredMax[i] = fan;
same = false;
}
}
if (same) sameCount++;
else sameCount = 0;
string label = "Measuring Max Speed - CPU: " + measuredMax[(int)AsusFan.CPU] * 100 + ", GPU: " + measuredMax[(int)AsusFan.GPU] * 100;
if (measuredMax[(int)AsusFan.Mid] > 10) label = label + ", Mid: " + measuredMax[(int)AsusFan.Mid] * 100;
label = label + " (" + sameCount + "s)";
fansForm.LabelFansResult(label);
if (sameCount >= 15)
{
for (int i = 0; i < FAN_COUNT; i++)
{
if (measuredMax[i] > 30 && measuredMax[i] < INADEQUATE_MAX) SetFanMax((AsusFan)i, measuredMax[i]);
}
sameCount = 0;
FinishCalibration();
}
}
private void FinishCalibration()
{
timer.Enabled = false;
modeControl.SetPerformanceMode();
string label = "Measured - CPU: " + AppConfig.Get("fan_max_" + (int)AsusFan.CPU) * 100;
if (AppConfig.Get("fan_max_" + (int)AsusFan.GPU) > 0)
label = label + ", GPU: " + AppConfig.Get("fan_max_" + (int)AsusFan.GPU) * 100;
if (AppConfig.Get("fan_max_" + (int)AsusFan.Mid) > 0)
label = label + ", Mid: " + AppConfig.Get("fan_max_" + (int)AsusFan.Mid) * 100;
fansForm.LabelFansResult(label);
fansForm.InitAxis();
}
}
}

315
app/Fans.Designer.cs generated
View File

@@ -31,14 +31,14 @@ namespace GHelper
/// </summary>
private void InitializeComponent()
{
ChartArea chartArea9 = new ChartArea();
Title title9 = new Title();
ChartArea chartArea10 = new ChartArea();
Title title10 = new Title();
ChartArea chartArea11 = new ChartArea();
Title title11 = new Title();
ChartArea chartArea12 = new ChartArea();
Title title12 = new Title();
ChartArea chartArea1 = new ChartArea();
Title title1 = new Title();
ChartArea chartArea2 = new ChartArea();
Title title2 = new Title();
ChartArea chartArea3 = new ChartArea();
Title title3 = new Title();
ChartArea chartArea4 = new ChartArea();
Title title4 = new Title();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Fans));
panelFans = new Panel();
labelTip = new Label();
@@ -55,6 +55,7 @@ namespace GHelper
picturePerf = new PictureBox();
labelFans = new Label();
panelApplyFans = new Panel();
buttonCalibrate = new RButton();
labelFansResult = new Label();
checkApplyFans = new RCheckBox();
buttonReset = new RButton();
@@ -103,11 +104,14 @@ namespace GHelper
pictureBoxCPU = new PictureBox();
labelPowerLimits = new Label();
panelBoost = new Panel();
panelPowerMode = new Panel();
comboPowerMode = new RComboBox();
panelBoostTitle = new Panel();
pictureBoost = new PictureBox();
labelBoost = new Label();
panelPowerMode = new Panel();
comboPowerMode = new RComboBox();
panelPowerModeTItle = new Panel();
picturePowerMode = new PictureBox();
labelPowerModeTitle = new Label();
panelGPU = new Panel();
panelGPUTemp = new Panel();
labelGPUTemp = new Label();
@@ -125,6 +129,10 @@ namespace GHelper
labelGPUCore = new Label();
trackGPUCore = new TrackBar();
labelGPUCoreTitle = new Label();
panelGPUClockLimit = new Panel();
labelGPUClockLimit = new Label();
trackGPUClockLimit = new TrackBar();
labelGPUClockLimitTitle = new Label();
panelTitleGPU = new Panel();
pictureGPU = new PictureBox();
labelGPU = new Label();
@@ -133,9 +141,6 @@ namespace GHelper
buttonAdvanced = new RButton();
buttonGPU = new RButton();
buttonCPU = new RButton();
panelPowerModeTItle = new Panel();
picturePowerMode = new PictureBox();
labelPowerModeTitle = new Label();
panelFans.SuspendLayout();
tableFanCharts.SuspendLayout();
((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit();
@@ -170,9 +175,11 @@ namespace GHelper
panelTitleCPU.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxCPU).BeginInit();
panelBoost.SuspendLayout();
panelPowerMode.SuspendLayout();
panelBoostTitle.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoost).BeginInit();
panelPowerMode.SuspendLayout();
panelPowerModeTItle.SuspendLayout();
((System.ComponentModel.ISupportInitialize)picturePowerMode).BeginInit();
panelGPU.SuspendLayout();
panelGPUTemp.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackGPUTemp).BeginInit();
@@ -182,12 +189,12 @@ namespace GHelper
((System.ComponentModel.ISupportInitialize)trackGPUMemory).BeginInit();
panelGPUCore.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackGPUCore).BeginInit();
panelGPUClockLimit.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).BeginInit();
panelTitleGPU.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureGPU).BeginInit();
panelNav.SuspendLayout();
tableNav.SuspendLayout();
panelPowerModeTItle.SuspendLayout();
((System.ComponentModel.ISupportInitialize)picturePowerMode).BeginInit();
SuspendLayout();
//
// panelFans
@@ -233,7 +240,7 @@ namespace GHelper
tableFanCharts.Location = new Point(0, 66);
tableFanCharts.Margin = new Padding(4);
tableFanCharts.Name = "tableFanCharts";
tableFanCharts.Padding = new Padding(10, 0, 10, 10);
tableFanCharts.Padding = new Padding(10, 0, 10, 5);
tableFanCharts.RowCount = 2;
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
@@ -244,60 +251,60 @@ namespace GHelper
//
// chartGPU
//
chartArea9.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea9);
chartArea1.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea1);
chartGPU.Dock = DockStyle.Fill;
chartGPU.Location = new Point(12, 491);
chartGPU.Location = new Point(12, 493);
chartGPU.Margin = new Padding(2, 10, 2, 10);
chartGPU.Name = "chartGPU";
chartGPU.Size = new Size(782, 461);
chartGPU.Size = new Size(782, 463);
chartGPU.TabIndex = 17;
chartGPU.Text = "chartGPU";
title9.Name = "Title1";
chartGPU.Titles.Add(title9);
title1.Name = "Title1";
chartGPU.Titles.Add(title1);
//
// chartCPU
//
chartArea10.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea10);
chartArea2.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea2);
chartCPU.Dock = DockStyle.Fill;
chartCPU.Location = new Point(12, 10);
chartCPU.Margin = new Padding(2, 10, 2, 10);
chartCPU.Name = "chartCPU";
chartCPU.Size = new Size(782, 461);
chartCPU.Size = new Size(782, 463);
chartCPU.TabIndex = 14;
chartCPU.Text = "chartCPU";
title10.Name = "Title1";
chartCPU.Titles.Add(title10);
title2.Name = "Title1";
chartCPU.Titles.Add(title2);
//
// chartXGM
//
chartArea11.Name = "ChartAreaXGM";
chartXGM.ChartAreas.Add(chartArea11);
chartArea3.Name = "ChartAreaXGM";
chartXGM.ChartAreas.Add(chartArea3);
chartXGM.Dock = DockStyle.Fill;
chartXGM.Location = new Point(12, 1453);
chartXGM.Location = new Point(12, 1459);
chartXGM.Margin = new Padding(2, 10, 2, 10);
chartXGM.Name = "chartXGM";
chartXGM.Size = new Size(782, 464);
chartXGM.Size = new Size(782, 463);
chartXGM.TabIndex = 14;
chartXGM.Text = "chartXGM";
title11.Name = "Title4";
chartXGM.Titles.Add(title11);
title3.Name = "Title4";
chartXGM.Titles.Add(title3);
chartXGM.Visible = false;
//
// chartMid
//
chartArea12.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea12);
chartArea4.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea4);
chartMid.Dock = DockStyle.Fill;
chartMid.Location = new Point(12, 972);
chartMid.Location = new Point(12, 976);
chartMid.Margin = new Padding(2, 10, 2, 10);
chartMid.Name = "chartMid";
chartMid.Size = new Size(782, 461);
chartMid.Size = new Size(782, 463);
chartMid.TabIndex = 14;
chartMid.Text = "chartMid";
title12.Name = "Title3";
chartMid.Titles.Add(title12);
title4.Name = "Title3";
chartMid.Titles.Add(title4);
chartMid.Visible = false;
//
// panelTitleFans
@@ -404,6 +411,7 @@ namespace GHelper
//
// panelApplyFans
//
panelApplyFans.Controls.Add(buttonCalibrate);
panelApplyFans.Controls.Add(labelFansResult);
panelApplyFans.Controls.Add(checkApplyFans);
panelApplyFans.Controls.Add(buttonReset);
@@ -414,16 +422,32 @@ namespace GHelper
panelApplyFans.Size = new Size(806, 116);
panelApplyFans.TabIndex = 43;
//
// buttonCalibrate
//
buttonCalibrate.Activated = false;
buttonCalibrate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCalibrate.BackColor = SystemColors.ControlLight;
buttonCalibrate.BorderColor = Color.Transparent;
buttonCalibrate.BorderRadius = 2;
buttonCalibrate.FlatStyle = FlatStyle.Flat;
buttonCalibrate.Location = new Point(275, 40);
buttonCalibrate.Margin = new Padding(4, 2, 4, 2);
buttonCalibrate.Name = "buttonCalibrate";
buttonCalibrate.Secondary = true;
buttonCalibrate.Size = new Size(141, 50);
buttonCalibrate.TabIndex = 43;
buttonCalibrate.Text = "Calibrate";
buttonCalibrate.UseVisualStyleBackColor = false;
//
// labelFansResult
//
labelFansResult.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
labelFansResult.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
labelFansResult.ForeColor = Color.Red;
labelFansResult.Location = new Point(24, 4);
labelFansResult.Location = new Point(18, 2);
labelFansResult.Margin = new Padding(4, 0, 4, 0);
labelFansResult.Name = "labelFansResult";
labelFansResult.Size = new Size(762, 32);
labelFansResult.Size = new Size(771, 32);
labelFansResult.TabIndex = 42;
labelFansResult.TextAlign = ContentAlignment.TopRight;
labelFansResult.Visible = false;
//
// checkApplyFans
@@ -452,7 +476,7 @@ namespace GHelper
buttonReset.Margin = new Padding(4, 2, 4, 2);
buttonReset.Name = "buttonReset";
buttonReset.Secondary = true;
buttonReset.Size = new Size(274, 50);
buttonReset.Size = new Size(252, 50);
buttonReset.TabIndex = 18;
buttonReset.Text = Properties.Strings.FactoryDefaults;
buttonReset.UseVisualStyleBackColor = false;
@@ -499,7 +523,7 @@ namespace GHelper
panelAdvanced.Controls.Add(panelTemperature);
panelAdvanced.Controls.Add(panelTitleTemp);
panelAdvanced.Dock = DockStyle.Top;
panelAdvanced.Location = new Point(10, 1396);
panelAdvanced.Location = new Point(10, 1520);
panelAdvanced.Name = "panelAdvanced";
panelAdvanced.Size = new Size(520, 888);
panelAdvanced.TabIndex = 14;
@@ -797,7 +821,7 @@ namespace GHelper
panelPower.Controls.Add(panelPowerMode);
panelPower.Controls.Add(panelPowerModeTItle);
panelPower.Dock = DockStyle.Top;
panelPower.Location = new Point(10, 640);
panelPower.Location = new Point(10, 764);
panelPower.Margin = new Padding(4);
panelPower.Name = "panelPower";
panelPower.Size = new Size(520, 756);
@@ -1020,30 +1044,6 @@ namespace GHelper
panelBoost.Size = new Size(520, 64);
panelBoost.TabIndex = 13;
//
// panelPowerMode
//
panelPowerMode.Controls.Add(comboPowerMode);
panelPowerMode.Dock = DockStyle.Top;
panelPowerMode.Location = new Point(0, 60);
panelPowerMode.Margin = new Padding(4);
panelPowerMode.Name = "panelPowerMode";
panelPowerMode.Size = new Size(520, 64);
panelPowerMode.TabIndex = 49;
//
// comboPowerMode
//
comboPowerMode.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
comboPowerMode.BorderColor = Color.White;
comboPowerMode.ButtonColor = Color.FromArgb(255, 255, 255);
comboPowerMode.DropDownStyle = ComboBoxStyle.DropDownList;
comboPowerMode.FormattingEnabled = true;
comboPowerMode.Items.AddRange(new object[] { "Disabled", "Enabled", "Aggressive", "Efficient Enabled", "Efficient Aggressive", "Aggressive at Guaranteed", "Efficient at Guaranteed" });
comboPowerMode.Location = new Point(13, 12);
comboPowerMode.Margin = new Padding(4);
comboPowerMode.Name = "comboPowerMode";
comboPowerMode.Size = new Size(329, 40);
comboPowerMode.TabIndex = 42;
//
// panelBoostTitle
//
panelBoostTitle.AutoSize = true;
@@ -1080,6 +1080,66 @@ namespace GHelper
labelBoost.TabIndex = 39;
labelBoost.Text = "CPU Boost";
//
// panelPowerMode
//
panelPowerMode.Controls.Add(comboPowerMode);
panelPowerMode.Dock = DockStyle.Top;
panelPowerMode.Location = new Point(0, 60);
panelPowerMode.Margin = new Padding(4);
panelPowerMode.Name = "panelPowerMode";
panelPowerMode.Size = new Size(520, 64);
panelPowerMode.TabIndex = 49;
//
// comboPowerMode
//
comboPowerMode.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
comboPowerMode.BorderColor = Color.White;
comboPowerMode.ButtonColor = Color.FromArgb(255, 255, 255);
comboPowerMode.DropDownStyle = ComboBoxStyle.DropDownList;
comboPowerMode.FormattingEnabled = true;
comboPowerMode.Items.AddRange(new object[] { "Disabled", "Enabled", "Aggressive", "Efficient Enabled", "Efficient Aggressive", "Aggressive at Guaranteed", "Efficient at Guaranteed" });
comboPowerMode.Location = new Point(13, 12);
comboPowerMode.Margin = new Padding(4);
comboPowerMode.Name = "comboPowerMode";
comboPowerMode.Size = new Size(329, 40);
comboPowerMode.TabIndex = 42;
//
// panelPowerModeTItle
//
panelPowerModeTItle.AutoSize = true;
panelPowerModeTItle.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelPowerModeTItle.Controls.Add(picturePowerMode);
panelPowerModeTItle.Controls.Add(labelPowerModeTitle);
panelPowerModeTItle.Dock = DockStyle.Top;
panelPowerModeTItle.Location = new Point(0, 0);
panelPowerModeTItle.Margin = new Padding(4);
panelPowerModeTItle.Name = "panelPowerModeTItle";
panelPowerModeTItle.Size = new Size(520, 60);
panelPowerModeTItle.TabIndex = 50;
//
// picturePowerMode
//
picturePowerMode.BackgroundImage = Properties.Resources.icons8_gauge_32;
picturePowerMode.BackgroundImageLayout = ImageLayout.Zoom;
picturePowerMode.InitialImage = null;
picturePowerMode.Location = new Point(10, 18);
picturePowerMode.Margin = new Padding(4, 2, 4, 10);
picturePowerMode.Name = "picturePowerMode";
picturePowerMode.Size = new Size(32, 32);
picturePowerMode.TabIndex = 40;
picturePowerMode.TabStop = false;
//
// labelPowerModeTitle
//
labelPowerModeTitle.AutoSize = true;
labelPowerModeTitle.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelPowerModeTitle.Location = new Point(46, 18);
labelPowerModeTitle.Margin = new Padding(4, 0, 4, 0);
labelPowerModeTitle.Name = "labelPowerModeTitle";
labelPowerModeTitle.Size = new Size(271, 32);
labelPowerModeTitle.TabIndex = 39;
labelPowerModeTitle.Text = "Windows Power Mode";
//
// panelGPU
//
panelGPU.AutoSize = true;
@@ -1087,13 +1147,14 @@ namespace GHelper
panelGPU.Controls.Add(panelGPUBoost);
panelGPU.Controls.Add(panelGPUMemory);
panelGPU.Controls.Add(panelGPUCore);
panelGPU.Controls.Add(panelGPUClockLimit);
panelGPU.Controls.Add(panelTitleGPU);
panelGPU.Dock = DockStyle.Top;
panelGPU.Location = new Point(10, 66);
panelGPU.Margin = new Padding(4);
panelGPU.Name = "panelGPU";
panelGPU.Padding = new Padding(0, 0, 0, 18);
panelGPU.Size = new Size(520, 574);
panelGPU.Size = new Size(520, 698);
panelGPU.TabIndex = 44;
panelGPU.Visible = false;
//
@@ -1105,7 +1166,7 @@ namespace GHelper
panelGPUTemp.Controls.Add(labelGPUTempTitle);
panelGPUTemp.Controls.Add(trackGPUTemp);
panelGPUTemp.Dock = DockStyle.Top;
panelGPUTemp.Location = new Point(0, 432);
panelGPUTemp.Location = new Point(0, 556);
panelGPUTemp.Margin = new Padding(4);
panelGPUTemp.MaximumSize = new Size(0, 124);
panelGPUTemp.Name = "panelGPUTemp";
@@ -1154,7 +1215,7 @@ namespace GHelper
panelGPUBoost.Controls.Add(labelGPUBoostTitle);
panelGPUBoost.Controls.Add(trackGPUBoost);
panelGPUBoost.Dock = DockStyle.Top;
panelGPUBoost.Location = new Point(0, 308);
panelGPUBoost.Location = new Point(0, 432);
panelGPUBoost.Margin = new Padding(4);
panelGPUBoost.MaximumSize = new Size(0, 124);
panelGPUBoost.Name = "panelGPUBoost";
@@ -1203,7 +1264,7 @@ namespace GHelper
panelGPUMemory.Controls.Add(labelGPUMemoryTitle);
panelGPUMemory.Controls.Add(trackGPUMemory);
panelGPUMemory.Dock = DockStyle.Top;
panelGPUMemory.Location = new Point(0, 184);
panelGPUMemory.Location = new Point(0, 308);
panelGPUMemory.Margin = new Padding(4);
panelGPUMemory.MaximumSize = new Size(0, 124);
panelGPUMemory.Name = "panelGPUMemory";
@@ -1252,7 +1313,7 @@ namespace GHelper
panelGPUCore.Controls.Add(trackGPUCore);
panelGPUCore.Controls.Add(labelGPUCoreTitle);
panelGPUCore.Dock = DockStyle.Top;
panelGPUCore.Location = new Point(0, 60);
panelGPUCore.Location = new Point(0, 184);
panelGPUCore.Margin = new Padding(4);
panelGPUCore.MaximumSize = new Size(0, 124);
panelGPUCore.Name = "panelGPUCore";
@@ -1294,6 +1355,56 @@ namespace GHelper
labelGPUCoreTitle.TabIndex = 17;
labelGPUCoreTitle.Text = "Core Clock Offset";
//
// panelGPUClockLimit
//
panelGPUClockLimit.AutoSize = true;
panelGPUClockLimit.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelGPUClockLimit.Controls.Add(labelGPUClockLimit);
panelGPUClockLimit.Controls.Add(trackGPUClockLimit);
panelGPUClockLimit.Controls.Add(labelGPUClockLimitTitle);
panelGPUClockLimit.Dock = DockStyle.Top;
panelGPUClockLimit.Location = new Point(0, 60);
panelGPUClockLimit.Margin = new Padding(4);
panelGPUClockLimit.MaximumSize = new Size(0, 124);
panelGPUClockLimit.Name = "panelGPUClockLimit";
panelGPUClockLimit.Size = new Size(520, 124);
panelGPUClockLimit.TabIndex = 48;
//
// labelGPUClockLimit
//
labelGPUClockLimit.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelGPUClockLimit.Location = new Point(326, 16);
labelGPUClockLimit.Margin = new Padding(4, 0, 4, 0);
labelGPUClockLimit.Name = "labelGPUClockLimit";
labelGPUClockLimit.Size = new Size(176, 32);
labelGPUClockLimit.TabIndex = 29;
labelGPUClockLimit.Text = "1500 MHz";
labelGPUClockLimit.TextAlign = ContentAlignment.TopRight;
//
// trackGPUClockLimit
//
trackGPUClockLimit.LargeChange = 100;
trackGPUClockLimit.Location = new Point(6, 48);
trackGPUClockLimit.Margin = new Padding(4, 2, 4, 2);
trackGPUClockLimit.Maximum = 3000;
trackGPUClockLimit.Name = "trackGPUClockLimit";
trackGPUClockLimit.RightToLeft = RightToLeft.No;
trackGPUClockLimit.Size = new Size(496, 90);
trackGPUClockLimit.SmallChange = 10;
trackGPUClockLimit.TabIndex = 18;
trackGPUClockLimit.TickFrequency = 50;
trackGPUClockLimit.TickStyle = TickStyle.TopLeft;
//
// labelGPUClockLimitTitle
//
labelGPUClockLimitTitle.AutoSize = true;
labelGPUClockLimitTitle.Location = new Point(10, 16);
labelGPUClockLimitTitle.Margin = new Padding(4, 0, 4, 0);
labelGPUClockLimitTitle.Name = "labelGPUClockLimitTitle";
labelGPUClockLimitTitle.Size = new Size(188, 32);
labelGPUClockLimitTitle.TabIndex = 17;
labelGPUClockLimitTitle.Text = "Core Clock Limit";
//
// panelTitleGPU
//
panelTitleGPU.AutoSize = true;
@@ -1416,42 +1527,6 @@ namespace GHelper
buttonCPU.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonCPU.UseVisualStyleBackColor = false;
//
// panelPowerModeTItle
//
panelPowerModeTItle.AutoSize = true;
panelPowerModeTItle.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelPowerModeTItle.Controls.Add(picturePowerMode);
panelPowerModeTItle.Controls.Add(labelPowerModeTitle);
panelPowerModeTItle.Dock = DockStyle.Top;
panelPowerModeTItle.Location = new Point(0, 0);
panelPowerModeTItle.Margin = new Padding(4);
panelPowerModeTItle.Name = "panelPowerModeTItle";
panelPowerModeTItle.Size = new Size(520, 60);
panelPowerModeTItle.TabIndex = 50;
//
// picturePowerMode
//
picturePowerMode.BackgroundImage = Properties.Resources.icons8_gauge_32;
picturePowerMode.BackgroundImageLayout = ImageLayout.Zoom;
picturePowerMode.InitialImage = null;
picturePowerMode.Location = new Point(10, 18);
picturePowerMode.Margin = new Padding(4, 2, 4, 10);
picturePowerMode.Name = "picturePowerMode";
picturePowerMode.Size = new Size(32, 32);
picturePowerMode.TabIndex = 40;
picturePowerMode.TabStop = false;
//
// labelPowerModeTitle
//
labelPowerModeTitle.AutoSize = true;
labelPowerModeTitle.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelPowerModeTitle.Location = new Point(46, 18);
labelPowerModeTitle.Margin = new Padding(4, 0, 4, 0);
labelPowerModeTitle.Name = "labelPowerModeTitle";
labelPowerModeTitle.Size = new Size(271, 32);
labelPowerModeTitle.TabIndex = 39;
labelPowerModeTitle.Text = "Windows Power Mode";
//
// Fans
//
AutoScaleDimensions = new SizeF(192F, 192F);
@@ -1519,10 +1594,13 @@ namespace GHelper
panelTitleCPU.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxCPU).EndInit();
panelBoost.ResumeLayout(false);
panelPowerMode.ResumeLayout(false);
panelBoostTitle.ResumeLayout(false);
panelBoostTitle.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBoost).EndInit();
panelPowerMode.ResumeLayout(false);
panelPowerModeTItle.ResumeLayout(false);
panelPowerModeTItle.PerformLayout();
((System.ComponentModel.ISupportInitialize)picturePowerMode).EndInit();
panelGPU.ResumeLayout(false);
panelGPU.PerformLayout();
panelGPUTemp.ResumeLayout(false);
@@ -1537,14 +1615,14 @@ namespace GHelper
panelGPUCore.ResumeLayout(false);
panelGPUCore.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackGPUCore).EndInit();
panelGPUClockLimit.ResumeLayout(false);
panelGPUClockLimit.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).EndInit();
panelTitleGPU.ResumeLayout(false);
panelTitleGPU.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureGPU).EndInit();
panelNav.ResumeLayout(false);
tableNav.ResumeLayout(false);
panelPowerModeTItle.ResumeLayout(false);
panelPowerModeTItle.PerformLayout();
((System.ComponentModel.ISupportInitialize)picturePowerMode).EndInit();
ResumeLayout(false);
PerformLayout();
}
@@ -1647,5 +1725,10 @@ namespace GHelper
private Panel panelPowerModeTItle;
private PictureBox picturePowerMode;
private Label labelPowerModeTitle;
private Panel panelGPUClockLimit;
private Label labelGPUClockLimit;
private TrackBar trackGPUClockLimit;
private Label labelGPUClockLimitTitle;
private RButton buttonCalibrate;
}
}

View File

@@ -1,4 +1,5 @@
using GHelper.Gpu.NVidia;
using GHelper.Fan;
using GHelper.Gpu.NVidia;
using GHelper.Mode;
using GHelper.UI;
using Ryzen;
@@ -18,20 +19,23 @@ namespace GHelper
Series seriesMid;
Series seriesXGM;
static int MinRPM, MaxRPM;
static bool gpuVisible = true;
static bool fanRpm = true;
const int fansMax = 100;
NvidiaGpuControl? nvControl = null;
ModeControl modeControl = Program.modeControl;
FanSensorControl fanSensorControl;
public Fans()
{
InitializeComponent();
fanSensorControl = new FanSensorControl(this);
//float dpi = ControlHelper.GetDpiScale(this).Value;
//comboModes.Size = new Size(comboModes.Width, (int)dpi * 18);
comboModes.ClientSize = new Size(comboModes.Width, comboModes.Height - 4);
@@ -56,10 +60,10 @@ namespace GHelper
buttonApplyAdvanced.Text = Properties.Strings.Apply;
checkApplyUV.Text = Properties.Strings.AutoApply;
buttonCalibrate.Text = Properties.Strings.Calibrate;
InitTheme(true);
MinRPM = 18;
MaxRPM = HardwareControl.fanMax;
labelTip.Visible = false;
labelTip.BackColor = Color.Transparent;
@@ -77,15 +81,24 @@ namespace GHelper
chartCPU.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.CPU);
chartCPU.MouseUp += ChartCPU_MouseUp;
chartCPU.MouseLeave += ChartCPU_MouseLeave;
chartGPU.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.GPU);
chartGPU.MouseUp += ChartCPU_MouseUp;
chartGPU.MouseLeave += ChartCPU_MouseLeave;
chartMid.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.Mid);
chartMid.MouseUp += ChartCPU_MouseUp;
chartMid.MouseLeave += ChartCPU_MouseLeave;
chartXGM.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.XGM);
chartXGM.MouseUp += ChartCPU_MouseUp;
chartXGM.MouseLeave += ChartCPU_MouseLeave;
chartCPU.MouseClick += ChartCPU_MouseClick;
chartGPU.MouseClick += ChartCPU_MouseClick;
chartMid.MouseClick += ChartCPU_MouseClick;
chartXGM.MouseClick += ChartCPU_MouseClick;
buttonReset.Click += ButtonReset_Click;
@@ -109,6 +122,9 @@ namespace GHelper
checkApplyFans.Click += CheckApplyFans_Click;
checkApplyPower.Click += CheckApplyPower_Click;
trackGPUClockLimit.Minimum = NvidiaGpuControl.MinClockLimit;
trackGPUClockLimit.Maximum = NvidiaGpuControl.MaxClockLimit;
trackGPUCore.Minimum = NvidiaGpuControl.MinCoreOffset;
trackGPUCore.Maximum = NvidiaGpuControl.MaxCoreOffset;
@@ -121,6 +137,7 @@ namespace GHelper
trackGPUTemp.Minimum = AsusACPI.MinGPUTemp;
trackGPUTemp.Maximum = AsusACPI.MaxGPUTemp;
trackGPUClockLimit.Scroll += trackGPUClockLimit_Scroll;
trackGPUCore.Scroll += trackGPU_Scroll;
trackGPUMemory.Scroll += trackGPU_Scroll;
@@ -132,6 +149,8 @@ namespace GHelper
trackGPUBoost.MouseUp += TrackGPU_MouseUp;
trackGPUTemp.MouseUp += TrackGPU_MouseUp;
trackGPUClockLimit.MouseUp += TrackGPU_MouseUp;
//labelInfo.MaximumSize = new Size(280, 0);
labelFansResult.Visible = false;
@@ -184,12 +203,42 @@ namespace GHelper
checkApplyUV.Click += CheckApplyUV_Click;
buttonCalibrate.Click += ButtonCalibrate_Click;
ToggleNavigation(0);
if (Program.acpi.DeviceGet(AsusACPI.DevsCPUFanCurve) < 0) buttonCalibrate.Visible = false;
FormClosed += Fans_FormClosed;
}
private void ButtonCalibrate_Click(object? sender, EventArgs e)
{
buttonCalibrate.Enabled = false;
fanSensorControl.StartCalibration();
}
private void ChartCPU_MouseClick(object? sender, MouseEventArgs e)
{
if (sender is null) return;
Chart chart = (Chart)sender;
HitTestResult result = chart.HitTest(e.X, e.Y);
if ((result.ChartElementType == ChartElementType.AxisLabels || result.ChartElementType == ChartElementType.Axis) && result.Axis == chart.ChartAreas[0].AxisY)
{
fanRpm = !fanRpm;
SetAxis(chartCPU, AsusFan.CPU);
SetAxis(chartGPU, AsusFan.GPU);
if (chartMid.Visible) SetAxis(chartMid, AsusFan.Mid);
if (chartXGM.Visible) SetAxis(chartXGM, AsusFan.XGM);
}
}
private void Fans_FormClosed(object? sender, FormClosedEventArgs e)
{
//Because windows charts seem to eat a lot of memory :(
@@ -435,24 +484,29 @@ namespace GHelper
int gpu_boost = AppConfig.GetMode("gpu_boost");
int gpu_temp = AppConfig.GetMode("gpu_temp");
int core = AppConfig.GetMode("gpu_core");
int memory = AppConfig.GetMode("gpu_memory");
int clock_limit = AppConfig.GetMode("gpu_clock_limit");
if (gpu_boost < 0) gpu_boost = AsusACPI.MaxGPUBoost;
if (gpu_temp < 0) gpu_temp = AsusACPI.MaxGPUTemp;
if (core == -1) core = 0;
if (memory == -1) memory = 0;
if (clock_limit == -1) clock_limit = NvidiaGpuControl.MaxClockLimit;
//if (readClocks)
//{
int status = nvControl.GetClocks(out int current_core, out int current_memory);
if (status != -1)
if (nvControl.GetClocks(out int current_core, out int current_memory))
{
core = current_core;
memory = current_memory;
}
int _clockLimit = nvControl.GetMaxGPUCLock();
if (_clockLimit == 0) clock_limit = NvidiaGpuControl.MaxClockLimit;
else if (_clockLimit > 0) clock_limit = _clockLimit;
try
{
labelGPU.Text = nvControl.FullName;
@@ -463,6 +517,7 @@ namespace GHelper
}
//}
trackGPUClockLimit.Value = Math.Max(Math.Min(clock_limit, NvidiaGpuControl.MaxClockLimit), NvidiaGpuControl.MinClockLimit);
trackGPUCore.Value = Math.Max(Math.Min(core, NvidiaGpuControl.MaxCoreOffset), NvidiaGpuControl.MinCoreOffset);
trackGPUMemory.Value = Math.Max(Math.Min(memory, NvidiaGpuControl.MaxMemoryOffset), NvidiaGpuControl.MinMemoryOffset);
@@ -488,8 +543,24 @@ namespace GHelper
{
labelGPUCore.Text = $"{trackGPUCore.Value} MHz";
labelGPUMemory.Text = $"{trackGPUMemory.Value} MHz";
labelGPUBoost.Text = $"{trackGPUBoost.Value}W";
labelGPUTemp.Text = $"{trackGPUTemp.Value}°C";
if (trackGPUClockLimit.Value >= NvidiaGpuControl.MaxClockLimit)
labelGPUClockLimit.Text = "Default";
else
labelGPUClockLimit.Text = $"{trackGPUClockLimit.Value} MHz";
}
private void trackGPUClockLimit_Scroll(object? sender, EventArgs e)
{
int maxClock = (int)Math.Round((float)trackGPUClockLimit.Value / 50) * 50;
trackGPUClockLimit.Value = maxClock;
AppConfig.SetMode("gpu_clock_limit", maxClock);
VisualiseGPUSettings();
}
private void trackGPU_Scroll(object? sender, EventArgs e)
@@ -501,6 +572,7 @@ namespace GHelper
AppConfig.SetMode("gpu_core", trackGPUCore.Value);
AppConfig.SetMode("gpu_memory", trackGPUMemory.Value);
VisualiseGPUSettings();
}
@@ -513,34 +585,52 @@ namespace GHelper
VisualiseGPUSettings();
}
static string ChartPercToRPM(int percentage, AsusFan device, string unit = "")
static string ChartYLabel(int percentage, AsusFan device, string unit = "")
{
if (percentage == 0) return "OFF";
int Max = MaxRPM;
if (device == AsusFan.XGM) Max = 72;
int Min = FanSensorControl.DEFAULT_FAN_MIN;
int Max = FanSensorControl.GetFanMax(device);
return (200 * Math.Round((float)(MinRPM * 100 + (Max - MinRPM) * percentage) / 200)).ToString() + unit;
if (fanRpm)
return (200 * Math.Round((float)(Min * 100 + (Max - Min) * percentage) / 200)).ToString() + unit;
else
return percentage + "%";
}
void SetAxis(Chart chart, AsusFan device)
{
chart.ChartAreas[0].AxisY.CustomLabels.Clear();
for (int i = 0; i <= fansMax; i += 10)
{
chart.ChartAreas[0].AxisY.CustomLabels.Add(i - 2, i + 2, ChartYLabel(i, device));
}
//chart.ChartAreas[0].AxisY.CustomLabels.Add(fansMax -2, fansMax + 2, Properties.Strings.RPM);
chart.ChartAreas[0].AxisY.Interval = 10;
}
void SetChart(Chart chart, AsusFan device)
{
string title = "";
string scale = ", RPM/°C";
switch (device)
{
case AsusFan.CPU:
title = Properties.Strings.FanProfileCPU;
title = Properties.Strings.FanProfileCPU + scale;
break;
case AsusFan.GPU:
title = Properties.Strings.FanProfileGPU;
title = Properties.Strings.FanProfileGPU + scale;
break;
case AsusFan.Mid:
title = Properties.Strings.FanProfileMid;
title = Properties.Strings.FanProfileMid + scale;
break;
case AsusFan.XGM:
title = "XG Mobile";
title = "XG Mobile" + scale;
break;
}
@@ -560,12 +650,7 @@ namespace GHelper
chart.ChartAreas[0].AxisX.LineColor = chartGrid;
chart.ChartAreas[0].AxisY.LineColor = chartGrid;
for (int i = 0; i <= fansMax - 10; i += 10)
chart.ChartAreas[0].AxisY.CustomLabels.Add(i - 2, i + 2, ChartPercToRPM(i, device));
chart.ChartAreas[0].AxisY.CustomLabels.Add(fansMax - 2, fansMax + 2, Properties.Strings.RPM);
chart.ChartAreas[0].AxisY.Interval = 10;
SetAxis(chart, device);
if (chart.Legends.Count > 0)
chart.Legends[0].Enabled = false;
@@ -607,7 +692,14 @@ namespace GHelper
comboBoost.SelectedIndex = Math.Min(boost, comboBoost.Items.Count - 1);
string powerMode = PowerNative.GetPowerMode();
comboPowerMode.SelectedValue = powerMode;
bool batterySaver = PowerNative.GetBatterySaverStatus();
comboPowerMode.Enabled = !batterySaver;
if (batterySaver)
comboPowerMode.SelectedIndex = 0;
else
comboPowerMode.SelectedValue = powerMode;
}
@@ -615,9 +707,11 @@ namespace GHelper
{
string powerMode = (string)comboPowerMode.SelectedValue;
PowerNative.SetPowerMode(powerMode);
if (PowerNative.GetDefaultPowerMode(Modes.GetCurrentBase()) != powerMode)
AppConfig.SetMode("powermode", powerMode);
else
AppConfig.RemoveMode("powermode");
}
private void ComboBoost_Changed(object? sender, EventArgs e)
@@ -649,16 +743,34 @@ namespace GHelper
}
public void InitAxis()
{
if (this == null || this.Text == "") return;
Invoke(delegate
{
buttonCalibrate.Enabled = true;
SetAxis(chartCPU, AsusFan.CPU);
SetAxis(chartGPU, AsusFan.GPU);
if (chartMid.Visible) SetAxis(chartMid, AsusFan.Mid);
});
}
public void LabelFansResult(string text)
{
labelFansResult.Text = text;
labelFansResult.Visible = (text.Length > 0);
if (text.Length > 0) Logger.WriteLine(text);
if (this == null || this.Text == "") return;
Invoke(delegate
{
labelFansResult.Text = text;
labelFansResult.Visible = (text.Length > 0);
});
}
private void Fans_FormClosing(object? sender, FormClosingEventArgs e)
{
/*
if (e.CloseReason == CloseReason.UserClosing)
{
@@ -897,13 +1009,17 @@ namespace GHelper
if (gpuVisible)
{
trackGPUClockLimit.Value = NvidiaGpuControl.MaxClockLimit;
trackGPUCore.Value = 0;
trackGPUMemory.Value = 0;
trackGPUBoost.Value = AsusACPI.MaxGPUBoost;
trackGPUTemp.Value = AsusACPI.MaxGPUTemp;
AppConfig.SetMode("gpu_clock_limit", trackGPUClockLimit.Value);
AppConfig.SetMode("gpu_boost", trackGPUBoost.Value);
AppConfig.SetMode("gpu_temp", trackGPUTemp.Value);
AppConfig.SetMode("gpu_core", trackGPUCore.Value);
AppConfig.SetMode("gpu_memory", trackGPUMemory.Value);
@@ -914,11 +1030,10 @@ namespace GHelper
}
private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)
private void Chart_Save()
{
curPoint = null;
curIndex = -1;
labelTip.Visible = false;
SaveProfile(seriesCPU, AsusFan.CPU);
@@ -931,8 +1046,19 @@ namespace GHelper
SaveProfile(seriesXGM, AsusFan.XGM);
modeControl.AutoFans();
}
private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)
{
Chart_Save();
}
private void ChartCPU_MouseLeave(object? sender, EventArgs e)
{
curPoint = null;
curIndex = -1;
labelTip.Visible = false;
}
private void ChartCPU_MouseMove(object? sender, MouseEventArgs e, AsusFan device)
@@ -996,7 +1122,7 @@ namespace GHelper
tip = true;
}
labelTip.Text = Math.Round(curPoint.XValue) + "C, " + ChartPercToRPM((int)curPoint.YValues[0], device, " " + Properties.Strings.RPM);
labelTip.Text = Math.Round(curPoint.XValue) + "C, " + ChartYLabel((int)curPoint.YValues[0], device, " " + Properties.Strings.RPM);
labelTip.Top = e.Y + ((Control)sender).Top;
labelTip.Left = e.X - 50;

View File

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

View File

@@ -10,6 +10,10 @@ namespace GHelper.Gpu
SettingsForm settings;
ScreenControl screenControl = new ScreenControl();
public static int gpuMode;
public static bool? gpuExists = null;
public GPUModeControl(SettingsForm settingsForm)
{
settings = settingsForm;
@@ -20,32 +24,37 @@ namespace GHelper.Gpu
int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco);
int mux = Program.acpi.DeviceGet(AsusACPI.GPUMux);
if (mux < 0) mux = Program.acpi.DeviceGet(AsusACPI.GPUMuxVivo);
Logger.WriteLine("Eco flag : " + eco);
Logger.WriteLine("Mux flag : " + mux);
int GpuMode;
settings.VisualiseGPUButtons(eco >= 0, mux >= 0);
if (mux == 0)
{
GpuMode = AsusACPI.GPUModeUltimate;
gpuMode = AsusACPI.GPUModeUltimate;
}
else
{
if (eco == 1)
GpuMode = AsusACPI.GPUModeEco;
gpuMode = AsusACPI.GPUModeEco;
else
GpuMode = AsusACPI.GPUModeStandard;
gpuMode = AsusACPI.GPUModeStandard;
// Ultimate mode not supported
if (mux != 1) settings.HideUltimateMode();
// GPU mode not supported
if (eco < 0 && mux < 0) settings.HideGPUModes();
if (eco < 0 && mux < 0)
{
if (gpuExists is null) gpuExists = Program.acpi.GetFan(AsusFan.GPU) >= 0;
settings.HideGPUModes((bool)gpuExists);
}
}
AppConfig.Set("gpu_mode", GpuMode);
AppConfig.Set("gpu_mode", gpuMode);
settings.VisualiseGPUMode(gpuMode);
AsusUSB.ApplyGPUColor();
InitXGM();
settings.VisualiseGPUMode(GpuMode);
}
@@ -65,12 +74,15 @@ namespace GHelper.Gpu
var restart = false;
var changed = false;
int status;
if (CurrentGPU == AsusACPI.GPUModeUltimate)
{
DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertUltimateOff, Properties.Strings.AlertUltimateTitle, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
Program.acpi.DeviceSet(AsusACPI.GPUMux, 1, "GPUMux");
status = Program.acpi.DeviceSet(AsusACPI.GPUMux, 1, "GPUMux");
if (status != 1) Program.acpi.DeviceSet(AsusACPI.GPUMuxVivo, 1, "GPUMuxVivo");
restart = true;
changed = true;
}
@@ -85,7 +97,8 @@ namespace GHelper.Gpu
Program.acpi.SetGPUEco(0);
Thread.Sleep(100);
}
Program.acpi.DeviceSet(AsusACPI.GPUMux, 0, "GPUMux");
status = Program.acpi.DeviceSet(AsusACPI.GPUMux, 0, "GPUMux");
if (status != 1) Program.acpi.DeviceSet(AsusACPI.GPUMuxVivo, 0, "GPUMuxVivo");
restart = true;
changed = true;
}
@@ -152,7 +165,7 @@ namespace GHelper.Gpu
if (status == 0 && eco == 1 && hardWay) RestartGPU();
await Task.Delay(TimeSpan.FromMilliseconds(100));
await Task.Delay(TimeSpan.FromMilliseconds(AppConfig.Get("refresh_delay", 500)));
settings.Invoke(delegate
{
@@ -189,7 +202,7 @@ namespace GHelper.Gpu
{
bool GpuAuto = AppConfig.Is("gpu_auto");
bool ForceGPU = AppConfig.ContainsModel("503");
bool ForceGPU = AppConfig.IsForceSetGPUMode();
int GpuMode = AppConfig.Get("gpu_mode");
@@ -268,9 +281,12 @@ namespace GHelper.Gpu
public void InitXGM()
{
bool connected = Program.acpi.IsXGConnected();
int activated = Program.acpi.DeviceGet(AsusACPI.GPUXG);
settings.VisualizeXGM(connected, activated == 1);
if (Program.acpi.IsXGConnected())
{
//Program.acpi.DeviceSet(AsusACPI.GPUXGInit, 1, "XG Init");
AsusUSB.InitXGM();
}
}
public void ToggleXGM()
@@ -282,7 +298,9 @@ namespace GHelper.Gpu
if (Program.acpi.DeviceGet(AsusACPI.GPUXG) == 1)
{
AsusUSB.ResetXGM();
HardwareControl.KillGPUApps();
DialogResult dialogResult = MessageBox.Show("Did you close all applications running on XG Mobile?", "Disabling XG Mobile", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
@@ -292,7 +310,14 @@ namespace GHelper.Gpu
}
else
{
Program.acpi.DeviceSet(AsusACPI.GPUXG, 1, "GPU XGM");
if (AppConfig.Is("xgm_special"))
Program.acpi.DeviceSet(AsusACPI.GPUXG, 0x101, "GPU XGM");
else
Program.acpi.DeviceSet(AsusACPI.GPUXG, 1, "GPU XGM");
InitXGM();
AsusUSB.ApplyXGMLight(AppConfig.Is("xmg_light"));
await Task.Delay(TimeSpan.FromSeconds(15));

View File

@@ -18,6 +18,9 @@ public class NvidiaGpuControl : IGpuControl
public const int MinCoreOffset = -250;
public const int MinMemoryOffset = -250;
public const int MinClockLimit = 1000;
public const int MaxClockLimit = 3000;
private static PhysicalGPU? _internalGpu;
public NvidiaGpuControl()
@@ -76,7 +79,7 @@ public class NvidiaGpuControl : IGpuControl
}
public int GetClocks(out int core, out int memory)
public bool GetClocks(out int core, out int memory)
{
PhysicalGPU internalGpu = _internalGpu!;
@@ -95,28 +98,24 @@ public class NvidiaGpuControl : IGpuControl
Logger.WriteLine("GPU VOLT:" + delta.IsEditable + " - " + delta.ValueDeltaInMicroVolt.DeltaValue);
}
return 0;
return true;
}
catch (Exception ex)
{
Logger.WriteLine("GET GPU CLOCKS:" + ex.Message);
core = memory = 0;
return -1;
return false;
}
}
public bool RestartGPU()
private bool RunPowershellCommand(string script)
{
try
{
string script = @"$device = Get-PnpDevice | Where-Object { $_.FriendlyName -imatch 'NVIDIA' -and $_.Class -eq 'Display' }; Disable-PnpDevice $device.InstanceId -Confirm:$false; Start-Sleep -Seconds 5; Enable-PnpDevice $device.InstanceId -Confirm:$false";
Logger.WriteLine(script);
ProcessHelper.RunCMD("powershell", script);
//Thread.Sleep(2000);
return true;
}
catch (Exception ex)
@@ -124,27 +123,71 @@ public class NvidiaGpuControl : IGpuControl
Logger.WriteLine(ex.ToString());
return false;
}
}
public int SetClocksFromConfig()
public int GetMaxGPUCLock()
{
int core = AppConfig.Get("gpu_core", 0);
int memory = AppConfig.Get("gpu_memory", 0);
int status = SetClocks(core, memory);
return status;
PhysicalGPU internalGpu = _internalGpu!;
try
{
PrivateClockBoostLockV2 data = GPUApi.GetClockBoostLock(internalGpu.Handle);
int limit = (int)data.ClockBoostLocks[0].VoltageInMicroV / 1000;
Logger.WriteLine("GET CLOCK LIMIT: " + limit);
return limit;
}
catch (Exception ex)
{
Logger.WriteLine("GET CLOCK LIMIT: " + ex.Message);
return -1;
}
}
public int SetClocks(int core, int memory, int voltage = 0)
public int SetMaxGPUClock(int clock)
{
if (clock < MinClockLimit || clock >= MaxClockLimit) clock = 0;
int _clockLimit = GetMaxGPUCLock();
if (_clockLimit != clock)
{
if (clock > 0) RunPowershellCommand($"nvidia-smi -lgc 0,{clock}");
else RunPowershellCommand($"nvidia-smi -rgc");
return 1;
}
else
{
return 0;
}
}
public bool RestartGPU()
{
return RunPowershellCommand(@"$device = Get-PnpDevice | Where-Object { $_.FriendlyName -imatch 'NVIDIA' -and $_.Class -eq 'Display' }; Disable-PnpDevice $device.InstanceId -Confirm:$false; Start-Sleep -Seconds 5; Enable-PnpDevice $device.InstanceId -Confirm:$false");
}
public int SetClocks(int core, int memory)
{
if (core < MinCoreOffset || core > MaxCoreOffset) return 0;
if (memory < MinMemoryOffset || memory > MaxMemoryOffset) return 0;
if (GetClocks(out int currentCore, out int currentMemory))
{
if (Math.Abs(core - currentCore) < 5 && Math.Abs(memory - currentMemory) < 5) return 0;
}
PhysicalGPU internalGpu = _internalGpu!;
var coreClock = new PerformanceStates20ClockEntryV1(PublicClockDomain.Graphics, new PerformanceStates20ParameterDelta(core * 1000));
var memoryClock = new PerformanceStates20ClockEntryV1(PublicClockDomain.Memory, new PerformanceStates20ParameterDelta(memory * 1000));
var voltageEntry = new PerformanceStates20BaseVoltageEntryV1(PerformanceVoltageDomain.Core, new PerformanceStates20ParameterDelta(voltage));
//var voltageEntry = new PerformanceStates20BaseVoltageEntryV1(PerformanceVoltageDomain.Core, new PerformanceStates20ParameterDelta(voltage));
PerformanceStates20ClockEntryV1[] clocks = { coreClock, memoryClock };
PerformanceStates20BaseVoltageEntryV1[] voltages = { };
@@ -164,8 +207,6 @@ public class NvidiaGpuControl : IGpuControl
return -1;
}
return 1;
}

View File

@@ -1,4 +1,5 @@
using GHelper;
using GHelper.Fan;
using GHelper.Gpu;
using GHelper.Gpu.NVidia;
using GHelper.Gpu.AMD;
@@ -10,9 +11,6 @@ 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;
@@ -35,65 +33,6 @@ public static class HardwareControl
static long lastUpdate;
static int _fanMax = DEFAULT_FAN_MAX;
static bool _fanRpm = false;
public static int fanMax
{
get
{
return _fanMax;
}
set
{
AppConfig.Set("fan_max", value);
_fanMax = value;
}
}
public static bool fanRpm
{
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
if (fan < 0)
{
fan += 65536;
if (fan <= 0 || fan > 100) return null; //nothing reasonable
}
if (fan > fanMax && fan <= INADEQUATE_MAX) fanMax = fan;
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
}
private static int GetGpuUse()
{
try
@@ -141,7 +80,7 @@ public static class HardwareControl
}
catch (Exception ex)
{
Logger.WriteLine("Discharge Reading: " + ex.Message);
Debug.WriteLine("Discharge Reading: " + ex.Message);
}
}
@@ -163,7 +102,7 @@ public static class HardwareControl
}
catch (Exception ex)
{
Logger.WriteLine("Full Charge Reading: " + ex.Message);
Debug.WriteLine("Full Charge Reading: " + ex.Message);
}
}
@@ -186,7 +125,7 @@ public static class HardwareControl
}
catch (Exception ex)
{
Logger.WriteLine("Design Capacity Reading: " + ex.Message);
Debug.WriteLine("Design Capacity Reading: " + ex.Message);
}
}
@@ -246,9 +185,9 @@ public static class HardwareControl
gpuTemp = -1;
gpuUse = -1;
cpuFan = FormatFan(Program.acpi.DeviceGet(AsusACPI.CPU_Fan));
gpuFan = FormatFan(Program.acpi.DeviceGet(AsusACPI.GPU_Fan));
midFan = FormatFan(Program.acpi.DeviceGet(AsusACPI.Mid_Fan));
cpuFan = FanSensorControl.FormatFan(AsusFan.CPU, Program.acpi.GetFan(AsusFan.CPU));
gpuFan = FanSensorControl.FormatFan(AsusFan.GPU, Program.acpi.GetFan(AsusFan.GPU));
midFan = FanSensorControl.FormatFan(AsusFan.Mid, Program.acpi.GetFan(AsusFan.Mid));
cpuTemp = GetCPUTemp();
@@ -328,6 +267,7 @@ public static class HardwareControl
if (_gpuControl.IsValid)
{
GpuControl = _gpuControl;
if (GpuControl.FullName.Contains("6850M")) AppConfig.Set("xgm_special", 1);
Logger.WriteLine(GpuControl.FullName);
return;
}

View File

@@ -95,6 +95,10 @@ namespace GHelper.Helpers
if (IsClamshellEnabled())
ToggleLidAction();
if (Program.settingsForm.Visible)
Program.screenControl.InitScreen();
}
private static int CheckAndSaveLidAction()

View File

@@ -55,6 +55,12 @@ namespace GHelper.Helpers
return Process.GetProcessesByName("AsusOptimization").Count() > 0;
}
public static bool IsOSDRunning()
{
return Process.GetProcessesByName("AsusOSD").Count() > 0;
}
public static int GetRunningCount()
{
int count = 0;

View File

@@ -132,7 +132,12 @@ namespace GHelper.Helpers
cmd.StartInfo.FileName = name;
cmd.StartInfo.Arguments = args;
cmd.Start();
Logger.WriteLine(cmd.StandardOutput.ReadToEnd());
string result = cmd.StandardOutput.ReadToEnd().Replace(Environment.NewLine, " ").Trim(' ');
Logger.WriteLine(args);
Logger.WriteLine(result);
cmd.WaitForExit();
}

View File

@@ -10,8 +10,8 @@ public class Startup
public static bool IsScheduled()
{
TaskService taskService = new TaskService();
return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));
using (TaskService taskService = new TaskService())
return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));
}
public static void ReScheduleAdmin()
@@ -23,6 +23,26 @@ public class Startup
}
}
public static void StartupCheck()
{
using (TaskService taskService = new TaskService())
{
var task = taskService.RootFolder.AllTasks.FirstOrDefault(t => t.Name == taskName);
if (task != null)
{
string strExeFilePath = Application.ExecutablePath.Trim();
string action = task.Definition.Actions.FirstOrDefault()!.ToString().Trim();
if (!strExeFilePath.Equals(action, StringComparison.OrdinalIgnoreCase) && !File.Exists(action))
{
Logger.WriteLine("File doesn't exist: " + action);
Logger.WriteLine("Rescheduling to: " + strExeFilePath);
UnSchedule();
Schedule();
}
}
}
}
public static void Schedule()
{

View File

@@ -4,6 +4,7 @@ using GHelper.Mode;
using Microsoft.Win32;
using System.Diagnostics;
using System.Management;
using System.Text.RegularExpressions;
namespace GHelper.Input
{
@@ -103,7 +104,12 @@ namespace GHelper.Input
string actionM1 = AppConfig.GetString("m1");
string actionM2 = AppConfig.GetString("m2");
if (keyProfile != Keys.None) hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control, keyProfile);
if (keyProfile != Keys.None)
{
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control, keyProfile);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, keyProfile);
}
if (keyApp != Keys.None) hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control, keyApp);
if (!AppConfig.Is("skip_hotkeys"))
@@ -126,27 +132,70 @@ namespace GHelper.Input
if (AppConfig.Is("fn_lock") && !AppConfig.ContainsModel("VivoBook"))
for (Keys i = Keys.F1; i <= Keys.F11; i++) hook.RegisterHotKey(ModifierKeys.None, i);
// Arrow-lock group
if (AppConfig.Is("arrow_lock") && AppConfig.IsDUO())
{
hook.RegisterHotKey(ModifierKeys.None, Keys.Left);
hook.RegisterHotKey(ModifierKeys.None, Keys.Right);
hook.RegisterHotKey(ModifierKeys.None, Keys.Up);
hook.RegisterHotKey(ModifierKeys.None, Keys.Down);
}
}
public static int[] ParseHexValues(string input)
{
string pattern = @"\b(0x[0-9A-Fa-f]{1,2}|[0-9A-Fa-f]{1,2})\b";
if (!Regex.IsMatch(input, $"^{pattern}(\\s+{pattern})*$")) return new int[0];
MatchCollection matches = Regex.Matches(input, pattern);
int[] hexValues = new int[matches.Count];
for (int i = 0; i < matches.Count; i++)
{
string hexValueStr = matches[i].Value;
int hexValue = int.Parse(hexValueStr.StartsWith("0x", StringComparison.OrdinalIgnoreCase)
? hexValueStr.Substring(2)
: hexValueStr, System.Globalization.NumberStyles.HexNumber);
hexValues[i] = hexValue;
}
return hexValues;
}
static void CustomKey(string configKey = "m3")
{
string command = AppConfig.GetString(configKey + "_custom");
int intKey;
int[] hexKeys = new int[0];
try
{
intKey = Convert.ToInt32(command, 16);
hexKeys = ParseHexValues(command);
}
catch
{
intKey = -1;
}
if (intKey > 0)
KeyboardHook.KeyPress((Keys)intKey);
else
LaunchProcess(command);
switch (hexKeys.Length)
{
case 1:
KeyboardHook.KeyPress((Keys)hexKeys[0]);
break;
case 2:
KeyboardHook.KeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1]);
break;
case 3:
KeyboardHook.KeyKeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1], (Keys)hexKeys[3]);
break;
default:
LaunchProcess(command);
break;
}
}
@@ -154,7 +203,7 @@ namespace GHelper.Input
static void SetBrightness(int delta)
{
int brightness = -1;
if (isTUF) brightness = ScreenBrightness.Get();
if (AppConfig.SwappedBrightness()) delta = -delta;
@@ -168,7 +217,7 @@ namespace GHelper.Input
Thread.Sleep(100);
if (brightness == ScreenBrightness.Get())
Program.toast.RunToast(ScreenBrightness.Adjust(delta) + "%", (delta < 0 ) ? ToastIcon.BrightnessDown : ToastIcon.BrightnessUp);
Program.toast.RunToast(ScreenBrightness.Adjust(delta) + "%", (delta < 0) ? ToastIcon.BrightnessDown : ToastIcon.BrightnessUp);
}
}
@@ -250,7 +299,7 @@ namespace GHelper.Input
SetBrightness(+10);
break;
case Keys.F9:
KeyboardHook.KeyWinPress(Keys.P);
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.P);
break;
case Keys.F10:
HandleOptimizationEvent(107);
@@ -259,7 +308,7 @@ namespace GHelper.Input
HandleOptimizationEvent(108);
break;
case Keys.F12:
KeyboardHook.KeyWinPress(Keys.A);
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.A);
break;
case Keys.VolumeDown:
KeyProcess("m1");
@@ -267,6 +316,18 @@ namespace GHelper.Input
case Keys.VolumeUp:
KeyProcess("m2");
break;
case Keys.Left:
KeyboardHook.KeyPress(Keys.Home);
break;
case Keys.Right:
KeyboardHook.KeyPress(Keys.End);
break;
case Keys.Up:
KeyboardHook.KeyPress(Keys.PageUp);
break;
case Keys.Down:
KeyboardHook.KeyPress(Keys.PageDown);
break;
default:
break;
}
@@ -280,6 +341,11 @@ namespace GHelper.Input
if (e.Key == Keys.F20) KeyProcess("m3");
}
if (e.Modifier == (ModifierKeys.Control | ModifierKeys.Shift | ModifierKeys.Alt))
{
if (e.Key == keyProfile) modeControl.CyclePerformanceMode(true);
}
if (e.Modifier == (ModifierKeys.Control))
{
switch (e.Key)
@@ -345,7 +411,7 @@ namespace GHelper.Input
break;
case "screen":
Logger.WriteLine("Screen off toggle");
NativeMethods.TurnOffScreen(Program.settingsForm.Handle);
NativeMethods.TurnOffScreen();
break;
case "miniled":
screenControl.ToogleMiniled();
@@ -354,13 +420,20 @@ namespace GHelper.Input
Program.settingsForm.BeginInvoke(Program.settingsForm.CycleAuraMode);
break;
case "performance":
modeControl.CyclePerformanceMode();
modeControl.CyclePerformanceMode(Control.ModifierKeys == Keys.Shift);
break;
case "ghelper":
Program.settingsForm.BeginInvoke(delegate
try
{
Program.SettingsToggle();
});
Program.settingsForm.BeginInvoke(delegate
{
Program.SettingsToggle();
});
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
break;
case "fnlock":
ToggleFnLock();
@@ -368,6 +441,7 @@ namespace GHelper.Input
case "micmute":
bool muteStatus = Audio.ToggleMute();
Program.toast.RunToast(muteStatus ? "Muted" : "Unmuted", muteStatus ? ToastIcon.MicrophoneMute : ToastIcon.Microphone);
if (AppConfig.IsVivobook()) Program.acpi.DeviceSet(AsusACPI.MICMUTE_LED, muteStatus ? 1 : 0, "MicmuteLed");
break;
case "brightness_up":
SetBrightness(+10);
@@ -401,6 +475,20 @@ namespace GHelper.Input
}
}
static void ToggleTouchpad()
{
KeyboardHook.KeyKeyKeyPress(Keys.ControlKey, Keys.LWin, Keys.F24);
}
public static void ToggleArrowLock()
{
int arLock = AppConfig.Is("arrow_lock") ? 0 : 1;
AppConfig.Set("arrow_lock", arLock);
Program.settingsForm.BeginInvoke(Program.inputDispatcher.RegisterKeys);
Program.toast.RunToast("Arrow-Lock " + (arLock == 1 ? "On" : "Off"), ToastIcon.FnLock);
}
public static void ToggleFnLock()
{
int fnLock = AppConfig.Is("fn_lock") ? 0 : 1;
@@ -435,7 +523,7 @@ namespace GHelper.Input
// We'll special-case the translation of those.
if (AppConfig.IsAlly())
{
switch(EventID)
switch (EventID)
{
// This is both the M1 and M2 keys.
@@ -466,11 +554,14 @@ namespace GHelper.Input
case 56: // M4 / Rog button
KeyProcess("m4");
return;
case 55: // Arconym
KeyProcess("m6");
return;
case 181: // FN + Numpad Enter
KeyProcess("fne");
return;
case 174: // FN+F5
modeControl.CyclePerformanceMode();
modeControl.CyclePerformanceMode(Control.ModifierKeys == Keys.Shift);
return;
case 179: // FN+F4
case 178: // FN+F4
@@ -482,6 +573,9 @@ namespace GHelper.Input
case 78: // Fn + ESC
ToggleFnLock();
return;
case 75: // Fn + ESC
ToggleArrowLock();
return;
case 189: // Tablet mode
TabletMode();
return;
@@ -495,7 +589,7 @@ namespace GHelper.Input
SetBacklight(4);
return;
case 53: // FN+F6 on GA-502DU model
NativeMethods.TurnOffScreen(Program.settingsForm.Handle);
NativeMethods.TurnOffScreen();
return;
}
}
@@ -519,13 +613,18 @@ namespace GHelper.Input
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Up, "Brightness");
break;
case 107: // FN+F10
AsusUSB.TouchpadToggle();
ToggleTouchpad();
Thread.Sleep(200);
Program.toast.RunToast(GetTouchpadState() ? "On" : "Off", ToastIcon.Touchpad);
break;
case 108: // FN+F11
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.KB_Sleep, "Sleep");
break;
case 106: // Screenpad button on DUO
SetScreenpad(100);
break;
}
}
@@ -547,9 +646,7 @@ namespace GHelper.Input
public static void SetBacklightAuto(bool init = false)
{
if (init) AsusUSB.Init();
//if (!OptimizationService.IsRunning())
AsusUSB.ApplyBrightness(GetBacklight(), "Auto");
AsusUSB.ApplyBrightness(GetBacklight(), "Auto", init);
}
public static void SetBacklight(int delta, bool force = false)
@@ -575,22 +672,45 @@ namespace GHelper.Input
AsusUSB.ApplyBrightness(backlight, "HotKey");
}
string[] backlightNames = new string[] { "Off", "Low", "Mid", "Max" };
Program.toast.RunToast(backlightNames[backlight], delta > 0 ? ToastIcon.BacklightUp : ToastIcon.BacklightDown);
if (!OptimizationService.IsOSDRunning())
{
string[] backlightNames = new string[] { "Off", "Low", "Mid", "Max" };
Program.toast.RunToast(backlightNames[backlight], delta > 0 ? ToastIcon.BacklightUp : ToastIcon.BacklightDown);
}
}
public static void SetScreenpad(int delta)
{
int brightness = AppConfig.Get("screenpad", 100);
brightness = Math.Max(Math.Min(100, brightness + delta), 0);
if (delta == 100)
{
if (brightness < 0) brightness = 100;
else if (brightness >= 100) brightness = 0;
else brightness = -10;
}
else
{
brightness = Math.Max(Math.Min(100, brightness + delta), -10);
}
AppConfig.Set("screenpad", brightness);
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, (brightness * 255 / 100), "Screenpad");
if (brightness == 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, brightness, "ScreenpadToggle");
if (brightness >= 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 1, "ScreenpadOn");
Program.toast.RunToast($"Screen Pad {brightness}", delta > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, Math.Max(brightness * 255 / 100, 0), "Screenpad");
if (brightness < 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 0, "ScreenpadOff");
string toast;
if (brightness < 0) toast = "Off";
else if (brightness == 0) toast = "Hidden";
else toast = brightness.ToString() + "%";
Program.toast.RunToast($"Screen Pad {toast}", delta > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);
}
@@ -603,11 +723,14 @@ namespace GHelper.Input
//string executable = command.Split(' ')[0];
//string arguments = command.Substring(executable.Length).Trim();
ProcessStartInfo startInfo = new ProcessStartInfo("cmd", "/C " + command);
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
startInfo.FileName = command;
//startInfo.Arguments = arguments;
Process proc = Process.Start(startInfo);
}

View File

@@ -17,21 +17,33 @@ public sealed class KeyboardHook : IDisposable
public const int KEYEVENTF_EXTENDEDKEY = 1;
public const int KEYEVENTF_KEYUP = 2;
private const byte VK_LWIN = 0x5B;
private const byte VK_LCONTROL = 0xA2;
public static void KeyPress(Keys key)
{
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
}
public static void KeyWinPress(Keys key)
public static void KeyKeyPress(Keys key, Keys key2)
{
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}
public static void KeyKeyKeyPress(Keys key, Keys key2, Keys key3)
{
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}
/// <summary>
/// Represents the window that is used internally to get the messages.

302
app/Matrix.Designer.cs generated Normal file
View File

@@ -0,0 +1,302 @@
namespace GHelper
{
partial class Matrix
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
pictureMatrix = new PictureBox();
trackZoom = new TrackBar();
buttonPicture = new UI.RButton();
panelPicture = new Panel();
panelMain = new Panel();
panelButtons = new Panel();
buttonReset = new UI.RButton();
panelScaling = new Panel();
comboScaling = new UI.RComboBox();
labelScaling = new Label();
panelZoom = new Panel();
labelZoom = new Label();
labelZoomTitle = new Label();
panelRotation = new Panel();
comboRotation = new UI.RComboBox();
labelRotation = new Label();
((System.ComponentModel.ISupportInitialize)pictureMatrix).BeginInit();
((System.ComponentModel.ISupportInitialize)trackZoom).BeginInit();
panelPicture.SuspendLayout();
panelMain.SuspendLayout();
panelButtons.SuspendLayout();
panelScaling.SuspendLayout();
panelZoom.SuspendLayout();
panelRotation.SuspendLayout();
SuspendLayout();
//
// pictureMatrix
//
pictureMatrix.BackColor = Color.Black;
pictureMatrix.Cursor = Cursors.SizeAll;
pictureMatrix.Location = new Point(731, 27);
pictureMatrix.Name = "pictureMatrix";
pictureMatrix.Size = new Size(81, 73);
pictureMatrix.TabIndex = 0;
pictureMatrix.TabStop = false;
//
// trackZoom
//
trackZoom.LargeChange = 50;
trackZoom.Location = new Point(16, 52);
trackZoom.Maximum = 200;
trackZoom.Minimum = 10;
trackZoom.Name = "trackZoom";
trackZoom.Size = new Size(782, 90);
trackZoom.SmallChange = 10;
trackZoom.TabIndex = 2;
trackZoom.TickFrequency = 20;
trackZoom.TickStyle = TickStyle.TopLeft;
trackZoom.Value = 100;
//
// buttonPicture
//
buttonPicture.Activated = false;
buttonPicture.BackColor = SystemColors.ControlLight;
buttonPicture.BorderColor = Color.Transparent;
buttonPicture.BorderRadius = 5;
buttonPicture.FlatAppearance.BorderSize = 0;
buttonPicture.FlatStyle = FlatStyle.Flat;
buttonPicture.Image = Properties.Resources.icons8_matrix_32;
buttonPicture.Location = new Point(16, 19);
buttonPicture.Name = "buttonPicture";
buttonPicture.Secondary = true;
buttonPicture.Size = new Size(258, 56);
buttonPicture.TabIndex = 3;
buttonPicture.Text = "Picture / Gif";
buttonPicture.TextAlign = ContentAlignment.MiddleRight;
buttonPicture.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonPicture.UseVisualStyleBackColor = false;
//
// panelPicture
//
panelPicture.BackColor = Color.Black;
panelPicture.Controls.Add(pictureMatrix);
panelPicture.Dock = DockStyle.Top;
panelPicture.Location = new Point(0, 0);
panelPicture.Name = "panelPicture";
panelPicture.Size = new Size(834, 419);
panelPicture.TabIndex = 4;
//
// panelMain
//
panelMain.Controls.Add(panelButtons);
panelMain.Controls.Add(panelRotation);
panelMain.Controls.Add(panelScaling);
panelMain.Controls.Add(panelZoom);
panelMain.Controls.Add(panelPicture);
panelMain.Dock = DockStyle.Top;
panelMain.Location = new Point(20, 20);
panelMain.Name = "panelMain";
panelMain.Size = new Size(834, 924);
panelMain.TabIndex = 5;
//
// panelButtons
//
panelButtons.Controls.Add(buttonReset);
panelButtons.Controls.Add(buttonPicture);
panelButtons.Dock = DockStyle.Top;
panelButtons.Location = new Point(0, 720);
panelButtons.Name = "panelButtons";
panelButtons.Size = new Size(834, 94);
panelButtons.TabIndex = 6;
//
// buttonReset
//
buttonReset.Activated = false;
buttonReset.BackColor = SystemColors.ControlLight;
buttonReset.BorderColor = Color.Transparent;
buttonReset.BorderRadius = 5;
buttonReset.FlatAppearance.BorderSize = 0;
buttonReset.FlatStyle = FlatStyle.Flat;
buttonReset.Image = Properties.Resources.icons8_refresh_32;
buttonReset.Location = new Point(290, 19);
buttonReset.Name = "buttonReset";
buttonReset.Secondary = true;
buttonReset.Size = new Size(258, 56);
buttonReset.TabIndex = 4;
buttonReset.Text = "Reset";
buttonReset.TextAlign = ContentAlignment.MiddleRight;
buttonReset.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonReset.UseVisualStyleBackColor = false;
//
// panelScaling
//
panelScaling.Controls.Add(comboScaling);
panelScaling.Controls.Add(labelScaling);
panelScaling.Dock = DockStyle.Top;
panelScaling.Location = new Point(0, 564);
panelScaling.Name = "panelScaling";
panelScaling.Size = new Size(834, 78);
panelScaling.TabIndex = 7;
//
// comboScaling
//
comboScaling.BorderColor = Color.White;
comboScaling.ButtonColor = Color.FromArgb(255, 255, 255);
comboScaling.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboScaling.FormattingEnabled = true;
comboScaling.ItemHeight = 32;
comboScaling.Items.AddRange(new object[] { "Default", "Low", "High", "Bilinear", "Bicubic", "NearestNeighbor", "HighQualityBilinear", "HighQualityBicubic" });
comboScaling.Location = new Point(229, 17);
comboScaling.Margin = new Padding(4, 11, 4, 8);
comboScaling.Name = "comboScaling";
comboScaling.Size = new Size(322, 40);
comboScaling.TabIndex = 17;
//
// labelScaling
//
labelScaling.AutoSize = true;
labelScaling.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelScaling.Location = new Point(16, 20);
labelScaling.Name = "labelScaling";
labelScaling.Size = new Size(185, 32);
labelScaling.TabIndex = 4;
labelScaling.Text = "Scaling Quality";
//
// panelZoom
//
panelZoom.AutoSize = true;
panelZoom.Controls.Add(labelZoom);
panelZoom.Controls.Add(labelZoomTitle);
panelZoom.Controls.Add(trackZoom);
panelZoom.Dock = DockStyle.Top;
panelZoom.Location = new Point(0, 419);
panelZoom.Name = "panelZoom";
panelZoom.Size = new Size(834, 145);
panelZoom.TabIndex = 5;
//
// labelZoom
//
labelZoom.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelZoom.AutoSize = true;
labelZoom.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
labelZoom.Location = new Point(731, 17);
labelZoom.Name = "labelZoom";
labelZoom.Size = new Size(77, 32);
labelZoom.TabIndex = 4;
labelZoom.Text = "Zoom";
//
// labelZoomTitle
//
labelZoomTitle.AutoSize = true;
labelZoomTitle.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelZoomTitle.Location = new Point(16, 17);
labelZoomTitle.Name = "labelZoomTitle";
labelZoomTitle.Size = new Size(81, 32);
labelZoomTitle.TabIndex = 3;
labelZoomTitle.Text = "Zoom";
//
// panelRotation
//
panelRotation.Controls.Add(comboRotation);
panelRotation.Controls.Add(labelRotation);
panelRotation.Dock = DockStyle.Top;
panelRotation.Location = new Point(0, 642);
panelRotation.Name = "panelRotation";
panelRotation.Size = new Size(834, 78);
panelRotation.TabIndex = 8;
//
// comboRotation
//
comboRotation.BorderColor = Color.White;
comboRotation.ButtonColor = Color.FromArgb(255, 255, 255);
comboRotation.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboRotation.FormattingEnabled = true;
comboRotation.ItemHeight = 32;
comboRotation.Items.AddRange(new object[] { "Straight", "Diagonal" });
comboRotation.Location = new Point(229, 17);
comboRotation.Margin = new Padding(4, 11, 4, 8);
comboRotation.Name = "comboRotation";
comboRotation.Size = new Size(322, 40);
comboRotation.TabIndex = 17;
//
// labelRotation
//
labelRotation.AutoSize = true;
labelRotation.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelRotation.Location = new Point(16, 20);
labelRotation.Name = "labelRotation";
labelRotation.Size = new Size(190, 32);
labelRotation.TabIndex = 4;
labelRotation.Text = "Image Rotation";
//
// Matrix
//
AutoScaleDimensions = new SizeF(192F, 192F);
AutoScaleMode = AutoScaleMode.Dpi;
AutoSize = true;
ClientSize = new Size(874, 978);
Controls.Add(panelMain);
MaximizeBox = false;
MinimizeBox = false;
MinimumSize = new Size(900, 0);
Name = "Matrix";
Padding = new Padding(20);
ShowIcon = false;
ShowInTaskbar = false;
Text = "Matrix";
((System.ComponentModel.ISupportInitialize)pictureMatrix).EndInit();
((System.ComponentModel.ISupportInitialize)trackZoom).EndInit();
panelPicture.ResumeLayout(false);
panelMain.ResumeLayout(false);
panelMain.PerformLayout();
panelButtons.ResumeLayout(false);
panelScaling.ResumeLayout(false);
panelScaling.PerformLayout();
panelZoom.ResumeLayout(false);
panelZoom.PerformLayout();
panelRotation.ResumeLayout(false);
panelRotation.PerformLayout();
ResumeLayout(false);
}
#endregion
private PictureBox pictureMatrix;
private TrackBar trackZoom;
private UI.RButton buttonPicture;
private Panel panelPicture;
private Panel panelMain;
private Panel panelZoom;
private Label labelZoom;
private Label labelZoomTitle;
private Panel panelButtons;
private UI.RButton buttonReset;
private Panel panelScaling;
private Label labelScaling;
private UI.RComboBox comboScaling;
private Panel panelRotation;
private UI.RComboBox comboRotation;
private Label labelRotation;
}
}

222
app/Matrix.cs Normal file
View File

@@ -0,0 +1,222 @@
using GHelper.AnimeMatrix;
using GHelper.UI;
namespace GHelper
{
public partial class Matrix : RForm
{
public AniMatrixControl matrixControl = Program.settingsForm.matrixControl;
private bool Dragging;
private int xPos;
private int yPos;
private int baseX;
private int baseY;
private float uiScale;
Image picture;
MemoryStream ms = new MemoryStream();
public Matrix()
{
InitializeComponent();
InitTheme(true);
Shown += Matrix_Shown;
FormClosing += Matrix_FormClosed;
buttonPicture.Click += ButtonPicture_Click;
buttonReset.Click += ButtonReset_Click;
pictureMatrix.MouseUp += PictureMatrix_MouseUp;
pictureMatrix.MouseMove += PictureMatrix_MouseMove;
pictureMatrix.MouseDown += PictureMatrix_MouseDown;
trackZoom.MouseUp += TrackZoom_MouseUp;
trackZoom.ValueChanged += TrackZoom_Changed;
trackZoom.Value = Math.Min(trackZoom.Maximum, AppConfig.Get("matrix_zoom", 100));
VisualiseZoom();
comboScaling.DropDownStyle = ComboBoxStyle.DropDownList;
comboScaling.SelectedIndex = AppConfig.Get("matrix_quality", 0);
comboScaling.SelectedValueChanged += ComboScaling_SelectedValueChanged;
comboRotation.DropDownStyle = ComboBoxStyle.DropDownList;
comboRotation.SelectedIndex = AppConfig.Get("matrix_rotation", 0);
comboRotation.SelectedValueChanged += ComboRotation_SelectedValueChanged; ;
uiScale = panelPicture.Width / matrixControl.device.MaxColumns / 3;
panelPicture.Height = (int)(matrixControl.device.MaxRows * uiScale);
}
private void ComboRotation_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_rotation", comboRotation.SelectedIndex);
SetMatrixPicture(false);
}
private void ComboScaling_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_quality", comboScaling.SelectedIndex);
SetMatrixPicture(false);
}
private void Matrix_FormClosed(object? sender, FormClosingEventArgs e)
{
if (picture is not null) picture.Dispose();
if (ms is not null) ms.Dispose();
pictureMatrix.Dispose();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
}
private void VisualiseZoom()
{
labelZoom.Text = trackZoom.Value + "%";
}
private void ButtonReset_Click(object? sender, EventArgs e)
{
AppConfig.Set("matrix_zoom", 100);
AppConfig.Set("matrix_x", 0);
AppConfig.Set("matrix_y", 0);
trackZoom.Value = 100;
SetMatrixPicture();
}
private void TrackZoom_MouseUp(object? sender, EventArgs e)
{
AppConfig.Set("matrix_zoom", trackZoom.Value);
SetMatrixPicture();
}
private void TrackZoom_Changed(object? sender, EventArgs e)
{
VisualiseZoom();
}
private void PictureMatrix_MouseDown(object? sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Dragging = true;
xPos = e.X;
yPos = e.Y;
}
}
private void PictureMatrix_MouseMove(object? sender, MouseEventArgs e)
{
Control c = sender as Control;
if (Dragging && c != null)
{
c.Top = e.Y + c.Top - yPos;
c.Left = e.X + c.Left - xPos;
}
}
private void PictureMatrix_MouseUp(object? sender, MouseEventArgs e)
{
Dragging = false;
Control c = sender as Control;
int matrixX = (int)((baseX - c.Left) / uiScale);
int matrixY = (int)((baseY - c.Top) / uiScale);
AppConfig.Set("matrix_x", matrixX);
AppConfig.Set("matrix_y", matrixY);
SetMatrixPicture(false);
}
private void Matrix_Shown(object? sender, EventArgs e)
{
FormPosition();
SetMatrixPicture();
}
private void SetMatrixPicture(bool visualise = true)
{
matrixControl.SetMatrixPicture(AppConfig.GetString("matrix_picture"), visualise);
}
private void ButtonPicture_Click(object? sender, EventArgs e)
{
matrixControl.OpenMatrixPicture();
}
public void FormPosition()
{
if (Height > Program.settingsForm.Height)
{
Top = Program.settingsForm.Top + Program.settingsForm.Height - Height;
}
else
{
Height = Program.settingsForm.Height;
Top = Program.settingsForm.Top;
}
Left = Program.settingsForm.Left - Width - 5;
}
public void VisualiseMatrix(string fileName)
{
if (picture is not null) picture.Dispose();
using (var fs = new FileStream(fileName, FileMode.Open))
{
ms.SetLength(0);
fs.CopyTo(ms);
ms.Position = 0;
fs.Close();
picture = Image.FromStream(ms);
int width = picture.Width;
int height = picture.Height;
int matrixX = AppConfig.Get("matrix_x", 0);
int matrixY = AppConfig.Get("matrix_y", 0);
int matrixZoom = AppConfig.Get("matrix_zoom", 100);
float scale = Math.Min((float)panelPicture.Width / (float)width, (float)panelPicture.Height / (float)height) * matrixZoom / 100;
pictureMatrix.Width = (int)(width * scale);
pictureMatrix.Height = (int)(height * scale);
baseX = panelPicture.Width - pictureMatrix.Width;
baseY = 0;
pictureMatrix.Left = baseX - (int)(matrixX * uiScale);
pictureMatrix.Top = baseY - (int)(matrixY * uiScale);
pictureMatrix.SizeMode = PictureBoxSizeMode.Zoom;
pictureMatrix.Image = picture;
}
}
}
}

120
app/Matrix.resx Normal file
View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<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="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -70,7 +70,16 @@ namespace GHelper.Mode
Modes.SetCurrent(mode);
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.IsManualModeRequired() ? AsusACPI.PerformanceManual : Modes.GetBase(mode), "Mode");
int status = Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.IsManualModeRequired() ? AsusACPI.PerformanceManual : Modes.GetBase(mode), "Mode");
// Vivobook fallback
if (status != 1)
{
int vivoMode = Modes.GetBase(mode);
if (vivoMode == 1) vivoMode = 2;
else if (vivoMode == 2) vivoMode = 1;
Program.acpi.DeviceSet(AsusACPI.VivoBookMode, vivoMode, "VivoMode");
}
if (AppConfig.Is("xgm_fan") && Program.acpi.IsXGConnected()) AsusUSB.ResetXGM();
@@ -110,9 +119,9 @@ namespace GHelper.Mode
}
public void CyclePerformanceMode()
public void CyclePerformanceMode(bool back = false)
{
SetPerformanceMode(Modes.GetNext(Control.ModifierKeys == Keys.Shift), true);
SetPerformanceMode(Modes.GetNext(back), true);
}
public void AutoFans(bool force = false)
@@ -125,6 +134,7 @@ namespace GHelper.Mode
bool xgmFan = false;
if (AppConfig.Is("xgm_fan") && Program.acpi.IsXGConnected())
{
//AsusUSB.InitXGM();
AsusUSB.SetXGMFan(AppConfig.GetFanConfig(AsusFan.XGM));
xgmFan = true;
}
@@ -139,10 +149,16 @@ namespace GHelper.Mode
// something went wrong, resetting to default profile
if (cpuResult != 1 || gpuResult != 1)
{
int mode = Modes.GetCurrentBase();
Logger.WriteLine("ASUS BIOS rejected fan curve, resetting mode to " + mode);
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, mode, "Reset Mode");
settings.LabelFansResult("ASUS BIOS rejected fan curve");
cpuResult = Program.acpi.SetFanRange(AsusFan.CPU, AppConfig.GetFanConfig(AsusFan.CPU));
gpuResult = Program.acpi.SetFanRange(AsusFan.GPU, AppConfig.GetFanConfig(AsusFan.GPU));
if (cpuResult != 1 || gpuResult != 1)
{
int mode = Modes.GetCurrentBase();
Logger.WriteLine("ASUS BIOS rejected fan curve, resetting mode to " + mode);
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, mode, "Reset Mode");
settings.LabelFansResult("ASUS BIOS rejected fan curve");
}
}
else
{
@@ -291,10 +307,11 @@ namespace GHelper.Mode
Task.Run(() =>
{
int gpu_core = AppConfig.GetMode("gpu_core");
int gpu_memory = AppConfig.GetMode("gpu_memory");
int core = AppConfig.GetMode("gpu_core");
int memory = AppConfig.GetMode("gpu_memory");
int clock_limit = AppConfig.GetMode("gpu_clock_limit");
if (gpu_core == -1 && gpu_memory == -1) return;
if (core == -1 && memory == -1) return;
//if ((gpu_core > -5 && gpu_core < 5) && (gpu_memory > -5 && gpu_memory < 5)) launchAsAdmin = false;
@@ -305,20 +322,16 @@ namespace GHelper.Mode
using NvidiaGpuControl nvControl = (NvidiaGpuControl)HardwareControl.GpuControl;
try
{
int getStatus = nvControl.GetClocks(out int current_core, out int current_memory);
if (getStatus != -1)
{
if (Math.Abs(gpu_core - current_core) < 5 && Math.Abs(gpu_memory - current_memory) < 5) return;
}
int setStatus = nvControl.SetClocks(gpu_core, gpu_memory);
if (launchAsAdmin && setStatus == -1) ProcessHelper.RunAsAdmin("gpu");
int statusLimit = nvControl.SetMaxGPUClock(clock_limit);
int statusClocks = nvControl.SetClocks(core, memory);
if ((statusLimit != 0 || statusClocks != 0) && launchAsAdmin) ProcessHelper.RunAsAdmin("gpu");
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
}
settings.GPUInit();
});
}

View File

@@ -153,6 +153,13 @@ namespace GHelper.Mode
Guid guidScheme = new Guid(scheme);
uint status = PowerGetEffectiveOverlayScheme(out Guid activeScheme);
if (GetBatterySaverStatus())
{
Logger.WriteLine("Battery Saver detected");
return;
}
if (status != 0 || activeScheme != guidScheme)
{
status = PowerSetActiveOverlayScheme(guidScheme);
@@ -288,6 +295,48 @@ namespace GHelper.Mode
Logger.WriteLine("Setting Hibernate after " + seconds + ": " + (hrAC == 0 ? "OK" : hrAC));
}
[DllImport("Kernel32")]
private static extern bool GetSystemPowerStatus(SystemPowerStatus sps);
public enum ACLineStatus : byte
{
Offline = 0, Online = 1, Unknown = 255
}
public enum BatteryFlag : byte
{
High = 1,
Low = 2,
Critical = 4,
Charging = 8,
NoSystemBattery = 128,
Unknown = 255
}
// Fields must mirror their unmanaged counterparts, in order
[StructLayout(LayoutKind.Sequential)]
public class SystemPowerStatus
{
public ACLineStatus ACLineStatus;
public BatteryFlag BatteryFlag;
public Byte BatteryLifePercent;
public Byte SystemStatusFlag;
public Int32 BatteryLifeTime;
public Int32 BatteryFullLifeTime;
}
public static bool GetBatterySaverStatus()
{
SystemPowerStatus sps = new SystemPowerStatus();
try
{
GetSystemPowerStatus(sps);
return (sps.SystemStatusFlag > 0);
} catch (Exception ex)
{
return false;
}
}
}
}

View File

@@ -32,9 +32,9 @@ public class NativeMethods
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, out string lpBuffer, uint nSize, IntPtr Arguments);
public static void TurnOffScreen(IntPtr handle)
public static void TurnOffScreen()
{
IntPtr result = SendMessage(handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MONITOR_OFF);
IntPtr result = SendMessage(-1, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MONITOR_OFF);
if (result == IntPtr.Zero)
{
int error = Marshal.GetLastWin32Error();

View File

@@ -141,7 +141,6 @@ namespace GHelper.Peripherals.Mouse
{
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;
@@ -149,6 +148,8 @@ namespace GHelper.Peripherals.Mouse
private readonly string path;
protected byte reportId = 0x00;
public bool IsDeviceReady { get; protected set; }
private void SetDeviceReady(bool ready)
@@ -180,6 +181,8 @@ namespace GHelper.Peripherals.Mouse
public bool AngleSnapping { get; protected set; }
public short AngleAdjustmentDegrees { get; protected set; }
public DebounceTime Debounce { get; protected set; }
public int Acceleration { get; protected set; }
public int Deceleration { get; protected set; }
public AsusMouse(ushort vendorId, ushort productId, string path, bool wireless) : base(vendorId, productId)
@@ -195,7 +198,12 @@ namespace GHelper.Peripherals.Mouse
{
LightingSetting = new LightingSetting[SupportedLightingZones().Length];
}
this.reportId = 0x00;
}
public AsusMouse(ushort vendorId, ushort productId, string path, bool wireless, byte reportId) : this(vendorId, productId, path, wireless)
{
this.reportId = reportId;
}
public override bool Equals(object? obj)
@@ -265,6 +273,11 @@ namespace GHelper.Peripherals.Mouse
return 300;
}
public virtual int USBPacketSize()
{
return 65;
}
public override void SetProvider()
{
_usbProvider = new WindowsUsbProvider(_vendorId, _productId, path, USBTimeout());
@@ -279,7 +292,7 @@ namespace GHelper.Peripherals.Mouse
}
}
private static bool IsPacketLoggerEnabled()
protected static bool IsPacketLoggerEnabled()
{
#if DEBUG
return true;
@@ -307,59 +320,87 @@ namespace GHelper.Peripherals.Mouse
[MethodImpl(MethodImplOptions.Synchronized)]
protected virtual byte[]? WriteForResponse(byte[] packet)
{
byte[] response = new byte[ASUS_MOUSE_PACKET_SIZE];
Array.Resize(ref packet, USBPacketSize());
try
byte[] response = new byte[USBPacketSize()];
response[0] = reportId;
int retries = 3;
while (retries > 0)
{
if (IsPacketLoggerEnabled())
Logger.WriteLine(GetDisplayName() + ": Sending packet: " + ByteArrayToString(packet));
response = new byte[USBPacketSize()];
long time = MeasuredIO(Write, packet);
Logger.WriteLine(GetDisplayName() + ": Write took " + time + "ms");
time = MeasuredIO(Read, response);
Logger.WriteLine(GetDisplayName() + ": Read took " + time + "ms");
if (IsPacketLoggerEnabled())
Logger.WriteLine(GetDisplayName() + ": Read packet: " + ByteArrayToString(response));
if (IsMouseError(response))
try
{
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;
}
if (IsPacketLoggerEnabled())
Logger.WriteLine(GetDisplayName() + ": Sending packet: " + ByteArrayToString(packet)
+ " Try " + (retries - 2) + " of 3");
long time = MeasuredIO(Write, packet);
Logger.WriteLine(GetDisplayName() + ": Write took " + time + "ms");
//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");
if (IsMouseError(response))
{
if (IsPacketLoggerEnabled())
Logger.WriteLine(GetDisplayName() + ": Read packet: " + ByteArrayToString(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;
}
if (response[1] == 0 && response[2] == 0 && response[3] == 0)
{
if (IsPacketLoggerEnabled())
Logger.WriteLine(GetDisplayName() + ": Read packet: " + ByteArrayToString(response));
Logger.WriteLine(GetDisplayName() + ": Received empty packet. Stopping here.");
//Empty packet
return null;
}
//Not the response we were looking for, continue reading
while (response[0] != packet[0] || response[1] != packet[1] || response[2] != packet[2])
{
if (IsPacketLoggerEnabled())
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");
}
if (IsPacketLoggerEnabled())
Logger.WriteLine(GetDisplayName() + ": Read packet: " + ByteArrayToString(response));
return response;
}
catch (IOException e)
{
Logger.WriteLine(GetDisplayName() + ": Failed to read packet " + e.Message);
OnDisconnect();
return null;
}
catch (TimeoutException e)
{
Logger.WriteLine(GetDisplayName() + ": Timeout reading packet " + e.Message + " Trying again.");
retries--;
continue;
}
catch (ObjectDisposedException)
{
Logger.WriteLine(GetDisplayName() + ": Channel closed ");
OnDisconnect();
return null;
}
}
catch (IOException e)
{
Logger.WriteLine(GetDisplayName() + ": Failed to read packet " + e.Message);
OnDisconnect();
return null;
}
catch (TimeoutException e)
{
Logger.WriteLine(GetDisplayName() + ": Timeout reading packet " + e.Message);
return null;
}
catch (ObjectDisposedException)
{
Logger.WriteLine(GetDisplayName() + ": Channel closed ");
OnDisconnect();
return null;
}
return response;
return null;
}
public abstract string GetDisplayName();
@@ -386,6 +427,7 @@ namespace GHelper.Peripherals.Mouse
ReadPollingRate();
ReadLiftOffDistance();
ReadDebounce();
ReadAcceleration();
ReadLightingSetting();
}
@@ -403,6 +445,16 @@ namespace GHelper.Peripherals.Mouse
return false;
}
public virtual int LowBatteryWarningStep()
{
return 10;
}
public virtual int LowBatteryWarningMax()
{
return 50;
}
public virtual bool HasLowBatteryWarning()
{
return false;
@@ -410,7 +462,7 @@ namespace GHelper.Peripherals.Mouse
protected virtual byte[] GetBatteryReportPacket()
{
return new byte[] { 0x00, 0x12, 0x07 };
return new byte[] { reportId, 0x12, 0x07 };
}
protected virtual int ParseBattery(byte[] packet)
@@ -452,7 +504,7 @@ namespace GHelper.Peripherals.Mouse
}
protected virtual byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)
{
return new byte[] { 0x00, 0x51, 0x37, 0x00, 0x00, (byte)powerOff, 0x00, (byte)lowBatteryWarning };
return new byte[] { reportId, 0x51, 0x37, 0x00, 0x00, (byte)powerOff, 0x00, (byte)lowBatteryWarning };
}
public void SetEnergySettings(int lowBatteryWarning, PowerOffSetting powerOff)
@@ -538,7 +590,7 @@ namespace GHelper.Peripherals.Mouse
return packet[11];
}
Logger.WriteLine(GetDisplayName() + ": Failed to decode active profile");
return 1;
return 0;
}
protected virtual int ParseDPIProfile(byte[] packet)
@@ -553,12 +605,12 @@ namespace GHelper.Peripherals.Mouse
protected virtual byte[] GetReadProfilePacket()
{
return new byte[] { 0x00, 0x12, 0x00 };
return new byte[] { reportId, 0x12, 0x00 };
}
protected virtual byte[] GetUpdateProfilePacket(int profile)
{
return new byte[] { 0x00, 0x50, 0x02, (byte)profile };
return new byte[] { reportId, 0x50, 0x02, (byte)profile };
}
public void ReadProfile()
@@ -667,20 +719,20 @@ namespace GHelper.Peripherals.Mouse
protected virtual byte[] GetReadPollingRatePacket()
{
return new byte[] { 0x00, 0x12, 0x04, 0x00 };
return new byte[] { reportId, 0x12, 0x04, 0x00 };
}
protected virtual byte[] GetUpdatePollingRatePacket(PollingRate pollingRate)
{
return new byte[] { 0x00, 0x51, 0x31, 0x04, 0x00, (byte)pollingRate };
return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)pollingRate };
}
protected virtual byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)
{
return new byte[] { 0x00, 0x51, 0x31, 0x06, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };
return new byte[] { reportId, 0x51, 0x31, 0x06, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };
}
protected virtual byte[] GetUpdateAngleAdjustmentPacket(short angleAdjustment)
{
return new byte[] { 0x00, 0x51, 0x31, 0x0B, 0x00, (byte)(angleAdjustment & 0xFF), (byte)((angleAdjustment >> 8) & 0xFF) };
return new byte[] { reportId, 0x51, 0x31, 0x0B, 0x00, (byte)(angleAdjustment & 0xFF), (byte)((angleAdjustment >> 8) & 0xFF) };
}
protected virtual PollingRate ParsePollingRate(byte[] packet)
@@ -791,6 +843,126 @@ namespace GHelper.Peripherals.Mouse
this.AngleAdjustmentDegrees = angleAdjustment;
}
// ------------------------------------------------------------------------------
// Acceleration/Deceleration
// ------------------------------------------------------------------------------
public virtual bool HasAcceleration()
{
return false;
}
public virtual bool HasDeceleration()
{
return false;
}
public virtual int MaxAcceleration()
{
return 0;
}
public virtual int MaxDeceleration()
{
return 0;
}
protected virtual byte[] GetChangeAccelerationPacket(int acceleration)
{
return new byte[] { reportId, 0x51, 0x31, 0x07, 0x00, (byte)acceleration };
}
protected virtual byte[] GetChangeDecelerationPacket(int deceleration)
{
return new byte[] { reportId, 0x51, 0x31, 0x08, 0x00, (byte)deceleration };
}
public virtual void SetAcceleration(int acceleration)
{
if (!HasAcceleration())
{
return;
}
if (acceleration > MaxAcceleration() || acceleration < 0)
{
Logger.WriteLine(GetDisplayName() + ": Acceleration " + acceleration + " is invalid.");
return;
}
WriteForResponse(GetChangeAccelerationPacket(acceleration));
FlushSettings();
Logger.WriteLine(GetDisplayName() + ": Acceleration set to " + acceleration);
this.Acceleration = acceleration;
}
public virtual void SetDeceleration(int deceleration)
{
if (!HasDeceleration())
{
return;
}
if (deceleration > MaxDeceleration() || deceleration < 0)
{
Logger.WriteLine(GetDisplayName() + ": Deceleration " + deceleration + " is invalid.");
return;
}
WriteForResponse(GetChangeDecelerationPacket(deceleration));
FlushSettings();
Logger.WriteLine(GetDisplayName() + ": Deceleration set to " + deceleration);
this.Deceleration = deceleration;
}
protected virtual byte[] GetReadAccelerationPacket()
{
return new byte[] { reportId, 0x12, 0x04, 0x01 };
}
protected virtual int ParseAcceleration(byte[] packet)
{
if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x01)
{
return 0;
}
return packet[5];
}
protected virtual int ParseDeceleration(byte[] packet)
{
if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x01)
{
return 0;
}
return packet[7];
}
public virtual void ReadAcceleration()
{
if (!HasAcceleration() && !HasDeceleration())
{
return;
}
byte[]? response = WriteForResponse(GetReadAccelerationPacket());
if (response is null) return;
if (HasAcceleration())
{
Acceleration = ParseAcceleration(response);
Logger.WriteLine(GetDisplayName() + ": Read Acceleration: " + Acceleration);
}
if (HasDeceleration())
{
Deceleration = ParseDeceleration(response);
Logger.WriteLine(GetDisplayName() + ": Read Deceleration: " + Deceleration);
}
}
// ------------------------------------------------------------------------------
// DPI
// ------------------------------------------------------------------------------
@@ -826,12 +998,12 @@ namespace GHelper.Peripherals.Mouse
protected virtual byte[] GetChangeDPIProfilePacket(int profile)
{
return new byte[] { 0x00, 0x51, 0x31, 0x0A, 0x00, (byte)profile };
return new byte[] { reportId, 0x51, 0x31, 0x0A, 0x00, (byte)profile };
}
protected virtual byte[] GetChangeDPIProfilePacket2(int profile)
{
return new byte[] { 0x00, 0x51, 0x31, 0x09, 0x00, (byte)profile };
return new byte[] { reportId, 0x51, 0x31, 0x09, 0x00, (byte)profile };
}
//profiles start to count at 1
@@ -863,10 +1035,10 @@ namespace GHelper.Peripherals.Mouse
{
if (!HasXYDPI())
{
return new byte[] { 0x00, 0x12, 0x04, 0x00 };
return new byte[] { reportId, 0x12, 0x04, 0x00 };
}
return new byte[] { 0x00, 0x12, 0x04, 0x02 };
return new byte[] { reportId, 0x12, 0x04, 0x02 };
}
protected virtual byte[]? GetUpdateDPIPacket(AsusMouseDPI dpi, int profile)
@@ -883,11 +1055,11 @@ namespace GHelper.Peripherals.Mouse
if (HasDPIColors())
{
return new byte[] { 0x00, 0x51, 0x31, (byte)(profile - 1), 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF), dpi.Color.R, dpi.Color.G, dpi.Color.B };
return new byte[] { reportId, 0x51, 0x31, (byte)(profile - 1), 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF), dpi.Color.R, dpi.Color.G, dpi.Color.B };
}
else
{
return new byte[] { 0x00, 0x51, 0x31, (byte)(profile - 1), 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF) };
return new byte[] { reportId, 0x51, 0x31, (byte)(profile - 1), 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF) };
}
}
@@ -918,7 +1090,7 @@ namespace GHelper.Peripherals.Mouse
protected virtual byte[] GetReadDPIColorsPacket()
{
return new byte[] { 0x00, 0x12, 0x04, 0x03 };
return new byte[] { reportId, 0x12, 0x04, 0x03 };
}
protected virtual void ParseDPIColors(byte[] packet)
@@ -996,13 +1168,13 @@ namespace GHelper.Peripherals.Mouse
protected virtual byte[] GetReadLiftOffDistancePacket()
{
return new byte[] { 0x00, 0x12, 0x06 };
return new byte[] { reportId, 0x12, 0x06 };
}
//This also resets the "calibration" to default. There is no seperate command to only set the lift off distance
protected virtual byte[] GetUpdateLiftOffDistancePacket(LiftOffDistance liftOffDistance)
{
return new byte[] { 0x00, 0x51, 0x35, 0xFF, 0x00, 0xFF, ((byte)liftOffDistance) };
return new byte[] { reportId, 0x51, 0x35, 0xFF, 0x00, 0xFF, ((byte)liftOffDistance) };
}
protected virtual LiftOffDistance ParseLiftOffDistance(byte[] packet)
@@ -1071,13 +1243,13 @@ namespace GHelper.Peripherals.Mouse
protected virtual byte[] GetReadDebouncePacket()
{
return new byte[] { 0x00, 0x12, 0x04, 0x00 };
return new byte[] { reportId, 0x12, 0x04, 0x00 };
}
protected virtual byte[] GetUpdateDebouncePacket(DebounceTime debounce)
{
return new byte[] { 0x00, 0x51, 0x31, 0x05, 0x00, ((byte)debounce) };
return new byte[] { reportId, 0x51, 0x31, 0x05, 0x00, ((byte)debounce) };
}
protected virtual DebounceTime ParseDebounce(byte[] packet)
@@ -1261,7 +1433,7 @@ namespace GHelper.Peripherals.Mouse
idx = IndexForZone(zone);
}
return new byte[] { 0x00, 0x12, 0x03, (byte)idx };
return new byte[] { reportId, 0x12, 0x03, (byte)idx };
}
protected virtual byte[] GetUpdateLightingModePacket(LightingSetting lightingSetting, LightingZone zone)
@@ -1279,7 +1451,7 @@ namespace GHelper.Peripherals.Mouse
lightingSetting.LightingMode = LightingMode.ColorCycle;
}
return new byte[] { 0x00, 0x51, 0x28, (byte)zone, 0x00,
return new byte[] { reportId, 0x51, 0x28, (byte)zone, 0x00,
IndexForLightingMode(lightingSetting.LightingMode),
(byte)lightingSetting.Brightness,
lightingSetting.RGBColor.R, lightingSetting.RGBColor.G, lightingSetting.RGBColor.B,
@@ -1375,7 +1547,7 @@ namespace GHelper.Peripherals.Mouse
protected virtual byte[] GetSaveProfilePacket()
{
return new byte[] { 0x00, 0x50, 0x03 };
return new byte[] { reportId, 0x50, 0x03 };
}
public void FlushSettings()

View File

@@ -0,0 +1,209 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P704
public class Chakram : AsusMouse
{
public Chakram() : base(0x0B05, 0x18E5, "mi_00", true) {
}
protected Chakram(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Chakram (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 HasDebounceSetting()
{
return true;
}
public override bool HasLiftOffSetting()
{
return true;
}
public override int DPIIncrements()
{
return 100;
}
public override bool HasRGB()
{
return true;
}
public override int MaxBrightness()
{
return 4;
}
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 false;
}
public override bool HasLowBatteryWarning()
{
return true;
}
public override int LowBatteryWarningStep()
{
return 25;
}
public override int LowBatteryWarningMax()
{
return 100;
}
protected override int ParseBattery(byte[] packet)
{
return base.ParseBattery(packet) * 25;
}
protected override int ParseLowBatteryWarning(byte[] packet)
{
return base.ParseLowBatteryWarning(packet) * 25;
}
protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)
{
return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);
}
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]);
setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode)
? (AnimationDirection)packet[21]
: AnimationDirection.Clockwise;
if (setting.AnimationDirection != AnimationDirection.Clockwise
&& setting.AnimationDirection != AnimationDirection.CounterClockwise)
{
setting.AnimationDirection = AnimationDirection.Clockwise;
}
setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[22] == 0x01;
setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode)
? (AnimationSpeed)packet[23]
: 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)
{
setting.AnimationSpeed = AnimationSpeed.Medium;
}
return setting;
}
public override void ReadLightingSetting()
{
if (!HasRGB())
{
return;
}
//Mouse sends all lighting zones in one response
//21: Direction
//22: Random
//23: Speed
// 20 21 22 23
//00 12 03 00 00 [03 04 00 00 ff] [03 04 00 00 ff] [03 04 00 00 ff] 00 04 00 00
//00 12 03 00 00 [05 02 ff 00 ff] [05 02 ff 00 ff] [05 02 ff 00 ff] 00 01 01 00
//00 12 03 00 00 [03 01 00 00 ff] [03 01 00 00 ff] [03 01 00 00 ff] 00 01 00 01
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 override bool CanChangeDPIProfile()
{
return false;
}
}
public class ChakramWired : Chakram
{
public ChakramWired() : base(0x18E3, false)
{
}
public override string GetDisplayName()
{
return "ROG Chakram (Wired)";
}
}
}

View File

@@ -0,0 +1,174 @@
using System.Runtime.CompilerServices;
namespace GHelper.Peripherals.Mouse.Models
{
//P713_Wireless
public class HarpeAceAimLabEdition : AsusMouse
{
public HarpeAceAimLabEdition() : base(0x0B05, 0x1A94, "mi_00", true)
{
}
protected HarpeAceAimLabEdition(ushort productId, bool wireless, string endpoint, byte reportId) : base(0x0B05, productId, endpoint, wireless, reportId)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Harpe Ace Aim Lab Edition (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 int MinDPI()
{
return 50;
}
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.Scrollwheel };
}
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 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 override int AngleTuningStep()
{
return 1;
}
public override int AngleTuningMin()
{
return -30;
}
public override int AngleTuningMax()
{
return 30;
}
public override bool HasAcceleration()
{
return true;
}
public override bool HasDeceleration()
{
return true;
}
public override int MaxAcceleration()
{
return 9;
}
public override int MaxDeceleration()
{
return 9;
}
}
public class HarpeAceAimLabEditionWired : HarpeAceAimLabEdition
{
public HarpeAceAimLabEditionWired() : base(0x1A92, false, "mi_00", 0x00)
{
}
public override string GetDisplayName()
{
return "ROG Harpe Ace Aim Lab Edition (Wired)";
}
}
public class HarpeAceAimLabEditionOmni : HarpeAceAimLabEdition
{
public HarpeAceAimLabEditionOmni() : base(0x1ACE, true, "mi_02&col03", 0x03)
{
}
public override string GetDisplayName()
{
return "ROG Harpe Ace Aim Lab Edition (OMNI)";
}
public override int USBPacketSize()
{
return 64;
}
}
}

View File

@@ -0,0 +1,115 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P709_Wireless
public class KerisWirelssAimpoint : AsusMouse
{
public KerisWirelssAimpoint() : base(0x0B05, 0x1A68, "mi_00", true)
{
}
protected KerisWirelssAimpoint(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Keris Wireless 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 };
}
public override bool IsLightingModeSupported(LightingMode lightingMode)
{
return lightingMode == LightingMode.Static
|| lightingMode == LightingMode.Breathing
|| lightingMode == LightingMode.ColorCycle
|| lightingMode == LightingMode.BatteryState
|| lightingMode == LightingMode.React;
}
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 KerisWirelssAimpointWired : KerisWirelssAimpoint
{
public KerisWirelssAimpointWired() : base(0x1A66, false)
{
}
public override string GetDisplayName()
{
return "ROG Keris Wireless Aimpoint (Wired)";
}
}
}

View File

@@ -0,0 +1,209 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P705
public class PugioII : AsusMouse
{
public PugioII() : base(0x0B05, 0x1908, "mi_00", true)
{
}
protected PugioII(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Pugio 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 HasDebounceSetting()
{
return true;
}
public override bool HasLiftOffSetting()
{
return true;
}
public override int DPIIncrements()
{
return 100;
}
public override bool HasRGB()
{
return true;
}
public override int MaxBrightness()
{
return 4;
}
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 false;
}
public override bool HasLowBatteryWarning()
{
return true;
}
public override int LowBatteryWarningStep()
{
return 25;
}
public override int LowBatteryWarningMax()
{
return 100;
}
protected override int ParseBattery(byte[] packet)
{
return base.ParseBattery(packet) * 25;
}
protected override int ParseLowBatteryWarning(byte[] packet)
{
return base.ParseLowBatteryWarning(packet) * 25;
}
protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)
{
return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);
}
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]);
setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode)
? (AnimationDirection)packet[21]
: AnimationDirection.Clockwise;
if (setting.AnimationDirection != AnimationDirection.Clockwise
&& setting.AnimationDirection != AnimationDirection.CounterClockwise)
{
setting.AnimationDirection = AnimationDirection.Clockwise;
}
setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[22] == 0x01;
setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode)
? (AnimationSpeed)packet[23]
: 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)
{
setting.AnimationSpeed = AnimationSpeed.Medium;
}
return setting;
}
public override void ReadLightingSetting()
{
if (!HasRGB())
{
return;
}
//Mouse sends all lighting zones in one response
//21: Direction
//22: Random
//23: Speed
// 20 21 22 23
//00 12 03 00 00 [03 04 00 00 ff] [03 04 00 00 ff] [03 04 00 00 ff] 00 04 00 00
//00 12 03 00 00 [05 02 ff 00 ff] [05 02 ff 00 ff] [05 02 ff 00 ff] 00 01 01 00
//00 12 03 00 00 [03 01 00 00 ff] [03 01 00 00 ff] [03 01 00 00 ff] 00 01 00 01
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 override bool CanChangeDPIProfile()
{
return false;
}
}
public class PugioIIWired : PugioII
{
public PugioIIWired() : base(0x1906, false)
{
}
public override string GetDisplayName()
{
return "ROG Pugio II (Wired)";
}
}
}

View File

@@ -0,0 +1,177 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P506
public class StrixImpactII : AsusMouse
{
public StrixImpactII() : base(0x0B05, 0x18E1, "mi_00", false)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Strix Impact II";
}
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 6_200;
}
public override bool HasRGB()
{
return true;
}
public override bool HasAutoPowerOff()
{
return false;
}
public override bool HasAngleSnapping()
{
return true;
}
public override bool HasAngleTuning()
{
return false;
}
public override bool HasDebounceSetting()
{
return true;
}
public override bool HasLowBatteryWarning()
{
return false;
}
public override bool HasBattery()
{
return false;
}
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;
}
public override LightingZone[] SupportedLightingZones()
{
return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };
}
public override int DPIIncrements()
{
return 100;
}
public override bool CanChangeDPIProfile()
{
return true;
}
public override int MaxBrightness()
{
return 4;
}
protected override byte IndexForLightingMode(LightingMode lightingMode)
{
if (lightingMode == LightingMode.React)
{
return 0x03;
}
return ((byte)lightingMode);
}
protected override LightingMode LightingModeForIndex(byte lightingMode)
{
if (lightingMode == 0x03)
{
return LightingMode.React;
}
return base.LightingModeForIndex(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
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;
}
}
}
}

View File

@@ -0,0 +1,170 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P304
public class TUFM5 : AsusMouse
{
public TUFM5() : base(0x0B05, 0x1898, "mi_02", false)
{
}
public override int DPIProfileCount()
{
return 2;
}
public override string GetDisplayName()
{
return "TUF GAMING M5";
}
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 6_200;
}
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;
}
protected override byte[] GetUpdatePollingRatePacket(PollingRate pollingRate)
{
return new byte[] { reportId, 0x51, 0x31, 0x02, 0x00, (byte)pollingRate };
}
protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)
{
return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };
}
protected override PollingRate ParsePollingRate(byte[] packet)
{
if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)
{
return (PollingRate)packet[9];
}
return PollingRate.PR125Hz;
}
protected override bool ParseAngleSnapping(byte[] packet)
{
if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)
{
return packet[13] == 0x01;
}
return false;
}
protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)
{
return new byte[] { reportId, 0x51, 0x31, 0x03, 0x00, ((byte)debounce) };
}
protected override DebounceTime ParseDebounce(byte[] packet)
{
if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00)
{
return DebounceTime.MS12;
}
if (packet[11] < 0x02)
{
return DebounceTime.MS12;
}
if (packet[11] > 0x07)
{
return DebounceTime.MS32;
}
return (DebounceTime)packet[11];
}
}
}

View File

@@ -196,7 +196,18 @@ namespace GHelper.Peripherals
DetectMouse(new StrixImpactIIWirelessWired());
DetectMouse(new GladiusIII());
DetectMouse(new GladiusIIIWired());
DetectMouse(new HarpeAceAimLabEdition());
DetectMouse(new HarpeAceAimLabEditionWired());
DetectMouse(new HarpeAceAimLabEditionOmni());
DetectMouse(new TUFM3());
DetectMouse(new TUFM5());
DetectMouse(new KerisWirelssAimpoint());
DetectMouse(new KerisWirelssAimpointWired());
DetectMouse(new PugioII());
DetectMouse(new PugioIIWired());
DetectMouse(new StrixImpactII());
DetectMouse(new Chakram());
DetectMouse(new ChakramWired());
}
public static void DetectMouse(AsusMouse am)

View File

@@ -29,9 +29,9 @@ namespace GHelper
public static SettingsForm settingsForm = new SettingsForm();
public static ModeControl modeControl = new ModeControl();
static GPUModeControl gpuControl = new GPUModeControl(settingsForm);
static ScreenControl screenControl = new ScreenControl();
static ClamshellModeControl clamshellControl = new ClamshellModeControl();
public static GPUModeControl gpuControl = new GPUModeControl(settingsForm);
public static ScreenControl screenControl = new ScreenControl();
public static ClamshellModeControl clamshellControl = new ClamshellModeControl();
public static ToastForm toast = new ToastForm();
@@ -95,6 +95,7 @@ namespace GHelper
settingsForm.InitAura();
settingsForm.InitMatrix();
gpuControl.InitXGM();
SetAutoModes();
@@ -118,7 +119,7 @@ namespace GHelper
if (Environment.CurrentDirectory.Trim('\\') == Application.StartupPath.Trim('\\') || action.Length > 0)
{
SettingsToggle(action);
SettingsToggle(action, false);
}
Application.Run();
@@ -155,15 +156,17 @@ namespace GHelper
lastTheme = DateTimeOffset.Now.ToUnixTimeMilliseconds();
}
if (settingsForm.fans is not null && settingsForm.fans.Text != "")
settingsForm.fans.InitTheme();
if (settingsForm.fansForm is not null && settingsForm.fansForm.Text != "")
settingsForm.fansForm.InitTheme();
if (settingsForm.keyb is not null && settingsForm.keyb.Text != "")
settingsForm.keyb.InitTheme();
if (settingsForm.extraForm is not null && settingsForm.extraForm.Text != "")
settingsForm.extraForm.InitTheme();
if (settingsForm.updates is not null && settingsForm.updates.Text != "")
settingsForm.updates.InitTheme();
if (settingsForm.updatesForm is not null && settingsForm.updatesForm.Text != "")
settingsForm.updatesForm.InitTheme();
if (settingsForm.matrixForm is not null && settingsForm.matrixForm.Text != "")
settingsForm.matrixForm.InitTheme();
break;
}
}
@@ -194,7 +197,7 @@ namespace GHelper
BatteryControl.SetBatteryChargeLimit();
settingsForm.AutoKeyboard();
settingsForm.matrix.SetMatrix(true);
settingsForm.matrixControl.SetMatrix(true);
}
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
@@ -202,7 +205,7 @@ namespace GHelper
if (e.Mode == PowerModes.Suspend)
{
Logger.WriteLine("Power Mode:" + e.Mode.ToString());
Logger.WriteLine("Power Mode Changed:" + e.Mode.ToString());
gpuControl.StandardModeFix();
}
@@ -210,11 +213,21 @@ namespace GHelper
SetAutoModes(true);
}
public static void SettingsToggle(string action = "")
public static void SettingsToggle(string action = "", bool checkForFocus = true, bool trayClick = false)
{
if (settingsForm.Visible) settingsForm.HideAll();
if (settingsForm.Visible)
{
// If helper window is not on top, this just focuses on the app again
// Pressing the ghelper button again will hide the app
if (checkForFocus && !settingsForm.HasAnyFocus(trayClick))
{
settingsForm.ShowAll();
}
else
{
settingsForm.HideAll();
}
}
else
{
@@ -243,15 +256,18 @@ namespace GHelper
gpuControl.RestartGPU(false);
break;
case "services":
settingsForm.keyb = new Extra();
settingsForm.keyb.Show();
settingsForm.keyb.ServiesToggle();
settingsForm.extraForm = new Extra();
settingsForm.extraForm.Show();
settingsForm.extraForm.ServiesToggle();
break;
case "uv":
Startup.ReScheduleAdmin();
settingsForm.FansToggle(2);
modeControl.SetRyzen();
break;
default:
Startup.StartupCheck();
break;
}
}
}
@@ -259,7 +275,7 @@ namespace GHelper
static void TrayIcon_MouseClick(object? sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
SettingsToggle();
SettingsToggle(trayClick: true);
}
@@ -276,5 +292,4 @@ namespace GHelper
}
}

View File

@@ -610,6 +610,16 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] MFont {
get {
object obj = ResourceManager.GetObject("MFont", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>

View File

@@ -130,6 +130,9 @@
<data name="icons8_mute_unmute_96" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-mute-unmute-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-hibernate-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-hibernate-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-quit-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-quit-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -286,7 +289,7 @@
<data name="icons8_rocket_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-rocket-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-hibernate-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-hibernate-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="MFont" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Font.otf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@@ -60,6 +60,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Acceleration.
/// </summary>
internal static string Acceleration {
get {
return ResourceManager.GetString("Acceleration", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Can&apos;t connect to ASUS ACPI. Application can&apos;t function without it. Try to install Asus System Control Interface.
/// </summary>
@@ -456,6 +465,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to One time charge to 100%.
/// </summary>
internal static string BatteryLimitFull {
get {
return ResourceManager.GetString("BatteryLimitFull", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to BIOS and Driver Updates.
/// </summary>
@@ -474,6 +492,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Boot Sound.
/// </summary>
internal static string BootSound {
get {
return ResourceManager.GetString("BootSound", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Brightness.
/// </summary>
@@ -501,6 +528,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Calibrate.
/// </summary>
internal static string Calibrate {
get {
return ResourceManager.GetString("Calibrate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Charging.
/// </summary>
@@ -537,6 +573,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Deceleration.
/// </summary>
internal static string Deceleration {
get {
return ResourceManager.GetString("Deceleration", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Default.
/// </summary>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Beschleunigung</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Verbindung zu ASUS ACPI fehlgeschlagen. G-Helper kann nicht ausgeführt werden. Bitte installiere ASUS System Control Interface.</value>
</data>
@@ -127,10 +130,10 @@
<value>Eco Modus</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<value>Wechseln in den Ultimate Modus benötigt einen Neustart. Jetzt neustarten?</value>
<value>Deaktivieren des Ultimate Modus benötigt einen Neustart.</value>
</data>
<data name="AlertUltimateOn" xml:space="preserve">
<value>Ultimate Modus benötigt einen Neustart</value>
<value>Aktivieren des Ultimate Modus benötigt einen Neustart.</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<value>Jetzt neu starten?</value>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Batteriezustand</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS und Treiber Updates</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Hochfahren</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Helligkeit</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Helligkeit erhöhen</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Kalibrieren</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Lädt</value>
</data>
@@ -276,11 +288,14 @@
<data name="Custom" xml:space="preserve">
<value>Benutzerdefiniert</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Verlangsamung</value>
</data>
<data name="Default" xml:space="preserve">
<value>Standard</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Overdrive abschalten</value>
<value>Bildschirm: Overdrive abschalten</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>Entlädt</value>
@@ -298,7 +313,7 @@
<value>Eco</value>
</data>
<data name="EnableOptimusText" xml:space="preserve">
<value>Wenn Sie die dGPU deaktivieren, indem Sie in den Eco-Modus wechseln, kann zu Problemen mit der Helligkeitseinstellung führen, wenn der Anzeigemodus nicht auf Optimus eingestellt ist.
<value>Die dGPU zu deaktivieren, indem Sie in den Eco-Modus wechseln während der Anzeigemodus nicht auf Optimus eingestellt ist, kann zu Problemen mit der Helligkeitseinstellung führen.
Trotzdem fortfahren?</value>
</data>
@@ -375,7 +390,7 @@ Trotzdem fortfahren?</value>
<value>Maximale GPU Temperatur</value>
</data>
<data name="HibernateAfter" xml:space="preserve">
<value>Minutes till Hibernation in sleep on battery (0 - OFF)</value>
<value>Minuten bis zum Ruhezustand im Standby (0 = Aus)</value>
</data>
<data name="High" xml:space="preserve">
<value>Hoch</value>
@@ -390,7 +405,7 @@ Trotzdem fortfahren?</value>
<value>Alle Anwendungen auf der dGPU beim Wechsel in den Eco Modus beenden.</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Laptopbelechtung</value>
<value>Laptopbeleuchtung</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Laptoptastatur</value>
@@ -486,7 +501,7 @@ Trotzdem fortfahren?</value>
<value>Neue Updates:</value>
</data>
<data name="NoNewUpdates" xml:space="preserve">
<value>Keine Updates verfügbar</value>
<value>Keine Updates</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Nicht verbunden</value>
@@ -540,7 +555,7 @@ Trotzdem fortfahren?</value>
<value>Schließen</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>
<value>Ein Prozess verhindert den Wechsel in den Eco-Modus. dGPU neu starten? Fortfahren auf eigene Gefahr.</value>
</data>
<data name="RPM" xml:space="preserve">
<value>U/Min</value>
@@ -618,7 +633,7 @@ Trotzdem fortfahren?</value>
<value>Ultimativ</value>
</data>
<data name="UndervoltingRisky" xml:space="preserve">
<value>Die Spannungsabsenkung (Undervolting) ist experimentell und birgt u.U. ein Risik. Wenn die Spannung zu weit abgesenkt wird, wird der Computer instabil und kann abstürzen, was zu Datenverlust führen kann. Es empfiehlt sich mit kleinen Werten anzufangen und es ausgiebig zu testen, um den idealen Wert zu finden.</value>
<value>Die Spannungsabsenkung (Undervolting) ist experimentell und birgt Risiken. Wenn die Spannung zu weit abgesenkt wird, wird der Computer instabil und kann abstürzen, was zu Datenverlust führen kann. Es empfiehlt sich mit kleinen Werten anzufangen und ausgiebig zu testen, um den idealen Wert zu finden.</value>
</data>
<data name="Updates" xml:space="preserve">
<value>Aktualisierungen</value>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Aceleración</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>No se pudo conectar con ASUS ACPI. La aplicación no puede funcionar sin el recurso. Instale Asus System Control Interface</value>
</data>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Salud de la batería</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Actualizaciones de BIOS y Drivers</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Al arrancar</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Sonido al arranque</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Brillo</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Subir brillo</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrar</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Cargando</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Personalizado</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Desaceleración</value>
</data>
<data name="Default" xml:space="preserve">
<value>Por defecto</value>
</data>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Accélération</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Connexion impossible avec ASUS ACPI. L'application ne peut fonctionner sans. Veuillez installer Asus System Control Interface</value>
</data>
@@ -184,7 +187,7 @@
<value>Rapide</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
<value>Mode dÉclairage</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
@@ -208,7 +211,7 @@
<value>Stroboscopique</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
<value>Tout</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
@@ -217,7 +220,7 @@
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
<value>Molette</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Santé de la batterie</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Mise à jour BIOS et pilotes</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Au démarrage</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Luminosité</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Augmenter la luminosité</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Chargement en cours</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Personnalisé</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Décélération</value>
</data>
<data name="Default" xml:space="preserve">
<value>Par défaut</value>
</data>
@@ -286,7 +301,7 @@
<value>Taux décharge </value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>Télécharger</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Pilotes et Logiciels</value>
@@ -375,10 +390,10 @@ Voulez-vous continuer ?</value>
<value>Température cible</value>
</data>
<data name="HibernateAfter" xml:space="preserve">
<value>Minutes till Hibernation in sleep on battery (0 - OFF)</value>
<value>Minutes jusqu'à la mise en veille prolongée sur la batterie (0 - OFF)</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value>Élevé</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Raccourcis clavier</value>
@@ -411,7 +426,7 @@ Voulez-vous continuer ?</value>
<value>Logo</value>
</data>
<data name="Low" xml:space="preserve">
<value>Low</value>
<value>Faible</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Visualiseur Audio</value>
@@ -540,7 +555,7 @@ Voulez-vous continuer ?</value>
<value>Quitter</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>
<value>Un programme utilise le dGPU et empêche le passage en mode Éco. Laissez G-Helper tenter un redémarrage du dGPU dans le gestionnaire de tâches ? (Procéder à vos propres risques)</value>
</data>
<data name="RPM" xml:space="preserve">
<value> RPM</value>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Gyorsítás</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Nem sikerült csatlakozni az ASUS ACPI-hez, az alkalmazás nem működik enélkül. Próbáld meg telepíteni az ASUS rendszervezérlő interfész-t</value>
</data>
@@ -163,28 +166,28 @@
<value>Asus szolgáltatások futnak</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>Akkuállapot</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Lélegző</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>Jobbra forog</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Színváltás</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Comet</value>
<value>Üstökös</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>Balra forog</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Gyors</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
<value>Világítás típusa</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normál</value>
@@ -193,10 +196,10 @@
<value>Szivárvány</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>Véletlen</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
<value>Reagál</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Lassú</value>
@@ -208,16 +211,16 @@
<value>Stroboszkóp</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
<value>Mindegyik</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
<value>Dokk</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
<value>Logó</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
<value>Görgetés</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
@@ -235,19 +238,22 @@
<value>Ébren</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Timeout plugged / on battery (0 - ON)</value>
<value>Késleltetés töltés / akku módban (0 - BE)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Teljesítmény</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
<value>Töltés</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Töltési korlát</value>
</data>
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
<value>Akku állapot</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS és illesztőprogram frissítések</value>
@@ -255,6 +261,9 @@
<data name="Boot" xml:space="preserve">
<value>Rendszerbetöltés</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Rendszerindítási hang</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Fényerő</value>
</data>
@@ -264,8 +273,11 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Fényerő növelése</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Kalibrálás</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Charging</value>
<value>Töltés</value>
</data>
<data name="Color" xml:space="preserve">
<value>Szín</value>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Egyéni</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Lassítás</value>
</data>
<data name="Default" xml:space="preserve">
<value>Alapért.</value>
</data>
@@ -286,7 +301,7 @@
<value>Merülés</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>Letöltés</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Illesztőprogramok és alkalmazások</value>
@@ -306,7 +321,7 @@ Do you still want to continue?</value>
<value>NVIDIA kijelzőmód nincs Optimus-ra állítva</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Energy Settings</value>
<value>Energia beállítások</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Extra</value>
@@ -342,7 +357,7 @@ Do you still want to continue?</value>
<value>Venti + energia</value>
</data>
<data name="FnLock" xml:space="preserve">
<value>Process Fn+F hotkeys without Fn</value>
<value>Fn + F gyorsgombok feldolgozása Fn nélkül</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dinamikus gyorsítás</value>
@@ -375,10 +390,10 @@ Do you still want to continue?</value>
<value>Célhőmérséklet</value>
</data>
<data name="HibernateAfter" xml:space="preserve">
<value>Minutes till Hibernation in sleep on battery (0 - OFF)</value>
<value>Akku módban az alvó módból Hibernálásig eltelt idő (0 - KI)</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value>Magas</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Gyorsbillentyűk</value>
@@ -387,7 +402,7 @@ Do you still want to continue?</value>
<value>Billentyűzet</value>
</data>
<data name="KillGpuApps" xml:space="preserve">
<value>Stop all apps using GPU when switching to Eco</value>
<value>Eco módba lépéskor minden alkalmazást leállít, ami a GPU-t használja</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Laptop háttérvilágítás</value>
@@ -405,19 +420,19 @@ Do you still want to continue?</value>
<value>Fénysáv</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
<value>Világítás</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logó</value>
</data>
<data name="Low" xml:space="preserve">
<value>Low</value>
<value>Alacsony</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Hang vizualizáció</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Binary Banner</value>
<value>Bináris logó</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<value>Fényes</value>
@@ -447,19 +462,19 @@ Do you still want to continue?</value>
<value>60Hz-s frissítési gyakoriság, hogy spóroljon az akkuval</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Minute</value>
<value>perc</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Minutes</value>
<value>perc</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>Automatikus kikapcsolás idő múlva</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
<value>Gomb funkciója</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
@@ -468,10 +483,10 @@ Do you still want to continue?</value>
<value>Low Battery Warning at</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performance</value>
<value>Teljesítmény</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Synchronize with mouse</value>
<value>Szinkronizálás egérrel</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Többzónás</value>
@@ -480,7 +495,7 @@ Do you still want to continue?</value>
<value>Mikrofon némítása</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>Soha</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>Új frissítés</value>
@@ -489,7 +504,7 @@ Do you still want to continue?</value>
<value>Nincs új frissítés</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Not Connected</value>
<value>Nincs csatlakoztatva</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>G-Helper ablak megnyitása</value>
@@ -498,7 +513,7 @@ Do you still want to continue?</value>
<value>Optimalizált</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Akkus módban váltson Eco módra, töltés közben pedig Standard-ra</value>
<value>Akkus módban váltson Eco módra, töltéskor pedig Standard-ra</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>Optimalizált módban USB-C-s töltés közben tartsa letiltva a GPU-t</value>
@@ -513,7 +528,7 @@ Do you still want to continue?</value>
<value>Üzemmód</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Peripherals</value>
<value>Perifériák</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Kép / Gif</value>
@@ -534,19 +549,19 @@ Do you still want to continue?</value>
<value>PrintScreen</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>Profil</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Bezárás</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>
<value>Valami használja még a dGPU-t, ezzel megakadályozva az Eco móda lépést. Próbálja meg a G-Helper újraindítani a dGPU-t az eszközkezelőben? (Kérjük, saját felelősségére folytassa)</value>
</data>
<data name="RPM" xml:space="preserve">
<value>Fordulatszám</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Futtatás rendszerindításkor</value>
<value>Indítás a rendszerrel</value>
</data>
<data name="ScreenPadDown" xml:space="preserve">
<value>Screenpad Brightness Down</value>
@@ -612,7 +627,7 @@ Do you still want to continue?</value>
<value>Akkus üzemmódban kikapcsol</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>Routes laptop screen to dGPU, maximizing FPS</value>
<value>A jobb FPS érdekében a laptop kijelzőt közvetlenül a GPU-n keresztül működteti</value>
</data>
<data name="UltimateMode" xml:space="preserve">
<value>Ultimate</value>

View File

@@ -117,8 +117,11 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Accelerazione</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Impossibile connettersi ad ASUS ACPI. Senza di essa l'applicazione non può funzionare. Prova a installare Asus Satem Contro Interfacce</value>
<value>Impossibile connettersi ad ASUS ACPI. Senza di essa l'applicazione non può funzionare. Prova ad installare Asus System Control Interface</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Uso intensivo della GPU, disabilitare?</value>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Salute Batteria</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Aggiornamenti Driver e BIOS</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Avvio</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Luminosità</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Aumenta Luminosità</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>In carica</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Personalizzato</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Decelerazione</value>
</data>
<data name="Default" xml:space="preserve">
<value>Default</value>
</data>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Acceleration</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>ASUS ACPI에 연결할 수 없어 응용 프로그램이 작동하지 않습니다. Asus System Control Interface를 먼저 설치하십시오.</value>
</data>
@@ -163,64 +166,64 @@
<value>실행중인 Asus 서비스</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>배터리 상태</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Breathe</value>
<value>숨쉬기</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>시계 방향</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Color Cycle</value>
<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>Lighting Mode</value>
<value>조명 모드</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>보통</value>
</data>
<data name="AuraRainbow" xml:space="preserve">
<value>Rainbow</value>
<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>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>Static</value>
<value>정적</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>Strobe</value>
<value>섬광</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
<value>전체</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
<value></value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
<value>로고</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
<value>스크롤 휠</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
<value>하단 조명</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>자동 적용</value>
@@ -232,28 +235,34 @@
<value>배터리 사용 중에만 60Hz 설정</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Awake</value>
<value>절전 모드 해제</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>전원 연결 / 배터리 사용 중 자동 꺼짐 시간 (0 - 항상 켜짐)</value>
<value>전원 / 배터리 사용 중 자동 꺼짐 시간 (0 - 항상 켜짐)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>균형</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
<value>잔량</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>배터리 충전 제한</value>
</data>
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
<value>배터리 수명</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>바이오스/드라이버 업데이트</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Boot</value>
<value>부팅</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>밝기</value>
@@ -264,8 +273,11 @@
<data name="BrightnessUp" xml:space="preserve">
<value>밝기 증가</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Charging</value>
<value>충전 중</value>
</data>
<data name="Color" xml:space="preserve">
<value>색상</value>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>사용자 설정</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
</data>
<data name="Default" xml:space="preserve">
<value>기본</value>
</data>
@@ -286,7 +301,7 @@
<value>방전 중</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>다운로드</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>드라이버와 소프트웨어</value>
@@ -336,7 +351,7 @@
<value>팬 속도/전력</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value>Fan</value>
<value></value>
</data>
<data name="FansPower" xml:space="preserve">
<value>팬 + 전력</value>
@@ -375,10 +390,10 @@
<value>목표 온도</value>
</data>
<data name="HibernateAfter" xml:space="preserve">
<value>Minutes till Hibernation in sleep on battery (0 - OFF)</value>
<value>최대 절전 모드 전환 시간 (0 - 꺼짐)</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value>높게</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>키 설정</value>
@@ -405,13 +420,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>
@@ -447,31 +462,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>Button Response</value>
<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>
@@ -480,7 +495,7 @@
<value>마이크 음소거</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>사용 안함</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>새 업데이트</value>
@@ -489,7 +504,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>
@@ -513,7 +528,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>
@@ -522,7 +537,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>
@@ -534,13 +549,13 @@
<value>PrintScreen</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>프로필</value>
</data>
<data name="Quit" xml:space="preserve">
<value>종료</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>
<value>dGPU가 사용중이기 때문에 Eco 모드로 전환할 수 없습니다. 장치 관리자에서 dGPU를 재시작하시겠습니까?</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
@@ -555,13 +570,13 @@
<value>Screenpad 밝기 증가</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>꺼짐</value>
<value>시스템 종료</value>
</data>
<data name="Silent" xml:space="preserve">
<value>조용</value>
</data>
<data name="Sleep" xml:space="preserve">
<value>Sleep</value>
<value>절전 모드</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<value>Standard 모드에서 dGPU 켜기</value>
@@ -588,19 +603,19 @@
<value>서비스 중지 중</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Aura 토글 키</value>
<value>Aura 전환 키</value>
</data>
<data name="ToggleClamshellMode" xml:space="preserve">
<value>Auto Toggle Clamshell Mode</value>
<value>클램쉘 모드 자동 전환</value>
</data>
<data name="ToggleFnLock" xml:space="preserve">
<value>Fn-Lock 토글 키</value>
<value>Fn-Lock 전환 키</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Miniled 토글 키 (지원하는 기기만)</value>
<value>Miniled 전환 키 (지원하는 기기만)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>화면 토글 키</value>
<value>화면 전환 키</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>터보</value>
@@ -618,7 +633,7 @@
<value>Ultimate</value>
</data>
<data name="UndervoltingRisky" xml:space="preserve">
<value>언더볼팅은 실험적이며 위험한 기능입니다. 적용 값이 너무 낮은 경우 시스템이 불안정해지고, 종료되거나 데이터 손상을 유발할 수 있습니다. 은 값부터 적용하여 잘 작동하는지 확인해 보십시오.</value>
<value>언더볼팅은 실험적이며 위험한 기능입니다. 적용 값이 너무 낮은 경우 시스템이 불안정해지고, 강제 종료되거나 데이터 손상을 유발할 수 있습니다. 은 값부터 적용하여 잘 작동하는지 확인해 보십시오.</value>
</data>
<data name="Updates" xml:space="preserve">
<value>업데이트</value>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Greitėjimas</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Nepavyko prisijungti prie ASUS ACPI. Programėlė be jo negali veikti. Pabandykite įdiegti Asus System Control Interface</value>
</data>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Sveikata</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS ir tvarkyklių naujinimai</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Paleidimas</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Paleidimo garsas</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Ryškumas</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Ryškumo didinimas</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Kalibruoti</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Įkrovimas</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Tinkintas</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Lėtėjimas</value>
</data>
<data name="Default" xml:space="preserve">
<value>Numatytas</value>
</data>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Przyśpieszenie</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Nie można odnaleźć sterownika ASUS ACPI. Aplikacja nie może bez niego funkcjonować. Spróbuj zainstalować Asus System Control Interface</value>
</data>
@@ -232,7 +235,7 @@
<value>Automatycznie ustaw odświeżanie 60 Hz w czasie pracy na baterii</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Aktywność</value>
<value>Włączone</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Limit czasu podłączonego / na baterii (0 - Włączony)</value>
@@ -249,11 +252,17 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Stan baterii</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>Jednorazowo naładuj do 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Aktualizacje BIOS i sterowników</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Podczas uruchamiania</value>
<value>Uruchamianie</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Dźwięk podczas rozruchu</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Jasność</value>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Zwiększ jasność</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Kalibruj</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Ładowanie</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Niestandardowy</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Spowolnienie</value>
</data>
<data name="Default" xml:space="preserve">
<value>Domyślny</value>
</data>
@@ -286,7 +301,7 @@
<value>Zużycie mocy</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>Pobierz</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Sterowniki i oprogramowanie</value>
@@ -375,7 +390,7 @@ Nadal chcesz kontynuować?</value>
<value>Temperatura docelowa</value>
</data>
<data name="HibernateAfter" xml:space="preserve">
<value>Minutes till Hibernation in sleep on battery (0 - OFF)</value>
<value>Czas przejścia w hibernację na baterii (0 - wcale)</value>
</data>
<data name="High" xml:space="preserve">
<value>Wysoka</value>
@@ -540,13 +555,13 @@ Nadal chcesz kontynuować?</value>
<value>Zamknij</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>
<value>Coś korzysta z dGPU, uniemożliwiając włączenie trybu Eco. Czy G-Helper ma zresetować dGPU w Menadżerze Urządzeń? (Korzystasz na własne ryzyko)</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Uruchom przy starcie systemu</value>
<value>Uruchom przy starcie</value>
</data>
<data name="ScreenPadDown" xml:space="preserve">
<value>Zmniejsz jasność ScreenPad</value>

View File

@@ -117,8 +117,11 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Acceleration</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Não foi possível conectar ao ASUS ACPI. O applicativo não pode funcionar sem isso. Tente instalar Asus System Controle Interface</value>
<value>Não foi possível conectar ao ASUS ACPI. O aplicativo não pode funcionar sem isso. Tente instalar Asus System Controle Interface</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Parece que o GPU está em uso pesado.</value>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS and Driver Updates</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Ao ligar</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Nível do brilho</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Brightness Up</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Charging</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Personalizado</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
</data>
<data name="Default" xml:space="preserve">
<value>Padrão</value>
</data>

View File

@@ -0,0 +1,656 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<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="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Aceleração</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Não foi possível conectar ao ASUS ACPI. O programa não funciona sem esse serviço. Tente instalar Asus System Control Interface</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Parece que o GPU está em uso pesado, desativá-lo?</value>
</data>
<data name="AlertDGPUTitle" xml:space="preserve">
<value>Modo económico</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<value>Passar ao Modo Ultimate implica o reinício do sistema</value>
</data>
<data name="AlertUltimateOn" xml:space="preserve">
<value>Modo Ultimate implica o reinício do sistema</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<value>Reiniciar agora?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Velocidade da Animação</value>
</data>
<data name="AnimeMatrix" xml:space="preserve">
<value>AniMe Matrix</value>
</data>
<data name="AppAlreadyRunning" xml:space="preserve">
<value>O programa já está em execução</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper já está em execução. Verifique o tabuleiro do sistema pelo ícone.</value>
</data>
<data name="Apply" xml:space="preserve">
<value>Aplicar</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>Aplicar a curva personalizada</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Aplicar as limitações de energia</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Ajuste automático dos modos de energia do Windows</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Serviços da Asus em execução</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Estado da bateria</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Respiração</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>No sentido horário</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Ciclo de cores</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Cometa</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>No sentido anti-horário</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Rápido</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Modo de iluminação</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
<data name="AuraRainbow" xml:space="preserve">
<value>Arco-íris</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Aleatório</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>Reagir</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Lento</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>Estático</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>Estroboscópio</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>Todos</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>Roda de Deslocamento</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Aplicar automaticamente</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Automático</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>Define a taxa de atualização automaticamente para poupar bateria</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Acordado</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Tempo limite ligado à corrente / na bateria (0 - ON)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Equilibrado</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Carga</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limite de carga</value>
</data>
<data name="BatteryHealth" xml:space="preserve">
<value>Estado da bateria</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Atualizações de Drivers e da BIOS</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Ao ligar</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Nível do brilho</value>
</data>
<data name="BrightnessDown" xml:space="preserve">
<value>Diminuir o brilho</value>
</data>
<data name="BrightnessUp" xml:space="preserve">
<value>Aumentar o brilho</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Carregando</value>
</data>
<data name="Color" xml:space="preserve">
<value>Cor</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<value>Turbo do CPU</value>
</data>
<data name="Custom" xml:space="preserve">
<value>Personalizado</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Desaceleração</value>
</data>
<data name="Default" xml:space="preserve">
<value>Padrão</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Desativar o overdrive do ecrã</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>Descarregando</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Transferir</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Drivers e Software</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Desativar o dGPU para poupar energia</value>
</data>
<data name="EcoMode" xml:space="preserve">
<value>Económico</value>
</data>
<data name="EnableOptimusText" xml:space="preserve">
<value>Desativar a dGPU por ativar o modo Eco enquanto o Modo de Ecrã no Painel de Controlo da NVIDIA não está definido para Optimus pode causar problemas com os controlos do brilho do painel até ao próximo reinício.
Quer prosseguir?</value>
</data>
<data name="EnableOptimusTitle" xml:space="preserve">
<value>O Modo de Ecrã da NVIDIA não está definido para Optimus</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Configurações de Energia</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Adicional</value>
</data>
<data name="ExtraSettings" xml:space="preserve">
<value>Configurações adicionais</value>
</data>
<data name="FactoryDefaults" xml:space="preserve">
<value>Padrão de fábrica</value>
</data>
<data name="FanCurves" xml:space="preserve">
<value>Curvas das Ventoinhas</value>
</data>
<data name="FanProfileCPU" xml:space="preserve">
<value>Perfil da Ventoinha do CPU</value>
</data>
<data name="FanProfileGPU" xml:space="preserve">
<value>Perfil da Ventoinha da GPU</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<value>Perfil da Ventoinha Central</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<value>Perfis das Ventoinhas</value>
</data>
<data name="FansAndPower" xml:space="preserve">
<value>Ventoinhas e Potência</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value>Fan</value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Ventoinhas + Potência</value>
</data>
<data name="FnLock" xml:space="preserve">
<value>Processar teclas de atalho Fn+F sem pressionar Fn</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Boost dinâmico</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Carregando</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Frequência da GPU</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Frequência da Memória</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>Modo da GPU</value>
</data>
<data name="GPUModeEco" xml:space="preserve">
<value>Só iGPU</value>
</data>
<data name="GPUModeStandard" xml:space="preserve">
<value>iGPU + dGPU</value>
</data>
<data name="GPUModeUltimate" xml:space="preserve">
<value>Exclusivamente dGPU</value>
</data>
<data name="GPUSettings" xml:space="preserve">
<value>Parâmetros de GPU</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Temperatura limite</value>
</data>
<data name="HibernateAfter" xml:space="preserve">
<value>Minutos para a hibernação em suspensão, na bateria (0 - OFF)</value>
</data>
<data name="High" xml:space="preserve">
<value>Alto</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Combinações de teclas</value>
</data>
<data name="Keyboard" xml:space="preserve">
<value>Teclado</value>
</data>
<data name="KillGpuApps" xml:space="preserve">
<value>Parar todos os programas que usam a GPU ao alternar para o modo Eco</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Configurações de iluminação</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Teclado</value>
</data>
<data name="LaptopScreen" xml:space="preserve">
<value>Ecrã</value>
</data>
<data name="Lid" xml:space="preserve">
<value>Tampa</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>Barra de Luz</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Iluminação</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="Low" xml:space="preserve">
<value>Baixo</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Visualizador de áudio</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Bandeira Binária</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<value>Brilho</value>
</data>
<data name="MatrixClock" xml:space="preserve">
<value>Relógio</value>
</data>
<data name="MatrixDim" xml:space="preserve">
<value>Escuro</value>
</data>
<data name="MatrixLogo" xml:space="preserve">
<value>Logo ROG</value>
</data>
<data name="MatrixMedium" xml:space="preserve">
<value>Médio</value>
</data>
<data name="MatrixOff" xml:space="preserve">
<value>Desligado</value>
</data>
<data name="MatrixPicture" xml:space="preserve">
<value>Imagem</value>
</data>
<data name="MaxRefreshTooltip" xml:space="preserve">
<value>Taxa de atualização máxima e menor latência</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<value>Taxa de atualização de 60Hz para poupar bateria</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Minuto</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Minutos</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Desligar automaticamente após</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Distância de Lift Off</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Aviso de bateria fraca</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Desempenho do rato</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Sincronizar com o rato</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multizona</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Desligar microfone</value>
</data>
<data name="Never" xml:space="preserve">
<value>Nunca</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>Novas atualizações</value>
</data>
<data name="NoNewUpdates" xml:space="preserve">
<value>Sem novas atualizações</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Não conectado</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Abrir G-Helper</value>
</data>
<data name="Optimized" xml:space="preserve">
<value>Otimizado</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Mudar para Eco em bateria, e mudar para Standard quando ligado à corrente</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>Manter a GPU desativada ao usar um carregador USB-C no modo Otimizado</value>
</data>
<data name="Other" xml:space="preserve">
<value>Outro</value>
</data>
<data name="Overdrive" xml:space="preserve">
<value>Overdrive</value>
</data>
<data name="PerformanceMode" xml:space="preserve">
<value>Modo</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Periféricos</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Imagem / Gif</value>
</data>
<data name="PlayPause" xml:space="preserve">
<value>Reproduzir / Pausar</value>
</data>
<data name="PollingRate" xml:space="preserve">
<value>Polling Rate</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Limites de Potência</value>
</data>
<data name="PPTExperimental" xml:space="preserve">
<value>Os Limites de Potência são uma funcionalidade experimental. Use com cuidado!</value>
</data>
<data name="PrintScreen" xml:space="preserve">
<value>Captura de ecrã</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Perfil</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Sair</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Algum processo está a utilizar a dGPU, impedindo o modo Eco. Deixar o G-Helper tentar reiniciar a dGPU no gestor de dispositivos? (Proceda por sua conta e risco)</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Executar ao iniciar</value>
</data>
<data name="ScreenPadDown" xml:space="preserve">
<value>Diminuir o brilho do ScreenPad</value>
</data>
<data name="ScreenPadUp" xml:space="preserve">
<value>Aumentar o brilho do ScreenPad</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>Desligar</value>
</data>
<data name="Silent" xml:space="preserve">
<value>Silencioso</value>
</data>
<data name="Sleep" xml:space="preserve">
<value>Hibernação</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<value>Liga o dGPU para uso padrão</value>
</data>
<data name="StandardMode" xml:space="preserve">
<value>Padrão</value>
</data>
<data name="Start" xml:space="preserve">
<value>Iniciar</value>
</data>
<data name="StartingServices" xml:space="preserve">
<value>Iniciando os serviços</value>
</data>
<data name="StartupError" xml:space="preserve">
<value>Erro de inicialização</value>
</data>
<data name="Stop" xml:space="preserve">
<value>Parar</value>
</data>
<data name="StopGPUApps" xml:space="preserve">
<value>Parar programas que usem a GPU</value>
</data>
<data name="StoppingServices" xml:space="preserve">
<value>Parando os serviços</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Alternar Aura</value>
</data>
<data name="ToggleClamshellMode" xml:space="preserve">
<value>Alternar automaticamente o Modo Clamshell</value>
</data>
<data name="ToggleFnLock" xml:space="preserve">
<value>Alternar Fn-Lock</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Alternar MiniLED (se suportado)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Alternar Ecrã</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
</data>
<data name="TurnedOff" xml:space="preserve">
<value>Desligado</value>
</data>
<data name="TurnOffOnBattery" xml:space="preserve">
<value>Desligar em bateria</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>O ecrã do portátil está ligado diretamente à dGPU, maximizando FPS</value>
</data>
<data name="UltimateMode" xml:space="preserve">
<value>Ultimate</value>
</data>
<data name="UndervoltingRisky" xml:space="preserve">
<value>Undervolting é uma funcionalidade experimental e arriscada. Se os valores aplicados foram baixos para o hardware, podem existir instabilidades, desligar e causar corrupção de dados. Caso queira, comece por valores pequenos no início, clique em Aplicar e teste o que funciona para o hardware.</value>
</data>
<data name="Updates" xml:space="preserve">
<value>Atualizações</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Versão</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Diminuir o volume</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Sem som</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Aumentar o volume</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Manter a janela do aplicativo sempre no topo</value>
</data>
</root>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Acceleration</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Can't connect to ASUS ACPI. Application can't function without it. Try to install Asus System Control Interface</value>
</data>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS and Driver Updates</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Boot</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Brightness</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Brightness Up</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Charging</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Custom</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
</data>
<data name="Default" xml:space="preserve">
<value>Default</value>
</data>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Acceleration</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Nu se poate conecta la ASUS ACPI. Aplicația nu poate funcționa fără aceasta. Încercați să instalați Asus System Control Interface</value>
</data>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Sănătatea bateriei</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Actualizări BIOS și Driver</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Pornire</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Luminozitate</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Mărirea luminozității</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Se încarcă</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Personalizat</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
</data>
<data name="Default" xml:space="preserve">
<value>Implicit</value>
</data>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Hızlandırma</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>ASUS ACPI'ye bağlanılamıyor. Uygulama o olmadan çalışamaz. Asus Sistem Kontrol Arayüzü'nü yüklemeyi deneyin.</value>
</data>
@@ -148,7 +151,7 @@
<value>G-Helper zaten çalışıyor. Simge için görev çubuğunu kontrol edin.</value>
</data>
<data name="Apply" xml:space="preserve">
<value>Apply</value>
<value>Uygula</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>Özel Fan Eğrisini Uygula</value>
@@ -160,31 +163,31 @@
<value>Windows Güç Modunu otomatik ayarla</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Asus Services Running</value>
<value>Çalışan Asus Hizmetleri</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>Pil Durumu</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Nefes</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>Saat Yönünde</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Renk Döngüsü</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Comet</value>
<value>Kuyruklu Yıldız</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>Saat Yönünün Tersine</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Hızlı</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
<value>ıklandırma Modu</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
@@ -193,10 +196,10 @@
<value>Gökkuşağı</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>Rastgele</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
<value>Reaksiyon</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Yavaş</value>
@@ -208,22 +211,22 @@
<value>Flaş</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
<value>Tümü</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
<value>Yuva</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Scrollwheel</value>
<value>Kaydırma Tekerleği</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
<value>Alttan Aydınlatma</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Auto Apply</value>
<value>Otomatik Uygula</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Otomatik</value>
@@ -232,7 +235,7 @@
<value>Pil tasarrufu için 60Hz kullanılır ve şarja takıldığında eski haline getirir</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Uyanık</value>
<value>Uyanırken</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Pildeyken klavye ışığının kapanma süresi</value>
@@ -241,41 +244,53 @@
<value>Dengeli</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
<value>Şarj</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Pil Şarj Limiti</value>
</data>
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
<value>Pil Sağlığı</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>Bir seferlik %100 şarj etme</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS and Driver Updates</value>
<value>BIOS ve Sürücü Güncellemeleri</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Önyükleme</value>
<value>Boot</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sesi</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Parlaklığı</value>
</data>
<data name="BrightnessDown" xml:space="preserve">
<value>Brightness Down</value>
<value>Parlaklığı Azalt</value>
</data>
<data name="BrightnessUp" xml:space="preserve">
<value>Brightness Up</value>
<value>Parlaklığı Artır</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Kalibre Et</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Charging</value>
<value>Şarj oluyor</value>
</data>
<data name="Color" xml:space="preserve">
<value>Renk</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<value>CPU Boost</value>
<value>CPU Desteği</value>
</data>
<data name="Custom" xml:space="preserve">
<value>Özel</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Yavaşlama</value>
</data>
<data name="Default" xml:space="preserve">
<value>Varsayılan</value>
</data>
@@ -283,13 +298,13 @@
<value>Ekran overdrive özelliğini devre dışı bırak</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>Pil boşalıyor</value>
<value>Şarj azalıyor</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>İndir</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Drivers and Software</value>
<value>Sürücüler ve Yazılımlar</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Pil tasarrufu için harici GPU'yu devre dışı bırakır</value>
@@ -298,15 +313,15 @@
<value>Eko</value>
</data>
<data name="EnableOptimusText" xml:space="preserve">
<value>Disabling the dGPU by going into Eco mode while Display Mode in NVIDIA Control Panel is not set to Optimus might cause problems with brightness controls until after the next reboot.
<value>NVIDIA Denetim Masası'ndaki Görüntü Modu Optimus olarak ayarlı değilken Eko moduna geçilerek harici GPU'nun devre dışı bırakılması, bir sonraki yeniden başlatmaya kadar parlaklık ayarlarında sorunlara neden olabilir.
Do you still want to continue?</value>
Yine de devam etmek istiyor musunuz?</value>
</data>
<data name="EnableOptimusTitle" xml:space="preserve">
<value>NVIDIA Display Mode is not set to Optimus</value>
<value>NVIDIA Görüntü Modu Optimus olarak ayarlanmamış</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Energy Settings</value>
<value>Enerji Ayarları</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Ekstra</value>
@@ -351,10 +366,10 @@ Do you still want to continue?</value>
<value>Değiştiriliyor</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Core Clock Offset</value>
<value>Çekirdek Frekans Dengesi</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Memory Clock Offset</value>
<value>Hafıza Frekans Dengesi</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>GPU Modu</value>
@@ -369,28 +384,28 @@ Do you still want to continue?</value>
<value>sadece harici GPU</value>
</data>
<data name="GPUSettings" xml:space="preserve">
<value>GPU Settings</value>
<value>GPU Ayarları</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Temperature Target</value>
<value>Sıcaklık Hedefi</value>
</data>
<data name="HibernateAfter" xml:space="preserve">
<value>Minutes till Hibernation in sleep on battery (0 - OFF)</value>
<value>Uyku modunda, Hazırda Bekleme Moduna geçiş dakikası (0 - KAPALI)</value>
</data>
<data name="High" xml:space="preserve">
<value>High</value>
<value>Yüksek</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Tuş Bağlantıları</value>
<value>Tuş Atamaları</value>
</data>
<data name="Keyboard" xml:space="preserve">
<value>Klavye</value>
</data>
<data name="KillGpuApps" xml:space="preserve">
<value>Eco'ya geçerken dGPU kullanan tüm uygulamaları durdur</value>
<value>Eco'ya geçerken harici GPU'yu kullanan tüm uygulamaları durdur</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Aydınlatması</value>
<value>Laptop Aydınlatması</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Laptop Klavyesi</value>
@@ -399,25 +414,25 @@ Do you still want to continue?</value>
<value>Laptop Ekranı</value>
</data>
<data name="Lid" xml:space="preserve">
<value>Lid</value>
<value>Kapak</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>Lightbar</value>
<value>ık Çubuğu</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
<value>ıklandırma</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="Low" xml:space="preserve">
<value>Low</value>
<value>Düşük</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Audio Visualizer</value>
<value>Ses Görselleştirici</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Matrix Banner</value>
<value>Binary Banner</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<value>Parlak</value>
@@ -447,49 +462,49 @@ Do you still want to continue?</value>
<value>Pil tasarrufu için 60Hz yenileme hızı</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Minute</value>
<value>Dakika</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Minutes</value>
<value>Dakika</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>Sonrasında Otomatik Kapat</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Button Response</value>
<value>Tuş Tepkisi</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
<value>Havalanma Mesafesi</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Low Battery Warning at</value>
<value>Düşük Pil Uyarısı seviyesi</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performance</value>
<value>Performans</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Synchronize with mouse</value>
<value>Fare ile senkronize edin</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Çoklu Bölge</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Mute Mic</value>
<value>Mikrofonu Sustur</value>
</data>
<data name="Never" xml:space="preserve">
<value>Never</value>
<value>Asla</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>New updates</value>
<value>Yeni güncellemeler</value>
</data>
<data name="NoNewUpdates" xml:space="preserve">
<value>No new updates</value>
<value>Güncelleme yok</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Not Connected</value>
<value>Bağlantı Yok</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>G-Helper penceresini aç</value>
@@ -513,7 +528,7 @@ Do you still want to continue?</value>
<value>Performans Modu</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Peripherals</value>
<value>Çevre Birimleri</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Resim / Gif</value>
@@ -522,7 +537,7 @@ Do you still want to continue?</value>
<value>Oynat / Duraklat</value>
</data>
<data name="PollingRate" xml:space="preserve">
<value>Polling Rate</value>
<value>Yoklama Sıklığı</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Güç Sınırları</value>
@@ -534,13 +549,13 @@ Do you still want to continue?</value>
<value>Ekran Görüntüsü Al</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
<value>Profil</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Çıkış Yap</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>
<value>Bir şey harici GPU'yu kullanıyor ve Eco modunu engelliyor. G-Helper aygıt yöneticisinde harici GPU'yu yeniden başlatmayı denesin mi? (Kendi sorumluluğunuzdadır)</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
@@ -549,13 +564,13 @@ Do you still want to continue?</value>
<value>Başlangıçta Çalıştır</value>
</data>
<data name="ScreenPadDown" xml:space="preserve">
<value>Screenpad Brightness Down</value>
<value>Screenpad Parlaklığını Azalt</value>
</data>
<data name="ScreenPadUp" xml:space="preserve">
<value>Screenpad Brightness Up</value>
<value>Screenpad Parlaklığını Artır</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>Kapalı</value>
<value>Kapatma</value>
</data>
<data name="Silent" xml:space="preserve">
<value>Sessiz</value>
@@ -570,37 +585,37 @@ Do you still want to continue?</value>
<value>Standart</value>
</data>
<data name="Start" xml:space="preserve">
<value>Start</value>
<value>Başlat</value>
</data>
<data name="StartingServices" xml:space="preserve">
<value>Starting Services</value>
<value>Hizmetler Başlatılıyor</value>
</data>
<data name="StartupError" xml:space="preserve">
<value>Başlatma Hatası</value>
</data>
<data name="Stop" xml:space="preserve">
<value>Stop</value>
<value>Durdur</value>
</data>
<data name="StopGPUApps" xml:space="preserve">
<value>Stop GPU Applications</value>
<value>GPU Uygulamalarını Durdur</value>
</data>
<data name="StoppingServices" xml:space="preserve">
<value>Stopping Services</value>
<value>Hizmetler Durduruluyor</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Aura'yı Değiştir</value>
<value>Aura'yı Kullan</value>
</data>
<data name="ToggleClamshellMode" xml:space="preserve">
<value>Auto Toggle Clamshell Mode</value>
<value>Otomatik Clamshell Modunu Aç</value>
</data>
<data name="ToggleFnLock" xml:space="preserve">
<value>Toggle Fn-Lock</value>
<value>Fn-Lock'u Aç</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Toggle Miniled (if supported)</value>
<value>Miniled'i Aç (destekliyorsa)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Toggle Screen</value>
<value>Ekranı Değiştir</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -618,22 +633,22 @@ Do you still want to continue?</value>
<value>Ultimate</value>
</data>
<data name="UndervoltingRisky" xml:space="preserve">
<value>Undervolting is an experimental and risky feature. If applied values are too low for your hardware, it can become unstable, shut down or cause data corruption. If you want to try - start from small values first, click Apply and test what works for you.</value>
<value>Undervolting deneysel ve riskli bir özelliktir. Uygulanan değerler cihazınız için çok düşükse, cihazınız stabil çalışmayabilir, kapanabilir veya veri kaybına uğrayabilir. Yine de denemek istiyorsanız, önce küçük değerlerden başlayıp Uygula'ya tıklayın ve sizin için uygun olanı test edin.</value>
</data>
<data name="Updates" xml:space="preserve">
<value>Updates</value>
<value>Güncellemeler</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Sürüm</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Volume Down</value>
<value>Sesi Azalt</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Ses Kısma</value>
<value>Sesi Kapat</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Volume Up</value>
<value>Sesi Artır</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Uygulama penceresini her zaman en üstte tut</value>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Acceleration</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Не вдається під'єднатися до ASUS ACPI. Програма не може працювати без нього. Спробуйте встановити Asus System Control Interface</value>
</data>
@@ -133,7 +136,7 @@
<value>Ультимативний режим потребує перезавантаження</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<value>Перезавантажитися зараз?</value>
<value>Перезавантажити зараз?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Швидкість Анімації</value>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Стан батареї</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Оновлення BIOS та драйверів</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Старт</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Яскравість</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Підвищити яскравість</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Зарядка</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Своє</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
</data>
<data name="Default" xml:space="preserve">
<value>За замовчуванням</value>
</data>
@@ -286,7 +301,7 @@
<value>Розрядка</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>Завантажити</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Драйвери та програми</value>
@@ -375,7 +390,7 @@
<value>Temperature Target</value>
</data>
<data name="HibernateAfter" xml:space="preserve">
<value>Minutes till Hibernation in sleep on battery (0 - OFF)</value>
<value>Хвилин до режиму глибокого сну з акумулятором (0 - Вимкнено)</value>
</data>
<data name="High" xml:space="preserve">
<value>Висока</value>
@@ -540,7 +555,7 @@
<value>Вихід</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>
<value>Щось використовує dGPU та запобігає Еко-режиму. Дозвольте G-Helper спробувати перезапустити dGPU у менеджері пристрою? (Будь ласка, продовжуйте на власний ризик)</value>
</data>
<data name="RPM" xml:space="preserve">
<value>Оберти</value>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Gia tốc</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Không thể kết nối đến ASUS ACPI. Chương trình cần nó để có thể hoạt động. Hãy thử cài lại Asus System Control Interface</value>
</data>
@@ -163,28 +166,28 @@
<value>Dịch vụ Asus đang chạy</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Battery State</value>
<value>Trạng thái pin</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Hơi thở</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>Chiều kim đồng hồ</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Chuyển màu</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Comet</value>
<value>Sao chổi</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>Ngược chiều kim đồng hồ</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Nhanh</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Lighting Mode</value>
<value>Chế độ sáng</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Bình thường</value>
@@ -193,10 +196,10 @@
<value>Cầu vồng</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>Ngẫu nhiên</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
<value>Phản ứng</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Chậm</value>
@@ -208,7 +211,7 @@
<value>Nhấp nháy</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
<value>Tất cả</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
@@ -241,13 +244,16 @@
<value>Cân bằng</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
<value>Sạc</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Giới hạn sạc</value>
</data>
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
<value>Sức khoẻ pin</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Cập nhật BIOS và driver</value>
@@ -255,6 +261,9 @@
<data name="Boot" xml:space="preserve">
<value>Khởi động</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Độ sáng</value>
</data>
@@ -264,8 +273,11 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Tăng độ sáng</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Charging</value>
<value>Đang sạc</value>
</data>
<data name="Color" xml:space="preserve">
<value>Màu</value>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>Tuỳ chỉnh</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Giảm tốc</value>
</data>
<data name="Default" xml:space="preserve">
<value>Mặc định</value>
</data>
@@ -286,7 +301,7 @@
<value>Đang không sạc</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>Tải xuống</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Driver và phần mềm</value>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>加速</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>无法连接到ASUS ACPI。 没有它应用程序将无法运行。 请尝试安装Asus System Control Interface驱动。</value>
</data>
@@ -151,7 +154,7 @@
<value>应用</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>应用自定义扇曲线</value>
<value>应用自定义扇曲线</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<value>应用功率限制</value>
@@ -220,7 +223,7 @@
<value>滚轮</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
<value>底灯</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>自动应用</value>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>电池健康</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>一次性充电至 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS 和驱动程序更新</value>
</data>
<data name="Boot" xml:space="preserve">
<value>开机时</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>开机音效</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>亮度</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>提高亮度</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>校准</value>
</data>
<data name="Charging" xml:space="preserve">
<value>充电中</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>自定义设置</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>减速</value>
</data>
<data name="Default" xml:space="preserve">
<value>默认</value>
</data>
@@ -286,7 +301,7 @@
<value>正在放电</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>下载</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>驱动程序和软件</value>
@@ -298,12 +313,12 @@
<value>集显模式</value>
</data>
<data name="EnableOptimusText" xml:space="preserve">
<value>若未在nVIDIA控制面板的混合显示模式设置为Optimus,关闭独立显卡可能会导致亮度控制在系统重启前都不可用。
<value>NVIDIA 控制面板的显示模式设置为 Optimus 时,通过集显模式禁用独立显卡可能会使亮度控制出现问题,直到下次重启后才能恢复。
确定还要继续吗?</value>
</data>
<data name="EnableOptimusTitle" xml:space="preserve">
<value>NVIDIA 显示模式未设置为自动切换</value>
<value>NVIDIA 显示模式未设置为 Optimus</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>电源设置</value>
@@ -327,7 +342,7 @@
<value>GPU 风扇配置文件</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<value>中等风扇配置</value>
<value>Mid 风扇配置文件</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<value>风扇配置</value>
@@ -450,7 +465,7 @@
<value>分钟</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>分</value>
<value>分</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>角度校正</value>
@@ -462,7 +477,7 @@
<value>按键响应</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>静默高度</value>
<value>响应高度</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>低于该电量时警告</value>
@@ -540,7 +555,7 @@
<value>退出</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>
<value>有程序正在使用独显并阻止进入集显模式。要让 G-Helper 在设备管理器中重新启动独显吗?(请自行承担风险)</value>
</data>
<data name="RPM" xml:space="preserve">
<value>转/分钟</value>
@@ -600,7 +615,7 @@
<value>切换 MiniLED (如果支持)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>切换屏幕</value>
<value>关闭屏幕</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>增强模式</value>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>滑鼠加速</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>無法連結到華碩 ACPI。 没有它,應用程式將無法執行。 嘗試安裝Asus System Control Interface</value>
</data>
@@ -172,7 +175,7 @@
<value>順時針</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>循環</value>
<value>彩色循環</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>彗星</value>
@@ -202,7 +205,7 @@
<value>慢</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>靜態</value>
<value>靜態恆亮</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>閃爍</value>
@@ -235,7 +238,7 @@
<value>喚醒時</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>超時插入/使用電池 (0 = 不關閉)</value>
<value>閒置幾秒後關閉燈光:插電時 / 使用電池 (0 = 不關閉)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>平衡模式</value>
@@ -249,12 +252,18 @@
<data name="BatteryHealth" xml:space="preserve">
<value>電池健康度</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>僅本次將電力充滿</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS與驅動程式更新 Updates</value>
</data>
<data name="Boot" xml:space="preserve">
<value>開機時</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>開機音效</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>亮度</value>
</data>
@@ -264,6 +273,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>螢幕亮度提高</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>校準</value>
</data>
<data name="Charging" xml:space="preserve">
<value>充電中</value>
</data>
@@ -276,6 +288,9 @@
<data name="Custom" xml:space="preserve">
<value>自定義設置</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>滑鼠減速</value>
</data>
<data name="Default" xml:space="preserve">
<value>預設</value>
</data>
@@ -286,7 +301,7 @@
<value>正在釋放電力</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>下載</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>驅動程式與軟體</value>
@@ -540,7 +555,7 @@
<value>退出</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>
<value>有其他程式正在使用獨顯導致無法切換至節能模式. 是否讓G-Helper重新啟動獨顯? * 請自行評估風險</value>
</data>
<data name="RPM" xml:space="preserve">
<value>每分鐘轉數</value>

BIN
app/Resources/Font.otf Normal file

Binary file not shown.

View File

@@ -11,13 +11,13 @@ namespace Ryzen
internal class RyzenControl
{
public const int MinCPUUV = -30;
public static int MinCPUUV => AppConfig.Get("min_uv", -30);
public const int MaxCPUUV = 0;
public const int MinIGPUUV = -20;
public const int MaxIGPUUV = 0;
public const int MinTemp = 75;
public static int MinTemp => AppConfig.Get("min_temp", 75);
public const int MaxTemp = 98;
public static string[] FAM = { "RAVEN", "PICASSO", "DALI", "RENOIR/LUCIENNE", "MATISSE", "VANGOGH", "VERMEER", "CEZANNE/BARCELO", "REMBRANDT", "PHOENIX", "RAPHAEL/DRAGON RANGE" };

View File

@@ -40,6 +40,7 @@ namespace GHelper
labelMatrix = new Label();
checkMatrix = new CheckBox();
panelBattery = new Panel();
buttonBatteryFull = new RButton();
sliderBattery = new Slider();
panelBatteryTitle = new Panel();
labelBattery = new Label();
@@ -278,6 +279,7 @@ namespace GHelper
//
panelBattery.AutoSize = true;
panelBattery.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelBattery.Controls.Add(buttonBatteryFull);
panelBattery.Controls.Add(sliderBattery);
panelBattery.Controls.Add(panelBatteryTitle);
panelBattery.Dock = DockStyle.Top;
@@ -285,19 +287,39 @@ namespace GHelper
panelBattery.Margin = new Padding(0);
panelBattery.Name = "panelBattery";
panelBattery.Padding = new Padding(20, 20, 20, 10);
panelBattery.Size = new Size(827, 114);
panelBattery.Size = new Size(827, 119);
panelBattery.TabIndex = 5;
//
// buttonBatteryFull
//
buttonBatteryFull.Activated = false;
buttonBatteryFull.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonBatteryFull.BackColor = SystemColors.ControlLight;
buttonBatteryFull.BorderColor = Color.Transparent;
buttonBatteryFull.BorderRadius = 2;
buttonBatteryFull.FlatAppearance.BorderSize = 0;
buttonBatteryFull.FlatStyle = FlatStyle.Flat;
buttonBatteryFull.Font = new Font("Segoe UI", 7.125F, FontStyle.Bold, GraphicsUnit.Point);
buttonBatteryFull.ForeColor = SystemColors.ControlDark;
buttonBatteryFull.Location = new Point(730, 66);
buttonBatteryFull.Margin = new Padding(0);
buttonBatteryFull.Name = "buttonBatteryFull";
buttonBatteryFull.Secondary = true;
buttonBatteryFull.Size = new Size(73, 36);
buttonBatteryFull.TabIndex = 41;
buttonBatteryFull.Text = "100%";
buttonBatteryFull.UseVisualStyleBackColor = false;
//
// sliderBattery
//
sliderBattery.AccessibleName = "Battery Charge Limit";
sliderBattery.Dock = DockStyle.Top;
sliderBattery.Location = new Point(20, 64);
sliderBattery.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
sliderBattery.Location = new Point(20, 65);
sliderBattery.Margin = new Padding(4);
sliderBattery.Max = 100;
sliderBattery.Min = 40;
sliderBattery.Name = "sliderBattery";
sliderBattery.Size = new Size(787, 40);
sliderBattery.Size = new Size(716, 40);
sliderBattery.Step = 5;
sliderBattery.TabIndex = 20;
sliderBattery.Text = "sliderBattery";
@@ -354,7 +376,7 @@ namespace GHelper
panelFooter.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelFooter.Controls.Add(tableButtons);
panelFooter.Dock = DockStyle.Top;
panelFooter.Location = new Point(11, 1435);
panelFooter.Location = new Point(11, 1440);
panelFooter.Margin = new Padding(0);
panelFooter.Name = "panelFooter";
panelFooter.Padding = new Padding(20);
@@ -1232,7 +1254,7 @@ namespace GHelper
panelVersion.Controls.Add(labelCharge);
panelVersion.Controls.Add(checkStartup);
panelVersion.Dock = DockStyle.Top;
panelVersion.Location = new Point(11, 1379);
panelVersion.Location = new Point(11, 1384);
panelVersion.Margin = new Padding(4);
panelVersion.Name = "panelVersion";
panelVersion.Size = new Size(827, 56);
@@ -1550,5 +1572,6 @@ namespace GHelper
private RButton buttonUpdates;
private Label labelCharge;
private RButton buttonFnLock;
private RButton buttonBatteryFull;
}
}

View File

@@ -2,6 +2,7 @@
using GHelper.AutoUpdate;
using GHelper.Battery;
using GHelper.Display;
using GHelper.Fan;
using GHelper.Gpu;
using GHelper.Helpers;
using GHelper.Input;
@@ -25,19 +26,25 @@ namespace GHelper
ScreenControl screenControl = new ScreenControl();
AutoUpdateControl updateControl;
public AniMatrixControl matrix;
AsusMouseSettings? mouseSettings;
public AniMatrixControl matrixControl;
public static System.Timers.Timer sensorTimer = default!;
public Fans? fans;
public Extra? keyb;
public Updates? updates;
public Matrix? matrixForm;
public Fans? fansForm;
public Extra? extraForm;
public Updates? updatesForm;
static long lastRefresh;
static long lastBatteryRefresh;
static long lastLostFocus;
bool isGpuSection = true;
bool batteryMouseOver = false;
bool batteryFullMouseOver = false;
public SettingsForm()
{
@@ -47,7 +54,7 @@ namespace GHelper
gpuControl = new GPUModeControl(this);
updateControl = new AutoUpdateControl(this);
matrix = new AniMatrixControl(this);
matrixControl = new AniMatrixControl(this);
buttonSilent.Text = Properties.Strings.Silent;
buttonBalanced.Text = Properties.Strings.Balanced;
@@ -82,6 +89,7 @@ namespace GHelper
buttonUpdates.Text = Properties.Strings.Updates;
FormClosing += SettingsForm_FormClosing;
Deactivate += SettingsForm_LostFocus;
buttonSilent.BorderColor = colorEco;
buttonBalanced.BorderColor = colorStandard;
@@ -189,6 +197,10 @@ namespace GHelper
buttonPeripheral2.MouseEnter += ButtonPeripheral_MouseEnter;
buttonPeripheral3.MouseEnter += ButtonPeripheral_MouseEnter;
buttonBatteryFull.MouseEnter += ButtonBatteryFull_MouseEnter;
buttonBatteryFull.MouseLeave += ButtonBatteryFull_MouseLeave;
buttonBatteryFull.Click += ButtonBatteryFull_Click;
Text = "G-Helper " + (ProcessHelper.IsUserAdministrator() ? "—" : "-") + " " + AppConfig.GetModelShort();
TopMost = AppConfig.Is("topmost");
@@ -202,6 +214,27 @@ namespace GHelper
panelPerformance.Focus();
}
private void SettingsForm_LostFocus(object? sender, EventArgs e)
{
lastLostFocus = DateTimeOffset.Now.ToUnixTimeMilliseconds();
}
private void ButtonBatteryFull_Click(object? sender, EventArgs e)
{
BatteryControl.ToggleBatteryLimitFull();
}
private void ButtonBatteryFull_MouseLeave(object? sender, EventArgs e)
{
batteryFullMouseOver = false;
RefreshSensors(true);
}
private void ButtonBatteryFull_MouseEnter(object? sender, EventArgs e)
{
batteryFullMouseOver = true;
labelCharge.Text = Properties.Strings.BatteryLimitFull;
}
private void SettingsForm_Resize(object? sender, EventArgs e)
{
@@ -242,7 +275,8 @@ namespace GHelper
if (this.Visible)
{
screenControl.InitScreen();
gpuControl.InitXGM();
VisualizeXGM();
Task.Run((Action)RefreshPeripheralsBattery);
updateControl.CheckForUpdates();
}
@@ -255,17 +289,28 @@ namespace GHelper
private void ButtonUpdates_Click(object? sender, EventArgs e)
{
if (updates == null || updates.Text == "")
if (updatesForm == null || updatesForm.Text == "")
{
updates = new Updates();
updates.Show();
updatesForm = new Updates();
AddOwnedForm(updatesForm);
}
if (updatesForm.Visible)
{
updatesForm.Close();
}
else
{
updates.Close();
updatesForm.Show();
}
}
public void VisualiseMatrix(string image)
{
if (matrixForm == null || matrixForm.Text == "") return;
matrixForm.VisualiseMatrix(image);
}
protected override void WndProc(ref Message m)
{
@@ -376,7 +421,7 @@ namespace GHelper
//contextMenuStrip.ShowCheckMargin = true;
contextMenuStrip.RenderMode = ToolStripRenderMode.System;
if (CheckSystemDarkModeStatus())
if (darkTheme)
{
contextMenuStrip.BackColor = this.BackColor;
contextMenuStrip.ForeColor = this.ForeColor;
@@ -503,14 +548,30 @@ namespace GHelper
private void CheckMatrix_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_auto", checkMatrix.Checked ? 1 : 0);
matrix.SetMatrix();
matrixControl.SetMatrix();
}
private void ButtonMatrix_Click(object? sender, EventArgs e)
{
matrix.OpenMatrixPicture();
if (matrixForm == null || matrixForm.Text == "")
{
matrixForm = new Matrix();
AddOwnedForm(matrixForm);
}
if (matrixForm.Visible)
{
matrixForm.Close();
}
else
{
matrixForm.FormPosition();
matrixForm.Show();
}
}
public void SetMatrixRunning(int mode)
@@ -518,26 +579,27 @@ namespace GHelper
Invoke(delegate
{
comboMatrixRunning.SelectedIndex = mode;
if (comboMatrix.SelectedIndex == 0) comboMatrix.SelectedIndex = 3;
});
}
private void ComboMatrixRunning_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_running", comboMatrixRunning.SelectedIndex);
matrix.SetMatrix();
matrixControl.SetMatrix();
}
private void ComboMatrix_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_brightness", comboMatrix.SelectedIndex);
matrix.SetMatrix();
matrixControl.SetMatrix();
}
private void LabelCPUFan_Click(object? sender, EventArgs e)
{
HardwareControl.fanRpm = !HardwareControl.fanRpm;
FanSensorControl.fanRpm = !FanSensorControl.fanRpm;
RefreshSensors(true);
}
@@ -551,8 +613,7 @@ namespace GHelper
if (colorDlg.ShowDialog() == DialogResult.OK)
{
AppConfig.Set("aura_color2", colorDlg.Color.ToArgb());
AsusUSB.ApplyAura();
VisualiseAura();
SetAura();
}
}
@@ -563,14 +624,19 @@ namespace GHelper
private void ButtonKeyboard_Click(object? sender, EventArgs e)
{
if (keyb == null || keyb.Text == "")
if (extraForm == null || extraForm.Text == "")
{
keyb = new Extra();
keyb.Show();
extraForm = new Extra();
AddOwnedForm(extraForm);
}
if (extraForm.Visible)
{
extraForm.Close();
}
else
{
keyb.Close();
extraForm.Show();
}
}
@@ -578,26 +644,35 @@ namespace GHelper
{
Invoke(delegate
{
if (fans != null && fans.Text != "") fans.InitAll();
if (fansForm != null && fansForm.Text != "") fansForm.InitAll();
});
}
public void GPUInit()
{
Invoke(delegate
{
if (fansForm != null && fansForm.Text != "") fansForm.InitGPU();
});
}
public void FansToggle(int index = 0)
{
if (fans == null || fans.Text == "")
if (fansForm == null || fansForm.Text == "")
{
fans = new Fans();
fansForm = new Fans();
AddOwnedForm(fansForm);
}
if (fans.Visible)
if (fansForm.Visible)
{
fans.Close();
fansForm.Close();
}
else
{
fans.FormPosition();
fans.Show();
fans.ToggleNavigation(index);
fansForm.FormPosition();
fansForm.Show();
fansForm.ToggleNavigation(index);
}
}
@@ -617,8 +692,7 @@ namespace GHelper
if (colorDlg.ShowDialog() == DialogResult.OK)
{
AppConfig.Set("aura_color", colorDlg.Color.ToArgb());
AsusUSB.ApplyAura();
VisualiseAura();
SetAura();
}
}
@@ -651,17 +725,29 @@ namespace GHelper
}
public void SetAura()
{
Task.Run(() =>
{
AsusUSB.ApplyAura();
VisualiseAura();
});
}
public void VisualiseAura()
{
pictureColor.BackColor = AsusUSB.Color1;
pictureColor2.BackColor = AsusUSB.Color2;
pictureColor2.Visible = AsusUSB.HasSecondColor();
Invoke(delegate
{
pictureColor.BackColor = AsusUSB.Color1;
pictureColor2.BackColor = AsusUSB.Color2;
pictureColor2.Visible = AsusUSB.HasSecondColor();
});
}
public void InitMatrix()
{
if (!matrix.IsValid)
if (!matrixControl.IsValid)
{
panelMatrix.Visible = false;
return;
@@ -682,13 +768,14 @@ namespace GHelper
comboKeyboard.SelectedIndex += 1;
else
comboKeyboard.SelectedIndex = 0;
Program.toast.RunToast(comboKeyboard.GetItemText(comboKeyboard.SelectedItem), ToastIcon.BacklightUp);
}
private void ComboKeyboard_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("aura_mode", (int)comboKeyboard.SelectedValue);
AsusUSB.ApplyAura();
VisualiseAura();
SetAura();
}
@@ -712,7 +799,7 @@ namespace GHelper
public void VisualiseScreen(bool screenEnabled, bool screenAuto, int frequency, int maxFrequency, int overdrive, bool overdriveSetting, int miniled)
public void VisualiseScreen(bool screenEnabled, bool screenAuto, int frequency, int maxFrequency, int overdrive, bool overdriveSetting, int miniled, bool hdr)
{
ButtonEnabled(button60Hz, screenEnabled);
@@ -753,7 +840,8 @@ namespace GHelper
if (miniled >= 0)
{
buttonMiniled.Activated = (miniled == 1);
buttonMiniled.Activated = (miniled == 1) || hdr;
buttonMiniled.Enabled = !hdr;
}
else
{
@@ -764,20 +852,45 @@ namespace GHelper
private void ButtonQuit_Click(object? sender, EventArgs e)
{
matrix.Dispose();
matrixControl.Dispose();
Close();
Program.trayIcon.Visible = false;
Application.Exit();
}
/// <summary>
/// Closes all forms except the settings. Hides the settings
/// </summary>
public void HideAll()
{
this.Hide();
if (fans != null && fans.Text != "") fans.Close();
if (keyb != null && keyb.Text != "") keyb.Close();
if (updates != null && updates.Text != "") updates.Close();
if (fansForm != null && fansForm.Text != "") fansForm.Close();
if (extraForm != null && extraForm.Text != "") extraForm.Close();
if (updatesForm != null && updatesForm.Text != "") updatesForm.Close();
if (matrixForm != null && matrixForm.Text != "") matrixForm.Close();
}
/// <summary>
/// Brings all visible windows to the top, with settings being the focus
/// </summary>
public void ShowAll()
{
this.Activate();
}
/// <summary>
/// Check if any of fans, keyboard, update, or itself has focus
/// </summary>
/// <returns>Focus state</returns>
public bool HasAnyFocus(bool lostFocusCheck = false)
{
return (fansForm != null && fansForm.ContainsFocus) ||
(extraForm != null && extraForm.ContainsFocus) ||
(updatesForm != null && updatesForm.ContainsFocus) ||
(matrixForm != null && matrixForm.ContainsFocus) ||
this.ContainsFocus ||
(lostFocusCheck && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastLostFocus) < 300);
}
private void SettingsForm_FormClosing(object? sender, FormClosingEventArgs e)
{
@@ -859,7 +972,7 @@ namespace GHelper
labelMidFan.Text = "Mid " + HardwareControl.midFan;
labelBattery.Text = battery;
if (!batteryMouseOver) labelCharge.Text = charge;
if (!batteryMouseOver && !batteryFullMouseOver) labelCharge.Text = charge;
//panelPerformance.AccessibleName = labelPerf.Text + " " + trayTip;
});
@@ -871,8 +984,8 @@ namespace GHelper
public void LabelFansResult(string text)
{
if (fans != null && fans.Text != "")
fans.LabelFansResult(text);
if (fansForm != null && fansForm.Text != "")
fansForm.LabelFansResult(text);
}
public void ShowMode(int mode)
@@ -945,15 +1058,24 @@ namespace GHelper
}
public void VisualizeXGM(bool connected, bool activated)
public void VisualizeXGM(int GPUMode = -1)
{
bool connected = Program.acpi.IsXGConnected();
buttonXGM.Enabled = buttonXGM.Visible = connected;
if (!connected) return;
buttonXGM.Activated = activated;
if (GPUMode != -1)
ButtonEnabled(buttonXGM, AppConfig.IsNoGPUModes() || GPUMode != AsusACPI.GPUModeEco);
if (activated)
int activated = Program.acpi.DeviceGet(AsusACPI.GPUXG);
Logger.WriteLine("XGM Activated flag: " + activated);
buttonXGM.Activated = activated == 1;
if (activated == 1)
{
ButtonEnabled(buttonOptimized, false);
ButtonEnabled(buttonEco, false);
@@ -970,16 +1092,30 @@ namespace GHelper
}
public void HideUltimateMode()
public void VisualiseGPUButtons(bool eco = true, bool ultimate = true)
{
tableGPU.Controls.Remove(buttonUltimate);
tablePerf.ColumnCount = 0;
tableGPU.ColumnCount = 0;
tableScreen.ColumnCount = 0;
menuUltimate.Visible = false;
if (!eco)
{
menuEco.Visible = buttonEco.Visible = false;
menuOptimized.Visible = buttonOptimized.Visible = false;
buttonStopGPU.Visible = true;
tableGPU.ColumnCount = 3;
tableScreen.ColumnCount = 3;
}
else
{
buttonStopGPU.Visible = false;
}
if (!ultimate)
{
menuUltimate.Visible = buttonUltimate.Visible = false;
tableGPU.ColumnCount = 3;
tableScreen.ColumnCount = 3;
}
}
public void HideGPUModes()
public void HideGPUModes(bool gpuExists)
{
isGpuSection = false;
@@ -987,14 +1123,17 @@ namespace GHelper
buttonStandard.Visible = false;
buttonUltimate.Visible = false;
buttonOptimized.Visible = false;
buttonStopGPU.Visible = true;
tableGPU.ColumnCount = 0;
SetContextMenu();
if (HardwareControl.FormatFan(Program.acpi.DeviceGet(AsusACPI.GPU_Fan)) is null) panelGPU.Visible = false;
panelGPU.Visible = gpuExists;
}
public void LockGPUModes(string text = null)
{
Invoke(delegate
@@ -1037,7 +1176,6 @@ namespace GHelper
buttonOptimized.Activated = GPUAuto;
labelGPU.Text = Properties.Strings.GPUMode + ": " + Properties.Strings.GPUModeEco;
Program.trayIcon.Icon = Properties.Resources.eco;
ButtonEnabled(buttonXGM, false);
break;
case AsusACPI.GPUModeUltimate:
buttonUltimate.Activated = true;
@@ -1050,10 +1188,12 @@ namespace GHelper
buttonOptimized.Activated = GPUAuto;
labelGPU.Text = Properties.Strings.GPUMode + ": " + Properties.Strings.GPUModeStandard;
Program.trayIcon.Icon = Properties.Resources.standard;
ButtonEnabled(buttonXGM, true);
break;
}
VisualizeXGM(GPUMode);
if (isGpuSection)
{
menuEco.Checked = buttonEco.Activated;
@@ -1091,6 +1231,22 @@ namespace GHelper
{
labelBatteryTitle.Text = Properties.Strings.BatteryChargeLimit + ": " + limit.ToString() + "%";
sliderBattery.Value = limit;
VisualiseBatteryFull();
}
public void VisualiseBatteryFull()
{
if (AppConfig.Is("charge_full"))
{
buttonBatteryFull.BackColor = colorStandard;
buttonBatteryFull.ForeColor = SystemColors.ControlLightLight;
}
else
{
buttonBatteryFull.BackColor = buttonSecond;
buttonBatteryFull.ForeColor = SystemColors.ControlDark;
}
}
@@ -1114,8 +1270,16 @@ namespace GHelper
if (m.IsDeviceReady)
{
b.Text = m.GetDisplayName() + "\n" + m.Battery + "%"
+ (m.Charging ? "(" + Properties.Strings.Charging + ")" : "");
if (m.HasBattery())
{
b.Text = m.GetDisplayName() + "\n" + m.Battery + "%"
+ (m.Charging ? "(" + Properties.Strings.Charging + ")" : "");
}
else
{
b.Text = m.GetDisplayName();
}
}
else
{
@@ -1167,6 +1331,12 @@ namespace GHelper
private void ButtonPeripheral_Click(object? sender, EventArgs e)
{
if (mouseSettings is not null)
{
mouseSettings.Close();
return;
}
int index = 0;
if (sender == buttonPeripheral2) index = 1;
if (sender == buttonPeripheral3) index = 2;
@@ -1187,16 +1357,30 @@ namespace GHelper
//Should not happen if all device classes are implemented correctly. But better safe than sorry.
return;
}
AsusMouseSettings s = new AsusMouseSettings(am);
if (!s.IsDisposed)
mouseSettings = new AsusMouseSettings(am);
mouseSettings.TopMost = true;
mouseSettings.FormClosed += MouseSettings_FormClosed;
mouseSettings.Disposed += MouseSettings_Disposed;
if (!mouseSettings.IsDisposed)
{
s.Show();
mouseSettings.Show();
}
else
{
mouseSettings = null;
}
}
}
private void MouseSettings_Disposed(object? sender, EventArgs e)
{
mouseSettings = null;
}
private void MouseSettings_FormClosed(object? sender, FormClosedEventArgs e)
{
mouseSettings = null;
}
public void VisualiseFnLock()

View File

@@ -62,6 +62,23 @@ namespace GHelper.UI
private static bool IsDarkTheme()
{
string? uiMode = AppConfig.GetString("ui_mode");
if (uiMode is not null && uiMode.ToLower() == "dark")
{
return true;
}
if (uiMode is not null && uiMode.ToLower() == "light")
{
return false;
}
if (uiMode is not null && uiMode.ToLower() == "windows")
{
return CheckSystemDarkModeStatus();
}
using var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize");
var registryValueObject = key?.GetValue("AppsUseLightTheme");
@@ -71,7 +88,7 @@ namespace GHelper.UI
public bool InitTheme(bool setDPI = false)
{
bool newDarkTheme = CheckSystemDarkModeStatus();
bool newDarkTheme = IsDarkTheme();
bool changed = darkTheme != newDarkTheme;
darkTheme = newDarkTheme;

View File

@@ -54,16 +54,17 @@ namespace GHelper
//
tableBios.AutoSize = true;
tableBios.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableBios.ColumnCount = 3;
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableBios.ColumnCount = 4;
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableBios.Dock = DockStyle.Top;
tableBios.Location = new Point(20, 20);
tableBios.Margin = new Padding(4);
tableBios.MinimumSize = new Size(1100, 0);
tableBios.MinimumSize = new Size(1300, 0);
tableBios.Name = "tableBios";
tableBios.Size = new Size(1216, 0);
tableBios.Size = new Size(1300, 0);
tableBios.TabIndex = 0;
//
// labelBIOS
@@ -105,7 +106,7 @@ namespace GHelper
//
labelUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelUpdates.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelUpdates.Location = new Point(941, 23);
labelUpdates.Location = new Point(810, 23);
labelUpdates.Name = "labelUpdates";
labelUpdates.Size = new Size(245, 32);
labelUpdates.TabIndex = 4;
@@ -156,16 +157,17 @@ namespace GHelper
//
tableDrivers.AutoSize = true;
tableDrivers.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableDrivers.ColumnCount = 3;
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableDrivers.ColumnCount = 4;
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableDrivers.Dock = DockStyle.Top;
tableDrivers.Location = new Point(20, 20);
tableDrivers.Margin = new Padding(4);
tableDrivers.MinimumSize = new Size(1100, 0);
tableDrivers.MinimumSize = new Size(1300, 0);
tableDrivers.Name = "tableDrivers";
tableDrivers.Size = new Size(1216, 0);
tableDrivers.Size = new Size(1300, 0);
tableDrivers.TabIndex = 0;
//
// panelDriversTitle

View File

@@ -7,31 +7,33 @@ using System.Text.Json;
namespace GHelper
{
struct DriverDownload
{
public string categoryName;
public string title;
public string version;
public string downloadUrl;
public JsonElement hardwares;
}
public partial class Updates : RForm
{
const int DRIVER_NOT_FOUND = 2;
const int DRIVER_NEWER = 1;
//static int rowCount = 0;
static string model;
static string bios;
static string model;
static int updatesCount = 0;
private static long lastUpdate;
public struct DriverDownload
{
public string categoryName;
public string title;
public string version;
public string downloadUrl;
public string date;
public JsonElement hardwares;
}
private void LoadUpdates(bool force = false)
{
if (!force && (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastUpdate) < 5000)) return;
lastUpdate = DateTimeOffset.Now.ToUnixTimeMilliseconds();
InitBiosAndModel();
(bios, model) = AppConfig.GetBiosAndModel();
updatesCount = 0;
labelUpdates.ForeColor = colorEco;
@@ -114,33 +116,71 @@ namespace GHelper
}
}
private string InitBiosAndModel()
{
using (ManagementObjectSearcher objSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_BIOS"))
{
using (ManagementObjectCollection objCollection = objSearcher.Get())
{
foreach (ManagementObject obj in objCollection)
if (obj["SMBIOSBIOSVersion"] is not null)
{
string[] results = obj["SMBIOSBIOSVersion"].ToString().Split(".");
if (results.Length > 1)
{
model = results[0];
bios = results[1];
}
else
{
model = obj["SMBIOSBIOSVersion"].ToString();
}
}
return "";
}
public void VisualiseDriver(DriverDownload driver, TableLayoutPanel table)
{
Invoke(delegate
{
string versionText = driver.version.Replace("latest version at the ", "");
Label versionLabel = new Label { Text = versionText, Anchor = AnchorStyles.Left, AutoSize = true };
versionLabel.Cursor = Cursors.Hand;
versionLabel.Font = new Font(versionLabel.Font, FontStyle.Underline);
versionLabel.ForeColor = colorEco;
versionLabel.Padding = new Padding(5, 5, 5, 5);
versionLabel.Click += delegate
{
Process.Start(new ProcessStartInfo(driver.downloadUrl) { UseShellExecute = true });
};
table.RowStyles.Add(new RowStyle(SizeType.AutoSize));
table.Controls.Add(new Label { Text = driver.categoryName, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 0, table.RowCount);
table.Controls.Add(new Label { Text = driver.title, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 1, table.RowCount);
table.Controls.Add(new Label { Text = driver.date, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 2, table.RowCount);
table.Controls.Add(versionLabel, 3, table.RowCount);
table.RowCount++;
});
}
public void ShowTable(TableLayoutPanel table)
{
Invoke(delegate
{
table.Visible = true;
ResumeLayout(false);
PerformLayout();
});
}
public void VisualiseNewDriver(int position, int newer, TableLayoutPanel table)
{
var label = table.GetControlFromPosition(3, position) as Label;
if (label != null)
{
Invoke(delegate
{
if (newer == DRIVER_NEWER)
{
label.Font = new Font(label.Font, FontStyle.Underline | FontStyle.Bold);
label.ForeColor = colorTurbo;
}
if (newer == DRIVER_NOT_FOUND) label.ForeColor = Color.Gray;
});
}
}
public async void DriversAsync(string url, int type, TableLayoutPanel table)
public void VisualiseNewCount(int updatesCount, TableLayoutPanel table)
{
Invoke(delegate
{
labelUpdates.Text = $"{Properties.Strings.NewUpdates}: {updatesCount}";
labelUpdates.ForeColor = colorTurbo;
labelUpdates.Font = new Font(labelUpdates.Font, FontStyle.Bold);
});
}
public async void DriversAsync(string url, int type, TableLayoutPanel table)
{
try
@@ -183,41 +223,17 @@ namespace GHelper
driver.version = file.GetProperty("Version").ToString().Replace("V", "");
driver.downloadUrl = file.GetProperty("DownloadUrl").GetProperty("Global").ToString();
driver.hardwares = file.GetProperty("HardwareInfoList");
driver.date = file.GetProperty("ReleaseDate").ToString();
drivers.Add(driver);
Invoke(delegate
{
string versionText = driver.version.Replace("latest version at the ", "");
Label versionLabel = new Label { Text = versionText, Anchor = AnchorStyles.Left, AutoSize = true };
versionLabel.Cursor = Cursors.Hand;
versionLabel.Font = new Font(versionLabel.Font, FontStyle.Underline);
versionLabel.ForeColor = colorEco;
versionLabel.Padding = new Padding(5, 5, 5, 5);
versionLabel.Click += delegate
{
Process.Start(new ProcessStartInfo(driver.downloadUrl) { UseShellExecute = true });
};
table.RowStyles.Add(new RowStyle(SizeType.AutoSize));
table.Controls.Add(new Label { Text = driver.categoryName, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 0, table.RowCount);
table.Controls.Add(new Label { Text = driver.title, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 1, table.RowCount);
table.Controls.Add(versionLabel, 2, table.RowCount);
table.RowCount++;
});
VisualiseDriver(driver, table);
}
oldTitle = title;
}
}
Invoke(delegate
{
table.Visible = true;
ResumeLayout(false);
PerformLayout();
});
ShowTable(table);
Dictionary<string, string> devices = new();
@@ -228,38 +244,29 @@ namespace GHelper
int count = 0;
foreach (var driver in drivers)
{
int newer = -2;
int newer = DRIVER_NOT_FOUND;
if (type == 0 && driver.hardwares.ToString().Length > 0)
for (int k = 0; k < driver.hardwares.GetArrayLength(); k++)
{
var deviceID = driver.hardwares[k].GetProperty("hardwareid").ToString();
var localVersion = devices.Where(p => p.Key.Contains(deviceID)).Select(p => p.Value).FirstOrDefault();
if (localVersion is not null)
var localVersions = devices.Where(p => p.Key.Contains(deviceID)).Select(p => p.Value);
foreach (var localVersion in localVersions)
{
newer = new Version(driver.version).CompareTo(new Version(localVersion));
break;
newer = Math.Min(newer, new Version(driver.version).CompareTo(new Version(localVersion)));
Logger.WriteLine(driver.title + " " + deviceID + " "+ driver.version + " vs " + localVersion + " = " + newer);
}
}
if (type == 1)
newer = Int32.Parse(driver.version) > Int32.Parse(bios) ? 1 : -1;
if (newer > 0)
{
var label = table.GetControlFromPosition(2, count) as Label;
if (label != null)
{
Invoke(delegate
{
updatesCount++;
label.Font = new Font(label.Font, FontStyle.Underline | FontStyle.Bold);
label.ForeColor = colorTurbo;
VisualiseNewDriver(count, newer, table);
labelUpdates.Text = $"{Properties.Strings.NewUpdates}: {updatesCount}";
labelUpdates.ForeColor = colorTurbo;
labelUpdates.Font = new Font(label.Font, FontStyle.Bold);
});
}
if (newer == DRIVER_NEWER)
{
updatesCount++;
VisualiseNewCount(updatesCount, table);
}
count++;

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

@@ -10,7 +10,7 @@ Small and lightweight Armoury Crate alternative for Asus laptops offering almost
- 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!
#### 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)
#### Support project in [:euro: EUR](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA) | [💵 USD](https://www.paypal.com/donate/?hosted_button_id=SRM6QUX6ACXDY)
![Gihhub](https://github.com/seerge/g-helper/assets/5920850/4d98465a-63a5-4498-ae14-afb3e67e7e82)
@@ -56,7 +56,7 @@ _To keep auto switching and hotkeys working the app needs to stay running in the
All Modes are **baked in BIOS** along with default fan curves and power limits and they are the **same** as in the Armoury Crate.
Each BIOS mode is paired with matching Windows Power Mode. If you don't want app to set Power Modes uncheck ``Extra``->``Auto adjust Windows Power Modes``
Each BIOS mode is paired with matching Windows Power Mode. You can adjust this setting under ``Fans + Power``
1. **Silent** in BIOS + **Best power efficiency** power mode
2. **Balanced** (Performance in AC) in BIOS + **Balanced** power mode
@@ -72,13 +72,16 @@ Each BIOS mode is paired with matching Windows Power Mode. If you don't want app
![Screenshot 2023-08-05 170159](https://github.com/seerge/g-helper/assets/5920850/84a5beb3-2463-40f1-9188-930d3099aad9)
![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)
## :question: FAQ
#### 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``
#### 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).
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).
Please note: For some devices not every charge limit % may be working. Try to set standard **80%** to be sure.
#### 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
@@ -96,7 +99,7 @@ You don't have to, it's purely optional. From my experience built in (in BIOS) p
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?
TUF models from 2021 and older don't support custom fan curves at all. Most probably you didn't have them in the 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.
@@ -107,7 +110,7 @@ Please check the system tray for a ``(G)`` icon. By default Windows is keen to h
#### 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?
#### Can I use the 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?
@@ -119,6 +122,13 @@ Personally, I'm not a big fan of them, as they make colors very inaccurate. But
#### 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 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. (*)
#### How to Undervolt GPU
Due to the way the Core Clock offset works for the GPU. When you increase clock offset you undervolt it at the same time (see picture)
1. Increase ``Core Clock Offset`` under ``Fans + Power -> GPU`` until your 3dmark / furmark / game runs stable. Start with +100, +150, +200 ... This should make your **scores / fps better within same power** / heat as before.
2. Set ``Core Clock Limit`` to a certain value (it really depends on application / game that you use) **to lower your power** / heat consumption
![Undervolting](https://github.com/seerge/g-helper/assets/5920850/6cadd219-fa92-4260-8bae-cb24c284b8cf)
#### 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 :)
@@ -227,24 +237,54 @@ By default the app will use your windows language setting. But you can set langu
### Custom windows power plans with each mode
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.
You can manually assign a custom power plan GUID to each mode.
Format is following : ``"scheme_<mode>" : "GUID" ``
Where ``mode = 0 (balanced), 1 (turbo), 2 (silent)``
Default behavior is :
Example (for default windows "balanced" power plan):
```
"scheme_0": "00000000-0000-0000-0000-000000000000",
"scheme_1": "ded574b5-45a0-4f42-8737-46345c09c238",
"scheme_2": "961cc777-2547-4f9d-8174-7d86181b8a7a",
"scheme_0": "381b4222-f694-41f0-9685-ff5bb260df2e",
"scheme_1": "381b4222-f694-41f0-9685-ff5bb260df2e",
"scheme_2": "381b4222-f694-41f0-9685-ff5bb260df2e",
```
### Alternative Activation for XG Mobile 6850XT
If you experience a situation when your XG Mobile doesn't work on full power when Activated. It's possible it needs an "alternative" command to get activated.
To turn it on, add following line to config :
```
"xgm_special" : 1,
```
### Override UI theme
By default the app would set the UI theme from the "app" theme in Windows setting. You can override it to specific theme, or general windows theme
```
"ui_mode" : "dark",
"ui_mode" : "light",
"ui_mode" : "windows",
```
### Skip keyboard Aura initialisation on startup
By default the app would set the last remembered RGB mode for the keyboard on each launch. To disable it completely
```
"skip_aura" : 1,
````
### Disable OSD
Disable app's OSD (for performance modes, keyboard backlight, etc.)
```
"disable_osd": 1,
```
### Disable "Tablet mode" on X13/X16
To disable automatic touchpad toggling when laptop enters / leaves tablet mode
```
"disable_tablet": 1,
```
### Extra Keybindings
- ``Ctrl + Shift + F5`` - Toggle Performance Modes
- ``Ctrl + Shift + F12`` - Open G-Helper window
@@ -256,20 +296,24 @@ If you don't want this bindings to work you can add
"skip_hotkeys":1,
```
### Toggle Performance Mode key binding
### Toggle Performance Mode or Toggle App Window key binding
To change binding for Toggle Performance Modes to ``Ctrl + Shift + KEY``
```
"keybind_profile": 116,
```
To change binding for Toggle App Window to ``Ctrl + Shift + KEY``
```
"keybind_app": 123,
```
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.
### Higher Maximum GPU Clock / Memory Offsets
By default under GPU section you can set up to +250/+250 for Core and Memory Clock Offset. To increase this value:
By default under the GPU section you can set up to +250/+250 for Core and Memory Clock Offset. To increase this value:
```
"max_gpu_core": 300,
"max_gpu_memory": 1500,
@@ -282,7 +326,9 @@ Select ``Custom`` next to appropriate hotkey under ``Extra`` settings and do one
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 the "action" field, for example ``0x2C`` for Print Screen.
2. To simulate any windows key or key-combination - put appropriate keycode(s) into the "action" field separated by space.
For example ``0x2C`` for ``Print Screen`` or ``0x11 0xA0 0x31`` for ``Ctrl+Shift+1``
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)