mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
Compare commits
52 Commits
v0.158
...
cpu-auto-t
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02c2a7ff37 | ||
|
|
65c5b645a8 | ||
|
|
61803dbc39 | ||
|
|
adcec744d4 | ||
|
|
12d7afc532 | ||
|
|
cb685f9158 | ||
|
|
6523d6ac12 | ||
|
|
b8c3c04e4b | ||
|
|
0eb5394af8 | ||
|
|
b765514477 | ||
|
|
da47c094e4 | ||
|
|
f2ef77b866 | ||
|
|
b104d852c7 | ||
|
|
89de581e1f | ||
|
|
40d31c0de2 | ||
|
|
edf05935c0 | ||
|
|
082c7036f5 | ||
|
|
2e9a34d8f5 | ||
|
|
181a16bee3 | ||
|
|
599def92b3 | ||
|
|
c31e52bc74 | ||
|
|
5fee6e03d1 | ||
|
|
7f087d36dc | ||
|
|
6850b644a0 | ||
|
|
0370aa8c94 | ||
|
|
f1198440d4 | ||
|
|
8cd256463a | ||
|
|
2aebf3044d | ||
|
|
5d231ea172 | ||
|
|
b9b98577d0 | ||
|
|
37dfa199b0 | ||
|
|
9b59e7b08c | ||
|
|
20a04dd1b2 | ||
|
|
06205a1ad3 | ||
|
|
82f90fcab3 | ||
|
|
4af2bf63c7 | ||
|
|
54dcb46527 | ||
|
|
20c9d57299 | ||
|
|
84a6fd4d5f | ||
|
|
7cc4e87d5f | ||
|
|
dea90f66b2 | ||
|
|
ac9b67868e | ||
|
|
e08092a754 | ||
|
|
7e3d6eab44 | ||
|
|
cf447174cb | ||
|
|
0d18e5b850 | ||
|
|
df52fbe25d | ||
|
|
0a86b6db3c | ||
|
|
acf52c2edd | ||
|
|
b006a11dcf | ||
|
|
0dc16c5cda | ||
|
|
b0e412f370 |
@@ -365,9 +365,9 @@ public static class AppConfig
|
||||
return ContainsModel("ProArt");
|
||||
}
|
||||
|
||||
public static bool IsVivoZenbook()
|
||||
public static bool IsVivobook()
|
||||
{
|
||||
return ContainsModel("Vivobook") || ContainsModel("Zenbook");
|
||||
return ContainsModel("Vivobook");
|
||||
}
|
||||
|
||||
// Devices with bugged bios command to change brightness
|
||||
@@ -405,12 +405,7 @@ public static class AppConfig
|
||||
|
||||
public static bool IsOLED()
|
||||
{
|
||||
return ContainsModel("OLED") || IsSlash() || ContainsModel("UX64") || ContainsModel("UX34") || ContainsModel("UX53") || ContainsModel("K360") || ContainsModel("X150") || ContainsModel("M3500") || ContainsModel("K650");
|
||||
}
|
||||
|
||||
public static bool IsNoOverdrive()
|
||||
{
|
||||
return Is("no_overdrive") || IsOLED();
|
||||
return ContainsModel("OLED") || IsSlash() || ContainsModel("UX64") || ContainsModel("UX34") || ContainsModel("UX53") || ContainsModel("K360") || ContainsModel("X150");
|
||||
}
|
||||
|
||||
public static bool IsStrix()
|
||||
@@ -436,7 +431,7 @@ public static class AppConfig
|
||||
|
||||
public static bool IsNoDirectRGB()
|
||||
{
|
||||
return ContainsModel("GA503") || ContainsModel("G533Q") || IsSlash();
|
||||
return ContainsModel("GA503") || ContainsModel("G533Q");
|
||||
}
|
||||
|
||||
public static bool IsStrixNumpad()
|
||||
@@ -519,7 +514,7 @@ public static class AppConfig
|
||||
try
|
||||
{
|
||||
var (bios, model) = GetBiosAndModel();
|
||||
return (Int32.Parse(bios) == 317 || Int32.Parse(bios) == 316);
|
||||
return (Int32.Parse(bios) == 317);
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -527,19 +522,9 @@ public static class AppConfig
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsResetRequired()
|
||||
{
|
||||
return ContainsModel("GA403");
|
||||
}
|
||||
|
||||
public static bool IsFanRequired()
|
||||
{
|
||||
return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R") || ContainsModel("G713P") || ContainsModel("GU605") || ContainsModel("GA403");
|
||||
}
|
||||
|
||||
public static bool IsAMDLight()
|
||||
{
|
||||
return ContainsModel("GA402X") || ContainsModel("GA403") || ContainsModel("FA507N") || ContainsModel("FA507X") || ContainsModel("FA707N") || ContainsModel("FA707X");
|
||||
return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R") || ContainsModel("G713P");
|
||||
}
|
||||
|
||||
public static bool IsPowerRequired()
|
||||
@@ -577,10 +562,6 @@ public static class AppConfig
|
||||
return ContainsModel("G834") || ContainsModel("G614") || ContainsModel("G834") || ContainsModel("G634");
|
||||
}
|
||||
|
||||
public static bool IsROG()
|
||||
{
|
||||
return ContainsModel("ROG");
|
||||
}
|
||||
public static bool IsASUS()
|
||||
{
|
||||
return ContainsModel("ROG") || ContainsModel("TUF") || ContainsModel("Vivobook") || ContainsModel("Zenbook");
|
||||
|
||||
@@ -296,7 +296,7 @@ public class AsusACPI
|
||||
|
||||
if (AppConfig.IsSlash())
|
||||
{
|
||||
MaxGPUPower = AppConfig.Get("max_gpu_power", 25);
|
||||
MaxGPUPower = 25;
|
||||
}
|
||||
|
||||
if (AppConfig.DynamicBoost5())
|
||||
@@ -308,14 +308,6 @@ public class AsusACPI
|
||||
{
|
||||
MaxGPUBoost = 15;
|
||||
}
|
||||
|
||||
if (AppConfig.IsAMDLight())
|
||||
{
|
||||
MaxTotal = 90;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void Control(uint dwIoControlCode, byte[] lpInBuffer, byte[] lpOutBuffer)
|
||||
@@ -429,16 +421,9 @@ public class AsusACPI
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public int SetVivoMode(int mode)
|
||||
{
|
||||
if (mode == 1) mode = 2;
|
||||
else if (mode == 2) mode = 1;
|
||||
return Program.acpi.DeviceSet(VivoBookMode, mode, "VivoMode");
|
||||
}
|
||||
|
||||
public int SetGPUEco(int eco)
|
||||
{
|
||||
int ecoFlag = DeviceGet(GPUEco);
|
||||
|
||||
122
app/AsusMouseSettings.Designer.cs
generated
122
app/AsusMouseSettings.Designer.cs
generated
@@ -152,7 +152,7 @@
|
||||
//
|
||||
panelProfiles.Controls.Add(comboProfile);
|
||||
panelProfiles.Controls.Add(labelProfile);
|
||||
panelProfiles.Location = new Point(220, 2);
|
||||
panelProfiles.Location = new Point(212, 2);
|
||||
panelProfiles.Margin = new Padding(2);
|
||||
panelProfiles.MinimumSize = new Size(227, 0);
|
||||
panelProfiles.Name = "panelProfiles";
|
||||
@@ -197,7 +197,7 @@
|
||||
panelPerformance.Margin = new Padding(2);
|
||||
panelPerformance.Name = "panelPerformance";
|
||||
panelPerformance.Padding = new Padding(0, 7, 0, 17);
|
||||
panelPerformance.Size = new Size(437, 370);
|
||||
panelPerformance.Size = new Size(420, 370);
|
||||
panelPerformance.TabIndex = 1;
|
||||
//
|
||||
// panelPerformanceOther
|
||||
@@ -215,7 +215,7 @@
|
||||
panelPerformanceOther.Margin = new Padding(2);
|
||||
panelPerformanceOther.Name = "panelPerformanceOther";
|
||||
panelPerformanceOther.Padding = new Padding(0, 7, 0, 7);
|
||||
panelPerformanceOther.Size = new Size(437, 192);
|
||||
panelPerformanceOther.Size = new Size(420, 192);
|
||||
panelPerformanceOther.TabIndex = 49;
|
||||
//
|
||||
// panelDeceleration
|
||||
@@ -230,7 +230,7 @@
|
||||
panelDeceleration.Margin = new Padding(2);
|
||||
panelDeceleration.Name = "panelDeceleration";
|
||||
panelDeceleration.Padding = new Padding(3);
|
||||
panelDeceleration.Size = new Size(437, 31);
|
||||
panelDeceleration.Size = new Size(420, 31);
|
||||
panelDeceleration.TabIndex = 58;
|
||||
//
|
||||
// labelDeceleration
|
||||
@@ -279,7 +279,7 @@
|
||||
panelAcceleration.Margin = new Padding(2);
|
||||
panelAcceleration.Name = "panelAcceleration";
|
||||
panelAcceleration.Padding = new Padding(3);
|
||||
panelAcceleration.Size = new Size(437, 31);
|
||||
panelAcceleration.Size = new Size(420, 31);
|
||||
panelAcceleration.TabIndex = 57;
|
||||
//
|
||||
// labelAcceleration
|
||||
@@ -327,7 +327,7 @@
|
||||
panelLiftOffDistance.Margin = new Padding(2);
|
||||
panelLiftOffDistance.Name = "panelLiftOffDistance";
|
||||
panelLiftOffDistance.Padding = new Padding(3);
|
||||
panelLiftOffDistance.Size = new Size(437, 29);
|
||||
panelLiftOffDistance.Size = new Size(420, 29);
|
||||
panelLiftOffDistance.TabIndex = 56;
|
||||
//
|
||||
// labelLiftOffDistance
|
||||
@@ -364,7 +364,7 @@
|
||||
panelDebounce.Margin = new Padding(2);
|
||||
panelDebounce.Name = "panelDebounce";
|
||||
panelDebounce.Padding = new Padding(3);
|
||||
panelDebounce.Size = new Size(437, 31);
|
||||
panelDebounce.Size = new Size(420, 31);
|
||||
panelDebounce.TabIndex = 55;
|
||||
//
|
||||
// labelButtonDebounce
|
||||
@@ -413,7 +413,7 @@
|
||||
panelAngleSnapping.Margin = new Padding(2);
|
||||
panelAngleSnapping.Name = "panelAngleSnapping";
|
||||
panelAngleSnapping.Padding = new Padding(3);
|
||||
panelAngleSnapping.Size = new Size(437, 29);
|
||||
panelAngleSnapping.Size = new Size(420, 29);
|
||||
panelAngleSnapping.TabIndex = 54;
|
||||
//
|
||||
// sliderAngleAdjustment
|
||||
@@ -464,7 +464,7 @@
|
||||
panelPollingRate.Margin = new Padding(2);
|
||||
panelPollingRate.Name = "panelPollingRate";
|
||||
panelPollingRate.Padding = new Padding(3);
|
||||
panelPollingRate.Size = new Size(437, 27);
|
||||
panelPollingRate.Size = new Size(420, 27);
|
||||
panelPollingRate.TabIndex = 53;
|
||||
//
|
||||
// labelPollingRate
|
||||
@@ -500,7 +500,7 @@
|
||||
panelDPISettings.Location = new Point(0, 91);
|
||||
panelDPISettings.Margin = new Padding(2);
|
||||
panelDPISettings.Name = "panelDPISettings";
|
||||
panelDPISettings.Size = new Size(437, 70);
|
||||
panelDPISettings.Size = new Size(420, 70);
|
||||
panelDPISettings.TabIndex = 44;
|
||||
//
|
||||
// sliderDPI
|
||||
@@ -512,7 +512,7 @@
|
||||
sliderDPI.Max = 35000;
|
||||
sliderDPI.Min = 100;
|
||||
sliderDPI.Name = "sliderDPI";
|
||||
sliderDPI.Size = new Size(437, 20);
|
||||
sliderDPI.Size = new Size(420, 20);
|
||||
sliderDPI.Step = 50;
|
||||
sliderDPI.TabIndex = 43;
|
||||
sliderDPI.TabStop = false;
|
||||
@@ -537,7 +537,7 @@
|
||||
tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||
tableLayoutPanel1.RowCount = 1;
|
||||
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
|
||||
tableLayoutPanel1.Size = new Size(437, 23);
|
||||
tableLayoutPanel1.Size = new Size(420, 23);
|
||||
tableLayoutPanel1.TabIndex = 47;
|
||||
//
|
||||
// labelMinDPI
|
||||
@@ -547,7 +547,7 @@
|
||||
labelMinDPI.Location = new Point(4, 0);
|
||||
labelMinDPI.Margin = new Padding(4, 0, 4, 0);
|
||||
labelMinDPI.Name = "labelMinDPI";
|
||||
labelMinDPI.Size = new Size(158, 23);
|
||||
labelMinDPI.Size = new Size(151, 23);
|
||||
labelMinDPI.TabIndex = 45;
|
||||
labelMinDPI.Text = "100";
|
||||
//
|
||||
@@ -555,10 +555,10 @@
|
||||
//
|
||||
labelMaxDPI.Dock = DockStyle.Fill;
|
||||
labelMaxDPI.ForeColor = SystemColors.GrayText;
|
||||
labelMaxDPI.Location = new Point(274, 0);
|
||||
labelMaxDPI.Location = new Point(263, 0);
|
||||
labelMaxDPI.Margin = new Padding(4, 0, 4, 0);
|
||||
labelMaxDPI.Name = "labelMaxDPI";
|
||||
labelMaxDPI.Size = new Size(159, 23);
|
||||
labelMaxDPI.Size = new Size(153, 23);
|
||||
labelMaxDPI.TabIndex = 46;
|
||||
labelMaxDPI.Text = " 35000";
|
||||
labelMaxDPI.TextAlign = ContentAlignment.TopRight;
|
||||
@@ -568,12 +568,12 @@
|
||||
numericUpDownCurrentDPI.BorderStyle = BorderStyle.None;
|
||||
numericUpDownCurrentDPI.Dock = DockStyle.Fill;
|
||||
numericUpDownCurrentDPI.Increment = new decimal(new int[] { 50, 0, 0, 0 });
|
||||
numericUpDownCurrentDPI.Location = new Point(168, 2);
|
||||
numericUpDownCurrentDPI.Location = new Point(161, 2);
|
||||
numericUpDownCurrentDPI.Margin = new Padding(2);
|
||||
numericUpDownCurrentDPI.Maximum = new decimal(new int[] { 35000, 0, 0, 0 });
|
||||
numericUpDownCurrentDPI.Minimum = new decimal(new int[] { 100, 0, 0, 0 });
|
||||
numericUpDownCurrentDPI.Name = "numericUpDownCurrentDPI";
|
||||
numericUpDownCurrentDPI.Size = new Size(100, 19);
|
||||
numericUpDownCurrentDPI.Size = new Size(96, 19);
|
||||
numericUpDownCurrentDPI.TabIndex = 47;
|
||||
numericUpDownCurrentDPI.TextAlign = HorizontalAlignment.Center;
|
||||
numericUpDownCurrentDPI.Value = new decimal(new int[] { 2000, 0, 0, 0 });
|
||||
@@ -588,13 +588,13 @@
|
||||
panelDPITile.Margin = new Padding(2);
|
||||
panelDPITile.Name = "panelDPITile";
|
||||
panelDPITile.Padding = new Padding(0, 3, 0, 3);
|
||||
panelDPITile.Size = new Size(437, 27);
|
||||
panelDPITile.Size = new Size(420, 27);
|
||||
panelDPITile.TabIndex = 48;
|
||||
//
|
||||
// pictureDPIColor
|
||||
//
|
||||
pictureDPIColor.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||
pictureDPIColor.Location = new Point(412, 7);
|
||||
pictureDPIColor.Location = new Point(395, 7);
|
||||
pictureDPIColor.Margin = new Padding(4);
|
||||
pictureDPIColor.Name = "pictureDPIColor";
|
||||
pictureDPIColor.Size = new Size(10, 10);
|
||||
@@ -612,7 +612,7 @@
|
||||
buttonDPIColor.BorderRadius = 2;
|
||||
buttonDPIColor.FlatStyle = FlatStyle.Flat;
|
||||
buttonDPIColor.ForeColor = SystemColors.ControlText;
|
||||
buttonDPIColor.Location = new Point(308, 1);
|
||||
buttonDPIColor.Location = new Point(291, 1);
|
||||
buttonDPIColor.Margin = new Padding(2, 4, 2, 4);
|
||||
buttonDPIColor.Name = "buttonDPIColor";
|
||||
buttonDPIColor.Secondary = false;
|
||||
@@ -653,7 +653,7 @@
|
||||
tableDPI.RowCount = 1;
|
||||
tableDPI.RowStyles.Add(new RowStyle(SizeType.Absolute, 64F));
|
||||
tableDPI.RowStyles.Add(new RowStyle(SizeType.Absolute, 64F));
|
||||
tableDPI.Size = new Size(437, 64);
|
||||
tableDPI.Size = new Size(420, 64);
|
||||
tableDPI.TabIndex = 42;
|
||||
//
|
||||
// buttonDPI2
|
||||
@@ -669,11 +669,11 @@
|
||||
buttonDPI2.ForeColor = SystemColors.ControlText;
|
||||
buttonDPI2.Image = Properties.Resources.lighting_dot_32;
|
||||
buttonDPI2.ImageAlign = ContentAlignment.BottomCenter;
|
||||
buttonDPI2.Location = new Point(111, 2);
|
||||
buttonDPI2.Location = new Point(107, 2);
|
||||
buttonDPI2.Margin = new Padding(2);
|
||||
buttonDPI2.Name = "buttonDPI2";
|
||||
buttonDPI2.Secondary = false;
|
||||
buttonDPI2.Size = new Size(105, 60);
|
||||
buttonDPI2.Size = new Size(101, 60);
|
||||
buttonDPI2.TabIndex = 4;
|
||||
buttonDPI2.Text = "DPI 2\r\n1000";
|
||||
buttonDPI2.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
@@ -696,7 +696,7 @@
|
||||
buttonDPI1.Margin = new Padding(2);
|
||||
buttonDPI1.Name = "buttonDPI1";
|
||||
buttonDPI1.Secondary = false;
|
||||
buttonDPI1.Size = new Size(105, 60);
|
||||
buttonDPI1.Size = new Size(101, 60);
|
||||
buttonDPI1.TabIndex = 4;
|
||||
buttonDPI1.Text = "DPI 1\r\n800";
|
||||
buttonDPI1.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
@@ -715,11 +715,11 @@
|
||||
buttonDPI3.ForeColor = SystemColors.ControlText;
|
||||
buttonDPI3.Image = Properties.Resources.lighting_dot_32;
|
||||
buttonDPI3.ImageAlign = ContentAlignment.BottomCenter;
|
||||
buttonDPI3.Location = new Point(220, 2);
|
||||
buttonDPI3.Location = new Point(212, 2);
|
||||
buttonDPI3.Margin = new Padding(2);
|
||||
buttonDPI3.Name = "buttonDPI3";
|
||||
buttonDPI3.Secondary = false;
|
||||
buttonDPI3.Size = new Size(105, 60);
|
||||
buttonDPI3.Size = new Size(101, 60);
|
||||
buttonDPI3.TabIndex = 5;
|
||||
buttonDPI3.Text = "DPI 3\r\n1200";
|
||||
buttonDPI3.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
@@ -738,11 +738,11 @@
|
||||
buttonDPI4.ForeColor = SystemColors.ControlText;
|
||||
buttonDPI4.Image = Properties.Resources.lighting_dot_32;
|
||||
buttonDPI4.ImageAlign = ContentAlignment.BottomCenter;
|
||||
buttonDPI4.Location = new Point(329, 2);
|
||||
buttonDPI4.Location = new Point(317, 2);
|
||||
buttonDPI4.Margin = new Padding(2);
|
||||
buttonDPI4.Name = "buttonDPI4";
|
||||
buttonDPI4.Secondary = false;
|
||||
buttonDPI4.Size = new Size(106, 60);
|
||||
buttonDPI4.Size = new Size(101, 60);
|
||||
buttonDPI4.TabIndex = 6;
|
||||
buttonDPI4.Text = "DPI 4\r\n1400";
|
||||
buttonDPI4.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
@@ -757,7 +757,7 @@
|
||||
panelPerformanceHeader.Location = new Point(0, 7);
|
||||
panelPerformanceHeader.Margin = new Padding(2);
|
||||
panelPerformanceHeader.Name = "panelPerformanceHeader";
|
||||
panelPerformanceHeader.Size = new Size(437, 20);
|
||||
panelPerformanceHeader.Size = new Size(420, 20);
|
||||
panelPerformanceHeader.TabIndex = 41;
|
||||
//
|
||||
// pictureKeyboard
|
||||
@@ -793,7 +793,7 @@
|
||||
panelLighting.Margin = new Padding(2);
|
||||
panelLighting.Name = "panelLighting";
|
||||
panelLighting.Padding = new Padding(0, 0, 0, 17);
|
||||
panelLighting.Size = new Size(437, 220);
|
||||
panelLighting.Size = new Size(420, 220);
|
||||
panelLighting.TabIndex = 42;
|
||||
//
|
||||
// panelLightingContent
|
||||
@@ -814,7 +814,7 @@
|
||||
panelLightingContent.Margin = new Padding(2);
|
||||
panelLightingContent.Name = "panelLightingContent";
|
||||
panelLightingContent.Padding = new Padding(0, 0, 0, 7);
|
||||
panelLightingContent.Size = new Size(437, 183);
|
||||
panelLightingContent.Size = new Size(420, 183);
|
||||
panelLightingContent.TabIndex = 42;
|
||||
//
|
||||
// tableLayoutLightingZones
|
||||
@@ -838,7 +838,7 @@
|
||||
tableLayoutLightingZones.Name = "tableLayoutLightingZones";
|
||||
tableLayoutLightingZones.RowCount = 1;
|
||||
tableLayoutLightingZones.RowStyles.Add(new RowStyle(SizeType.Absolute, 40F));
|
||||
tableLayoutLightingZones.Size = new Size(437, 40);
|
||||
tableLayoutLightingZones.Size = new Size(420, 40);
|
||||
tableLayoutLightingZones.TabIndex = 56;
|
||||
//
|
||||
// buttonLightingZoneScroll
|
||||
@@ -855,11 +855,11 @@
|
||||
buttonLightingZoneScroll.FlatStyle = FlatStyle.Flat;
|
||||
buttonLightingZoneScroll.ForeColor = SystemColors.ControlText;
|
||||
buttonLightingZoneScroll.ImageAlign = ContentAlignment.BottomCenter;
|
||||
buttonLightingZoneScroll.Location = new Point(176, 2);
|
||||
buttonLightingZoneScroll.Location = new Point(170, 2);
|
||||
buttonLightingZoneScroll.Margin = new Padding(2);
|
||||
buttonLightingZoneScroll.Name = "buttonLightingZoneScroll";
|
||||
buttonLightingZoneScroll.Secondary = false;
|
||||
buttonLightingZoneScroll.Size = new Size(83, 36);
|
||||
buttonLightingZoneScroll.Size = new Size(80, 36);
|
||||
buttonLightingZoneScroll.TabIndex = 7;
|
||||
buttonLightingZoneScroll.Text = "Scrollwheel";
|
||||
buttonLightingZoneScroll.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
@@ -879,11 +879,11 @@
|
||||
buttonLightingZoneLogo.FlatStyle = FlatStyle.Flat;
|
||||
buttonLightingZoneLogo.ForeColor = SystemColors.ControlText;
|
||||
buttonLightingZoneLogo.ImageAlign = ContentAlignment.BottomCenter;
|
||||
buttonLightingZoneLogo.Location = new Point(89, 2);
|
||||
buttonLightingZoneLogo.Location = new Point(86, 2);
|
||||
buttonLightingZoneLogo.Margin = new Padding(2);
|
||||
buttonLightingZoneLogo.Name = "buttonLightingZoneLogo";
|
||||
buttonLightingZoneLogo.Secondary = false;
|
||||
buttonLightingZoneLogo.Size = new Size(83, 36);
|
||||
buttonLightingZoneLogo.Size = new Size(80, 36);
|
||||
buttonLightingZoneLogo.TabIndex = 4;
|
||||
buttonLightingZoneLogo.Text = "Logo";
|
||||
buttonLightingZoneLogo.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
@@ -907,7 +907,7 @@
|
||||
buttonLightingZoneAll.Margin = new Padding(2);
|
||||
buttonLightingZoneAll.Name = "buttonLightingZoneAll";
|
||||
buttonLightingZoneAll.Secondary = false;
|
||||
buttonLightingZoneAll.Size = new Size(83, 36);
|
||||
buttonLightingZoneAll.Size = new Size(80, 36);
|
||||
buttonLightingZoneAll.TabIndex = 4;
|
||||
buttonLightingZoneAll.Text = "All";
|
||||
buttonLightingZoneAll.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
@@ -927,11 +927,11 @@
|
||||
buttonLightingZoneUnderglow.FlatStyle = FlatStyle.Flat;
|
||||
buttonLightingZoneUnderglow.ForeColor = SystemColors.ControlText;
|
||||
buttonLightingZoneUnderglow.ImageAlign = ContentAlignment.BottomCenter;
|
||||
buttonLightingZoneUnderglow.Location = new Point(263, 2);
|
||||
buttonLightingZoneUnderglow.Location = new Point(254, 2);
|
||||
buttonLightingZoneUnderglow.Margin = new Padding(2);
|
||||
buttonLightingZoneUnderglow.Name = "buttonLightingZoneUnderglow";
|
||||
buttonLightingZoneUnderglow.Secondary = false;
|
||||
buttonLightingZoneUnderglow.Size = new Size(83, 36);
|
||||
buttonLightingZoneUnderglow.Size = new Size(80, 36);
|
||||
buttonLightingZoneUnderglow.TabIndex = 5;
|
||||
buttonLightingZoneUnderglow.Text = "Underglow";
|
||||
buttonLightingZoneUnderglow.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
@@ -951,11 +951,11 @@
|
||||
buttonLightingZoneDock.FlatStyle = FlatStyle.Flat;
|
||||
buttonLightingZoneDock.ForeColor = SystemColors.ControlText;
|
||||
buttonLightingZoneDock.ImageAlign = ContentAlignment.BottomCenter;
|
||||
buttonLightingZoneDock.Location = new Point(350, 2);
|
||||
buttonLightingZoneDock.Location = new Point(338, 2);
|
||||
buttonLightingZoneDock.Margin = new Padding(2);
|
||||
buttonLightingZoneDock.Name = "buttonLightingZoneDock";
|
||||
buttonLightingZoneDock.Secondary = false;
|
||||
buttonLightingZoneDock.Size = new Size(85, 36);
|
||||
buttonLightingZoneDock.Size = new Size(80, 36);
|
||||
buttonLightingZoneDock.TabIndex = 6;
|
||||
buttonLightingZoneDock.Text = "Dock";
|
||||
buttonLightingZoneDock.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
@@ -968,10 +968,10 @@
|
||||
comboBoxAnimationDirection.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
comboBoxAnimationDirection.FlatStyle = FlatStyle.Flat;
|
||||
comboBoxAnimationDirection.FormattingEnabled = true;
|
||||
comboBoxAnimationDirection.Location = new Point(245, 153);
|
||||
comboBoxAnimationDirection.Location = new Point(244, 153);
|
||||
comboBoxAnimationDirection.Margin = new Padding(11, 0, 11, 0);
|
||||
comboBoxAnimationDirection.Name = "comboBoxAnimationDirection";
|
||||
comboBoxAnimationDirection.Size = new Size(190, 23);
|
||||
comboBoxAnimationDirection.Size = new Size(191, 23);
|
||||
comboBoxAnimationDirection.TabIndex = 54;
|
||||
//
|
||||
// labelAnimationDirection
|
||||
@@ -1000,10 +1000,10 @@
|
||||
comboBoxAnimationSpeed.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
comboBoxAnimationSpeed.FlatStyle = FlatStyle.Flat;
|
||||
comboBoxAnimationSpeed.FormattingEnabled = true;
|
||||
comboBoxAnimationSpeed.Location = new Point(245, 125);
|
||||
comboBoxAnimationSpeed.Location = new Point(244, 125);
|
||||
comboBoxAnimationSpeed.Margin = new Padding(11, 0, 11, 0);
|
||||
comboBoxAnimationSpeed.Name = "comboBoxAnimationSpeed";
|
||||
comboBoxAnimationSpeed.Size = new Size(190, 23);
|
||||
comboBoxAnimationSpeed.Size = new Size(191, 23);
|
||||
comboBoxAnimationSpeed.TabIndex = 51;
|
||||
//
|
||||
// labelAnimationSpeed
|
||||
@@ -1018,7 +1018,7 @@
|
||||
// pictureBoxLightingColor
|
||||
//
|
||||
pictureBoxLightingColor.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||
pictureBoxLightingColor.Location = new Point(321, 80);
|
||||
pictureBoxLightingColor.Location = new Point(304, 80);
|
||||
pictureBoxLightingColor.Margin = new Padding(4);
|
||||
pictureBoxLightingColor.Name = "pictureBoxLightingColor";
|
||||
pictureBoxLightingColor.Size = new Size(13, 13);
|
||||
@@ -1035,11 +1035,11 @@
|
||||
buttonLightingColor.BorderRadius = 2;
|
||||
buttonLightingColor.FlatStyle = FlatStyle.Flat;
|
||||
buttonLightingColor.ForeColor = SystemColors.ControlText;
|
||||
buttonLightingColor.Location = new Point(252, 74);
|
||||
buttonLightingColor.Location = new Point(233, 74);
|
||||
buttonLightingColor.Margin = new Padding(2, 4, 2, 4);
|
||||
buttonLightingColor.Name = "buttonLightingColor";
|
||||
buttonLightingColor.Secondary = false;
|
||||
buttonLightingColor.Size = new Size(90, 25);
|
||||
buttonLightingColor.Size = new Size(94, 25);
|
||||
buttonLightingColor.TabIndex = 49;
|
||||
buttonLightingColor.Text = Properties.Strings.Color;
|
||||
buttonLightingColor.TextAlign = ContentAlignment.MiddleLeft;
|
||||
@@ -1077,13 +1077,13 @@
|
||||
panelLightingHeader.Location = new Point(0, 0);
|
||||
panelLightingHeader.Margin = new Padding(2);
|
||||
panelLightingHeader.Name = "panelLightingHeader";
|
||||
panelLightingHeader.Size = new Size(437, 20);
|
||||
panelLightingHeader.Size = new Size(420, 20);
|
||||
panelLightingHeader.TabIndex = 41;
|
||||
//
|
||||
// sliderBrightness
|
||||
//
|
||||
sliderBrightness.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
|
||||
sliderBrightness.Location = new Point(246, 1);
|
||||
sliderBrightness.Location = new Point(229, 1);
|
||||
sliderBrightness.Margin = new Padding(1);
|
||||
sliderBrightness.Max = 100;
|
||||
sliderBrightness.Min = 0;
|
||||
@@ -1131,7 +1131,7 @@
|
||||
panelEnergy.Margin = new Padding(2);
|
||||
panelEnergy.Name = "panelEnergy";
|
||||
panelEnergy.Padding = new Padding(0, 0, 0, 17);
|
||||
panelEnergy.Size = new Size(437, 96);
|
||||
panelEnergy.Size = new Size(420, 96);
|
||||
panelEnergy.TabIndex = 43;
|
||||
//
|
||||
// labelLowBatteryWarningValue
|
||||
@@ -1199,7 +1199,7 @@
|
||||
panelEnergyHeader.Location = new Point(0, 0);
|
||||
panelEnergyHeader.Margin = new Padding(2);
|
||||
panelEnergyHeader.Name = "panelEnergyHeader";
|
||||
panelEnergyHeader.Size = new Size(437, 20);
|
||||
panelEnergyHeader.Size = new Size(420, 20);
|
||||
panelEnergyHeader.TabIndex = 41;
|
||||
//
|
||||
// pictureBoxEnergy
|
||||
@@ -1240,7 +1240,7 @@
|
||||
tableLayoutProfiles.RowCount = 1;
|
||||
tableLayoutProfiles.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||
tableLayoutProfiles.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||
tableLayoutProfiles.Size = new Size(437, 38);
|
||||
tableLayoutProfiles.Size = new Size(420, 38);
|
||||
tableLayoutProfiles.TabIndex = 44;
|
||||
//
|
||||
// panelBatteryState
|
||||
@@ -1302,11 +1302,11 @@
|
||||
buttonSync.BorderRadius = 2;
|
||||
buttonSync.FlatStyle = FlatStyle.Flat;
|
||||
buttonSync.ForeColor = SystemColors.ControlText;
|
||||
buttonSync.Location = new Point(5, 37);
|
||||
buttonSync.Location = new Point(223, 5);
|
||||
buttonSync.Margin = new Padding(2, 4, 2, 4);
|
||||
buttonSync.Name = "buttonSync";
|
||||
buttonSync.Secondary = false;
|
||||
buttonSync.Size = new Size(431, 25);
|
||||
buttonSync.Size = new Size(195, 25);
|
||||
buttonSync.TabIndex = 46;
|
||||
buttonSync.Text = "Synchronize with Mouse";
|
||||
buttonSync.UseVisualStyleBackColor = false;
|
||||
@@ -1322,7 +1322,7 @@
|
||||
panelBottomButtons.Location = new Point(7, 731);
|
||||
panelBottomButtons.Margin = new Padding(2);
|
||||
panelBottomButtons.Name = "panelBottomButtons";
|
||||
panelBottomButtons.Size = new Size(437, 66);
|
||||
panelBottomButtons.Size = new Size(420, 45);
|
||||
panelBottomButtons.TabIndex = 47;
|
||||
//
|
||||
// buttonImport
|
||||
@@ -1335,11 +1335,11 @@
|
||||
buttonImport.BorderRadius = 2;
|
||||
buttonImport.FlatStyle = FlatStyle.Flat;
|
||||
buttonImport.ForeColor = SystemColors.ControlText;
|
||||
buttonImport.Location = new Point(222, 6);
|
||||
buttonImport.Location = new Point(106, 6);
|
||||
buttonImport.Margin = new Padding(2, 4, 2, 4);
|
||||
buttonImport.Name = "buttonImport";
|
||||
buttonImport.Secondary = false;
|
||||
buttonImport.Size = new Size(214, 25);
|
||||
buttonImport.Size = new Size(102, 25);
|
||||
buttonImport.TabIndex = 48;
|
||||
buttonImport.Text = "Import Profile";
|
||||
buttonImport.UseVisualStyleBackColor = false;
|
||||
@@ -1355,11 +1355,11 @@
|
||||
buttonExport.BorderRadius = 2;
|
||||
buttonExport.FlatStyle = FlatStyle.Flat;
|
||||
buttonExport.ForeColor = SystemColors.ControlText;
|
||||
buttonExport.Location = new Point(5, 6);
|
||||
buttonExport.Location = new Point(2, 6);
|
||||
buttonExport.Margin = new Padding(2, 4, 2, 4);
|
||||
buttonExport.Name = "buttonExport";
|
||||
buttonExport.Secondary = false;
|
||||
buttonExport.Size = new Size(197, 25);
|
||||
buttonExport.Size = new Size(103, 25);
|
||||
buttonExport.TabIndex = 47;
|
||||
buttonExport.Text = "Export Profile";
|
||||
buttonExport.UseVisualStyleBackColor = false;
|
||||
@@ -1433,7 +1433,7 @@
|
||||
AutoScroll = true;
|
||||
AutoSize = true;
|
||||
AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
ClientSize = new Size(451, 803);
|
||||
ClientSize = new Size(451, 699);
|
||||
Controls.Add(panelBottomButtons);
|
||||
Controls.Add(panelEnergy);
|
||||
Controls.Add(panelLighting);
|
||||
|
||||
336
app/AutoTDP/AutoTDPGameProfileUI.Designer.cs
generated
Normal file
336
app/AutoTDP/AutoTDPGameProfileUI.Designer.cs
generated
Normal file
@@ -0,0 +1,336 @@
|
||||
namespace GHelper.AutoTDP
|
||||
{
|
||||
partial class AutoTDPGameProfileUI
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
panelPerformanceHeader = new Panel();
|
||||
pictureKeyboard = new PictureBox();
|
||||
labelSettings = new Label();
|
||||
checkBoxEnabled = new CheckBox();
|
||||
panelGameSettings = new Panel();
|
||||
labelMinTDP = new Label();
|
||||
labelMaxTDP = new Label();
|
||||
sliderMaxTDP = new UI.Slider();
|
||||
numericUpDownFPS = new NumericUpDown();
|
||||
sliderMinTDP = new UI.Slider();
|
||||
labelMaxTDPText = new Label();
|
||||
labeMinTDPText = new Label();
|
||||
labelTargetFPS = new Label();
|
||||
textBoxTitle = new TextBox();
|
||||
textBoxProcessName = new TextBox();
|
||||
labelFPSSource = new Label();
|
||||
labelLimiter = new Label();
|
||||
buttonSave = new UI.RButton();
|
||||
buttonDelete = new UI.RButton();
|
||||
panelPerformanceHeader.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureKeyboard).BeginInit();
|
||||
panelGameSettings.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)numericUpDownFPS).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// panelPerformanceHeader
|
||||
//
|
||||
panelPerformanceHeader.BackColor = SystemColors.ControlLight;
|
||||
panelPerformanceHeader.Controls.Add(pictureKeyboard);
|
||||
panelPerformanceHeader.Controls.Add(labelSettings);
|
||||
panelPerformanceHeader.Controls.Add(checkBoxEnabled);
|
||||
panelPerformanceHeader.Dock = DockStyle.Top;
|
||||
panelPerformanceHeader.Location = new Point(0, 0);
|
||||
panelPerformanceHeader.Name = "panelPerformanceHeader";
|
||||
panelPerformanceHeader.Size = new Size(551, 50);
|
||||
panelPerformanceHeader.TabIndex = 53;
|
||||
//
|
||||
// pictureKeyboard
|
||||
//
|
||||
pictureKeyboard.BackgroundImage = Properties.Resources.icons8_automation_32;
|
||||
pictureKeyboard.BackgroundImageLayout = ImageLayout.Zoom;
|
||||
pictureKeyboard.Location = new Point(4, 13);
|
||||
pictureKeyboard.Name = "pictureKeyboard";
|
||||
pictureKeyboard.Size = new Size(23, 27);
|
||||
pictureKeyboard.TabIndex = 35;
|
||||
pictureKeyboard.TabStop = false;
|
||||
//
|
||||
// labelSettings
|
||||
//
|
||||
labelSettings.AutoSize = true;
|
||||
labelSettings.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelSettings.Location = new Point(31, 13);
|
||||
labelSettings.Margin = new Padding(6, 0, 6, 0);
|
||||
labelSettings.Name = "labelSettings";
|
||||
labelSettings.Size = new Size(135, 25);
|
||||
labelSettings.TabIndex = 34;
|
||||
labelSettings.Text = "Game Settings";
|
||||
//
|
||||
// checkBoxEnabled
|
||||
//
|
||||
checkBoxEnabled.Location = new Point(344, 3);
|
||||
checkBoxEnabled.Margin = new Padding(6, 0, 6, 0);
|
||||
checkBoxEnabled.Name = "checkBoxEnabled";
|
||||
checkBoxEnabled.Size = new Size(194, 42);
|
||||
checkBoxEnabled.TabIndex = 53;
|
||||
checkBoxEnabled.Text = "Enabled";
|
||||
checkBoxEnabled.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// panelGameSettings
|
||||
//
|
||||
panelGameSettings.AutoSize = true;
|
||||
panelGameSettings.Controls.Add(labelMinTDP);
|
||||
panelGameSettings.Controls.Add(labelMaxTDP);
|
||||
panelGameSettings.Controls.Add(sliderMaxTDP);
|
||||
panelGameSettings.Controls.Add(numericUpDownFPS);
|
||||
panelGameSettings.Controls.Add(sliderMinTDP);
|
||||
panelGameSettings.Controls.Add(labelMaxTDPText);
|
||||
panelGameSettings.Controls.Add(labeMinTDPText);
|
||||
panelGameSettings.Controls.Add(labelTargetFPS);
|
||||
panelGameSettings.Controls.Add(textBoxTitle);
|
||||
panelGameSettings.Controls.Add(textBoxProcessName);
|
||||
panelGameSettings.Controls.Add(labelFPSSource);
|
||||
panelGameSettings.Controls.Add(labelLimiter);
|
||||
panelGameSettings.Dock = DockStyle.Top;
|
||||
panelGameSettings.Location = new Point(0, 50);
|
||||
panelGameSettings.Name = "panelGameSettings";
|
||||
panelGameSettings.Padding = new Padding(0, 0, 0, 12);
|
||||
panelGameSettings.Size = new Size(551, 244);
|
||||
panelGameSettings.TabIndex = 57;
|
||||
//
|
||||
// labelMinTDP
|
||||
//
|
||||
labelMinTDP.Location = new Point(489, 152);
|
||||
labelMinTDP.Margin = new Padding(4, 0, 4, 0);
|
||||
labelMinTDP.Name = "labelMinTDP";
|
||||
labelMinTDP.Size = new Size(56, 37);
|
||||
labelMinTDP.TabIndex = 67;
|
||||
labelMinTDP.Text = "30W";
|
||||
labelMinTDP.TextAlign = ContentAlignment.MiddleRight;
|
||||
//
|
||||
// labelMaxTDP
|
||||
//
|
||||
labelMaxTDP.Location = new Point(487, 195);
|
||||
labelMaxTDP.Margin = new Padding(4, 0, 4, 0);
|
||||
labelMaxTDP.Name = "labelMaxTDP";
|
||||
labelMaxTDP.Size = new Size(57, 37);
|
||||
labelMaxTDP.TabIndex = 66;
|
||||
labelMaxTDP.Text = "150W";
|
||||
labelMaxTDP.TextAlign = ContentAlignment.MiddleRight;
|
||||
//
|
||||
// sliderMaxTDP
|
||||
//
|
||||
sliderMaxTDP.AccessibleName = "DPI Slider";
|
||||
sliderMaxTDP.Location = new Point(200, 195);
|
||||
sliderMaxTDP.Max = 200;
|
||||
sliderMaxTDP.Min = 5;
|
||||
sliderMaxTDP.Name = "sliderMaxTDP";
|
||||
sliderMaxTDP.Size = new Size(291, 33);
|
||||
sliderMaxTDP.Step = 1;
|
||||
sliderMaxTDP.TabIndex = 65;
|
||||
sliderMaxTDP.TabStop = false;
|
||||
sliderMaxTDP.Text = "sliderBattery";
|
||||
sliderMaxTDP.Value = 0;
|
||||
//
|
||||
// numericUpDownFPS
|
||||
//
|
||||
numericUpDownFPS.BorderStyle = BorderStyle.None;
|
||||
numericUpDownFPS.Location = new Point(416, 110);
|
||||
numericUpDownFPS.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
|
||||
numericUpDownFPS.Minimum = new decimal(new int[] { 20, 0, 0, 0 });
|
||||
numericUpDownFPS.Name = "numericUpDownFPS";
|
||||
numericUpDownFPS.Size = new Size(123, 27);
|
||||
numericUpDownFPS.TabIndex = 64;
|
||||
numericUpDownFPS.TextAlign = HorizontalAlignment.Center;
|
||||
numericUpDownFPS.Value = new decimal(new int[] { 60, 0, 0, 0 });
|
||||
//
|
||||
// sliderMinTDP
|
||||
//
|
||||
sliderMinTDP.AccessibleName = "DPI Slider";
|
||||
sliderMinTDP.Location = new Point(200, 155);
|
||||
sliderMinTDP.Max = 200;
|
||||
sliderMinTDP.Min = 5;
|
||||
sliderMinTDP.Name = "sliderMinTDP";
|
||||
sliderMinTDP.Size = new Size(291, 33);
|
||||
sliderMinTDP.Step = 1;
|
||||
sliderMinTDP.TabIndex = 63;
|
||||
sliderMinTDP.TabStop = false;
|
||||
sliderMinTDP.Text = "sliderBattery";
|
||||
sliderMinTDP.Value = 0;
|
||||
//
|
||||
// labelMaxTDPText
|
||||
//
|
||||
labelMaxTDPText.Location = new Point(7, 195);
|
||||
labelMaxTDPText.Margin = new Padding(6, 0, 6, 0);
|
||||
labelMaxTDPText.Name = "labelMaxTDPText";
|
||||
labelMaxTDPText.Size = new Size(184, 37);
|
||||
labelMaxTDPText.TabIndex = 61;
|
||||
labelMaxTDPText.Text = "Max TDP:";
|
||||
labelMaxTDPText.TextAlign = ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// labeMinTDPText
|
||||
//
|
||||
labeMinTDPText.Location = new Point(7, 152);
|
||||
labeMinTDPText.Margin = new Padding(6, 0, 6, 0);
|
||||
labeMinTDPText.Name = "labeMinTDPText";
|
||||
labeMinTDPText.Size = new Size(184, 37);
|
||||
labeMinTDPText.TabIndex = 62;
|
||||
labeMinTDPText.Text = "Min TDP:";
|
||||
labeMinTDPText.TextAlign = ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// labelTargetFPS
|
||||
//
|
||||
labelTargetFPS.Location = new Point(7, 105);
|
||||
labelTargetFPS.Margin = new Padding(6, 0, 6, 0);
|
||||
labelTargetFPS.Name = "labelTargetFPS";
|
||||
labelTargetFPS.Size = new Size(184, 37);
|
||||
labelTargetFPS.TabIndex = 60;
|
||||
labelTargetFPS.Text = "Target FPS:";
|
||||
labelTargetFPS.TextAlign = ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// textBoxTitle
|
||||
//
|
||||
textBoxTitle.Location = new Point(200, 60);
|
||||
textBoxTitle.Margin = new Padding(4, 5, 4, 5);
|
||||
textBoxTitle.Name = "textBoxTitle";
|
||||
textBoxTitle.Size = new Size(337, 31);
|
||||
textBoxTitle.TabIndex = 59;
|
||||
//
|
||||
// textBoxProcessName
|
||||
//
|
||||
textBoxProcessName.Location = new Point(200, 10);
|
||||
textBoxProcessName.Margin = new Padding(4, 5, 4, 5);
|
||||
textBoxProcessName.Name = "textBoxProcessName";
|
||||
textBoxProcessName.ReadOnly = true;
|
||||
textBoxProcessName.Size = new Size(337, 31);
|
||||
textBoxProcessName.TabIndex = 58;
|
||||
textBoxProcessName.WordWrap = false;
|
||||
//
|
||||
// labelFPSSource
|
||||
//
|
||||
labelFPSSource.Location = new Point(6, 62);
|
||||
labelFPSSource.Margin = new Padding(6, 0, 6, 0);
|
||||
labelFPSSource.Name = "labelFPSSource";
|
||||
labelFPSSource.Size = new Size(184, 37);
|
||||
labelFPSSource.TabIndex = 57;
|
||||
labelFPSSource.Text = "Name:";
|
||||
labelFPSSource.TextAlign = ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// labelLimiter
|
||||
//
|
||||
labelLimiter.Location = new Point(6, 12);
|
||||
labelLimiter.Margin = new Padding(6, 0, 6, 0);
|
||||
labelLimiter.Name = "labelLimiter";
|
||||
labelLimiter.Size = new Size(184, 37);
|
||||
labelLimiter.TabIndex = 47;
|
||||
labelLimiter.Text = "Process";
|
||||
labelLimiter.TextAlign = ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// buttonSave
|
||||
//
|
||||
buttonSave.AccessibleName = "Keyboard Color";
|
||||
buttonSave.Activated = false;
|
||||
buttonSave.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||
buttonSave.BackColor = SystemColors.ButtonHighlight;
|
||||
buttonSave.BorderColor = Color.Transparent;
|
||||
buttonSave.BorderRadius = 2;
|
||||
buttonSave.FlatStyle = FlatStyle.Flat;
|
||||
buttonSave.ForeColor = SystemColors.ControlText;
|
||||
buttonSave.Location = new Point(399, 303);
|
||||
buttonSave.Margin = new Padding(3, 7, 3, 7);
|
||||
buttonSave.Name = "buttonSave";
|
||||
buttonSave.Secondary = false;
|
||||
buttonSave.Size = new Size(147, 42);
|
||||
buttonSave.TabIndex = 61;
|
||||
buttonSave.Text = "Save";
|
||||
buttonSave.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// buttonDelete
|
||||
//
|
||||
buttonDelete.AccessibleName = "Keyboard Color";
|
||||
buttonDelete.Activated = false;
|
||||
buttonDelete.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||
buttonDelete.BackColor = SystemColors.ButtonHighlight;
|
||||
buttonDelete.BorderColor = Color.Transparent;
|
||||
buttonDelete.BorderRadius = 2;
|
||||
buttonDelete.FlatStyle = FlatStyle.Flat;
|
||||
buttonDelete.ForeColor = SystemColors.ControlText;
|
||||
buttonDelete.Location = new Point(6, 303);
|
||||
buttonDelete.Margin = new Padding(3, 7, 3, 7);
|
||||
buttonDelete.Name = "buttonDelete";
|
||||
buttonDelete.Secondary = false;
|
||||
buttonDelete.Size = new Size(147, 42);
|
||||
buttonDelete.TabIndex = 62;
|
||||
buttonDelete.Text = "Delete";
|
||||
buttonDelete.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// AutoTDPGameProfileUI
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(10F, 25F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(551, 362);
|
||||
Controls.Add(buttonDelete);
|
||||
Controls.Add(buttonSave);
|
||||
Controls.Add(panelGameSettings);
|
||||
Controls.Add(panelPerformanceHeader);
|
||||
FormBorderStyle = FormBorderStyle.FixedSingle;
|
||||
Margin = new Padding(4, 5, 4, 5);
|
||||
MaximizeBox = false;
|
||||
MinimizeBox = false;
|
||||
Name = "AutoTDPGameProfileUI";
|
||||
ShowIcon = false;
|
||||
ShowInTaskbar = false;
|
||||
Text = "Game Profile";
|
||||
panelPerformanceHeader.ResumeLayout(false);
|
||||
panelPerformanceHeader.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureKeyboard).EndInit();
|
||||
panelGameSettings.ResumeLayout(false);
|
||||
panelGameSettings.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)numericUpDownFPS).EndInit();
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private Panel panelPerformanceHeader;
|
||||
private PictureBox pictureKeyboard;
|
||||
private Label labelSettings;
|
||||
private CheckBox checkBoxEnabled;
|
||||
private Panel panelGameSettings;
|
||||
private Label labelFPSSource;
|
||||
private Label labelLimiter;
|
||||
private TextBox textBoxTitle;
|
||||
private TextBox textBoxProcessName;
|
||||
private UI.RButton buttonSave;
|
||||
private Label labelMaxTDPText;
|
||||
private Label labeMinTDPText;
|
||||
private Label labelTargetFPS;
|
||||
private UI.Slider sliderMinTDP;
|
||||
private UI.Slider sliderMaxTDP;
|
||||
private NumericUpDown numericUpDownFPS;
|
||||
private Label labelMinTDP;
|
||||
private Label labelMaxTDP;
|
||||
private UI.RButton buttonDelete;
|
||||
}
|
||||
}
|
||||
90
app/AutoTDP/AutoTDPGameProfileUI.cs
Normal file
90
app/AutoTDP/AutoTDPGameProfileUI.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
using GHelper.UI;
|
||||
|
||||
namespace GHelper.AutoTDP
|
||||
{
|
||||
public partial class AutoTDPGameProfileUI : RForm
|
||||
{
|
||||
public GameProfile GameProfile;
|
||||
private AutoTDPUI AutoTDPUI;
|
||||
|
||||
public AutoTDPGameProfileUI(GameProfile profile, AutoTDPUI parent)
|
||||
{
|
||||
AutoTDPUI = parent;
|
||||
GameProfile = profile;
|
||||
InitializeComponent();
|
||||
|
||||
sliderMinTDP.ValueChanged += SliderMinTDP_ValueChanged;
|
||||
sliderMaxTDP.ValueChanged += SliderMaxTDP_ValueChanged;
|
||||
buttonSave.Click += ButtonSave_Click;
|
||||
buttonDelete.Click += ButtonDelete_Click;
|
||||
|
||||
InitTheme();
|
||||
|
||||
|
||||
Shown += AutoTDPGameProfileUI_Shown;
|
||||
|
||||
VisualizeGameProfile();
|
||||
}
|
||||
|
||||
private void ButtonDelete_Click(object? sender, EventArgs e)
|
||||
{
|
||||
AutoTDPUI.DeleteGameProfile(GameProfile);
|
||||
Close();
|
||||
}
|
||||
|
||||
private void ButtonSave_Click(object? sender, EventArgs e)
|
||||
{
|
||||
GameProfile.Enabled = checkBoxEnabled.Checked;
|
||||
GameProfile.GameTitle = textBoxTitle.Text;
|
||||
GameProfile.TargetFPS = ((int)numericUpDownFPS.Value);
|
||||
GameProfile.MinTdp = sliderMinTDP.Value;
|
||||
GameProfile.MaxTdp = sliderMaxTDP.Value;
|
||||
|
||||
AutoTDPUI.UpdateGameProfile(GameProfile);
|
||||
|
||||
Close();
|
||||
}
|
||||
|
||||
private void SliderMaxTDP_ValueChanged(object? sender, EventArgs e)
|
||||
{
|
||||
labelMaxTDP.Text = sliderMaxTDP.Value + "W";
|
||||
if (sliderMaxTDP.Value < sliderMinTDP.Value)
|
||||
{
|
||||
sliderMinTDP.Value = sliderMaxTDP.Value;
|
||||
}
|
||||
}
|
||||
|
||||
private void SliderMinTDP_ValueChanged(object? sender, EventArgs e)
|
||||
{
|
||||
labelMinTDP.Text = sliderMinTDP.Value + "W";
|
||||
if (sliderMaxTDP.Value < sliderMinTDP.Value)
|
||||
{
|
||||
sliderMaxTDP.Value = sliderMinTDP.Value;
|
||||
}
|
||||
}
|
||||
|
||||
private void AutoTDPGameProfileUI_Shown(object? sender, EventArgs e)
|
||||
{
|
||||
if (Height > Program.settingsForm.Height)
|
||||
{
|
||||
Top = Program.settingsForm.Top + Program.settingsForm.Height - Height;
|
||||
}
|
||||
else
|
||||
{
|
||||
Top = Program.settingsForm.Top + 60;
|
||||
}
|
||||
|
||||
Left = Program.settingsForm.Left - Width - ((AutoTDPUI.Width - Width) / 2);
|
||||
}
|
||||
|
||||
private void VisualizeGameProfile()
|
||||
{
|
||||
sliderMinTDP.Value = GameProfile.MinTdp;
|
||||
sliderMaxTDP.Value = GameProfile.MaxTdp;
|
||||
numericUpDownFPS.Value = GameProfile.TargetFPS;
|
||||
textBoxProcessName.Text = GameProfile.ProcessName;
|
||||
textBoxTitle.Text = GameProfile.GameTitle;
|
||||
checkBoxEnabled.Checked = GameProfile.Enabled;
|
||||
}
|
||||
}
|
||||
}
|
||||
120
app/AutoTDP/AutoTDPGameProfileUI.resx
Normal file
120
app/AutoTDP/AutoTDPGameProfileUI.resx
Normal 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>
|
||||
620
app/AutoTDP/AutoTDPService.cs
Normal file
620
app/AutoTDP/AutoTDPService.cs
Normal file
@@ -0,0 +1,620 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json;
|
||||
using GHelper.AutoTDP.FramerateSource;
|
||||
using GHelper.AutoTDP.PowerLimiter;
|
||||
using Ryzen;
|
||||
|
||||
namespace GHelper.AutoTDP
|
||||
{
|
||||
internal class AutoTDPService : IDisposable
|
||||
{
|
||||
|
||||
private static readonly bool LOG_AUTO_TDP = false;
|
||||
private static readonly int INTERVAL_MIN_CHECK = 30 * 1_000;
|
||||
private static readonly int INTERVAL_APP_CHECK = 5_000;
|
||||
private static readonly int INTERVAL_FPS_CHECK = 500;
|
||||
|
||||
string GameProfileFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper\\AutoTDP.json";
|
||||
|
||||
IFramerateSource? framerateSouce;
|
||||
IPowerLimiter? powerLimiter;
|
||||
|
||||
public List<GameProfile> GameProfiles = new List<GameProfile>();
|
||||
|
||||
private bool Running = false;
|
||||
private Thread? checkerThread;
|
||||
private Thread? tdpThread;
|
||||
|
||||
private double GameFPSPrevious = double.NaN;
|
||||
private double GameFPS;
|
||||
|
||||
private int FramerateTargetReachedCounter;
|
||||
private int FramerateDipCounter;
|
||||
|
||||
private static readonly int FPSDipHistorySize = 6;
|
||||
|
||||
private List<double> FramerateLog = new List<double>();
|
||||
|
||||
private double LowestTDP;
|
||||
private double LowestStableTDP;
|
||||
private long LowestStableStability = 0;
|
||||
private int LowestStableChecks = 0;
|
||||
private double CurrentTDP;
|
||||
private double LastAdjustment;
|
||||
private double LastAdjustmentTotal = 0;
|
||||
private int LastAdjustmentsWithoutImprovement = 0;
|
||||
|
||||
private GameInstance? currentGame;
|
||||
|
||||
public AutoTDPService()
|
||||
{
|
||||
LoadGameProfiles();
|
||||
|
||||
Start();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Whether the system is enabled and currently running.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool IsRunning()
|
||||
{
|
||||
return Running;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Whether a supported game is actively monitored and TDP is adjusted
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool IsActive()
|
||||
{
|
||||
return currentGame is not null;
|
||||
}
|
||||
|
||||
public static bool IsAvailable()
|
||||
{
|
||||
|
||||
if (AppConfig.IsAlly())
|
||||
{
|
||||
//Not yet supported
|
||||
return false;
|
||||
}
|
||||
|
||||
return AvailablePowerLimiters().Count > 0 && AvailableFramerateSources().Count > 0;
|
||||
}
|
||||
|
||||
public static List<string> AvailableFramerateSources()
|
||||
{
|
||||
List<string> l = new List<string>();
|
||||
|
||||
if (RTSSFramerateSource.IsAvailable()) l.Add("rtss");
|
||||
|
||||
Logger.WriteLine("[AutoTDPService] Available Framerate Sources: " + string.Join(", ", l.ToArray()));
|
||||
return l;
|
||||
}
|
||||
|
||||
|
||||
public static List<string> AvailablePowerLimiters()
|
||||
{
|
||||
List<string> l = new List<string>();
|
||||
|
||||
if (IntelMSRPowerLimiter.IsAvailable()) l.Add("intel_msr");
|
||||
|
||||
if (ASUSACPIPowerLimiter.IsAvailable()) l.Add("asus_acpi");
|
||||
|
||||
|
||||
Logger.WriteLine("[AutoTDPService] Available Power Limiters: " + string.Join(", ", l.ToArray()));
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
if (!IsEnabled() || IsRunning() || !IsAvailable())
|
||||
{
|
||||
Logger.WriteLine("[AutoTDPService] Refusing startup. Stats: Enabled: " + IsEnabled() + ", Running: " + IsRunning() + " ,Available: " + IsAvailable());
|
||||
return;
|
||||
}
|
||||
|
||||
Running = true;
|
||||
|
||||
InitFramerateSource();
|
||||
|
||||
InitLimiter();
|
||||
|
||||
|
||||
checkerThread = new Thread(() =>
|
||||
{
|
||||
while (Running)
|
||||
{
|
||||
CheckForGame();
|
||||
try
|
||||
{
|
||||
Thread.Sleep(INTERVAL_APP_CHECK);
|
||||
}
|
||||
catch (ThreadInterruptedException)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
});
|
||||
checkerThread.Start();
|
||||
}
|
||||
|
||||
public bool IsEnabled()
|
||||
{
|
||||
return AppConfig.Get("auto_tdp_enabled", 0) == 1;
|
||||
}
|
||||
|
||||
public void InitFramerateSource()
|
||||
{
|
||||
string? source = AppConfig.GetString("auto_tdp_fps_source");
|
||||
|
||||
if ((source is null || source.Equals("rtss")) && RTSSFramerateSource.IsAvailable())
|
||||
{
|
||||
Logger.WriteLine("[AutoTDPService] Initializing RTSSFramerateSource...");
|
||||
RTSSFramerateSource rtss = new RTSSFramerateSource();
|
||||
RTSSFramerateSource.Start();
|
||||
framerateSouce = rtss;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public void InitLimiter()
|
||||
{
|
||||
string? limiter = AppConfig.GetString("auto_tdp_limiter");
|
||||
|
||||
if (limiter is null || limiter.Equals("asus_acpi") && ASUSACPIPowerLimiter.IsAvailable())
|
||||
{
|
||||
Logger.WriteLine("[AutoTDPService] Initializing ASUSACPIPowerLimiter...");
|
||||
powerLimiter = new ASUSACPIPowerLimiter();
|
||||
return;
|
||||
}
|
||||
|
||||
if (limiter is not null && limiter.Equals("intel_msr") && IntelMSRPowerLimiter.IsAvailable())
|
||||
{
|
||||
Logger.WriteLine("[AutoTDPService] Initializing IntelMSRPowerLimiter...");
|
||||
powerLimiter = new IntelMSRPowerLimiter();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public void SaveGameProfiles()
|
||||
{
|
||||
string json = JsonSerializer.Serialize(GameProfiles);
|
||||
|
||||
File.WriteAllText(GameProfileFile, json);
|
||||
}
|
||||
|
||||
|
||||
public void LoadGameProfiles()
|
||||
{
|
||||
if (!File.Exists(GameProfileFile))
|
||||
{
|
||||
if (GameProfiles is null) GameProfiles = new List<GameProfile>();
|
||||
return;
|
||||
}
|
||||
|
||||
string? json = File.ReadAllText(GameProfileFile);
|
||||
|
||||
if (json == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
GameProfiles = JsonSerializer.Deserialize<List<GameProfile>>(json);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logger.WriteLine("[AutoTDPService] Deserialization failed. Creating empty list. Message: " + e.Message);
|
||||
GameProfiles = new List<GameProfile>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void CheckForGame()
|
||||
{
|
||||
if (currentGame is not null)
|
||||
{
|
||||
//Already handling a running game. No need to check for other games
|
||||
return;
|
||||
}
|
||||
List<GameInstance> runningGames = framerateSouce.GetRunningGames();
|
||||
|
||||
if (runningGames.Count == 0)
|
||||
{
|
||||
if (LOG_AUTO_TDP)
|
||||
Logger.WriteLine("[AutoTDPService] No games detected");
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (GameInstance gi in runningGames)
|
||||
{
|
||||
if (LOG_AUTO_TDP)
|
||||
Logger.WriteLine("[AutoTDPService] Detected App: " + gi.ProcessName + " PID: " + gi.ProcessID);
|
||||
|
||||
if (IsGameInList(gi.ProcessName))
|
||||
{
|
||||
Logger.WriteLine("[AutoTDPService] Detected Supported Game: " + gi.ProcessName + " PID: " + gi.ProcessID);
|
||||
HandleGame(gi);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public GameProfile? ProfileForGame(String? processName)
|
||||
{
|
||||
if (processName is null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach (GameProfile gp in GameProfiles)
|
||||
{
|
||||
if (gp.ProcessName is not null && processName.EndsWith(gp.ProcessName, StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
return gp;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public bool IsGameInList(String? processName)
|
||||
{
|
||||
return ProfileForGame(processName) is not null;
|
||||
}
|
||||
|
||||
|
||||
public void HandleGame(GameInstance instance)
|
||||
{
|
||||
if (currentGame is not null)
|
||||
{
|
||||
if (LOG_AUTO_TDP)
|
||||
Logger.WriteLine("[AutoTDPService] Already handling a game");
|
||||
return;
|
||||
}
|
||||
|
||||
if (tdpThread is not null)
|
||||
{
|
||||
tdpThread.Join();
|
||||
tdpThread = null;
|
||||
}
|
||||
currentGame = instance;
|
||||
|
||||
StartGameHandler(instance);
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
currentGame = null;
|
||||
GameFPSPrevious = double.NaN;
|
||||
GameFPS = 0;
|
||||
LastAdjustmentsWithoutImprovement = 0;
|
||||
LastAdjustment = 0.0;
|
||||
FramerateLog = new List<double>();
|
||||
FramerateTargetReachedCounter = 0;
|
||||
FramerateDipCounter = 0;
|
||||
LowestStableStability = 0;
|
||||
LowestStableChecks = 0;
|
||||
|
||||
if (powerLimiter is not null)
|
||||
{
|
||||
powerLimiter.ResetPowerLimits();
|
||||
CurrentTDP = powerLimiter.GetCPUPowerLimit();
|
||||
}
|
||||
}
|
||||
|
||||
public void StartGameHandler(GameInstance instance)
|
||||
{
|
||||
GameProfile? profile = ProfileForGame(instance.ProcessName);
|
||||
if (profile is null || powerLimiter is null || framerateSouce is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.WriteLine("[AutoTDPService] Start handling game: " + instance.ProcessName + " PID: " + instance.ProcessID);
|
||||
|
||||
tdpThread = new Thread(() =>
|
||||
{
|
||||
CurrentTDP = powerLimiter.GetCPUPowerLimit();
|
||||
powerLimiter.SavePowerLimits(); // save current power limits to restore them afterwards
|
||||
|
||||
LowestStableTDP = profile.MaxTdp;
|
||||
LowestTDP = profile.MaxTdp;
|
||||
|
||||
while (currentGame is not null && Running)
|
||||
{
|
||||
|
||||
double fps = framerateSouce.GetFramerate(instance);
|
||||
|
||||
if (LOG_AUTO_TDP)
|
||||
Logger.WriteLine("[AutoTDPService] (" + instance.ProcessName + ") Framerate " + GameFPS);
|
||||
|
||||
if (fps < 0.0d)
|
||||
{
|
||||
//Game is not running anymore or RTSS lost its hook
|
||||
Reset();
|
||||
return;
|
||||
}
|
||||
|
||||
//prevent FPS from going to 0 which causes issues with the math
|
||||
GameFPS = Math.Max(5, fps);
|
||||
AdjustPowerLimit(profile);
|
||||
|
||||
try
|
||||
{
|
||||
Thread.Sleep(INTERVAL_FPS_CHECK);
|
||||
}
|
||||
catch (ThreadInterruptedException)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
tdpThread.Start();
|
||||
}
|
||||
|
||||
private double FPSDipCorrection(double currentFramerate, double targetFPS)
|
||||
{
|
||||
double correction = 0.0d;
|
||||
|
||||
|
||||
FramerateLog.Insert(0, currentFramerate);
|
||||
|
||||
//Remove last entry when exceeding the desired size.
|
||||
if (FramerateLog.Count > FPSDipHistorySize)
|
||||
{
|
||||
FramerateLog.RemoveAt(FramerateLog.Count - 1);
|
||||
}
|
||||
|
||||
if (targetFPS - 1 <= currentFramerate && currentFramerate <= targetFPS + 1)
|
||||
{
|
||||
//Framerate is inside ideal range
|
||||
FramerateTargetReachedCounter++;
|
||||
|
||||
if (FramerateTargetReachedCounter >= 3
|
||||
&& FramerateTargetReachedCounter < FPSDipHistorySize
|
||||
&& targetFPS - 0.5 <= FramerateLog.Take(3).Average()
|
||||
&& FramerateLog.Take(3).Average() - 0.05 <= targetFPS)
|
||||
{
|
||||
//short dip
|
||||
FramerateDipCounter++;
|
||||
FramerateUnstable();
|
||||
|
||||
correction = targetFPS + 0.15 - currentFramerate;
|
||||
}
|
||||
else if (FramerateDipCounter >= 4
|
||||
&& targetFPS - 0.5 <= FramerateLog.Average()
|
||||
&& FramerateLog.Average() - 0.1 <= targetFPS)
|
||||
{
|
||||
//long dip
|
||||
correction = targetFPS + 0.35 - currentFramerate;
|
||||
FramerateTargetReachedCounter = FPSDipHistorySize;
|
||||
FramerateVeryUnstable();
|
||||
}
|
||||
else
|
||||
{
|
||||
FramerateStable();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Framerate not in target range
|
||||
correction = 0.0;
|
||||
FramerateTargetReachedCounter = 0;
|
||||
FramerateDipCounter = 0;
|
||||
FramerateStable();
|
||||
}
|
||||
|
||||
ProcessStability();
|
||||
return correction;
|
||||
}
|
||||
|
||||
private void FramerateStable()
|
||||
{
|
||||
LowestStableStability++;
|
||||
}
|
||||
|
||||
private void FramerateUnstable()
|
||||
{
|
||||
LowestStableStability -= 15;
|
||||
}
|
||||
private void FramerateVeryUnstable()
|
||||
{
|
||||
LowestStableStability -= 60;
|
||||
}
|
||||
|
||||
private bool Stabilize()
|
||||
{
|
||||
return LowestStableChecks * INTERVAL_FPS_CHECK > INTERVAL_MIN_CHECK;
|
||||
}
|
||||
|
||||
private void ProcessStability()
|
||||
{
|
||||
if (!Stabilize()) LowestStableChecks++;
|
||||
|
||||
if (LowestStableStability < 0 && Stabilize())
|
||||
{
|
||||
//If unstable for too often increase lowest stable TDP
|
||||
LowestStableTDP += 1;
|
||||
LowestTDP += 1;
|
||||
LowestStableStability = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (CurrentTDP > LowestStableTDP - 0.1 && CurrentTDP < LowestStableTDP + 0.1 && Stabilize())
|
||||
{
|
||||
LowestStableStability++;
|
||||
|
||||
if (LowestStableStability > 120)
|
||||
{
|
||||
//if stable for long time try to reduce it again
|
||||
LowestStableTDP = ProfileForGame(currentGame.ProcessName).MaxTdp;
|
||||
LowestStableStability = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (LowestTDP - 0.25 <= CurrentTDP && CurrentTDP <= LowestTDP + 0.25)
|
||||
{
|
||||
LowestStableStability++;
|
||||
|
||||
if (LowestStableStability > 10 && Stabilize())
|
||||
{
|
||||
LowestStableTDP = LowestTDP + (LowestTDP * 0.10); // Add 10% additional wattage to get a smoother framerate
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (CurrentTDP < LowestTDP - 0.1 && LowestStableStability > 0)
|
||||
{
|
||||
LowestStableStability = 0;
|
||||
LowestTDP = CurrentTDP;
|
||||
}
|
||||
|
||||
LowestStableStability = Math.Min(LowestStableStability, 150);
|
||||
}
|
||||
|
||||
|
||||
private double TDPDamper(double currentFramerate)
|
||||
{
|
||||
if (double.IsNaN(GameFPSPrevious)) GameFPSPrevious = currentFramerate;
|
||||
double dF = -0.12d;
|
||||
|
||||
// PID Compute
|
||||
double deltaError = currentFramerate - GameFPSPrevious;
|
||||
double dT = deltaError / (1020.0 / 1000.0);
|
||||
double damping = CurrentTDP / currentFramerate * dF * dT;
|
||||
|
||||
GameFPSPrevious = currentFramerate;
|
||||
|
||||
return damping;
|
||||
}
|
||||
|
||||
public void AdjustPowerLimit(GameProfile profile)
|
||||
{
|
||||
|
||||
if (powerLimiter is null)
|
||||
{
|
||||
//Should not happen... but we also don't want it to crash
|
||||
return;
|
||||
}
|
||||
|
||||
double newPL = CurrentTDP;
|
||||
double fpsCorrection = FPSDipCorrection(GameFPS, profile.GetTDPFPS());
|
||||
double delta = profile.GetTDPFPS() - GameFPS - fpsCorrection - 1;
|
||||
delta = Math.Clamp(delta, -15, 15);
|
||||
|
||||
|
||||
double adjustment = (delta * CurrentTDP / GameFPS) * 0.65;
|
||||
//Dampen the changes to not change TDP too aggressively which would cause performance issues
|
||||
adjustment += TDPDamper(GameFPS);
|
||||
|
||||
adjustment = Math.Min(adjustment, (CurrentTDP * 0.1));
|
||||
|
||||
if (GameFPSPrevious > profile.GetTDPFPS() && GameFPS < profile.GetTDPFPS())
|
||||
{
|
||||
if (LOG_AUTO_TDP)
|
||||
Logger.WriteLine("[AutoTDPService] Single Dip, Ignore");
|
||||
//single dip. Ignore
|
||||
return;
|
||||
}
|
||||
|
||||
if (LastAdjustment > 0 && GameFPS <= GameFPSPrevious && adjustment > 0)
|
||||
{
|
||||
LastAdjustmentsWithoutImprovement++;
|
||||
LastAdjustmentTotal += adjustment;
|
||||
|
||||
//Wait for 3 consecutive power increases and at least 3W increased TDP before judging that increasing power does nothing.
|
||||
if (LastAdjustmentsWithoutImprovement >= 3 && LastAdjustmentTotal > 3)
|
||||
{
|
||||
//Do not adjust if increasing power does not improve framerate.
|
||||
if (LOG_AUTO_TDP)
|
||||
Logger.WriteLine("[AutoTDPService] Not adjusting because no improvement from last increase");
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
LastAdjustmentsWithoutImprovement = 0;
|
||||
LastAdjustmentTotal = 0;
|
||||
}
|
||||
|
||||
newPL += adjustment;
|
||||
LastAdjustment = adjustment;
|
||||
|
||||
//Respect the limits that the user chose
|
||||
newPL = Math.Clamp(newPL, profile.MinTdp, profile.MaxTdp);
|
||||
|
||||
if (newPL < LowestStableTDP && LowestStableTDP < profile.MaxTdp - 1)
|
||||
{
|
||||
newPL = LowestStableTDP;
|
||||
}
|
||||
|
||||
if (LOG_AUTO_TDP)
|
||||
Logger.WriteLine("[AutoTDPService] Power Limit from " + CurrentTDP + "W to " + newPL + "W, Delta:" + adjustment
|
||||
+ " Lowest: " + LowestTDP + "W, Lowest Stable(" + LowestStableStability + "): " + LowestStableTDP + "W");
|
||||
|
||||
//Apply power limits
|
||||
powerLimiter.SetCPUPowerLimit(newPL);
|
||||
CurrentTDP = newPL;
|
||||
}
|
||||
|
||||
public void StopGameHandler()
|
||||
{
|
||||
if (tdpThread is not null)
|
||||
{
|
||||
currentGame = null;
|
||||
tdpThread.Join();
|
||||
tdpThread = null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void Shutdown()
|
||||
{
|
||||
Running = false;
|
||||
|
||||
if (checkerThread is not null)
|
||||
{
|
||||
checkerThread.Interrupt();
|
||||
checkerThread.Join();
|
||||
}
|
||||
|
||||
|
||||
if (tdpThread is not null)
|
||||
{
|
||||
tdpThread.Interrupt();
|
||||
tdpThread.Join();
|
||||
}
|
||||
|
||||
if (powerLimiter is not null)
|
||||
{
|
||||
powerLimiter.ResetPowerLimits();
|
||||
powerLimiter.Dispose();
|
||||
powerLimiter = null;
|
||||
}
|
||||
|
||||
if (framerateSouce is not null)
|
||||
{
|
||||
framerateSouce = null;
|
||||
}
|
||||
|
||||
currentGame = null;
|
||||
Reset();
|
||||
|
||||
//Kill RTSS instance if we started one
|
||||
RTSSFramerateSource.Stop();
|
||||
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Shutdown();
|
||||
}
|
||||
}
|
||||
}
|
||||
311
app/AutoTDP/AutoTDPUI.Designer.cs
generated
Normal file
311
app/AutoTDP/AutoTDPUI.Designer.cs
generated
Normal file
@@ -0,0 +1,311 @@
|
||||
using GHelper.UI;
|
||||
|
||||
namespace GHelper.AutoTDP
|
||||
{
|
||||
partial class AutoTDPUI
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
panelPerformanceHeader = new Panel();
|
||||
pictureKeyboard = new PictureBox();
|
||||
labelGlobalSettings = new Label();
|
||||
checkBoxEnabled = new CheckBox();
|
||||
panelLightingContent = new Panel();
|
||||
comboBoxFPSSource = new RComboBox();
|
||||
labelFPSSource = new Label();
|
||||
comboBoxLimiter = new RComboBox();
|
||||
labelLimiter = new Label();
|
||||
buttonAddGame = new RButton();
|
||||
panelGamesHeader = new Panel();
|
||||
pictureBox1 = new PictureBox();
|
||||
labelGames = new Label();
|
||||
tableLayoutGames = new TableLayoutPanel();
|
||||
buttonGameDummy = new RButton();
|
||||
panelPerformanceHeader.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureKeyboard).BeginInit();
|
||||
panelLightingContent.SuspendLayout();
|
||||
panelGamesHeader.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
|
||||
tableLayoutGames.SuspendLayout();
|
||||
SuspendLayout();
|
||||
//
|
||||
// panelPerformanceHeader
|
||||
//
|
||||
panelPerformanceHeader.BackColor = SystemColors.ControlLight;
|
||||
panelPerformanceHeader.Controls.Add(pictureKeyboard);
|
||||
panelPerformanceHeader.Controls.Add(labelGlobalSettings);
|
||||
panelPerformanceHeader.Controls.Add(checkBoxEnabled);
|
||||
panelPerformanceHeader.Dock = DockStyle.Top;
|
||||
panelPerformanceHeader.Location = new Point(0, 0);
|
||||
panelPerformanceHeader.Margin = new Padding(2);
|
||||
panelPerformanceHeader.Name = "panelPerformanceHeader";
|
||||
panelPerformanceHeader.Size = new Size(446, 30);
|
||||
panelPerformanceHeader.TabIndex = 52;
|
||||
//
|
||||
// pictureKeyboard
|
||||
//
|
||||
pictureKeyboard.BackgroundImage = Properties.Resources.icons8_automation_32;
|
||||
pictureKeyboard.BackgroundImageLayout = ImageLayout.Zoom;
|
||||
pictureKeyboard.Location = new Point(3, 8);
|
||||
pictureKeyboard.Margin = new Padding(2);
|
||||
pictureKeyboard.Name = "pictureKeyboard";
|
||||
pictureKeyboard.Size = new Size(16, 16);
|
||||
pictureKeyboard.TabIndex = 35;
|
||||
pictureKeyboard.TabStop = false;
|
||||
//
|
||||
// labelGlobalSettings
|
||||
//
|
||||
labelGlobalSettings.AutoSize = true;
|
||||
labelGlobalSettings.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelGlobalSettings.Location = new Point(22, 8);
|
||||
labelGlobalSettings.Margin = new Padding(4, 0, 4, 0);
|
||||
labelGlobalSettings.Name = "labelGlobalSettings";
|
||||
labelGlobalSettings.Size = new Size(100, 15);
|
||||
labelGlobalSettings.TabIndex = 34;
|
||||
labelGlobalSettings.Text = "General Settings";
|
||||
//
|
||||
// checkBoxEnabled
|
||||
//
|
||||
checkBoxEnabled.Location = new Point(244, 4);
|
||||
checkBoxEnabled.Margin = new Padding(4, 0, 4, 0);
|
||||
checkBoxEnabled.Name = "checkBoxEnabled";
|
||||
checkBoxEnabled.Size = new Size(198, 25);
|
||||
checkBoxEnabled.TabIndex = 53;
|
||||
checkBoxEnabled.Text = "Enabled";
|
||||
checkBoxEnabled.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// panelLightingContent
|
||||
//
|
||||
panelLightingContent.AutoSize = true;
|
||||
panelLightingContent.Controls.Add(comboBoxFPSSource);
|
||||
panelLightingContent.Controls.Add(labelFPSSource);
|
||||
panelLightingContent.Controls.Add(comboBoxLimiter);
|
||||
panelLightingContent.Controls.Add(labelLimiter);
|
||||
panelLightingContent.Dock = DockStyle.Top;
|
||||
panelLightingContent.Location = new Point(0, 30);
|
||||
panelLightingContent.Margin = new Padding(2);
|
||||
panelLightingContent.Name = "panelLightingContent";
|
||||
panelLightingContent.Padding = new Padding(0, 0, 0, 7);
|
||||
panelLightingContent.Size = new Size(446, 67);
|
||||
panelLightingContent.TabIndex = 56;
|
||||
//
|
||||
// comboBoxFPSSource
|
||||
//
|
||||
comboBoxFPSSource.BorderColor = Color.White;
|
||||
comboBoxFPSSource.ButtonColor = Color.FromArgb(255, 255, 255);
|
||||
comboBoxFPSSource.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
comboBoxFPSSource.FlatStyle = FlatStyle.Flat;
|
||||
comboBoxFPSSource.FormattingEnabled = true;
|
||||
comboBoxFPSSource.Location = new Point(244, 37);
|
||||
comboBoxFPSSource.Margin = new Padding(11, 0, 11, 0);
|
||||
comboBoxFPSSource.Name = "comboBoxFPSSource";
|
||||
comboBoxFPSSource.Size = new Size(191, 23);
|
||||
comboBoxFPSSource.TabIndex = 56;
|
||||
//
|
||||
// labelFPSSource
|
||||
//
|
||||
labelFPSSource.Location = new Point(4, 37);
|
||||
labelFPSSource.Margin = new Padding(4, 0, 4, 0);
|
||||
labelFPSSource.Name = "labelFPSSource";
|
||||
labelFPSSource.Size = new Size(211, 22);
|
||||
labelFPSSource.TabIndex = 57;
|
||||
labelFPSSource.Text = "FPS Source";
|
||||
//
|
||||
// comboBoxLimiter
|
||||
//
|
||||
comboBoxLimiter.BorderColor = Color.White;
|
||||
comboBoxLimiter.ButtonColor = Color.FromArgb(255, 255, 255);
|
||||
comboBoxLimiter.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
comboBoxLimiter.FlatStyle = FlatStyle.Flat;
|
||||
comboBoxLimiter.FormattingEnabled = true;
|
||||
comboBoxLimiter.Location = new Point(244, 7);
|
||||
comboBoxLimiter.Margin = new Padding(11, 0, 11, 0);
|
||||
comboBoxLimiter.Name = "comboBoxLimiter";
|
||||
comboBoxLimiter.Size = new Size(191, 23);
|
||||
comboBoxLimiter.TabIndex = 46;
|
||||
//
|
||||
// labelLimiter
|
||||
//
|
||||
labelLimiter.Location = new Point(4, 7);
|
||||
labelLimiter.Margin = new Padding(4, 0, 4, 0);
|
||||
labelLimiter.Name = "labelLimiter";
|
||||
labelLimiter.Size = new Size(211, 22);
|
||||
labelLimiter.TabIndex = 47;
|
||||
labelLimiter.Text = "Power Limiter";
|
||||
//
|
||||
// buttonAddGame
|
||||
//
|
||||
buttonAddGame.AccessibleName = "Keyboard Color";
|
||||
buttonAddGame.Activated = false;
|
||||
buttonAddGame.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||
buttonAddGame.BackColor = SystemColors.ButtonHighlight;
|
||||
buttonAddGame.BorderColor = Color.Transparent;
|
||||
buttonAddGame.BorderRadius = 2;
|
||||
buttonAddGame.FlatStyle = FlatStyle.Flat;
|
||||
buttonAddGame.ForeColor = SystemColors.ControlText;
|
||||
buttonAddGame.Location = new Point(339, 3);
|
||||
buttonAddGame.Margin = new Padding(2, 4, 2, 4);
|
||||
buttonAddGame.Name = "buttonAddGame";
|
||||
buttonAddGame.Secondary = false;
|
||||
buttonAddGame.Size = new Size(103, 25);
|
||||
buttonAddGame.TabIndex = 60;
|
||||
buttonAddGame.Text = "Add Game";
|
||||
buttonAddGame.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// panelGamesHeader
|
||||
//
|
||||
panelGamesHeader.BackColor = SystemColors.ControlLight;
|
||||
panelGamesHeader.Controls.Add(pictureBox1);
|
||||
panelGamesHeader.Controls.Add(buttonAddGame);
|
||||
panelGamesHeader.Controls.Add(labelGames);
|
||||
panelGamesHeader.Dock = DockStyle.Top;
|
||||
panelGamesHeader.Location = new Point(0, 97);
|
||||
panelGamesHeader.Margin = new Padding(2);
|
||||
panelGamesHeader.Name = "panelGamesHeader";
|
||||
panelGamesHeader.Size = new Size(446, 30);
|
||||
panelGamesHeader.TabIndex = 61;
|
||||
//
|
||||
// pictureBox1
|
||||
//
|
||||
pictureBox1.BackgroundImage = Properties.Resources.icons8_software_32_white;
|
||||
pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
|
||||
pictureBox1.Location = new Point(3, 8);
|
||||
pictureBox1.Margin = new Padding(2);
|
||||
pictureBox1.Name = "pictureBox1";
|
||||
pictureBox1.Size = new Size(16, 16);
|
||||
pictureBox1.TabIndex = 35;
|
||||
pictureBox1.TabStop = false;
|
||||
//
|
||||
// labelGames
|
||||
//
|
||||
labelGames.AutoSize = true;
|
||||
labelGames.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelGames.Location = new Point(22, 8);
|
||||
labelGames.Margin = new Padding(4, 0, 4, 0);
|
||||
labelGames.Name = "labelGames";
|
||||
labelGames.Size = new Size(45, 15);
|
||||
labelGames.TabIndex = 34;
|
||||
labelGames.Text = "Games";
|
||||
//
|
||||
// tableLayoutGames
|
||||
//
|
||||
tableLayoutGames.AutoSize = true;
|
||||
tableLayoutGames.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
tableLayoutGames.ColumnCount = 4;
|
||||
tableLayoutGames.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
|
||||
tableLayoutGames.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
|
||||
tableLayoutGames.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
|
||||
tableLayoutGames.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
|
||||
tableLayoutGames.Controls.Add(buttonGameDummy, 0, 0);
|
||||
tableLayoutGames.Dock = DockStyle.Top;
|
||||
tableLayoutGames.Location = new Point(0, 127);
|
||||
tableLayoutGames.Margin = new Padding(4, 2, 4, 2);
|
||||
tableLayoutGames.Name = "tableLayoutGames";
|
||||
tableLayoutGames.RowCount = 7;
|
||||
tableLayoutGames.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
|
||||
tableLayoutGames.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
|
||||
tableLayoutGames.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
|
||||
tableLayoutGames.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
|
||||
tableLayoutGames.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
|
||||
tableLayoutGames.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
|
||||
tableLayoutGames.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
|
||||
tableLayoutGames.Size = new Size(446, 420);
|
||||
tableLayoutGames.TabIndex = 62;
|
||||
//
|
||||
// buttonGameDummy
|
||||
//
|
||||
buttonGameDummy.AccessibleName = "DPI Setting 4";
|
||||
buttonGameDummy.Activated = false;
|
||||
buttonGameDummy.AutoSize = true;
|
||||
buttonGameDummy.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
buttonGameDummy.BackColor = SystemColors.ControlLightLight;
|
||||
buttonGameDummy.BorderColor = Color.LightGreen;
|
||||
buttonGameDummy.BorderRadius = 5;
|
||||
buttonGameDummy.Dock = DockStyle.Fill;
|
||||
buttonGameDummy.FlatAppearance.BorderSize = 0;
|
||||
buttonGameDummy.FlatStyle = FlatStyle.Flat;
|
||||
buttonGameDummy.ForeColor = SystemColors.ControlText;
|
||||
buttonGameDummy.ImageAlign = ContentAlignment.BottomCenter;
|
||||
buttonGameDummy.Location = new Point(2, 2);
|
||||
buttonGameDummy.Margin = new Padding(2);
|
||||
buttonGameDummy.Name = "buttonGameDummy";
|
||||
buttonGameDummy.Secondary = false;
|
||||
buttonGameDummy.Size = new Size(107, 56);
|
||||
buttonGameDummy.TabIndex = 7;
|
||||
buttonGameDummy.Text = "Genshin Impact\r\n60FPS\r\n";
|
||||
buttonGameDummy.TextImageRelation = TextImageRelation.ImageAboveText;
|
||||
buttonGameDummy.UseVisualStyleBackColor = false;
|
||||
buttonGameDummy.Visible = false;
|
||||
//
|
||||
// AutoTDPUI
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(446, 547);
|
||||
Controls.Add(tableLayoutGames);
|
||||
Controls.Add(panelGamesHeader);
|
||||
Controls.Add(panelLightingContent);
|
||||
Controls.Add(panelPerformanceHeader);
|
||||
FormBorderStyle = FormBorderStyle.FixedSingle;
|
||||
MaximizeBox = false;
|
||||
MinimizeBox = false;
|
||||
Name = "AutoTDPUI";
|
||||
ShowIcon = false;
|
||||
Text = "Auto TDP Settings";
|
||||
panelPerformanceHeader.ResumeLayout(false);
|
||||
panelPerformanceHeader.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureKeyboard).EndInit();
|
||||
panelLightingContent.ResumeLayout(false);
|
||||
panelGamesHeader.ResumeLayout(false);
|
||||
panelGamesHeader.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
|
||||
tableLayoutGames.ResumeLayout(false);
|
||||
tableLayoutGames.PerformLayout();
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
private Panel panelPerformanceHeader;
|
||||
private PictureBox pictureKeyboard;
|
||||
private Label labelGlobalSettings;
|
||||
private Panel panelLightingContent;
|
||||
private TableLayoutPanel tableLayoutGames;
|
||||
private UI.RButton rButton1;
|
||||
private CheckBox checkBoxEnabled;
|
||||
private UI.RComboBox comboBoxLightingMode;
|
||||
private Label labelLimiter;
|
||||
private UI.RComboBox comboBoxFPSSource;
|
||||
private Label labelFPSSource;
|
||||
private RComboBox comboBoxLimiter;
|
||||
private RButton buttonAddGame;
|
||||
private Panel panelGamesHeader;
|
||||
private PictureBox pictureBox1;
|
||||
private Label labelGames;
|
||||
private RButton buttonGameDummy;
|
||||
}
|
||||
}
|
||||
220
app/AutoTDP/AutoTDPUI.cs
Normal file
220
app/AutoTDP/AutoTDPUI.cs
Normal file
@@ -0,0 +1,220 @@
|
||||
using GHelper.AutoTDP.FramerateSource;
|
||||
using GHelper.AutoTDP.PowerLimiter;
|
||||
using GHelper.UI;
|
||||
using Ryzen;
|
||||
using System.Linq;
|
||||
|
||||
namespace GHelper.AutoTDP
|
||||
{
|
||||
public partial class AutoTDPUI : RForm
|
||||
{
|
||||
|
||||
private Dictionary<string, string> ModeTexts = new Dictionary<string, string>();
|
||||
|
||||
|
||||
private AutoTDPGameProfileUI? profileUI;
|
||||
public AutoTDPUI()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
InitTheme();
|
||||
|
||||
|
||||
ModeTexts.Add("intel_msr", "Intel MSR Power Limiter");
|
||||
ModeTexts.Add("asus_acpi", "ASUS ACPI Power Limiter");
|
||||
ModeTexts.Add("rtss", "Riva Tuner Statistics Server");
|
||||
|
||||
checkBoxEnabled.CheckedChanged += CheckBoxEnabled_CheckedChanged;
|
||||
buttonAddGame.Click += ButtonAddGame_Click;
|
||||
|
||||
comboBoxLimiter.DropDownClosed += ComboBoxLimiter_DropDownClosed;
|
||||
|
||||
comboBoxFPSSource.DropDownClosed += ComboBoxFPSSource_DropDownClosed;
|
||||
|
||||
Shown += AutoTDPUI_Shown;
|
||||
|
||||
VisualizeGeneralSettings();
|
||||
VizualizeGameList();
|
||||
}
|
||||
|
||||
private void ComboBoxFPSSource_DropDownClosed(object? sender, EventArgs e)
|
||||
{
|
||||
AppConfig.Set("auto_tdp_fps_source", AutoTDPService.AvailableFramerateSources().ElementAt(comboBoxFPSSource.SelectedIndex));
|
||||
|
||||
}
|
||||
|
||||
private void ComboBoxLimiter_DropDownClosed(object? sender, EventArgs e)
|
||||
{
|
||||
AppConfig.Set("auto_tdp_limiter", AutoTDPService.AvailablePowerLimiters().ElementAt(comboBoxLimiter.SelectedIndex));
|
||||
}
|
||||
|
||||
private void CheckBoxEnabled_CheckedChanged(object? sender, EventArgs e)
|
||||
{
|
||||
AppConfig.Set("auto_tdp_enabled", checkBoxEnabled.Checked ? 1 : 0);
|
||||
|
||||
if (Program.autoTDPService.IsEnabled())
|
||||
{
|
||||
Program.autoTDPService.Start();
|
||||
}
|
||||
else
|
||||
{
|
||||
Program.autoTDPService.Shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
private void ButtonAddGame_Click(object? sender, EventArgs e)
|
||||
{
|
||||
string? path = null;
|
||||
Thread t = new Thread(() =>
|
||||
{
|
||||
OpenFileDialog ofd = new OpenFileDialog();
|
||||
ofd.Filter = "Executables (*.exe)|*.exe";
|
||||
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
path = ofd.FileName;
|
||||
}
|
||||
});
|
||||
|
||||
t.SetApartmentState(ApartmentState.STA);
|
||||
t.Start();
|
||||
t.Join();
|
||||
|
||||
if (path is null)
|
||||
{
|
||||
//User did not select a file
|
||||
return;
|
||||
}
|
||||
|
||||
GameProfile p = new GameProfile();
|
||||
p.ProcessName = Path.GetFileName(path);
|
||||
p.GameTitle = Path.GetFileName(path).Replace(".exe", "");
|
||||
p.Enabled = true;
|
||||
p.TargetFPS = 60;
|
||||
p.MaxTdp = 40;
|
||||
p.MinTdp = 15;
|
||||
|
||||
profileUI = new AutoTDPGameProfileUI(p, this);
|
||||
profileUI.FormClosed += ProfileUI_FormClosed;
|
||||
profileUI.ShowDialog(this);
|
||||
}
|
||||
|
||||
private void ProfileUI_FormClosed(object? sender, FormClosedEventArgs e)
|
||||
{
|
||||
profileUI = null;
|
||||
}
|
||||
|
||||
private void AutoTDPUI_Shown(object? sender, EventArgs e)
|
||||
{
|
||||
if (Height > Program.settingsForm.Height)
|
||||
{
|
||||
Top = Program.settingsForm.Top + Program.settingsForm.Height - Height;
|
||||
}
|
||||
else
|
||||
{
|
||||
Top = Program.settingsForm.Top;
|
||||
}
|
||||
|
||||
Left = Program.settingsForm.Left - Width - 5;
|
||||
}
|
||||
|
||||
private void VisualizeGeneralSettings()
|
||||
{
|
||||
checkBoxEnabled.Checked = AppConfig.Get("auto_tdp_enabled", 0) == 1;
|
||||
|
||||
comboBoxLimiter.Items.Clear();
|
||||
comboBoxFPSSource.Items.Clear();
|
||||
|
||||
foreach (string s in AutoTDPService.AvailablePowerLimiters())
|
||||
{
|
||||
comboBoxLimiter.Items.Add(ModeTexts[s]);
|
||||
}
|
||||
|
||||
foreach (string s in AutoTDPService.AvailableFramerateSources())
|
||||
{
|
||||
comboBoxFPSSource.Items.Add(ModeTexts[s]);
|
||||
}
|
||||
|
||||
|
||||
string? limiter = AppConfig.GetString("auto_tdp_limiter", null);
|
||||
string? source = AppConfig.GetString("auto_tdp_fps_source", null);
|
||||
|
||||
|
||||
if (limiter is not null && AutoTDPService.AvailablePowerLimiters().Contains(limiter))
|
||||
{
|
||||
comboBoxLimiter.SelectedIndex = AutoTDPService.AvailablePowerLimiters().IndexOf(limiter);
|
||||
}
|
||||
else
|
||||
{
|
||||
comboBoxLimiter.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
if (source is not null && AutoTDPService.AvailableFramerateSources().Contains(source))
|
||||
{
|
||||
comboBoxFPSSource.SelectedIndex = AutoTDPService.AvailableFramerateSources().IndexOf(source);
|
||||
}
|
||||
else
|
||||
{
|
||||
comboBoxFPSSource.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void VizualizeGameList()
|
||||
{
|
||||
//Due to my lousy skills in UI design, the game table is limited to 7x4 games.
|
||||
buttonAddGame.Enabled = Program.autoTDPService.GameProfiles.Count < 7 * 4;
|
||||
|
||||
tableLayoutGames.Controls.Clear();
|
||||
|
||||
foreach (GameProfile gp in Program.autoTDPService.GameProfiles)
|
||||
{
|
||||
RButton bt = new RButton();
|
||||
bt.Text = gp.GameTitle + "\n" + gp.TargetFPS + " FPS";
|
||||
|
||||
bt.Dock = DockStyle.Fill;
|
||||
bt.FlatStyle = FlatStyle.Flat;
|
||||
bt.FlatAppearance.BorderColor = RForm.borderMain;
|
||||
bt.UseVisualStyleBackColor = false;
|
||||
bt.AutoSize = true;
|
||||
bt.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
bt.BackColor = RForm.buttonMain;
|
||||
bt.ForeColor = RForm.foreMain;
|
||||
bt.Click += Bt_Click;
|
||||
bt.Tag = gp;
|
||||
|
||||
tableLayoutGames.Controls.Add(bt);
|
||||
}
|
||||
}
|
||||
|
||||
private void Bt_Click(object? sender, EventArgs e)
|
||||
{
|
||||
GameProfile gp = (GameProfile)((RButton)sender).Tag;
|
||||
profileUI = new AutoTDPGameProfileUI(gp, this);
|
||||
profileUI.FormClosed += ProfileUI_FormClosed;
|
||||
profileUI.ShowDialog(this);
|
||||
}
|
||||
|
||||
public void DeleteGameProfile(GameProfile gp)
|
||||
{
|
||||
if (Program.autoTDPService.IsGameInList(gp.ProcessName))
|
||||
{
|
||||
Program.autoTDPService.GameProfiles.Remove(gp);
|
||||
}
|
||||
|
||||
Program.autoTDPService.SaveGameProfiles();
|
||||
VizualizeGameList();
|
||||
}
|
||||
|
||||
public void UpdateGameProfile(GameProfile gp)
|
||||
{
|
||||
if (!Program.autoTDPService.IsGameInList(gp.ProcessName))
|
||||
{
|
||||
Program.autoTDPService.GameProfiles.Add(gp);
|
||||
}
|
||||
Program.autoTDPService.SaveGameProfiles();
|
||||
VizualizeGameList();
|
||||
}
|
||||
}
|
||||
}
|
||||
120
app/AutoTDP/AutoTDPUI.resx
Normal file
120
app/AutoTDP/AutoTDPUI.resx
Normal 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>
|
||||
17
app/AutoTDP/FramerateSource/IFramerateSource.cs
Normal file
17
app/AutoTDP/FramerateSource/IFramerateSource.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
namespace GHelper.AutoTDP.FramerateSource
|
||||
{
|
||||
|
||||
internal class GameInstance
|
||||
{
|
||||
public string? ProcessName { get; set; }
|
||||
|
||||
public int ProcessID { get; set; }
|
||||
}
|
||||
|
||||
internal interface IFramerateSource
|
||||
{
|
||||
public double GetFramerate(GameInstance instance);
|
||||
|
||||
public List<GameInstance> GetRunningGames();
|
||||
}
|
||||
}
|
||||
130
app/AutoTDP/FramerateSource/RTSSFramerateSource.cs
Normal file
130
app/AutoTDP/FramerateSource/RTSSFramerateSource.cs
Normal file
@@ -0,0 +1,130 @@
|
||||
using System.Diagnostics;
|
||||
using RTSSSharedMemoryNET;
|
||||
|
||||
namespace GHelper.AutoTDP.FramerateSource
|
||||
{
|
||||
internal class RTSSFramerateSource : IFramerateSource
|
||||
{
|
||||
private static Process? rtssInstance;
|
||||
|
||||
private static OSD? osd;
|
||||
|
||||
public static string RTSSPath { get; set; }
|
||||
|
||||
|
||||
public static bool IsRunning => Process.GetProcessesByName("RTSS").Length != 0;
|
||||
|
||||
|
||||
static RTSSFramerateSource()
|
||||
{
|
||||
RTSSPath = @"C:\Program Files (x86)\RivaTuner Statistics Server\RTSS.exe";
|
||||
}
|
||||
|
||||
public static bool IsAvailable()
|
||||
{
|
||||
return File.Exists(RTSSPath);
|
||||
|
||||
}
|
||||
|
||||
public static void Start()
|
||||
{
|
||||
if ((rtssInstance == null || rtssInstance.HasExited) && !IsRunning && File.Exists(RTSSPath))
|
||||
{
|
||||
try
|
||||
{
|
||||
rtssInstance = Process.Start(RTSSPath);
|
||||
Thread.Sleep(2000); // If it works, don't touch it
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Logger.WriteLine("Could not start RTSS Service" + exc.Message);
|
||||
}
|
||||
|
||||
RunOSD();
|
||||
}
|
||||
else
|
||||
{
|
||||
RunOSD();
|
||||
}
|
||||
}
|
||||
|
||||
public List<GameInstance> GetRunningGames()
|
||||
{
|
||||
if (!IsRunning)
|
||||
{
|
||||
return new List<GameInstance>();
|
||||
}
|
||||
|
||||
List<GameInstance> giL = new List<GameInstance>();
|
||||
|
||||
foreach (AppEntry appEntry in OSD.GetAppEntries())
|
||||
{
|
||||
GameInstance i = new GameInstance();
|
||||
i.ProcessID = appEntry.ProcessId;
|
||||
i.ProcessName = appEntry.Name;
|
||||
|
||||
giL.Add(i);
|
||||
}
|
||||
|
||||
return giL;
|
||||
}
|
||||
|
||||
public double GetFramerate(GameInstance instance)
|
||||
{
|
||||
if (!IsRunning)
|
||||
{
|
||||
return -1.0d;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var appE = OSD.GetAppEntries().FirstOrDefault(a => a.ProcessId == instance.ProcessID);
|
||||
if (appE is null)
|
||||
return -1.0d;
|
||||
|
||||
return (double)appE.StatFrameTimeBufFramerate / 10;
|
||||
}
|
||||
catch (InvalidDataException)
|
||||
{
|
||||
}
|
||||
catch (FileNotFoundException)
|
||||
{
|
||||
}
|
||||
|
||||
return -1.0d;
|
||||
}
|
||||
|
||||
public static void RunOSD()
|
||||
{
|
||||
if (osd == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
osd = new OSD("GHELPER");
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Logger.WriteLine("Could not start OSD" + exc.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void Stop()
|
||||
{
|
||||
if (rtssInstance != null && !rtssInstance.HasExited)
|
||||
{
|
||||
try
|
||||
{
|
||||
rtssInstance.Kill();
|
||||
rtssInstance = null;
|
||||
var proc = Process.GetProcessesByName("RTSSHooksLoader64");
|
||||
proc[0].Kill();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// Ignored
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
18
app/AutoTDP/GameProfile.cs
Normal file
18
app/AutoTDP/GameProfile.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
namespace GHelper.AutoTDP
|
||||
{
|
||||
public class GameProfile
|
||||
{
|
||||
public string GameTitle { get; set; }
|
||||
public string ProcessName { get; set; }
|
||||
public int TargetFPS { get; set; }
|
||||
public int MinTdp { get; set; }
|
||||
public int MaxTdp { get; set; }
|
||||
public bool Enabled { get; set; }
|
||||
|
||||
public int GetTDPFPS()
|
||||
{
|
||||
return TargetFPS - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
57
app/AutoTDP/PowerLimiter/ASUSACPIPowerLimiter.cs
Normal file
57
app/AutoTDP/PowerLimiter/ASUSACPIPowerLimiter.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
using GHelper.Mode;
|
||||
|
||||
namespace GHelper.AutoTDP.PowerLimiter
|
||||
{
|
||||
internal class ASUSACPIPowerLimiter : IPowerLimiter
|
||||
{
|
||||
|
||||
private bool allAmd;
|
||||
private bool fPPT;
|
||||
|
||||
public ASUSACPIPowerLimiter()
|
||||
{
|
||||
allAmd = Program.acpi.IsAllAmdPPT();
|
||||
fPPT = Program.acpi.DeviceGet(AsusACPI.PPT_APUC1) >= 0;
|
||||
}
|
||||
|
||||
public static bool IsAvailable()
|
||||
{
|
||||
return AppConfig.IsASUS();
|
||||
}
|
||||
|
||||
public void SavePowerLimits()
|
||||
{
|
||||
}
|
||||
|
||||
public void SetCPUPowerLimit(double watts)
|
||||
{
|
||||
|
||||
if (allAmd) // CPU limit all amd models
|
||||
{
|
||||
Program.acpi.DeviceSet(AsusACPI.PPT_CPUB0, (int)watts, "PowerLimit B0");
|
||||
} else {
|
||||
Program.acpi.DeviceSet(AsusACPI.PPT_APUA3, (int)watts, "PowerLimit A3");
|
||||
Program.acpi.DeviceSet(AsusACPI.PPT_APUA0, (int)watts, "PowerLimit A0");
|
||||
if (fPPT) Program.acpi.DeviceSet(AsusACPI.PPT_APUC1, (int)watts, "PowerLimit C1");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// You can't read PPTs on ASUS :) endpoints just return 0 if they are available
|
||||
public int GetCPUPowerLimit()
|
||||
{
|
||||
return Program.acpi.DeviceGet(AsusACPI.PPT_APUA0);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
//Nothing to dispose here
|
||||
}
|
||||
|
||||
// Correct Asus way to reset everything, is just to set mode again
|
||||
public void ResetPowerLimits()
|
||||
{
|
||||
Program.modeControl.SetPerformanceMode(Modes.GetCurrent());
|
||||
}
|
||||
}
|
||||
}
|
||||
14
app/AutoTDP/PowerLimiter/IPowerLimiter.cs
Normal file
14
app/AutoTDP/PowerLimiter/IPowerLimiter.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace GHelper.AutoTDP.PowerLimiter
|
||||
{
|
||||
internal interface IPowerLimiter : IDisposable
|
||||
{
|
||||
public void SetCPUPowerLimit(double watts);
|
||||
|
||||
public int GetCPUPowerLimit();
|
||||
|
||||
public void ResetPowerLimits();
|
||||
|
||||
public void SavePowerLimits();
|
||||
|
||||
}
|
||||
}
|
||||
110
app/AutoTDP/PowerLimiter/IntelMSRPowerLimiter.cs
Normal file
110
app/AutoTDP/PowerLimiter/IntelMSRPowerLimiter.cs
Normal file
@@ -0,0 +1,110 @@
|
||||
using Ryzen;
|
||||
|
||||
namespace GHelper.AutoTDP.PowerLimiter
|
||||
{
|
||||
|
||||
internal class IntelMSRPowerLimiter : IPowerLimiter
|
||||
{
|
||||
public static readonly uint MSR_PKG_POWER_LIMIT = 0x610;
|
||||
public static readonly uint MSR_RAPL_POWER_UNIT = 0x606;
|
||||
|
||||
private Ols ols;
|
||||
|
||||
private uint DefaultEax = 0; // Set on first reading
|
||||
private uint DefaultEdx = 0;
|
||||
|
||||
//Lower 14 bits are the power limits
|
||||
private uint PL1_MASK = 0x3FFF;
|
||||
private uint PL2_MASK = 0x3FFF;
|
||||
|
||||
//The power unit factor (Default is 0.125 for most Intel CPUs).
|
||||
private double PowerUnit = 0x0;
|
||||
|
||||
public IntelMSRPowerLimiter()
|
||||
{
|
||||
ols = new Ols();
|
||||
ols.InitializeOls();
|
||||
ReadPowerUnit();
|
||||
}
|
||||
|
||||
public static bool IsAvailable()
|
||||
{
|
||||
return !RyzenControl.IsAMD();
|
||||
}
|
||||
|
||||
public void SavePowerLimits()
|
||||
{
|
||||
DefaultEax = 0;
|
||||
DefaultEdx = 0;
|
||||
|
||||
ols.Rdmsr(MSR_PKG_POWER_LIMIT, ref DefaultEax, ref DefaultEdx);
|
||||
}
|
||||
|
||||
public void ReadPowerUnit()
|
||||
{
|
||||
uint eax = 0;
|
||||
uint edx = 0;
|
||||
|
||||
ols.Rdmsr(MSR_RAPL_POWER_UNIT, ref eax, ref edx);
|
||||
|
||||
|
||||
uint pwr = eax & 0x03;
|
||||
|
||||
PowerUnit = 1 / Math.Pow(2, pwr);
|
||||
}
|
||||
|
||||
public void SetCPUPowerLimit(double watts)
|
||||
{
|
||||
uint eax = 0;
|
||||
uint edx = 0;
|
||||
|
||||
|
||||
ols.Rdmsr(MSR_PKG_POWER_LIMIT, ref eax, ref edx);
|
||||
|
||||
uint watsRapl = (uint)(watts / PowerUnit);
|
||||
|
||||
//Set limits for both PL1 and PL2
|
||||
uint eaxFilterd = eax & ~PL1_MASK;
|
||||
uint edxFilterd = edx & ~PL2_MASK;
|
||||
|
||||
eaxFilterd |= watsRapl;
|
||||
edxFilterd |= watsRapl;
|
||||
|
||||
//Enable clamping
|
||||
eaxFilterd |= 0x8000;
|
||||
edxFilterd |= 0x8000;
|
||||
|
||||
ols.Wrmsr(0x610, eaxFilterd, edxFilterd);
|
||||
}
|
||||
|
||||
|
||||
public int GetCPUPowerLimit()
|
||||
{
|
||||
uint eax = 0;
|
||||
uint edx = 0;
|
||||
|
||||
ols.Rdmsr(MSR_PKG_POWER_LIMIT, ref eax, ref edx);
|
||||
|
||||
uint pl1 = eax & PL1_MASK;
|
||||
uint pl2 = edx & PL2_MASK;
|
||||
|
||||
return (int)(pl1 * PowerUnit);
|
||||
}
|
||||
|
||||
|
||||
public void ResetPowerLimits()
|
||||
{
|
||||
if (DefaultEax == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
ols.Wrmsr(MSR_PKG_POWER_LIMIT, DefaultEax, DefaultEdx);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
ols.DeinitializeOls();
|
||||
ols.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
using GHelper.Helpers;
|
||||
using System.Management;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace GHelper.Display
|
||||
{
|
||||
@@ -8,6 +7,7 @@ namespace GHelper.Display
|
||||
|
||||
public const int MAX_REFRESH = 1000;
|
||||
|
||||
public static DisplayGammaRamp? gammaRamp;
|
||||
|
||||
public void AutoScreen(bool force = false)
|
||||
{
|
||||
@@ -24,6 +24,57 @@ namespace GHelper.Display
|
||||
}
|
||||
}
|
||||
|
||||
public void SetBrightness(int brightness = -1)
|
||||
{
|
||||
if (!AppConfig.IsOLED()) return;
|
||||
|
||||
if (brightness >= 0) AppConfig.Set("brightness", brightness);
|
||||
else brightness = AppConfig.Get("brightness");
|
||||
|
||||
if (brightness >= 0) SetGamma(brightness);
|
||||
}
|
||||
|
||||
|
||||
public void SetGamma(int brightness = 100)
|
||||
{
|
||||
var bright = Math.Round((float)brightness / 200 + 0.5, 2);
|
||||
|
||||
var screenName = ScreenNative.FindLaptopScreen();
|
||||
if (screenName is null) return;
|
||||
|
||||
try
|
||||
{
|
||||
var handle = ScreenNative.CreateDC(screenName, screenName, null, IntPtr.Zero);
|
||||
if (gammaRamp is null)
|
||||
{
|
||||
var gammaDump = new GammaRamp();
|
||||
if (ScreenNative.GetDeviceGammaRamp(handle, ref gammaDump))
|
||||
{
|
||||
gammaRamp = new DisplayGammaRamp(gammaDump);
|
||||
//Logger.WriteLine("Gamma R: " + string.Join("-", gammaRamp.Red));
|
||||
//Logger.WriteLine("Gamma G: " + string.Join("-", gammaRamp.Green));
|
||||
//Logger.WriteLine("Gamma B: " + string.Join("-", gammaRamp.Blue));
|
||||
}
|
||||
}
|
||||
|
||||
if (gammaRamp is null || !gammaRamp.IsOriginal())
|
||||
{
|
||||
Logger.WriteLine("Not default Gamma");
|
||||
gammaRamp = new DisplayGammaRamp();
|
||||
}
|
||||
|
||||
var ramp = gammaRamp.AsBrightnessRamp(bright);
|
||||
bool result = ScreenNative.SetDeviceGammaRamp(handle, ref ramp);
|
||||
|
||||
Logger.WriteLine("Brightness " + bright.ToString() + ": " + result);
|
||||
|
||||
} catch (Exception ex)
|
||||
{
|
||||
Logger.WriteLine(ex.ToString());
|
||||
}
|
||||
|
||||
//ScreenBrightness.Set(60 + (int)(40 * bright));
|
||||
}
|
||||
|
||||
public void SetScreen(int frequency = -1, int overdrive = -1, int miniled = -1)
|
||||
{
|
||||
@@ -45,8 +96,8 @@ namespace GHelper.Display
|
||||
|
||||
if (overdrive >= 0)
|
||||
{
|
||||
if (AppConfig.IsNoOverdrive()) overdrive = 0;
|
||||
if (!AppConfig.IsOLED()) Program.acpi.DeviceSet(AsusACPI.ScreenOverdrive, overdrive, "ScreenOverdrive");
|
||||
if (AppConfig.Get("no_overdrive") == 1) overdrive = 0;
|
||||
Program.acpi.DeviceSet(AsusACPI.ScreenOverdrive, overdrive, "ScreenOverdrive");
|
||||
|
||||
}
|
||||
|
||||
@@ -98,9 +149,9 @@ namespace GHelper.Display
|
||||
int maxFrequency = ScreenNative.GetMaxRefreshRate(laptopScreen);
|
||||
|
||||
bool screenAuto = AppConfig.Is("screen_auto");
|
||||
bool overdriveSetting = !AppConfig.IsNoOverdrive();
|
||||
bool overdriveSetting = !AppConfig.Is("no_overdrive");
|
||||
|
||||
int overdrive = AppConfig.IsNoOverdrive() ? 0 : Program.acpi.DeviceGet(AsusACPI.ScreenOverdrive);
|
||||
int overdrive = Program.acpi.DeviceGet(AsusACPI.ScreenOverdrive);
|
||||
|
||||
int miniled1 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled1);
|
||||
int miniled2 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled2);
|
||||
|
||||
@@ -1,245 +0,0 @@
|
||||
using GHelper.Helpers;
|
||||
using System.Management;
|
||||
|
||||
namespace GHelper.Display
|
||||
{
|
||||
public enum SplendidGamut : int
|
||||
{
|
||||
Native = 50,
|
||||
sRGB = 51,
|
||||
DCIP3 = 53,
|
||||
DisplayP3 = 54
|
||||
}
|
||||
|
||||
public enum SplendidCommand : int
|
||||
{
|
||||
Init = 10,
|
||||
DimmingAsus = 9,
|
||||
DimmingVisual = 19,
|
||||
GamutMode = 200,
|
||||
|
||||
Default = 11,
|
||||
Racing = 21,
|
||||
Scenery = 22,
|
||||
RTS = 23,
|
||||
FPS = 24,
|
||||
Cinema = 25,
|
||||
Vivid = 13,
|
||||
Eyecare = 17,
|
||||
}
|
||||
public static class VisualControl
|
||||
{
|
||||
public static DisplayGammaRamp? gammaRamp;
|
||||
|
||||
private static int _brightness = 100;
|
||||
private static bool _init = true;
|
||||
private static string? _splendidPath = null;
|
||||
|
||||
private static System.Timers.Timer brightnessTimer = new System.Timers.Timer(100);
|
||||
|
||||
|
||||
static VisualControl()
|
||||
{
|
||||
brightnessTimer.Elapsed += BrightnessTimerTimer_Elapsed;
|
||||
}
|
||||
|
||||
private static string GetGameVisualPath()
|
||||
{
|
||||
return Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\ASUS\\GameVisual";
|
||||
}
|
||||
|
||||
public static Dictionary<SplendidGamut, string> GetGamutModes()
|
||||
{
|
||||
Dictionary<SplendidGamut, string> _modes = new Dictionary<SplendidGamut, string>();
|
||||
|
||||
string gameVisualPath = GetGameVisualPath();
|
||||
if (!Directory.Exists(gameVisualPath))
|
||||
{
|
||||
Logger.WriteLine(gameVisualPath + "doesn't exit");
|
||||
return _modes;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
DirectoryInfo d = new DirectoryInfo(GetGameVisualPath());
|
||||
FileInfo[] icms = d.GetFiles("*.icm");
|
||||
if (icms.Length == 0) return _modes;
|
||||
|
||||
_modes.Add(SplendidGamut.Native, "Gamut: Native");
|
||||
foreach (FileInfo icm in icms)
|
||||
{
|
||||
if (icm.Name.Contains("sRGB")) _modes.Add(SplendidGamut.sRGB, "Gamut: sRGB");
|
||||
if (icm.Name.Contains("DCIP3")) _modes.Add(SplendidGamut.DCIP3, "Gamut: DCIP3");
|
||||
if (icm.Name.Contains("DisplayP3")) _modes.Add(SplendidGamut.DisplayP3, "Gamut: DisplayP3");
|
||||
}
|
||||
return _modes;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return _modes;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static Dictionary<SplendidCommand, string> GetVisualModes()
|
||||
{
|
||||
return new Dictionary<SplendidCommand, string>
|
||||
{
|
||||
{ SplendidCommand.Default, "Default"},
|
||||
{ SplendidCommand.Racing, "Racing"},
|
||||
{ SplendidCommand.Scenery, "Scenery"},
|
||||
{ SplendidCommand.RTS, "RTS/RPG"},
|
||||
{ SplendidCommand.FPS, "FPS"},
|
||||
{ SplendidCommand.Cinema, "Cinema"},
|
||||
{ SplendidCommand.Vivid, "Vivid" },
|
||||
{ SplendidCommand.Eyecare, "Eyecare"}
|
||||
};
|
||||
}
|
||||
|
||||
public static void SetGamut(int mode = 50)
|
||||
{
|
||||
if (RunSplendid(SplendidCommand.GamutMode, 0, mode)) return;
|
||||
|
||||
if (_init)
|
||||
{
|
||||
_init = false;
|
||||
RunSplendid(SplendidCommand.Init);
|
||||
RunSplendid(SplendidCommand.GamutMode, 0, mode);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SetVisual(SplendidCommand mode = SplendidCommand.Default, int whiteBalance = 50)
|
||||
{
|
||||
int balance = mode == SplendidCommand.Eyecare ? 2 : whiteBalance;
|
||||
if (RunSplendid(mode, 0, balance)) return;
|
||||
|
||||
if (_init)
|
||||
{
|
||||
_init = false;
|
||||
RunSplendid(SplendidCommand.Init);
|
||||
RunSplendid(mode, 0, balance);
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetSplendidPath()
|
||||
{
|
||||
if (_splendidPath == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var searcher = new ManagementObjectSearcher(@"Select * from Win32_SystemDriver WHERE Name='ATKWMIACPIIO'"))
|
||||
{
|
||||
foreach (var driver in searcher.Get())
|
||||
{
|
||||
string path = driver["PathName"].ToString();
|
||||
_splendidPath = Path.GetDirectoryName(path) + "\\AsusSplendid.exe";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.WriteLine(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
return _splendidPath;
|
||||
}
|
||||
|
||||
private static bool RunSplendid(SplendidCommand command, int? param1 = null, int? param2 = null)
|
||||
{
|
||||
var splendid = GetSplendidPath();
|
||||
bool isGameVisual = Directory.Exists(GetGameVisualPath());
|
||||
bool isSplenddid = File.Exists(splendid);
|
||||
|
||||
if (isSplenddid)
|
||||
{
|
||||
if (command == SplendidCommand.DimmingVisual && !isGameVisual) command = SplendidCommand.DimmingAsus;
|
||||
var result = ProcessHelper.RunCMD(splendid, (int)command + " " + param1 + " " + param2);
|
||||
if (result.Contains("file not exist") || (result.Length == 0 && isGameVisual)) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void BrightnessTimerTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
|
||||
{
|
||||
brightnessTimer.Stop();
|
||||
|
||||
|
||||
if (RunSplendid(SplendidCommand.DimmingVisual, 0, (int)(40 + _brightness * 0.6))) return;
|
||||
|
||||
if (_init)
|
||||
{
|
||||
_init = false;
|
||||
RunSplendid(SplendidCommand.Init);
|
||||
RunSplendid(SplendidCommand.Init, 4);
|
||||
if (RunSplendid(SplendidCommand.DimmingVisual, 0, (int)(40 + _brightness * 0.6))) return;
|
||||
}
|
||||
|
||||
// GammaRamp Fallback
|
||||
SetGamma(_brightness);
|
||||
}
|
||||
|
||||
public static int SetBrightness(int brightness = -1, int delta = 0)
|
||||
{
|
||||
if (!AppConfig.IsOLED()) return -1;
|
||||
|
||||
if (brightness < 0) brightness = AppConfig.Get("brightness", 100);
|
||||
|
||||
_brightness = Math.Max(0, Math.Min(100, brightness + delta));
|
||||
AppConfig.Set("brightness", _brightness);
|
||||
|
||||
brightnessTimer.Start();
|
||||
|
||||
Program.settingsForm.VisualiseBrightness();
|
||||
|
||||
return _brightness;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void SetGamma(int brightness = 100)
|
||||
{
|
||||
var bright = Math.Round((float)brightness / 200 + 0.5, 2);
|
||||
|
||||
var screenName = ScreenNative.FindLaptopScreen();
|
||||
if (screenName is null) return;
|
||||
|
||||
try
|
||||
{
|
||||
var handle = ScreenNative.CreateDC(screenName, screenName, null, IntPtr.Zero);
|
||||
if (gammaRamp is null)
|
||||
{
|
||||
var gammaDump = new GammaRamp();
|
||||
if (ScreenNative.GetDeviceGammaRamp(handle, ref gammaDump))
|
||||
{
|
||||
gammaRamp = new DisplayGammaRamp(gammaDump);
|
||||
//Logger.WriteLine("Gamma R: " + string.Join("-", gammaRamp.Red));
|
||||
//Logger.WriteLine("Gamma G: " + string.Join("-", gammaRamp.Green));
|
||||
//Logger.WriteLine("Gamma B: " + string.Join("-", gammaRamp.Blue));
|
||||
}
|
||||
}
|
||||
|
||||
if (gammaRamp is null || !gammaRamp.IsOriginal())
|
||||
{
|
||||
Logger.WriteLine("Not default Gamma");
|
||||
gammaRamp = new DisplayGammaRamp();
|
||||
}
|
||||
|
||||
var ramp = gammaRamp.AsBrightnessRamp(bright);
|
||||
bool result = ScreenNative.SetDeviceGammaRamp(handle, ref ramp);
|
||||
|
||||
Logger.WriteLine("Gamma " + bright.ToString() + ": " + result);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.WriteLine(ex.ToString());
|
||||
}
|
||||
|
||||
//ScreenBrightness.Set(60 + (int)(40 * bright));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -210,11 +210,6 @@ namespace GHelper
|
||||
checkUSBC.Visible = false;
|
||||
}
|
||||
|
||||
if (AppConfig.IsOLED())
|
||||
{
|
||||
checkNoOverdrive.Visible = false;
|
||||
}
|
||||
|
||||
// Change text and hide irrelevant options on the ROG Ally,
|
||||
// which is a bit of a special case piece of hardware.
|
||||
if (AppConfig.IsAlly())
|
||||
@@ -362,7 +357,7 @@ namespace GHelper
|
||||
checkTopmost.Checked = AppConfig.Is("topmost");
|
||||
checkTopmost.CheckedChanged += CheckTopmost_CheckedChanged; ;
|
||||
|
||||
checkNoOverdrive.Checked = AppConfig.IsNoOverdrive();
|
||||
checkNoOverdrive.Checked = AppConfig.Is("no_overdrive");
|
||||
checkNoOverdrive.CheckedChanged += CheckNoOverdrive_CheckedChanged;
|
||||
|
||||
checkUSBC.Checked = AppConfig.Is("optimized_usbc");
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace GHelper
|
||||
labelPowerLimits.Text = Properties.Strings.PowerLimits;
|
||||
checkApplyPower.Text = Properties.Strings.ApplyPowerLimits;
|
||||
|
||||
labelFans.Text = "BIOS " + Properties.Strings.FanCurves;
|
||||
labelFans.Text = Properties.Strings.FanCurves;
|
||||
labelBoost.Text = Properties.Strings.CPUBoost;
|
||||
buttonReset.Text = Properties.Strings.FactoryDefaults;
|
||||
checkApplyFans.Text = Properties.Strings.ApplyFanCurve;
|
||||
@@ -1008,7 +1008,7 @@ namespace GHelper
|
||||
try
|
||||
{
|
||||
if (chartCount > 2)
|
||||
Size = MinimumSize = new Size(Size.Width, Math.Max(MinimumSize.Height, (int)(ControlHelper.GetDpiScale(this).Value * (chartCount * 200 + 100))));
|
||||
Size = MinimumSize = new Size(Size.Width, (int)(ControlHelper.GetDpiScale(this).Value * (chartCount * 200 + 100)));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -1115,7 +1115,6 @@ namespace GHelper
|
||||
if (gpuVisible)
|
||||
{
|
||||
int gpuPowerVar = Program.acpi.DeviceGet(AsusACPI.GPU_POWER);
|
||||
Logger.WriteLine("Default GPU Power: " + gpuPowerVar);
|
||||
|
||||
trackGPUClockLimit.Value = NvidiaGpuControl.MaxClockLimit;
|
||||
trackGPUCore.Value = 0;
|
||||
@@ -1123,7 +1122,7 @@ namespace GHelper
|
||||
|
||||
trackGPUBoost.Value = AsusACPI.MaxGPUBoost;
|
||||
trackGPUTemp.Value = AsusACPI.MaxGPUTemp;
|
||||
trackGPUPower.Value = Math.Max(Math.Min((gpuPowerVar >= 0) ? gpuPowerVar : AsusACPI.MaxGPUPower, AsusACPI.MaxGPUPower), AsusACPI.MinGPUPower);
|
||||
trackGPUPower.Value = (gpuPowerVar >= 0) ? gpuPowerVar : AsusACPI.MaxGPUPower;
|
||||
|
||||
AppConfig.SetMode("gpu_boost", trackGPUBoost.Value);
|
||||
AppConfig.SetMode("gpu_temp", trackGPUTemp.Value);
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
|
||||
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
||||
<AssemblyVersion>0.158</AssemblyVersion>
|
||||
<AssemblyVersion>0.156</AssemblyVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
@@ -88,6 +88,14 @@
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="RTSSSharedMemoryNET">
|
||||
<HintPath>RTSSSharedMemoryNET.dll</HintPath>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Update="Properties\Resources.Designer.cs">
|
||||
<DesignTime>True</DesignTime>
|
||||
|
||||
@@ -14,18 +14,24 @@ Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|Any CPU.ActiveCfg = Debug|x64
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|Any CPU.Build.0 = Debug|x64
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|Any CPU.ActiveCfg = Release|x64
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|Any CPU.Build.0 = Release|x64
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|x64.ActiveCfg = Release|x64
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|x64.Build.0 = Release|x64
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -101,6 +101,8 @@ namespace GHelper.Helpers
|
||||
if (Program.settingsForm.Visible)
|
||||
Program.screenControl.InitScreen();
|
||||
|
||||
Program.screenControl.SetBrightness();
|
||||
|
||||
}
|
||||
|
||||
private static int CheckAndSaveLidAction()
|
||||
|
||||
@@ -122,7 +122,7 @@ namespace GHelper.Helpers
|
||||
}
|
||||
}
|
||||
|
||||
public static string RunCMD(string name, string args)
|
||||
public static void RunCMD(string name, string args)
|
||||
{
|
||||
var cmd = new Process();
|
||||
cmd.StartInfo.UseShellExecute = false;
|
||||
@@ -133,13 +133,13 @@ namespace GHelper.Helpers
|
||||
cmd.StartInfo.Arguments = args;
|
||||
cmd.Start();
|
||||
|
||||
Logger.WriteLine(name + " " + args);
|
||||
Logger.WriteLine(args);
|
||||
|
||||
string result = cmd.StandardOutput.ReadToEnd().Replace(Environment.NewLine, " ").Trim(' ');
|
||||
|
||||
Logger.WriteLine(result);
|
||||
|
||||
cmd.WaitForExit();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ namespace GHelper.Input
|
||||
|
||||
InitBacklightTimer();
|
||||
|
||||
if (AppConfig.IsVivoZenbook()) Program.acpi.DeviceSet(AsusACPI.FnLock, AppConfig.Is("fn_lock") ? 1 : 0, "FnLock");
|
||||
if (AppConfig.ContainsModel("VivoBook")) Program.acpi.DeviceSet(AsusACPI.FnLock, AppConfig.Is("fn_lock") ? 1 : 0, "FnLock");
|
||||
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ namespace GHelper.Input
|
||||
|
||||
// FN-Lock group
|
||||
|
||||
if (AppConfig.Is("fn_lock") && !AppConfig.IsVivoZenbook())
|
||||
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
|
||||
@@ -244,13 +244,6 @@ namespace GHelper.Input
|
||||
|
||||
}
|
||||
|
||||
static void SetBrightnessDimming(int delta)
|
||||
{
|
||||
int brightness = VisualControl.SetBrightness(delta: delta);
|
||||
if (brightness >= 0)
|
||||
Program.toast.RunToast(brightness + "%", (delta < 0) ? ToastIcon.BrightnessDown : ToastIcon.BrightnessUp);
|
||||
}
|
||||
|
||||
public void KeyPressed(object sender, KeyPressedEventArgs e)
|
||||
{
|
||||
|
||||
@@ -507,7 +500,7 @@ namespace GHelper.Input
|
||||
case "micmute":
|
||||
bool muteStatus = Audio.ToggleMute();
|
||||
Program.toast.RunToast(muteStatus ? "Muted" : "Unmuted", muteStatus ? ToastIcon.MicrophoneMute : ToastIcon.Microphone);
|
||||
if (AppConfig.IsVivoZenbook()) Program.acpi.DeviceSet(AsusACPI.MicMuteLed, muteStatus ? 1 : 0, "MicmuteLed");
|
||||
if (AppConfig.IsVivobook()) Program.acpi.DeviceSet(AsusACPI.MicMuteLed, muteStatus ? 1 : 0, "MicmuteLed");
|
||||
break;
|
||||
case "brightness_up":
|
||||
SetBrightness(+10);
|
||||
@@ -575,7 +568,7 @@ namespace GHelper.Input
|
||||
int fnLock = AppConfig.Is("fn_lock") ? 0 : 1;
|
||||
AppConfig.Set("fn_lock", fnLock);
|
||||
|
||||
if (AppConfig.IsVivoZenbook())
|
||||
if (AppConfig.ContainsModel("VivoBook"))
|
||||
Program.acpi.DeviceSet(AsusACPI.FnLock, fnLock == 1 ? 1 : 0, "FnLock");
|
||||
else
|
||||
Program.settingsForm.BeginInvoke(Program.inputDispatcher.RegisterKeys);
|
||||
@@ -683,8 +676,7 @@ namespace GHelper.Input
|
||||
return;
|
||||
case 51: // Fn+F6 on old TUFs
|
||||
case 53: // Fn+F6 on GA-502DU model
|
||||
SleepEvent();
|
||||
//NativeMethods.TurnOffScreen();
|
||||
NativeMethods.TurnOffScreen();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -705,14 +697,8 @@ namespace GHelper.Input
|
||||
if (AppConfig.IsDUO()) SetScreenpad(-10);
|
||||
else Program.settingsForm.BeginInvoke(Program.settingsForm.CycleMatrix, -1);
|
||||
}
|
||||
else if (Control.ModifierKeys == Keys.Control && AppConfig.IsOLED())
|
||||
{
|
||||
SetBrightnessDimming(-10);
|
||||
}
|
||||
else
|
||||
{
|
||||
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Down, "Brightness");
|
||||
}
|
||||
break;
|
||||
case 32: // FN+F8
|
||||
if (Control.ModifierKeys == Keys.Shift)
|
||||
@@ -720,14 +706,8 @@ namespace GHelper.Input
|
||||
if (AppConfig.IsDUO()) SetScreenpad(10);
|
||||
else Program.settingsForm.BeginInvoke(Program.settingsForm.CycleMatrix, 1);
|
||||
}
|
||||
else if (Control.ModifierKeys == Keys.Control && AppConfig.IsOLED())
|
||||
{
|
||||
SetBrightnessDimming(10);
|
||||
}
|
||||
else
|
||||
{
|
||||
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Up, "Brightness");
|
||||
}
|
||||
break;
|
||||
case 133: // Camera Toggle
|
||||
ToggleCamera();
|
||||
|
||||
@@ -62,45 +62,39 @@ namespace GHelper.Mode
|
||||
|
||||
if (!Modes.Exists(mode)) mode = 0;
|
||||
|
||||
customFans = false;
|
||||
customPower = 0;
|
||||
|
||||
settings.ShowMode(mode);
|
||||
SetModeLabel();
|
||||
|
||||
Modes.SetCurrent(mode);
|
||||
|
||||
int status = Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.IsManualModeRequired() ? AsusACPI.PerformanceManual : Modes.GetBase(mode), "Mode");
|
||||
|
||||
Task.Run(async () =>
|
||||
// Vivobook fallback
|
||||
if (status != 1)
|
||||
{
|
||||
bool reset = AppConfig.IsResetRequired() && (Modes.GetBase(oldMode) == Modes.GetBase(mode)) && customPower > 0;
|
||||
|
||||
customFans = false;
|
||||
customPower = 0;
|
||||
SetModeLabel();
|
||||
|
||||
// Workaround for not properly resetting limits on G14 2024
|
||||
if (reset)
|
||||
{
|
||||
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, (Modes.GetBase(oldMode) != 1) ? AsusACPI.PerformanceTurbo : AsusACPI.PerformanceBalanced, "Reset");
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(1500));
|
||||
}
|
||||
|
||||
int status = Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.IsManualModeRequired() ? AsusACPI.PerformanceManual : Modes.GetBase(mode), "Mode");
|
||||
// Vivobook fallback
|
||||
if (status != 1) Program.acpi.SetVivoMode(Modes.GetBase(mode));
|
||||
|
||||
SetGPUClocks();
|
||||
|
||||
AutoFans();
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(1000));
|
||||
AutoPower();
|
||||
|
||||
|
||||
});
|
||||
|
||||
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()) XGM.Reset();
|
||||
|
||||
if (notify)
|
||||
Program.toast.RunToast(Modes.GetCurrentName(), SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online ? ToastIcon.Charger : ToastIcon.Battery);
|
||||
|
||||
SetGPUClocks();
|
||||
|
||||
Task.Run(async () =>
|
||||
{
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
||||
AutoFans();
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(1000));
|
||||
AutoPower();
|
||||
});
|
||||
|
||||
|
||||
// Power plan from config or defaulting to balanced
|
||||
|
||||
@@ -37,12 +37,7 @@
|
||||
}
|
||||
public override int DPIIncrements()
|
||||
{
|
||||
return 50;
|
||||
}
|
||||
|
||||
public override int MinDPI()
|
||||
{
|
||||
return 50;
|
||||
return 100;
|
||||
}
|
||||
|
||||
public override bool HasDebounceSetting()
|
||||
|
||||
@@ -7,10 +7,6 @@
|
||||
{
|
||||
}
|
||||
|
||||
public StrixImpactII(ushort pid) : base(0x0B05, pid, "mi_00", false)
|
||||
{
|
||||
}
|
||||
|
||||
public override int DPIProfileCount()
|
||||
{
|
||||
return 4;
|
||||
@@ -178,19 +174,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class StrixImpactIIElectroPunk : StrixImpactII
|
||||
{
|
||||
|
||||
public StrixImpactIIElectroPunk() : base(0x1956)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override string GetDisplayName()
|
||||
{
|
||||
return "ROG Strix Impact II Electro Punk";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,7 +209,6 @@ namespace GHelper.Peripherals
|
||||
DetectMouse(new PugioII());
|
||||
DetectMouse(new PugioIIWired());
|
||||
DetectMouse(new StrixImpactII());
|
||||
DetectMouse(new StrixImpactIIElectroPunk());
|
||||
DetectMouse(new Chakram());
|
||||
DetectMouse(new ChakramWired());
|
||||
DetectMouse(new ChakramCore());
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using GHelper.Ally;
|
||||
using GHelper.AutoTDP;
|
||||
using GHelper.Battery;
|
||||
using GHelper.Display;
|
||||
using GHelper.Gpu;
|
||||
@@ -32,7 +33,7 @@ namespace GHelper
|
||||
public static ModeControl modeControl = new ModeControl();
|
||||
public static GPUModeControl gpuControl = new GPUModeControl(settingsForm);
|
||||
public static AllyControl allyControl = new AllyControl(settingsForm);
|
||||
public static ScreenControl screenControl = new ScreenControl();
|
||||
public static ScreenControl screenControl = new ScreenControl();
|
||||
public static ClamshellModeControl clamshellControl = new ClamshellModeControl();
|
||||
|
||||
public static ToastForm toast = new ToastForm();
|
||||
@@ -46,6 +47,8 @@ namespace GHelper
|
||||
|
||||
private static PowerLineStatus isPlugged = SystemInformation.PowerStatus.PowerLineStatus;
|
||||
|
||||
public static AutoTDPService autoTDPService = new AutoTDPService();
|
||||
|
||||
// The main entry point for the application
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
@@ -306,6 +309,7 @@ namespace GHelper
|
||||
|
||||
static void OnExit(object sender, EventArgs e)
|
||||
{
|
||||
autoTDPService.Shutdown();
|
||||
trayIcon.Visible = false;
|
||||
PeripheralsProvider.UnregisterForDeviceEvents();
|
||||
clamshellControl.UnregisterDisplayEvents();
|
||||
|
||||
BIN
app/RTSSSharedMemoryNET.dll
Normal file
BIN
app/RTSSSharedMemoryNET.dll
Normal file
Binary file not shown.
@@ -13,7 +13,7 @@ namespace Ryzen
|
||||
internal class RyzenControl
|
||||
{
|
||||
|
||||
public static int MinCPUUV => AppConfig.Get("min_uv", -40);
|
||||
public static int MinCPUUV => AppConfig.Get("min_uv", -30);
|
||||
public const int MaxCPUUV = 0;
|
||||
|
||||
public const int MinIGPUUV = -20;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
138
app/Settings.Designer.cs
generated
138
app/Settings.Designer.cs
generated
@@ -67,6 +67,8 @@ namespace GHelper
|
||||
labelCPUFan = new Label();
|
||||
panelGPU = new Panel();
|
||||
labelTipGPU = new Label();
|
||||
tableAdditionalGPUFeature = new TableLayoutPanel();
|
||||
buttonAutoTDP = new RButton();
|
||||
tableAMD = new TableLayoutPanel();
|
||||
buttonOverlay = new RButton();
|
||||
buttonFPS = new RButton();
|
||||
@@ -123,9 +125,6 @@ namespace GHelper
|
||||
pictureAlly = new PictureBox();
|
||||
labelAlly = new Label();
|
||||
panelGamma = new Panel();
|
||||
tableVisual = new TableLayoutPanel();
|
||||
comboVisual = new RComboBox();
|
||||
comboGamut = new RComboBox();
|
||||
sliderGamma = new Slider();
|
||||
panelGammaTitle = new Panel();
|
||||
labelGamma = new Label();
|
||||
@@ -146,6 +145,7 @@ namespace GHelper
|
||||
panelCPUTitle.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)picturePerf).BeginInit();
|
||||
panelGPU.SuspendLayout();
|
||||
tableAdditionalGPUFeature.SuspendLayout();
|
||||
tableAMD.SuspendLayout();
|
||||
tableGPU.SuspendLayout();
|
||||
panelGPUTitle.SuspendLayout();
|
||||
@@ -171,7 +171,6 @@ namespace GHelper
|
||||
panelAllyTitle.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureAlly).BeginInit();
|
||||
panelGamma.SuspendLayout();
|
||||
tableVisual.SuspendLayout();
|
||||
panelGammaTitle.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureGamma).BeginInit();
|
||||
SuspendLayout();
|
||||
@@ -185,7 +184,7 @@ namespace GHelper
|
||||
panelMatrix.Controls.Add(tableLayoutMatrix);
|
||||
panelMatrix.Controls.Add(panelMatrixTitle);
|
||||
panelMatrix.Dock = DockStyle.Top;
|
||||
panelMatrix.Location = new Point(11, 1000);
|
||||
panelMatrix.Location = new Point(11, 950);
|
||||
panelMatrix.Margin = new Padding(0);
|
||||
panelMatrix.Name = "panelMatrix";
|
||||
panelMatrix.Padding = new Padding(20, 20, 20, 10);
|
||||
@@ -360,7 +359,7 @@ namespace GHelper
|
||||
panelBattery.Controls.Add(sliderBattery);
|
||||
panelBattery.Controls.Add(panelBatteryTitle);
|
||||
panelBattery.Dock = DockStyle.Top;
|
||||
panelBattery.Location = new Point(11, 1676);
|
||||
panelBattery.Location = new Point(11, 1626);
|
||||
panelBattery.Margin = new Padding(0);
|
||||
panelBattery.Name = "panelBattery";
|
||||
panelBattery.Padding = new Padding(20, 20, 20, 10);
|
||||
@@ -452,7 +451,7 @@ namespace GHelper
|
||||
panelFooter.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
panelFooter.Controls.Add(tableButtons);
|
||||
panelFooter.Dock = DockStyle.Top;
|
||||
panelFooter.Location = new Point(11, 1851);
|
||||
panelFooter.Location = new Point(11, 1801);
|
||||
panelFooter.Margin = new Padding(0);
|
||||
panelFooter.Name = "panelFooter";
|
||||
panelFooter.Padding = new Padding(20);
|
||||
@@ -727,6 +726,7 @@ namespace GHelper
|
||||
panelGPU.AutoSize = true;
|
||||
panelGPU.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
panelGPU.Controls.Add(labelTipGPU);
|
||||
panelGPU.Controls.Add(tableAdditionalGPUFeature);
|
||||
panelGPU.Controls.Add(tableAMD);
|
||||
panelGPU.Controls.Add(tableGPU);
|
||||
panelGPU.Controls.Add(panelGPUTitle);
|
||||
@@ -749,6 +749,46 @@ namespace GHelper
|
||||
labelTipGPU.Size = new Size(787, 36);
|
||||
labelTipGPU.TabIndex = 20;
|
||||
//
|
||||
// tableAdditionalGPUFeature
|
||||
//
|
||||
tableAdditionalGPUFeature.AutoSize = true;
|
||||
tableAdditionalGPUFeature.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
tableAdditionalGPUFeature.ColumnCount = 3;
|
||||
tableAdditionalGPUFeature.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));
|
||||
tableAdditionalGPUFeature.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));
|
||||
tableAdditionalGPUFeature.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));
|
||||
tableAdditionalGPUFeature.Controls.Add(buttonAutoTDP, 0, 0);
|
||||
tableAdditionalGPUFeature.Dock = DockStyle.Top;
|
||||
tableAdditionalGPUFeature.Location = new Point(10, 198);
|
||||
tableAdditionalGPUFeature.Margin = new Padding(2, 1, 2, 1);
|
||||
tableAdditionalGPUFeature.Name = "tableAdditionalGPUFeature";
|
||||
tableAdditionalGPUFeature.RowCount = 1;
|
||||
tableAdditionalGPUFeature.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
|
||||
tableAdditionalGPUFeature.Size = new Size(392, 60);
|
||||
tableAdditionalGPUFeature.TabIndex = 25;
|
||||
//
|
||||
// buttonAutoTDP
|
||||
//
|
||||
buttonAutoTDP.Activated = false;
|
||||
buttonAutoTDP.BackColor = SystemColors.ControlLightLight;
|
||||
buttonAutoTDP.BorderColor = Color.Transparent;
|
||||
buttonAutoTDP.BorderRadius = 5;
|
||||
buttonAutoTDP.Dock = DockStyle.Fill;
|
||||
buttonAutoTDP.FlatAppearance.BorderSize = 0;
|
||||
buttonAutoTDP.FlatStyle = FlatStyle.Flat;
|
||||
buttonAutoTDP.ForeColor = SystemColors.ControlText;
|
||||
buttonAutoTDP.Image = Properties.Resources.icons8_processor_32;
|
||||
buttonAutoTDP.ImageAlign = ContentAlignment.MiddleRight;
|
||||
buttonAutoTDP.Location = new Point(1, 1);
|
||||
buttonAutoTDP.Margin = new Padding(1, 1, 1, 1);
|
||||
buttonAutoTDP.Name = "buttonAutoTDP";
|
||||
buttonAutoTDP.Secondary = false;
|
||||
buttonAutoTDP.Size = new Size(128, 38);
|
||||
buttonAutoTDP.TabIndex = 11;
|
||||
buttonAutoTDP.Text = "Auto TDP";
|
||||
buttonAutoTDP.TextImageRelation = TextImageRelation.ImageBeforeText;
|
||||
buttonAutoTDP.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// tableAMD
|
||||
//
|
||||
tableAMD.AutoSize = true;
|
||||
@@ -1199,7 +1239,7 @@ namespace GHelper
|
||||
panelKeyboard.Controls.Add(tableLayoutKeyboard);
|
||||
panelKeyboard.Controls.Add(panelKeyboardTitle);
|
||||
panelKeyboard.Dock = DockStyle.Top;
|
||||
panelKeyboard.Location = new Point(11, 1334);
|
||||
panelKeyboard.Location = new Point(11, 1284);
|
||||
panelKeyboard.Margin = new Padding(0);
|
||||
panelKeyboard.Name = "panelKeyboard";
|
||||
panelKeyboard.Padding = new Padding(20);
|
||||
@@ -1375,7 +1415,7 @@ namespace GHelper
|
||||
panelVersion.Controls.Add(labelCharge);
|
||||
panelVersion.Controls.Add(checkStartup);
|
||||
panelVersion.Dock = DockStyle.Top;
|
||||
panelVersion.Location = new Point(11, 1795);
|
||||
panelVersion.Location = new Point(11, 1745);
|
||||
panelVersion.Margin = new Padding(4);
|
||||
panelVersion.Name = "panelVersion";
|
||||
panelVersion.Size = new Size(827, 56);
|
||||
@@ -1400,7 +1440,7 @@ namespace GHelper
|
||||
panelPeripherals.Controls.Add(tableLayoutPeripherals);
|
||||
panelPeripherals.Controls.Add(panelPeripheralsTile);
|
||||
panelPeripherals.Dock = DockStyle.Top;
|
||||
panelPeripherals.Location = new Point(11, 1478);
|
||||
panelPeripherals.Location = new Point(11, 1428);
|
||||
panelPeripherals.Margin = new Padding(0);
|
||||
panelPeripherals.Name = "panelPeripherals";
|
||||
panelPeripherals.Padding = new Padding(20, 20, 20, 10);
|
||||
@@ -1542,7 +1582,7 @@ namespace GHelper
|
||||
panelAlly.Controls.Add(tableLayoutAlly);
|
||||
panelAlly.Controls.Add(panelAllyTitle);
|
||||
panelAlly.Dock = DockStyle.Top;
|
||||
panelAlly.Location = new Point(11, 1194);
|
||||
panelAlly.Location = new Point(11, 1144);
|
||||
panelAlly.Margin = new Padding(0);
|
||||
panelAlly.Name = "panelAlly";
|
||||
panelAlly.Padding = new Padding(20, 20, 20, 0);
|
||||
@@ -1674,7 +1714,6 @@ namespace GHelper
|
||||
//
|
||||
panelGamma.AutoSize = true;
|
||||
panelGamma.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
panelGamma.Controls.Add(tableVisual);
|
||||
panelGamma.Controls.Add(sliderGamma);
|
||||
panelGamma.Controls.Add(panelGammaTitle);
|
||||
panelGamma.Dock = DockStyle.Top;
|
||||
@@ -1682,78 +1721,23 @@ namespace GHelper
|
||||
panelGamma.Margin = new Padding(0);
|
||||
panelGamma.Name = "panelGamma";
|
||||
panelGamma.Padding = new Padding(20, 20, 20, 10);
|
||||
panelGamma.Size = new Size(827, 173);
|
||||
panelGamma.Size = new Size(827, 123);
|
||||
panelGamma.TabIndex = 9;
|
||||
panelGamma.Visible = false;
|
||||
//
|
||||
// tableVisual
|
||||
//
|
||||
tableVisual.AutoSize = true;
|
||||
tableVisual.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
tableVisual.ColumnCount = 3;
|
||||
tableVisual.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));
|
||||
tableVisual.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));
|
||||
tableVisual.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));
|
||||
tableVisual.Controls.Add(comboVisual, 0, 0);
|
||||
tableVisual.Controls.Add(comboGamut, 0, 0);
|
||||
tableVisual.Dock = DockStyle.Top;
|
||||
tableVisual.Location = new Point(20, 104);
|
||||
tableVisual.Margin = new Padding(8);
|
||||
tableVisual.Name = "tableVisual";
|
||||
tableVisual.RowCount = 1;
|
||||
tableVisual.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
|
||||
tableVisual.Size = new Size(787, 59);
|
||||
tableVisual.TabIndex = 41;
|
||||
tableVisual.Visible = false;
|
||||
//
|
||||
// comboVisual
|
||||
//
|
||||
comboVisual.BorderColor = Color.White;
|
||||
comboVisual.ButtonColor = Color.FromArgb(255, 255, 255);
|
||||
comboVisual.Dock = DockStyle.Top;
|
||||
comboVisual.FlatStyle = FlatStyle.Flat;
|
||||
comboVisual.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
|
||||
comboVisual.FormattingEnabled = true;
|
||||
comboVisual.ItemHeight = 32;
|
||||
comboVisual.Items.AddRange(new object[] { "Static", "Breathe", "Rainbow", "Strobe" });
|
||||
comboVisual.Location = new Point(266, 11);
|
||||
comboVisual.Margin = new Padding(4, 11, 4, 8);
|
||||
comboVisual.Name = "comboVisual";
|
||||
comboVisual.Size = new Size(254, 40);
|
||||
comboVisual.TabIndex = 14;
|
||||
comboVisual.Visible = false;
|
||||
//
|
||||
// comboGamut
|
||||
//
|
||||
comboGamut.BorderColor = Color.White;
|
||||
comboGamut.ButtonColor = Color.FromArgb(255, 255, 255);
|
||||
comboGamut.Dock = DockStyle.Top;
|
||||
comboGamut.FlatStyle = FlatStyle.Flat;
|
||||
comboGamut.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
|
||||
comboGamut.FormattingEnabled = true;
|
||||
comboGamut.ItemHeight = 32;
|
||||
comboGamut.Items.AddRange(new object[] { "Static", "Breathe", "Rainbow", "Strobe" });
|
||||
comboGamut.Location = new Point(4, 11);
|
||||
comboGamut.Margin = new Padding(4, 11, 4, 8);
|
||||
comboGamut.Name = "comboGamut";
|
||||
comboGamut.Size = new Size(254, 40);
|
||||
comboGamut.TabIndex = 13;
|
||||
comboGamut.Visible = false;
|
||||
//
|
||||
// sliderGamma
|
||||
//
|
||||
sliderGamma.Dock = DockStyle.Top;
|
||||
sliderGamma.Location = new Point(20, 64);
|
||||
sliderGamma.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
||||
sliderGamma.Location = new Point(40, 69);
|
||||
sliderGamma.Margin = new Padding(4);
|
||||
sliderGamma.Max = 100;
|
||||
sliderGamma.Min = 0;
|
||||
sliderGamma.Name = "sliderGamma";
|
||||
sliderGamma.Size = new Size(787, 40);
|
||||
sliderGamma.Size = new Size(752, 40);
|
||||
sliderGamma.Step = 10;
|
||||
sliderGamma.TabIndex = 20;
|
||||
sliderGamma.Text = "sliderGamma";
|
||||
sliderGamma.Value = 100;
|
||||
sliderGamma.Visible = false;
|
||||
//
|
||||
// panelGammaTitle
|
||||
//
|
||||
@@ -1796,7 +1780,7 @@ namespace GHelper
|
||||
labelGammaTitle.Location = new Point(43, 0);
|
||||
labelGammaTitle.Margin = new Padding(8, 0, 8, 0);
|
||||
labelGammaTitle.Name = "labelGammaTitle";
|
||||
labelGammaTitle.Size = new Size(506, 32);
|
||||
labelGammaTitle.Size = new Size(307, 32);
|
||||
labelGammaTitle.TabIndex = 37;
|
||||
labelGammaTitle.Text = "Flicker-free Dimming";
|
||||
//
|
||||
@@ -1806,7 +1790,7 @@ namespace GHelper
|
||||
AutoScaleMode = AutoScaleMode.Dpi;
|
||||
AutoSize = true;
|
||||
AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
ClientSize = new Size(849, 1759);
|
||||
ClientSize = new Size(849, 2119);
|
||||
Controls.Add(panelFooter);
|
||||
Controls.Add(panelVersion);
|
||||
Controls.Add(panelBattery);
|
||||
@@ -1850,6 +1834,7 @@ namespace GHelper
|
||||
((System.ComponentModel.ISupportInitialize)picturePerf).EndInit();
|
||||
panelGPU.ResumeLayout(false);
|
||||
panelGPU.PerformLayout();
|
||||
tableAdditionalGPUFeature.ResumeLayout(false);
|
||||
tableAMD.ResumeLayout(false);
|
||||
tableGPU.ResumeLayout(false);
|
||||
panelGPUTitle.ResumeLayout(false);
|
||||
@@ -1886,8 +1871,6 @@ namespace GHelper
|
||||
panelAllyTitle.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureAlly).EndInit();
|
||||
panelGamma.ResumeLayout(false);
|
||||
panelGamma.PerformLayout();
|
||||
tableVisual.ResumeLayout(false);
|
||||
panelGammaTitle.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)pictureGamma).EndInit();
|
||||
ResumeLayout(false);
|
||||
@@ -1993,8 +1976,7 @@ namespace GHelper
|
||||
private Label labelGammaTitle;
|
||||
private CheckBox checkMatrixLid;
|
||||
private Panel panelMatrixAuto;
|
||||
private TableLayoutPanel tableVisual;
|
||||
private RComboBox comboVisual;
|
||||
private RComboBox comboGamut;
|
||||
private TableLayoutPanel tableAdditionalGPUFeature;
|
||||
private RButton buttonAutoTDP;
|
||||
}
|
||||
}
|
||||
|
||||
128
app/Settings.cs
128
app/Settings.cs
@@ -1,5 +1,6 @@
|
||||
using GHelper.Ally;
|
||||
using GHelper.AnimeMatrix;
|
||||
using GHelper.AutoTDP;
|
||||
using GHelper.AutoUpdate;
|
||||
using GHelper.Battery;
|
||||
using GHelper.Display;
|
||||
@@ -24,10 +25,11 @@ namespace GHelper
|
||||
|
||||
public GPUModeControl gpuControl;
|
||||
public AllyControl allyControl;
|
||||
ScreenControl screenControl = new ScreenControl();
|
||||
ScreenControl screenControl = new ScreenControl();
|
||||
AutoUpdateControl updateControl;
|
||||
|
||||
AsusMouseSettings? mouseSettings;
|
||||
AutoTDPUI? autoTdpUi;
|
||||
|
||||
public AniMatrixControl matrixControl;
|
||||
|
||||
@@ -48,8 +50,6 @@ namespace GHelper
|
||||
bool batteryMouseOver = false;
|
||||
bool batteryFullMouseOver = false;
|
||||
|
||||
bool sliderGammaIgnore = false;
|
||||
|
||||
public SettingsForm()
|
||||
{
|
||||
|
||||
@@ -118,7 +118,7 @@ namespace GHelper
|
||||
buttonScreenAuto.AccessibleName = Properties.Strings.AutoMode;
|
||||
//button60Hz.AccessibleName = "60Hz Refresh Rate";
|
||||
//button120Hz.AccessibleName = "Maximum Refresh Rate";
|
||||
|
||||
|
||||
panelKeyboard.AccessibleName = Properties.Strings.LaptopKeyboard;
|
||||
buttonKeyboard.AccessibleName = Properties.Strings.ExtraSettings;
|
||||
buttonKeyboardColor.AccessibleName = Properties.Strings.LaptopKeyboard + " " + Properties.Strings.Color;
|
||||
@@ -221,7 +221,7 @@ namespace GHelper
|
||||
sliderBattery.ValueChanged += SliderBattery_ValueChanged;
|
||||
Program.trayIcon.MouseMove += TrayIcon_MouseMove;
|
||||
|
||||
sensorTimer = new System.Timers.Timer(AppConfig.Get("sensor_timer", 1000));
|
||||
sensorTimer = new System.Timers.Timer(AppConfig.Get("sensor_timer",1000));
|
||||
sensorTimer.Elapsed += OnTimedEvent;
|
||||
sensorTimer.Enabled = true;
|
||||
|
||||
@@ -246,6 +246,8 @@ namespace GHelper
|
||||
buttonFPS.Click += ButtonFPS_Click;
|
||||
buttonOverlay.Click += ButtonOverlay_Click;
|
||||
|
||||
buttonAutoTDP.Click += ButtonAutoTDP_Click;
|
||||
|
||||
Text = "G-Helper " + (ProcessHelper.IsUserAdministrator() ? "—" : "-") + " " + AppConfig.GetModelShort();
|
||||
TopMost = AppConfig.Is("topmost");
|
||||
|
||||
@@ -257,83 +259,58 @@ namespace GHelper
|
||||
buttonFnLock.Click += ButtonFnLock_Click;
|
||||
|
||||
panelPerformance.Focus();
|
||||
InitVisual();
|
||||
|
||||
InitBrightness();
|
||||
}
|
||||
|
||||
|
||||
public void InitVisual()
|
||||
public void InitBrightness()
|
||||
{
|
||||
|
||||
bool dimming = false;
|
||||
|
||||
if (AppConfig.IsOLED())
|
||||
{
|
||||
dimming = true;
|
||||
labelGammaTitle.Text = "Flicker-free Dimming";
|
||||
panelGamma.Visible = true;
|
||||
sliderGamma.Visible = true;
|
||||
VisualiseBrightness();
|
||||
sliderGamma.ValueChanged += SliderGamma_ValueChanged;
|
||||
}
|
||||
|
||||
var gamuts = VisualControl.GetGamutModes();
|
||||
if (gamuts.Count < 1) return;
|
||||
|
||||
if (!dimming) labelGammaTitle.Text = "Visual Mode";
|
||||
else labelGammaTitle.Text += " / Visual";
|
||||
if (!AppConfig.IsOLED()) return;
|
||||
|
||||
panelGamma.Visible = true;
|
||||
tableVisual.Visible = true;
|
||||
|
||||
comboVisual.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
comboVisual.DataSource = new BindingSource(VisualControl.GetVisualModes(), null);
|
||||
comboVisual.DisplayMember = "Value";
|
||||
comboVisual.ValueMember = "Key";
|
||||
comboVisual.SelectedValue = (SplendidCommand)AppConfig.Get("visual", (int)SplendidCommand.Default);
|
||||
|
||||
comboVisual.SelectedValueChanged += ComboVisual_SelectedValueChanged;
|
||||
comboVisual.Visible = true;
|
||||
|
||||
if (gamuts.Count <= 1) return;
|
||||
|
||||
comboGamut.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
comboGamut.DataSource = new BindingSource(gamuts, null);
|
||||
comboGamut.DisplayMember = "Value";
|
||||
comboGamut.ValueMember = "Key";
|
||||
comboGamut.SelectedValue = (SplendidGamut)AppConfig.Get("gamut", (int)SplendidGamut.Native);
|
||||
|
||||
comboGamut.SelectedValueChanged += ComboGamut_SelectedValueChanged;
|
||||
comboGamut.Visible = true;
|
||||
int brightness = AppConfig.Get("brightness");
|
||||
if (brightness >= 0) sliderGamma.Value = brightness;
|
||||
|
||||
sliderGamma.ValueChanged += SliderGamma_ValueChanged;
|
||||
labelGamma.Text = sliderGamma.Value + "%";
|
||||
}
|
||||
|
||||
private void ComboGamut_SelectedValueChanged(object? sender, EventArgs e)
|
||||
{
|
||||
AppConfig.Set("gamut", (int)comboGamut.SelectedValue);
|
||||
VisualControl.SetGamut((int)comboGamut.SelectedValue);
|
||||
}
|
||||
|
||||
private void ComboVisual_SelectedValueChanged(object? sender, EventArgs e)
|
||||
private void ButtonAutoTDP_Click(object? sender, EventArgs e)
|
||||
{
|
||||
AppConfig.Set("visual", (int)comboVisual.SelectedValue);
|
||||
VisualControl.SetVisual((SplendidCommand)comboVisual.SelectedValue);
|
||||
}
|
||||
|
||||
public void VisualiseBrightness()
|
||||
{
|
||||
Invoke(delegate
|
||||
if (autoTdpUi is not null)
|
||||
{
|
||||
sliderGammaIgnore = true;
|
||||
sliderGamma.Value = AppConfig.Get("brightness", 100);
|
||||
labelGamma.Text = sliderGamma.Value + "%";
|
||||
sliderGammaIgnore = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
autoTdpUi = new AutoTDPUI();
|
||||
autoTdpUi.FormClosed += AutoTdpUi_FormClosed;
|
||||
autoTdpUi.Disposed += AutoTdpUi_Disposed;
|
||||
if (!autoTdpUi.IsDisposed)
|
||||
{
|
||||
autoTdpUi.Show();
|
||||
}
|
||||
else
|
||||
{
|
||||
autoTdpUi = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void AutoTdpUi_Disposed(object? sender, EventArgs e)
|
||||
{
|
||||
autoTdpUi = null;
|
||||
}
|
||||
|
||||
private void AutoTdpUi_FormClosed(object? sender, FormClosedEventArgs e)
|
||||
{
|
||||
autoTdpUi = null;
|
||||
}
|
||||
|
||||
private void SliderGamma_ValueChanged(object? sender, EventArgs e)
|
||||
{
|
||||
if (sliderGammaIgnore) return;
|
||||
VisualControl.SetBrightness(sliderGamma.Value);
|
||||
screenControl.SetBrightness(sliderGamma.Value);
|
||||
labelGamma.Text = sliderGamma.Value + "%";
|
||||
}
|
||||
|
||||
private void ButtonOverlay_Click(object? sender, EventArgs e)
|
||||
@@ -407,7 +384,7 @@ namespace GHelper
|
||||
|
||||
public void VisualiseBacklight(int backlight)
|
||||
{
|
||||
buttonBacklight.Text = Math.Round((double)backlight * 33.33).ToString() + "%";
|
||||
buttonBacklight.Text = Math.Round((double)backlight*33.33).ToString() + "%";
|
||||
}
|
||||
|
||||
public void VisualiseFPSLimit(int limit)
|
||||
@@ -480,6 +457,8 @@ namespace GHelper
|
||||
|
||||
Task.Run((Action)RefreshPeripheralsBattery);
|
||||
updateControl.CheckForUpdates();
|
||||
|
||||
tableAdditionalGPUFeature.Visible = AutoTDPService.IsAvailable();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -904,7 +883,7 @@ namespace GHelper
|
||||
FansToggle();
|
||||
}
|
||||
|
||||
private void SetColorPicker(string colorField = "aura_color")
|
||||
private void SetColorPicker(string colorField = "aura_color")
|
||||
{
|
||||
ColorDialog colorDlg = new ColorDialog();
|
||||
colorDlg.AllowFullOpen = true;
|
||||
@@ -1009,7 +988,7 @@ namespace GHelper
|
||||
|
||||
buttonMatrix.Visible = false;
|
||||
checkMatrixLid.Visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
comboMatrix.SelectedIndex = Math.Min(AppConfig.Get("matrix_brightness", 0), comboMatrix.Items.Count - 1);
|
||||
comboMatrixRunning.SelectedIndex = Math.Min(AppConfig.Get("matrix_running", 0), comboMatrixRunning.Items.Count - 1);
|
||||
@@ -1150,6 +1129,7 @@ namespace GHelper
|
||||
|
||||
private void ButtonQuit_Click(object? sender, EventArgs e)
|
||||
{
|
||||
Program.autoTDPService.Shutdown();
|
||||
matrixControl.Dispose();
|
||||
Close();
|
||||
Program.trayIcon.Visible = false;
|
||||
@@ -1342,13 +1322,11 @@ namespace GHelper
|
||||
{
|
||||
if (InvokeRequired)
|
||||
{
|
||||
Invoke(delegate
|
||||
{
|
||||
Invoke(delegate {
|
||||
labelPerf.Text = modeText;
|
||||
panelPerformance.AccessibleName = labelPerf.Text;
|
||||
});
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
labelPerf.Text = modeText;
|
||||
panelPerformance.AccessibleName = labelPerf.Text;
|
||||
@@ -1523,7 +1501,7 @@ namespace GHelper
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
VisualizeXGM(GPUMode);
|
||||
|
||||
@@ -1697,7 +1675,7 @@ namespace GHelper
|
||||
return;
|
||||
}
|
||||
mouseSettings = new AsusMouseSettings(am);
|
||||
mouseSettings.TopMost = AppConfig.Is("topmost");
|
||||
mouseSettings.TopMost = true;
|
||||
mouseSettings.FormClosed += MouseSettings_FormClosed;
|
||||
mouseSettings.Disposed += MouseSettings_Disposed;
|
||||
if (!mouseSettings.IsDisposed)
|
||||
|
||||
@@ -97,16 +97,16 @@ public static class AsusHid
|
||||
try
|
||||
{
|
||||
stream.Write(data);
|
||||
if (log is not null) Logger.WriteLine($"{log} {device.ProductID.ToString("X")}: {BitConverter.ToString(data)}");
|
||||
Logger.WriteLine($"{log} {device.ProductID.ToString("X")}: {BitConverter.ToString(data)}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (log is not null) Logger.WriteLine($"Error writing {log} {device.ProductID.ToString("X")}: {ex.Message} {BitConverter.ToString(data)} ");
|
||||
Logger.WriteLine($"Error writing {log} {device.ProductID.ToString("X")}: {ex.Message} {BitConverter.ToString(data)} ");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (log is not null) Logger.WriteLine($"Error opening {log} {device.ProductID.ToString("X")}: {ex.Message}");
|
||||
Logger.WriteLine($"Error opening {log} {device.ProductID.ToString("X")}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace GHelper.USB
|
||||
public static Color Color1 = Color.White;
|
||||
public static Color Color2 = Color.Black;
|
||||
|
||||
static bool isACPI = AppConfig.IsTUF() || AppConfig.IsVivoZenbook() || AppConfig.IsProArt();
|
||||
static bool isACPI = AppConfig.IsTUF() || AppConfig.IsVivobook() || AppConfig.IsProArt();
|
||||
static bool isStrix = AppConfig.IsStrix() && !AppConfig.IsNoDirectRGB();
|
||||
|
||||
static bool isStrix4Zone = AppConfig.IsStrixLimitedRGB();
|
||||
@@ -598,7 +598,7 @@ namespace GHelper.USB
|
||||
|
||||
if (AppConfig.IsNoDirectRGB())
|
||||
{
|
||||
AsusHid.Write(new List<byte[]> { AuraMessage(AuraMode.AuraStatic, color, color, 0xeb, isSingleColor), MESSAGE_SET }, null);
|
||||
AsusHid.Write(new List<byte[]> { AuraMessage(AuraMode.AuraStatic, color, color, 0xeb, isSingleColor), MESSAGE_SET });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -670,7 +670,7 @@ namespace GHelper.USB
|
||||
{
|
||||
CustomRGB.ApplyAmbient(true);
|
||||
timer.Enabled = true;
|
||||
timer.Interval = AppConfig.Get("aura_refresh", AppConfig.IsStrix() ? 100 : 300);
|
||||
timer.Interval = AppConfig.Get("aura_refresh", AppConfig.ContainsModel("GU604") ? 400 : 120);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"sdk": {
|
||||
"version": "7.0.406"
|
||||
"version": "7.0.400"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user