Compare commits

..

84 Commits

Author SHA1 Message Date
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
45 changed files with 910 additions and 393 deletions

View File

@@ -1,14 +1,11 @@
// Source thanks to https://github.com/vddCore/Starlight with some adjustments from me
using GHelper;
using GHelper.AnimeMatrix.Communication;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Globalization;
using System.Management;
using System.Text;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
namespace Starlight.AnimeMatrix
{
@@ -80,6 +77,7 @@ namespace Starlight.AnimeMatrix
}
public class AnimeMatrixDevice : Device
{
int UpdatePageLength = 490;
@@ -89,31 +87,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;
public int MaxColumns = 34;
public int LedStart = 0;
public int TextShift = 8;
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;
TextShift = 11;
LedStart = 1;
}
if (model.Contains("GU604"))
@@ -124,12 +127,35 @@ namespace Starlight.AnimeMatrix
MaxRows = 92;
LedCount = 1711;
UpdatePageLength = 630;
TextShift = 10;
}
_displayBuffer = new byte[LedCount];
/*
for (int i = 0; i < MaxRows; i++)
{
_model = AnimeType.GA401;
Logger.WriteLine(FirstX(i) + " " + Pitch(i));
}
*/
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()
{
@@ -173,32 +199,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:
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 static int Width(int y)
public int Width()
{
switch (_model)
{
@@ -211,7 +212,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)
{
@@ -247,19 +271,19 @@ namespace Starlight.AnimeMatrix
return 39;
default:
return Width(y) - FirstX(y);
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);
@@ -270,8 +294,8 @@ namespace Starlight.AnimeMatrix
{
if (!IsRowInRange(y)) return;
if (x >= FirstX(y) && x < Width(y))
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x + dx, value);
if (x >= FirstX(y) && x < Width())
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x, value);
}
public void WakeUp()
@@ -369,20 +393,49 @@ namespace Starlight.AnimeMatrix
public void PresentClock()
{
int second = DateTime.Now.Second;
string time;
string second = (DateTime.Now.Second % 2 == 0) ? ":" : " ";
string time = DateTime.Now.ToString("HH" + second + "mm");
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");
Clear();
TextDiagonal(time, 15, 12, TextShift + 11);
TextDiagonal(DateTime.Now.ToString("yy'. 'MM'. 'dd"), 11.5F, 3, TextShift);
Present();
if (_model == AnimeType.GA401)
PresentText(time);
else
PresentTextDiagonal(time);
}
public void TextDiagonal(string text, float fontSize = 10, int deltaX = 0, int deltaY = 10)
{
int maxX = (int)Math.Sqrt(MaxRows * MaxRows + MaxColumns * MaxColumns);
int textHeight;
using (Bitmap bmp = new Bitmap(maxX, MaxRows))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
using (Font font = new Font(fonts.Families[0], fontSize, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text, font);
textHeight = (int)textSize.Height;
g.DrawString(text, font, Brushes.White, 0, 0);
}
}
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 > 100) SetLedDiagonal(x, y, (byte)color, deltaX, deltaY);
}
}
}
}
public void PresentText(string text1, string text2 = "")
@@ -410,42 +463,25 @@ namespace Starlight.AnimeMatrix
}
bmp.Save("test.bmp", ImageFormat.Bmp);
GenerateFrame(bmp);
Present();
}
}
public void GenerateFrame(Image image, float zoom = 1, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
{
using (Bitmap bmp = GeneratePicture(image, zoom, panX, panY, quality))
{
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);
}
}
}
}
public Bitmap GeneratePicture(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
public void GenerateFrame(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
{
int width = MaxColumns * 3;
int width = MaxColumns / 2 * 6;
int height = MaxRows;
int targetWidth = MaxColumns * 2;
float scale;
Bitmap bmp = new Bitmap(targetWidth, height);
using (Bitmap bmp = new Bitmap(targetWidth, height))
{
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height) * zoom / 100;
@@ -459,61 +495,35 @@ namespace Starlight.AnimeMatrix
graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, (float)Math.Round(targetWidth - (scaleWidth + panX) * targetWidth / width), -panY, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);
return bmp;
}
}
}
public void SetLedDiagonal(int x, int y, byte color, int delta = 10)
{
//x += delta;
y -= delta;
int dx = (x - y) / 2;
int dy = x + y;
SetLedPlanar(dx, dy, color);
}
public void PresentTextDiagonal(string text)
{
Clear();
int maxX = (int)Math.Sqrt(MaxRows * MaxRows + MaxColumns * MaxColumns);
int textHeight;
using (Bitmap bmp = new Bitmap(maxX, MaxRows))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
using (Font font = new Font("Consolas", 11, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text, font);
textHeight = (int)textSize.Height;
g.DrawString(text, font, Brushes.White, 4, 0);
}
}
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, textHeight - 8);
}
if (x % 2 == y % 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);
}
}
}
Present();
}
public void SetLedDiagonal(int x, int y, byte color, int deltaX = 0, int deltaY = 10)
{
x += deltaX;
y -= deltaY;
int plX = (x - y) / 2;
int plY = x + y;
SetLedPlanar(plX, plY, color);
}
private bool IsRowInRange(int row)
{
return (row >= 0 && row < MaxRows);

View File

@@ -356,6 +356,11 @@ public static class AppConfig
ContainsModel("FX507Z");
}
public static bool IsFanScale()
{
return ContainsModel("GU604");
}
public static bool IsFanRequired()
{
return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R");
@@ -383,7 +388,7 @@ public static class AppConfig
public static bool IsNoGPUModes()
{
return ContainsModel("GV301RA") || ContainsModel("GV302XA");
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
@@ -60,11 +61,11 @@ public class AsusACPI
public const uint GPUEco = 0x00090020;
public const uint GPUXGInit = 0x00090017;
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;
@@ -94,6 +95,7 @@ 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;
@@ -104,6 +106,8 @@ public class AsusACPI
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;
@@ -344,6 +348,32 @@ 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)
{
byte min = (byte)(curve[8] * 255 / 100);
@@ -371,13 +401,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)
{
@@ -520,14 +552,8 @@ public class AsusACPI
setting[4] = color.B;
setting[5] = (byte)speed;
DeviceSet(TUF_KB, setting, "TUF RGB");
/*
setting[0] = (byte)0xb4;
DeviceSet(TUF_KB, setting, "TUF RGB");
*/
//Debug.WriteLine(BitConverter.ToString(setting));
int result = DeviceSet(TUF_KB, setting, "TUF RGB");
if (result != 1) DeviceSet(TUF_KB2, setting, "TUF RGB");
}

View File

@@ -333,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 };
@@ -644,6 +646,8 @@ namespace GHelper
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);
@@ -652,6 +656,7 @@ namespace GHelper
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

@@ -9,8 +9,8 @@
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");
Program.settingsForm.VisualiseBattery(limit);
AppConfig.Set("charge_limit", limit);

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,12 @@ 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);
}
bool screenEnabled = (frequency >= 0);
@@ -94,7 +98,8 @@ namespace GHelper.Display
maxFrequency: maxFrequency,
overdrive: overdrive,
overdriveSetting: overdriveSetting,
miniled: miniled
miniled: miniled,
hdr: hdr
);
});

View File

@@ -1,8 +1,6 @@
using Microsoft.VisualBasic.Logging;
using System.Collections;
using System.Diagnostics.Metrics;
using System.Collections;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using static GHelper.Display.ScreenInterrogatory;
namespace GHelper.Display

28
app/Extra.Designer.cs generated
View File

@@ -115,6 +115,7 @@ namespace GHelper
labelHibernateAfter = new Label();
pictureHibernate = new PictureBox();
toolTip = new ToolTip(components);
checkBootSound = new CheckBox();
panelServices.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureService).BeginInit();
panelBindingsHeader.SuspendLayout();
@@ -147,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;
@@ -1065,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);
@@ -1073,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);
@@ -1092,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);
@@ -1105,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);
@@ -1172,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;
@@ -1209,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);
@@ -1356,5 +1371,6 @@ namespace GHelper
private NumericUpDown numericHibernateAfter;
private CheckBox checkGPUFix;
private ToolTip toolTip;
private CheckBox checkBootSound;
}
}

View File

@@ -108,6 +108,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;
@@ -311,6 +312,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;
@@ -327,6 +331,11 @@ namespace GHelper
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));

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();
}
}
}

211
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();
@@ -128,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();
@@ -136,10 +141,6 @@ namespace GHelper
buttonAdvanced = new RButton();
buttonGPU = new RButton();
buttonCPU = new RButton();
panelGPUClockLimit = new Panel();
labelGPUClockLimit = new Label();
trackGPUClockLimit = new TrackBar();
labelGPUClockLimitTitle = new Label();
panelFans.SuspendLayout();
tableFanCharts.SuspendLayout();
((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit();
@@ -188,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();
panelGPUClockLimit.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).BeginInit();
SuspendLayout();
//
// panelFans
@@ -239,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));
@@ -250,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
@@ -410,6 +411,7 @@ namespace GHelper
//
// panelApplyFans
//
panelApplyFans.Controls.Add(buttonCalibrate);
panelApplyFans.Controls.Add(labelFansResult);
panelApplyFans.Controls.Add(checkApplyFans);
panelApplyFans.Controls.Add(buttonReset);
@@ -420,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
@@ -458,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;
@@ -1337,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;
@@ -1459,56 +1527,6 @@ namespace GHelper
buttonCPU.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonCPU.UseVisualStyleBackColor = false;
//
// 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";
//
// Fans
//
AutoScaleDimensions = new SizeF(192F, 192F);
@@ -1597,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);
panelGPUClockLimit.ResumeLayout(false);
panelGPUClockLimit.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).EndInit();
ResumeLayout(false);
PerformLayout();
}
@@ -1711,5 +1729,6 @@ namespace GHelper
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,8 +19,6 @@ namespace GHelper
Series seriesMid;
Series seriesXGM;
static int MinRPM, MaxRPM;
static bool gpuVisible = true;
static bool fanRpm = true;
@@ -28,11 +27,15 @@ namespace GHelper
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);
@@ -57,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;
@@ -200,13 +203,24 @@ 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;
@@ -571,15 +585,15 @@ 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);
if (fanRpm)
return (200 * Math.Round((float)(MinRPM * 100 + (Max - MinRPM) * percentage) / 200)).ToString() + unit;
return (200 * Math.Round((float)(Min * 100 + (Max - Min) * percentage) / 200)).ToString() + unit;
else
return percentage + "%";
}
@@ -589,12 +603,12 @@ namespace GHelper
chart.ChartAreas[0].AxisY.CustomLabels.Clear();
for (int i = 0; i <= fansMax - 10; i += 10)
for (int i = 0; i <= fansMax; i += 10)
{
chart.ChartAreas[0].AxisY.CustomLabels.Add(i - 2, i + 2, ChartPercToRPM(i, device));
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.CustomLabels.Add(fansMax -2, fansMax + 2, Properties.Strings.RPM);
chart.ChartAreas[0].AxisY.Interval = 10;
}
@@ -602,20 +616,21 @@ namespace GHelper
{
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;
}
@@ -677,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;
}
@@ -721,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)
{
@@ -994,7 +1034,6 @@ namespace GHelper
{
curPoint = null;
curIndex = -1;
labelTip.Visible = false;
SaveProfile(seriesCPU, AsusFan.CPU);
@@ -1017,7 +1056,9 @@ namespace GHelper
private void ChartCPU_MouseLeave(object? sender, EventArgs e)
{
Chart_Save();
curPoint = null;
curIndex = -1;
labelTip.Visible = false;
}
private void ChartCPU_MouseMove(object? sender, MouseEventArgs e, AsusFan device)
@@ -1081,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.119</AssemblyVersion>
<AssemblyVersion>0.124</AssemblyVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -24,9 +24,13 @@ 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);
settings.VisualiseGPUButtons(eco >= 0, mux >= 0);
if (mux == 0)
{
gpuMode = AsusACPI.GPUModeUltimate;
@@ -38,15 +42,10 @@ namespace GHelper.Gpu
else
gpuMode = AsusACPI.GPUModeStandard;
// Ultimate mode not supported
if (mux != 1) settings.HideUltimateMode();
// GPU mode not supported
if (eco < 0 && mux < 0)
{
if (gpuExists is null)
gpuExists = HardwareControl.FormatFan(Program.acpi.DeviceGet(AsusACPI.GPU_Fan)) is not null;
if (gpuExists is null) gpuExists = Program.acpi.GetFan(AsusFan.GPU) >= 0;
settings.HideGPUModes((bool)gpuExists);
}
}
@@ -75,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;
}
@@ -95,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;
}
@@ -307,7 +310,11 @@ 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();

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.IsNotFalse("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
@@ -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

@@ -168,7 +168,7 @@ namespace GHelper.Input
static void SetBrightness(int delta)
{
int brightness = -1;
if (isTUF) brightness = ScreenBrightness.Get();
if (AppConfig.SwappedBrightness()) delta = -delta;
@@ -182,7 +182,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);
}
}
@@ -388,10 +388,17 @@ namespace GHelper.Input
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();
@@ -433,6 +440,11 @@ namespace GHelper.Input
}
}
static void ToggleTouchpad()
{
KeyboardHook.KeyCtrlWinPress(Keys.F24);
}
public static void ToggleArrowLock()
{
int arLock = AppConfig.Is("arrow_lock") ? 0 : 1;
@@ -476,7 +488,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.
@@ -566,7 +578,7 @@ 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;
@@ -599,9 +611,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)
@@ -645,7 +655,8 @@ namespace GHelper.Input
else if (brightness >= 100) brightness = 0;
else brightness = -10;
} else
}
else
{
brightness = Math.Max(Math.Min(100, brightness + delta), -10);
}
@@ -654,9 +665,9 @@ namespace GHelper.Input
if (brightness >= 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 1, "ScreenpadOn");
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, Math.Max(brightness * 255 / 100, 0 ), "Screenpad");
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, Math.Max(brightness * 255 / 100, 0), "Screenpad");
if (brightness < 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 0, "ScreenpadOff");
if (brightness < 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 0, "ScreenpadOff");
string toast;
@@ -677,11 +688,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,7 +17,9 @@ 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)
{
@@ -32,6 +34,16 @@ public sealed class KeyboardHook : IDisposable
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}
public static void KeyCtrlWinPress(Keys key)
{
keybd_event(VK_LCONTROL, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event(VK_LCONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}
/// <summary>
/// Represents the window that is used internally to get the messages.

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

@@ -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

@@ -289,4 +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="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

@@ -483,6 +483,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>
@@ -510,6 +519,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>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Helligkeit erhöhen</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Lädt</value>
</data>

View File

@@ -258,6 +258,9 @@
<data name="Boot" xml:space="preserve">
<value>Al arrancar</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Brillo</value>
</data>
@@ -267,6 +270,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Subir brillo</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Cargando</value>
</data>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,9 @@
<data name="Boot" xml:space="preserve">
<value>Rendszerbetöltés</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Fényerő</value>
</data>
@@ -267,6 +270,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Fényerő növelése</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Charging</value>
</data>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,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>

View File

@@ -235,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>
@@ -256,7 +256,10 @@
<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>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,9 @@
<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>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,9 @@
<data name="Boot" xml:space="preserve">
<value>Önyükleme</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Parlaklığı</value>
</data>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,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>
@@ -267,6 +270,9 @@
<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>Đang sạc</value>
</data>

View File

@@ -258,6 +258,9 @@
<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>
@@ -267,6 +270,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>

View File

@@ -258,6 +258,9 @@
<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>

BIN
app/Resources/Font.otf Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

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;
@@ -10,7 +11,6 @@ using GHelper.Peripherals;
using GHelper.Peripherals.Mouse;
using GHelper.UI;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.Timers;
namespace GHelper
@@ -544,6 +544,7 @@ namespace GHelper
Invoke(delegate
{
comboMatrixRunning.SelectedIndex = mode;
if (comboMatrix.SelectedIndex == 0) comboMatrix.SelectedIndex = 3;
});
}
@@ -563,7 +564,7 @@ namespace GHelper
private void LabelCPUFan_Click(object? sender, EventArgs e)
{
HardwareControl.fanRpm = !HardwareControl.fanRpm;
FanSensorControl.fanRpm = !FanSensorControl.fanRpm;
RefreshSensors(true);
}
@@ -757,7 +758,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);
@@ -799,6 +800,7 @@ namespace GHelper
if (miniled >= 0)
{
buttonMiniled.Activated = (miniled == 1);
buttonMiniled.Enabled = !hdr;
}
else
{
@@ -1024,13 +1026,26 @@ 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(bool gpuExists)
@@ -1041,15 +1056,17 @@ namespace GHelper
buttonStandard.Visible = false;
buttonUltimate.Visible = false;
buttonOptimized.Visible = false;
buttonStopGPU.Visible = true;
tableGPU.ColumnCount = 0;
SetContextMenu();
panelGPU.Visible = gpuExists;
}
public void LockGPUModes(string text = null)
{
Invoke(delegate

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

@@ -9,6 +9,9 @@ namespace GHelper
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;
@@ -21,6 +24,7 @@ namespace GHelper
public string title;
public string version;
public string downloadUrl;
public string date;
public JsonElement hardwares;
}
private void LoadUpdates(bool force = false)
@@ -156,7 +160,8 @@ namespace GHelper
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.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++;
});
}
@@ -171,15 +176,21 @@ namespace GHelper
});
}
public void VisualiseNewDriver(int position, TableLayoutPanel table)
public void VisualiseNewDriver(int position, int newer, TableLayoutPanel table)
{
var label = table.GetControlFromPosition(2, position) as Label;
var label = table.GetControlFromPosition(3, position) as Label;
if (label != null)
{
Invoke(delegate
{
label.Font = new Font(label.Font, FontStyle.Underline | FontStyle.Bold);
label.ForeColor = colorTurbo;
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;
});
}
}
@@ -237,6 +248,7 @@ 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);
VisualiseDriver(driver, table);
@@ -257,26 +269,28 @@ 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)
VisualiseNewDriver(count, newer, table);
if (newer == DRIVER_NEWER)
{
updatesCount++;
VisualiseNewDriver(count, table);
VisualiseNewCount(updatesCount, table);
}

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

@@ -249,6 +249,13 @@ Example (for default windows "balanced" power plan):
"scheme_2": "381b4222-f694-41f0-9685-ff5bb260df2e",
```
### Alternative Activation for XG Mobile 6850XT
If you experience situation when your XG Mobile doesn't work on full power when Activated. It's possible it needs "alternative" command to get activated.
To turn it on, add following line to config :
```
"xgm_special" : 1,
```
### Override UI theme
By default app would set UI theme from "app" theme in windows setting. You can override it to specific theme, or general windows theme
@@ -272,6 +279,12 @@ 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 enteres / leaves tablet mode
```
"disable_tablet": 1,
```
### Extra Keybindings
- ``Ctrl + Shift + F5`` - Toggle Performance Modes
- ``Ctrl + Shift + F12`` - Open G-Helper window