mirror of
https://github.com/ayufan/steam-deck-tools.git
synced 2025-12-06 07:12:01 +01:00
Add Updater.exe that can update to latest release and debug
This commit is contained in:
parent
275ce48509
commit
2259e17b21
|
|
@ -8,6 +8,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Autoupdater.NET.Official" Version="1.7.6" />
|
||||||
<PackageReference Include="LibreHardwareMonitorLib" Version="0.9.1" />
|
<PackageReference Include="LibreHardwareMonitorLib" Version="0.9.1" />
|
||||||
<PackageReference Include="TaskScheduler" Version="2.10.1" />
|
<PackageReference Include="TaskScheduler" Version="2.10.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,8 @@
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Security;
|
|
||||||
using System.Security.Principal;
|
using System.Security.Principal;
|
||||||
using System.Security.AccessControl;
|
using System.Security.AccessControl;
|
||||||
using System.Windows.Forms;
|
using AutoUpdaterDotNET;
|
||||||
using System.Runtime.CompilerServices;
|
using Microsoft.Win32;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace CommonHelpers
|
namespace CommonHelpers
|
||||||
{
|
{
|
||||||
|
|
@ -125,7 +121,7 @@ namespace CommonHelpers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RunOnce(String title, String mutexName, int runOnceTimeout = 1000)
|
public static void RunOnce(String? title, String mutexName, int runOnceTimeout = 1000)
|
||||||
{
|
{
|
||||||
runOnceMutex = TryCreateOrOpenExistingMutex(mutexName);
|
runOnceMutex = TryCreateOrOpenExistingMutex(mutexName);
|
||||||
|
|
||||||
|
|
@ -135,9 +131,58 @@ namespace CommonHelpers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Fatal(String title, String message)
|
public static String MachineID
|
||||||
{
|
{
|
||||||
MessageBox.Show(message, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
get
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (var registryKey = Registry.CurrentUser.OpenSubKey(@"Software\SteamDeckTools"))
|
||||||
|
{
|
||||||
|
var machineID = registryKey?.GetValue("MachineID") as string;
|
||||||
|
if (machineID is not null)
|
||||||
|
return machineID;
|
||||||
|
|
||||||
|
machineID = Guid.NewGuid().ToString();
|
||||||
|
registryKey?.SetValue("MachineID", machineID);
|
||||||
|
return machineID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
return "exception";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Version? ApplicationVersion
|
||||||
|
{
|
||||||
|
get => System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String ProductVersion
|
||||||
|
{
|
||||||
|
get => Application.ProductVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RunUpdater(string Title, bool user = false)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Process.Start(new ProcessStartInfo()
|
||||||
|
{
|
||||||
|
FileName = "Updater.exe",
|
||||||
|
ArgumentList = { user ? "-user" : "-first" },
|
||||||
|
UseShellExecute = false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Fatal(String? title, String message)
|
||||||
|
{
|
||||||
|
if (title is not null)
|
||||||
|
MessageBox.Show(message, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
Environment.Exit(1);
|
Environment.Exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
84
FanControl/FanControlForm.Designer.cs
generated
84
FanControl/FanControlForm.Designer.cs
generated
|
|
@ -55,6 +55,7 @@ namespace FanControl
|
||||||
this.helpLabel = new System.Windows.Forms.Label();
|
this.helpLabel = new System.Windows.Forms.Label();
|
||||||
this.sensorWarningLabel = new System.Windows.Forms.Label();
|
this.sensorWarningLabel = new System.Windows.Forms.Label();
|
||||||
this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
|
this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
|
||||||
|
this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.contextMenu.SuspendLayout();
|
this.contextMenu.SuspendLayout();
|
||||||
this.menuStrip1.SuspendLayout();
|
this.menuStrip1.SuspendLayout();
|
||||||
this.tableLayoutPanel1.SuspendLayout();
|
this.tableLayoutPanel1.SuspendLayout();
|
||||||
|
|
@ -84,58 +85,59 @@ namespace FanControl
|
||||||
this.toolStripMenuItemStartupOnBootContext,
|
this.toolStripMenuItemStartupOnBootContext,
|
||||||
this.toolStripMenuItemAlwaysOnTopContext,
|
this.toolStripMenuItemAlwaysOnTopContext,
|
||||||
this.toolStripMenuItem3,
|
this.toolStripMenuItem3,
|
||||||
|
this.toolStripMenuItem5,
|
||||||
this.toolStripSeparator1,
|
this.toolStripSeparator1,
|
||||||
this.toolStripMenuItem1});
|
this.toolStripMenuItem1});
|
||||||
this.contextMenu.Name = "fanModeSelectMenu";
|
this.contextMenu.Name = "fanModeSelectMenu";
|
||||||
this.contextMenu.Size = new System.Drawing.Size(257, 212);
|
this.contextMenu.Size = new System.Drawing.Size(211, 194);
|
||||||
//
|
//
|
||||||
// toolStripMenuItem2
|
// toolStripMenuItem2
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
|
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
|
||||||
this.toolStripMenuItem2.Size = new System.Drawing.Size(256, 38);
|
this.toolStripMenuItem2.Size = new System.Drawing.Size(210, 24);
|
||||||
this.toolStripMenuItem2.Text = "&Show";
|
this.toolStripMenuItem2.Text = "&Show";
|
||||||
this.toolStripMenuItem2.Click += new System.EventHandler(this.formShow_Event);
|
this.toolStripMenuItem2.Click += new System.EventHandler(this.formShow_Event);
|
||||||
//
|
//
|
||||||
// toolStripSeparator3
|
// toolStripSeparator3
|
||||||
//
|
//
|
||||||
this.toolStripSeparator3.Name = "toolStripSeparator3";
|
this.toolStripSeparator3.Name = "toolStripSeparator3";
|
||||||
this.toolStripSeparator3.Size = new System.Drawing.Size(253, 6);
|
this.toolStripSeparator3.Size = new System.Drawing.Size(207, 6);
|
||||||
//
|
//
|
||||||
// toolStripSeparatorEndOfModes
|
// toolStripSeparatorEndOfModes
|
||||||
//
|
//
|
||||||
this.toolStripSeparatorEndOfModes.Name = "toolStripSeparatorEndOfModes";
|
this.toolStripSeparatorEndOfModes.Name = "toolStripSeparatorEndOfModes";
|
||||||
this.toolStripSeparatorEndOfModes.Size = new System.Drawing.Size(253, 6);
|
this.toolStripSeparatorEndOfModes.Size = new System.Drawing.Size(207, 6);
|
||||||
//
|
//
|
||||||
// toolStripMenuItemStartupOnBootContext
|
// toolStripMenuItemStartupOnBootContext
|
||||||
//
|
//
|
||||||
this.toolStripMenuItemStartupOnBootContext.Name = "toolStripMenuItemStartupOnBootContext";
|
this.toolStripMenuItemStartupOnBootContext.Name = "toolStripMenuItemStartupOnBootContext";
|
||||||
this.toolStripMenuItemStartupOnBootContext.Size = new System.Drawing.Size(256, 38);
|
this.toolStripMenuItemStartupOnBootContext.Size = new System.Drawing.Size(210, 24);
|
||||||
this.toolStripMenuItemStartupOnBootContext.Text = "Run On &Startup";
|
this.toolStripMenuItemStartupOnBootContext.Text = "Run On &Startup";
|
||||||
this.toolStripMenuItemStartupOnBootContext.Click += new System.EventHandler(this.toolStripMenuItemStartupOnBoot_Click);
|
this.toolStripMenuItemStartupOnBootContext.Click += new System.EventHandler(this.toolStripMenuItemStartupOnBoot_Click);
|
||||||
//
|
//
|
||||||
// toolStripMenuItemAlwaysOnTopContext
|
// toolStripMenuItemAlwaysOnTopContext
|
||||||
//
|
//
|
||||||
this.toolStripMenuItemAlwaysOnTopContext.Name = "toolStripMenuItemAlwaysOnTopContext";
|
this.toolStripMenuItemAlwaysOnTopContext.Name = "toolStripMenuItemAlwaysOnTopContext";
|
||||||
this.toolStripMenuItemAlwaysOnTopContext.Size = new System.Drawing.Size(256, 38);
|
this.toolStripMenuItemAlwaysOnTopContext.Size = new System.Drawing.Size(210, 24);
|
||||||
this.toolStripMenuItemAlwaysOnTopContext.Text = "&Always on Top";
|
this.toolStripMenuItemAlwaysOnTopContext.Text = "&Always on Top";
|
||||||
this.toolStripMenuItemAlwaysOnTopContext.Click += new System.EventHandler(this.toolStripMenuItemAlwaysOnTop_Click);
|
this.toolStripMenuItemAlwaysOnTopContext.Click += new System.EventHandler(this.toolStripMenuItemAlwaysOnTop_Click);
|
||||||
//
|
//
|
||||||
// toolStripMenuItem3
|
// toolStripMenuItem3
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem3.Name = "toolStripMenuItem3";
|
this.toolStripMenuItem3.Name = "toolStripMenuItem3";
|
||||||
this.toolStripMenuItem3.Size = new System.Drawing.Size(256, 38);
|
this.toolStripMenuItem3.Size = new System.Drawing.Size(210, 24);
|
||||||
this.toolStripMenuItem3.Text = "Help";
|
this.toolStripMenuItem3.Text = "&Check for Updates";
|
||||||
this.toolStripMenuItem3.Click += new System.EventHandler(this.help_DoubleClick);
|
this.toolStripMenuItem3.Click += new System.EventHandler(this.checkForUpdates_Click);
|
||||||
//
|
//
|
||||||
// toolStripSeparator1
|
// toolStripSeparator1
|
||||||
//
|
//
|
||||||
this.toolStripSeparator1.Name = "toolStripSeparator1";
|
this.toolStripSeparator1.Name = "toolStripSeparator1";
|
||||||
this.toolStripSeparator1.Size = new System.Drawing.Size(253, 6);
|
this.toolStripSeparator1.Size = new System.Drawing.Size(207, 6);
|
||||||
//
|
//
|
||||||
// toolStripMenuItem1
|
// toolStripMenuItem1
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
|
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
|
||||||
this.toolStripMenuItem1.Size = new System.Drawing.Size(256, 38);
|
this.toolStripMenuItem1.Size = new System.Drawing.Size(210, 24);
|
||||||
this.toolStripMenuItem1.Text = "&Exit";
|
this.toolStripMenuItem1.Text = "&Exit";
|
||||||
this.toolStripMenuItem1.Click += new System.EventHandler(this.formClose_Event);
|
this.toolStripMenuItem1.Click += new System.EventHandler(this.formClose_Event);
|
||||||
//
|
//
|
||||||
|
|
@ -146,7 +148,8 @@ namespace FanControl
|
||||||
this.controlToolStripMenuItem});
|
this.controlToolStripMenuItem});
|
||||||
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
|
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
|
||||||
this.menuStrip1.Name = "menuStrip1";
|
this.menuStrip1.Name = "menuStrip1";
|
||||||
this.menuStrip1.Size = new System.Drawing.Size(711, 44);
|
this.menuStrip1.Padding = new System.Windows.Forms.Padding(4, 1, 0, 1);
|
||||||
|
this.menuStrip1.Size = new System.Drawing.Size(438, 30);
|
||||||
this.menuStrip1.TabIndex = 3;
|
this.menuStrip1.TabIndex = 3;
|
||||||
this.menuStrip1.Text = "menuStrip1";
|
this.menuStrip1.Text = "menuStrip1";
|
||||||
//
|
//
|
||||||
|
|
@ -156,7 +159,7 @@ namespace FanControl
|
||||||
this.fanModeSelectMenu.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
this.fanModeSelectMenu.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
this.fanModeSelectMenu.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
this.fanModeSelectMenu.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.fanModeSelectMenu.Name = "fanModeSelectMenu";
|
this.fanModeSelectMenu.Name = "fanModeSelectMenu";
|
||||||
this.fanModeSelectMenu.Size = new System.Drawing.Size(249, 40);
|
this.fanModeSelectMenu.Size = new System.Drawing.Size(155, 28);
|
||||||
this.fanModeSelectMenu.SelectedIndexChanged += new System.EventHandler(this.fanModeSelectMenu_SelectedIndexChanged);
|
this.fanModeSelectMenu.SelectedIndexChanged += new System.EventHandler(this.fanModeSelectMenu_SelectedIndexChanged);
|
||||||
//
|
//
|
||||||
// controlToolStripMenuItem
|
// controlToolStripMenuItem
|
||||||
|
|
@ -168,39 +171,39 @@ namespace FanControl
|
||||||
this.toolStripSeparator2,
|
this.toolStripSeparator2,
|
||||||
this.exitToolStripMenuItem});
|
this.exitToolStripMenuItem});
|
||||||
this.controlToolStripMenuItem.Name = "controlToolStripMenuItem";
|
this.controlToolStripMenuItem.Name = "controlToolStripMenuItem";
|
||||||
this.controlToolStripMenuItem.Size = new System.Drawing.Size(113, 40);
|
this.controlToolStripMenuItem.Size = new System.Drawing.Size(72, 28);
|
||||||
this.controlToolStripMenuItem.Text = "&Control";
|
this.controlToolStripMenuItem.Text = "&Control";
|
||||||
//
|
//
|
||||||
// toolStripMenuItemStartupOnBoot
|
// toolStripMenuItemStartupOnBoot
|
||||||
//
|
//
|
||||||
this.toolStripMenuItemStartupOnBoot.Name = "toolStripMenuItemStartupOnBoot";
|
this.toolStripMenuItemStartupOnBoot.Name = "toolStripMenuItemStartupOnBoot";
|
||||||
this.toolStripMenuItemStartupOnBoot.Size = new System.Drawing.Size(315, 44);
|
this.toolStripMenuItemStartupOnBoot.Size = new System.Drawing.Size(192, 26);
|
||||||
this.toolStripMenuItemStartupOnBoot.Text = "Run On &Startup";
|
this.toolStripMenuItemStartupOnBoot.Text = "Run On &Startup";
|
||||||
this.toolStripMenuItemStartupOnBoot.Click += new System.EventHandler(this.toolStripMenuItemStartupOnBoot_Click);
|
this.toolStripMenuItemStartupOnBoot.Click += new System.EventHandler(this.toolStripMenuItemStartupOnBoot_Click);
|
||||||
//
|
//
|
||||||
// toolStripMenuItemAlwaysOnTop
|
// toolStripMenuItemAlwaysOnTop
|
||||||
//
|
//
|
||||||
this.toolStripMenuItemAlwaysOnTop.Name = "toolStripMenuItemAlwaysOnTop";
|
this.toolStripMenuItemAlwaysOnTop.Name = "toolStripMenuItemAlwaysOnTop";
|
||||||
this.toolStripMenuItemAlwaysOnTop.Size = new System.Drawing.Size(315, 44);
|
this.toolStripMenuItemAlwaysOnTop.Size = new System.Drawing.Size(192, 26);
|
||||||
this.toolStripMenuItemAlwaysOnTop.Text = "&Always on Top";
|
this.toolStripMenuItemAlwaysOnTop.Text = "&Always on Top";
|
||||||
this.toolStripMenuItemAlwaysOnTop.Click += new System.EventHandler(this.toolStripMenuItemAlwaysOnTop_Click);
|
this.toolStripMenuItemAlwaysOnTop.Click += new System.EventHandler(this.toolStripMenuItemAlwaysOnTop_Click);
|
||||||
//
|
//
|
||||||
// toolStripMenuItem4
|
// toolStripMenuItem4
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem4.Name = "toolStripMenuItem4";
|
this.toolStripMenuItem4.Name = "toolStripMenuItem4";
|
||||||
this.toolStripMenuItem4.Size = new System.Drawing.Size(315, 44);
|
this.toolStripMenuItem4.Size = new System.Drawing.Size(192, 26);
|
||||||
this.toolStripMenuItem4.Text = "Help";
|
this.toolStripMenuItem4.Text = "Help";
|
||||||
this.toolStripMenuItem4.Click += new System.EventHandler(this.help_DoubleClick);
|
this.toolStripMenuItem4.Click += new System.EventHandler(this.help_DoubleClick);
|
||||||
//
|
//
|
||||||
// toolStripSeparator2
|
// toolStripSeparator2
|
||||||
//
|
//
|
||||||
this.toolStripSeparator2.Name = "toolStripSeparator2";
|
this.toolStripSeparator2.Name = "toolStripSeparator2";
|
||||||
this.toolStripSeparator2.Size = new System.Drawing.Size(312, 6);
|
this.toolStripSeparator2.Size = new System.Drawing.Size(189, 6);
|
||||||
//
|
//
|
||||||
// exitToolStripMenuItem
|
// exitToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
|
this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
|
||||||
this.exitToolStripMenuItem.Size = new System.Drawing.Size(315, 44);
|
this.exitToolStripMenuItem.Size = new System.Drawing.Size(192, 26);
|
||||||
this.exitToolStripMenuItem.Text = "&Exit";
|
this.exitToolStripMenuItem.Text = "&Exit";
|
||||||
this.exitToolStripMenuItem.Click += new System.EventHandler(this.formClose_Event);
|
this.exitToolStripMenuItem.Click += new System.EventHandler(this.formClose_Event);
|
||||||
//
|
//
|
||||||
|
|
@ -219,8 +222,8 @@ namespace FanControl
|
||||||
this.tableLayoutPanel1.Controls.Add(this.sensorWarningLabel, 0, 1);
|
this.tableLayoutPanel1.Controls.Add(this.sensorWarningLabel, 0, 1);
|
||||||
this.tableLayoutPanel1.Controls.Add(this.propertyGrid1, 0, 0);
|
this.tableLayoutPanel1.Controls.Add(this.propertyGrid1, 0, 0);
|
||||||
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 44);
|
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 30);
|
||||||
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 2, 4, 2);
|
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1);
|
||||||
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||||
this.tableLayoutPanel1.RowCount = 4;
|
this.tableLayoutPanel1.RowCount = 4;
|
||||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
|
@ -228,7 +231,7 @@ namespace FanControl
|
||||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(711, 1046);
|
this.tableLayoutPanel1.Size = new System.Drawing.Size(438, 454);
|
||||||
this.tableLayoutPanel1.TabIndex = 5;
|
this.tableLayoutPanel1.TabIndex = 5;
|
||||||
//
|
//
|
||||||
// label1
|
// label1
|
||||||
|
|
@ -238,10 +241,10 @@ namespace FanControl
|
||||||
this.label1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
this.label1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.label1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
|
this.label1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
|
||||||
this.label1.ForeColor = System.Drawing.Color.Red;
|
this.label1.ForeColor = System.Drawing.Color.Red;
|
||||||
this.label1.Location = new System.Drawing.Point(4, 950);
|
this.label1.Location = new System.Drawing.Point(2, 394);
|
||||||
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.label1.Name = "label1";
|
this.label1.Name = "label1";
|
||||||
this.label1.Size = new System.Drawing.Size(703, 64);
|
this.label1.Size = new System.Drawing.Size(434, 40);
|
||||||
this.label1.TabIndex = 9;
|
this.label1.TabIndex = 9;
|
||||||
this.label1.Text = "This application is highly experimental.\r\nUse at your own risk!";
|
this.label1.Text = "This application is highly experimental.\r\nUse at your own risk!";
|
||||||
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||||
|
|
@ -254,10 +257,10 @@ namespace FanControl
|
||||||
this.helpLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
this.helpLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.helpLabel.Font = new System.Drawing.Font("Segoe UI", 9F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point);
|
this.helpLabel.Font = new System.Drawing.Font("Segoe UI", 9F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point);
|
||||||
this.helpLabel.ForeColor = System.Drawing.SystemColors.HotTrack;
|
this.helpLabel.ForeColor = System.Drawing.SystemColors.HotTrack;
|
||||||
this.helpLabel.Location = new System.Drawing.Point(4, 1014);
|
this.helpLabel.Location = new System.Drawing.Point(2, 434);
|
||||||
this.helpLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
this.helpLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.helpLabel.Name = "helpLabel";
|
this.helpLabel.Name = "helpLabel";
|
||||||
this.helpLabel.Size = new System.Drawing.Size(703, 32);
|
this.helpLabel.Size = new System.Drawing.Size(434, 20);
|
||||||
this.helpLabel.TabIndex = 8;
|
this.helpLabel.TabIndex = 8;
|
||||||
this.helpLabel.Text = "https://steam-deck-tools.ayufan.dev";
|
this.helpLabel.Text = "https://steam-deck-tools.ayufan.dev";
|
||||||
this.helpLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
this.helpLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||||
|
|
@ -270,10 +273,10 @@ namespace FanControl
|
||||||
this.sensorWarningLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
this.sensorWarningLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.sensorWarningLabel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
|
this.sensorWarningLabel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
|
||||||
this.sensorWarningLabel.ForeColor = System.Drawing.Color.Red;
|
this.sensorWarningLabel.ForeColor = System.Drawing.Color.Red;
|
||||||
this.sensorWarningLabel.Location = new System.Drawing.Point(4, 854);
|
this.sensorWarningLabel.Location = new System.Drawing.Point(2, 334);
|
||||||
this.sensorWarningLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
this.sensorWarningLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.sensorWarningLabel.Name = "sensorWarningLabel";
|
this.sensorWarningLabel.Name = "sensorWarningLabel";
|
||||||
this.sensorWarningLabel.Size = new System.Drawing.Size(703, 96);
|
this.sensorWarningLabel.Size = new System.Drawing.Size(434, 60);
|
||||||
this.sensorWarningLabel.TabIndex = 6;
|
this.sensorWarningLabel.TabIndex = 6;
|
||||||
this.sensorWarningLabel.Text = "Some sensors are missing.\r\nThe fan behavior might be incorrect.\r\nWhich might resu" +
|
this.sensorWarningLabel.Text = "Some sensors are missing.\r\nThe fan behavior might be incorrect.\r\nWhich might resu" +
|
||||||
"lt in device overheating.\r\n";
|
"lt in device overheating.\r\n";
|
||||||
|
|
@ -285,24 +288,30 @@ namespace FanControl
|
||||||
this.propertyGrid1.DisabledItemForeColor = System.Drawing.SystemColors.ControlText;
|
this.propertyGrid1.DisabledItemForeColor = System.Drawing.SystemColors.ControlText;
|
||||||
this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.propertyGrid1.HelpVisible = false;
|
this.propertyGrid1.HelpVisible = false;
|
||||||
this.propertyGrid1.Location = new System.Drawing.Point(4, 2);
|
this.propertyGrid1.Location = new System.Drawing.Point(2, 1);
|
||||||
this.propertyGrid1.Margin = new System.Windows.Forms.Padding(4, 2, 4, 2);
|
this.propertyGrid1.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1);
|
||||||
this.propertyGrid1.Name = "propertyGrid1";
|
this.propertyGrid1.Name = "propertyGrid1";
|
||||||
this.propertyGrid1.Size = new System.Drawing.Size(703, 850);
|
this.propertyGrid1.Size = new System.Drawing.Size(434, 332);
|
||||||
this.propertyGrid1.TabIndex = 1;
|
this.propertyGrid1.TabIndex = 1;
|
||||||
this.propertyGrid1.ToolbarVisible = false;
|
this.propertyGrid1.ToolbarVisible = false;
|
||||||
//
|
//
|
||||||
|
// toolStripMenuItem5
|
||||||
|
//
|
||||||
|
this.toolStripMenuItem5.Name = "toolStripMenuItem5";
|
||||||
|
this.toolStripMenuItem5.Size = new System.Drawing.Size(210, 24);
|
||||||
|
this.toolStripMenuItem5.Text = "Help";
|
||||||
|
//
|
||||||
// FanControlForm
|
// FanControlForm
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(13F, 32F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.AutoSize = true;
|
this.AutoSize = true;
|
||||||
this.ClientSize = new System.Drawing.Size(711, 1090);
|
this.ClientSize = new System.Drawing.Size(438, 484);
|
||||||
this.Controls.Add(this.tableLayoutPanel1);
|
this.Controls.Add(this.tableLayoutPanel1);
|
||||||
this.Controls.Add(this.menuStrip1);
|
this.Controls.Add(this.menuStrip1);
|
||||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||||
this.MainMenuStrip = this.menuStrip1;
|
this.MainMenuStrip = this.menuStrip1;
|
||||||
this.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
|
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||||
this.MaximizeBox = false;
|
this.MaximizeBox = false;
|
||||||
this.MinimizeBox = false;
|
this.MinimizeBox = false;
|
||||||
this.Name = "FanControlForm";
|
this.Name = "FanControlForm";
|
||||||
|
|
@ -348,5 +357,6 @@ namespace FanControl
|
||||||
private ToolStripMenuItem toolStripMenuItem3;
|
private ToolStripMenuItem toolStripMenuItem3;
|
||||||
private ToolStripSeparator toolStripSeparator1;
|
private ToolStripSeparator toolStripSeparator1;
|
||||||
private ToolStripMenuItem toolStripMenuItem4;
|
private ToolStripMenuItem toolStripMenuItem4;
|
||||||
|
private ToolStripMenuItem toolStripMenuItem5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -19,6 +19,7 @@ namespace FanControl
|
||||||
|
|
||||||
Text += " v" + Application.ProductVersion.ToString();
|
Text += " v" + Application.ProductVersion.ToString();
|
||||||
Instance.Open(Text, true, "Global\\FanControlOnce");
|
Instance.Open(Text, true, "Global\\FanControlOnce");
|
||||||
|
Instance.RunUpdater(Text);
|
||||||
|
|
||||||
if (Instance.WantsRunOnStartup)
|
if (Instance.WantsRunOnStartup)
|
||||||
startupManager.Startup = true;
|
startupManager.Startup = true;
|
||||||
|
|
@ -147,6 +148,9 @@ namespace FanControl
|
||||||
|
|
||||||
private void fanLoopTimer_Tick(object sender, EventArgs e)
|
private void fanLoopTimer_Tick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
if (fanControl is null)
|
||||||
|
return;
|
||||||
|
|
||||||
SharedData_Update();
|
SharedData_Update();
|
||||||
fanControl.Update(Visible);
|
fanControl.Update(Visible);
|
||||||
}
|
}
|
||||||
|
|
@ -184,5 +188,10 @@ namespace FanControl
|
||||||
toolStripMenuItemAlwaysOnTopContext.Checked = TopMost;
|
toolStripMenuItemAlwaysOnTopContext.Checked = TopMost;
|
||||||
Settings.Default.AlwaysOnTop = toolStripMenuItemAlwaysOnTop.Checked;
|
Settings.Default.AlwaysOnTop = toolStripMenuItemAlwaysOnTop.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkForUpdates_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Instance.RunUpdater(Text, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ namespace PerformanceOverlay
|
||||||
|
|
||||||
SharedData_Update();
|
SharedData_Update();
|
||||||
Instance.Open(TitleWithVersion, true, "Global\\PerformanceOverlay");
|
Instance.Open(TitleWithVersion, true, "Global\\PerformanceOverlay");
|
||||||
|
Instance.RunUpdater(TitleWithVersion);
|
||||||
|
|
||||||
if (Instance.WantsRunOnStartup)
|
if (Instance.WantsRunOnStartup)
|
||||||
startupManager.Startup = true;
|
startupManager.Startup = true;
|
||||||
|
|
@ -71,11 +72,11 @@ namespace PerformanceOverlay
|
||||||
contextMenu.Items.Add(startupItem);
|
contextMenu.Items.Add(startupItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var checkForUpdatesItem = contextMenu.Items.Add("&Check for Updates");
|
||||||
|
checkForUpdatesItem.Click += delegate { Instance.RunUpdater(TitleWithVersion, true); };
|
||||||
|
|
||||||
var helpItem = contextMenu.Items.Add("&Help");
|
var helpItem = contextMenu.Items.Add("&Help");
|
||||||
helpItem.Click += delegate
|
helpItem.Click += delegate { System.Diagnostics.Process.Start("explorer.exe", "https://steam-deck-tools.ayufan.dev"); };
|
||||||
{
|
|
||||||
System.Diagnostics.Process.Start("explorer.exe", "https://steam-deck-tools.ayufan.dev");
|
|
||||||
};
|
|
||||||
|
|
||||||
contextMenu.Items.Add(new ToolStripSeparator());
|
contextMenu.Items.Add(new ToolStripSeparator());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ namespace PowerControl
|
||||||
public Controller()
|
public Controller()
|
||||||
{
|
{
|
||||||
Instance.RunOnce(TitleWithVersion, "Global\\PowerControl");
|
Instance.RunOnce(TitleWithVersion, "Global\\PowerControl");
|
||||||
|
Instance.RunUpdater(TitleWithVersion);
|
||||||
|
|
||||||
if (Instance.WantsRunOnStartup)
|
if (Instance.WantsRunOnStartup)
|
||||||
startupManager.Startup = true;
|
startupManager.Startup = true;
|
||||||
|
|
@ -72,12 +73,11 @@ namespace PowerControl
|
||||||
contextMenu.Items.Add(startupItem);
|
contextMenu.Items.Add(startupItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
var helpItem = contextMenu.Items.Add("&Help");
|
var checkForUpdatesItem = contextMenu.Items.Add("&Check for Updates");
|
||||||
helpItem.Click += delegate
|
checkForUpdatesItem.Click += delegate { Instance.RunUpdater(TitleWithVersion, true); };
|
||||||
{
|
|
||||||
System.Diagnostics.Process.Start("explorer.exe", "https://steam-deck-tools.ayufan.dev");
|
|
||||||
};
|
|
||||||
|
|
||||||
|
var helpItem = contextMenu.Items.Add("&Help");
|
||||||
|
helpItem.Click += delegate { System.Diagnostics.Process.Start("explorer.exe", "https://steam-deck-tools.ayufan.dev"); };
|
||||||
contextMenu.Items.Add(new ToolStripSeparator());
|
contextMenu.Items.Add(new ToolStripSeparator());
|
||||||
|
|
||||||
var exitItem = contextMenu.Items.Add("&Exit");
|
var exitItem = contextMenu.Items.Add("&Exit");
|
||||||
|
|
|
||||||
|
|
@ -24,3 +24,4 @@
|
||||||
- Swap `STEAM+Menu` and `STEAM+Options`. It makes more sense to switch windows with STEAM+3 horizontal lines
|
- Swap `STEAM+Menu` and `STEAM+Options`. It makes more sense to switch windows with STEAM+3 horizontal lines
|
||||||
- If application is run with `-run-on-startup` it will self-set to run on system start
|
- If application is run with `-run-on-startup` it will self-set to run on system start
|
||||||
- Depend on `GetCursorPos` to detect `SAS`
|
- Depend on `GetCursorPos` to detect `SAS`
|
||||||
|
- Add `Updater.exe` that can update to latest release and debug
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ namespace SteamController
|
||||||
Select((profile) => profile.Name).ToArray();
|
Select((profile) => profile.Name).ToArray();
|
||||||
|
|
||||||
Instance.RunOnce(TitleWithVersion, "Global\\SteamController");
|
Instance.RunOnce(TitleWithVersion, "Global\\SteamController");
|
||||||
|
Instance.RunUpdater(TitleWithVersion);
|
||||||
|
|
||||||
if (Instance.WantsRunOnStartup)
|
if (Instance.WantsRunOnStartup)
|
||||||
startupManager.Startup = true;
|
startupManager.Startup = true;
|
||||||
|
|
@ -81,12 +82,15 @@ namespace SteamController
|
||||||
|
|
||||||
contextMenu.Items.Add(new ToolStripSeparator());
|
contextMenu.Items.Add(new ToolStripSeparator());
|
||||||
|
|
||||||
var helpItem = contextMenu.Items.Add("&Help");
|
var checkForUpdatesItem = contextMenu.Items.Add("&Check for Updates");
|
||||||
helpItem.Click += delegate { Process.Start("explorer.exe", "https://steam-deck-tools.ayufan.dev"); };
|
checkForUpdatesItem.Click += delegate { Instance.RunUpdater(TitleWithVersion, true); };
|
||||||
|
|
||||||
var shortcutsItem = contextMenu.Items.Add("&Shortcuts");
|
var shortcutsItem = contextMenu.Items.Add("&Shortcuts");
|
||||||
shortcutsItem.Click += delegate { Process.Start("explorer.exe", "https://steam-deck-tools.ayufan.dev/docs/shortcuts.html"); };
|
shortcutsItem.Click += delegate { Process.Start("explorer.exe", "https://steam-deck-tools.ayufan.dev/docs/shortcuts.html"); };
|
||||||
|
|
||||||
|
var helpItem = contextMenu.Items.Add("&Help");
|
||||||
|
helpItem.Click += delegate { Process.Start("explorer.exe", "https://steam-deck-tools.ayufan.dev"); };
|
||||||
|
|
||||||
contextMenu.Items.Add(new ToolStripSeparator());
|
contextMenu.Items.Add(new ToolStripSeparator());
|
||||||
|
|
||||||
var exitItem = contextMenu.Items.Add("&Exit");
|
var exitItem = contextMenu.Items.Add("&Exit");
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerControl", "PowerContro
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExternalHelpers", "ExternalHelpers\ExternalHelpers.csproj", "{A3FD29A4-844F-42B1-80C5-0301BD053AC0}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExternalHelpers", "ExternalHelpers\ExternalHelpers.csproj", "{A3FD29A4-844F-42B1-80C5-0301BD053AC0}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SteamController", "SteamController\SteamController.csproj", "{A5A9DCD4-4686-49A6-836A-81498226B94B}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SteamController", "SteamController\SteamController.csproj", "{A5A9DCD4-4686-49A6-836A-81498226B94B}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Updater", "Updater\Updater.csproj", "{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
|
@ -97,6 +99,18 @@ Global
|
||||||
{A5A9DCD4-4686-49A6-836A-81498226B94B}.Release|x64.Build.0 = Release|Any CPU
|
{A5A9DCD4-4686-49A6-836A-81498226B94B}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{A5A9DCD4-4686-49A6-836A-81498226B94B}.Release|x86.ActiveCfg = Release|Any CPU
|
{A5A9DCD4-4686-49A6-836A-81498226B94B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{A5A9DCD4-4686-49A6-836A-81498226B94B}.Release|x86.Build.0 = Release|Any CPU
|
{A5A9DCD4-4686-49A6-836A-81498226B94B}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{7FBC87CE-5C6E-4A8E-AF07-E310AD311073}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
|
||||||
158
Updater/Program.cs
Normal file
158
Updater/Program.cs
Normal file
|
|
@ -0,0 +1,158 @@
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Reflection;
|
||||||
|
using AutoUpdaterDotNET;
|
||||||
|
using CommonHelpers;
|
||||||
|
|
||||||
|
namespace Updater
|
||||||
|
{
|
||||||
|
internal static class Program
|
||||||
|
{
|
||||||
|
public const String Title = "Steam Deck Tools";
|
||||||
|
public const String RunPrefix = "-run=";
|
||||||
|
public const String UpdatedArg = "-updated";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The main entry point for the application.
|
||||||
|
/// </summary>
|
||||||
|
[STAThread]
|
||||||
|
static void Main()
|
||||||
|
{
|
||||||
|
bool firstRun = Environment.GetCommandLineArgs().Contains("-first");
|
||||||
|
bool userCheck = Environment.GetCommandLineArgs().Contains("-user");
|
||||||
|
bool updated = Environment.GetCommandLineArgs().Contains(UpdatedArg);
|
||||||
|
bool cmdLine = !firstRun && !userCheck;
|
||||||
|
|
||||||
|
if (updated)
|
||||||
|
{
|
||||||
|
foreach (var arg in Environment.GetCommandLineArgs())
|
||||||
|
{
|
||||||
|
if (!arg.StartsWith(RunPrefix))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var processName = arg.Substring(RunPrefix.Length);
|
||||||
|
CommonHelpers.Log.TraceLine("Running {0}", processName);
|
||||||
|
try { Process.Start(processName); } catch { }
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance.RunOnce(null, "Global\\SteamDeckToolsAutoUpdater");
|
||||||
|
|
||||||
|
var persistence = new RegistryPersistenceProvider(@"Software\SteamDeckTools\AutoUpdater");
|
||||||
|
|
||||||
|
if (userCheck || cmdLine)
|
||||||
|
{
|
||||||
|
persistence.SetRemindLater(null);
|
||||||
|
persistence.SetSkippedVersion(new Version());
|
||||||
|
}
|
||||||
|
|
||||||
|
AutoUpdater.AppTitle = Title;
|
||||||
|
AutoUpdater.RemindLaterTimeSpan = RemindLaterFormat.Days;
|
||||||
|
AutoUpdater.LetUserSelectRemindLater = true;
|
||||||
|
AutoUpdater.ShowRemindLaterButton = true;
|
||||||
|
AutoUpdater.HttpUserAgent = String.Format("AutoUpdater/{0}/{1}", Instance.MachineID, Instance.ProductVersion);
|
||||||
|
AutoUpdater.PersistenceProvider = persistence;
|
||||||
|
AutoUpdater.ReportErrors = userCheck || cmdLine;
|
||||||
|
AutoUpdater.UpdateFormSize = new Size(800, 300);
|
||||||
|
AutoUpdater.ShowSkipButton = true;
|
||||||
|
AutoUpdater.Synchronous = true;
|
||||||
|
AutoUpdater.ApplicationExitEvent += Application_Exit;
|
||||||
|
|
||||||
|
AppendArg(UpdatedArg);
|
||||||
|
TrackProcess("FanControl");
|
||||||
|
TrackProcess("PowerControl");
|
||||||
|
TrackProcess("PerformanceOverlay");
|
||||||
|
TrackProcess("SteamController");
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
AutoUpdater.Start("https://steam-deck-tools.ayufan.dev/docs/updates/debug_zip.xml");
|
||||||
|
#else
|
||||||
|
AutoUpdater.Start("https://steam-deck-tools.ayufan.dev/docs/updates/release_zip.xml");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void TrackProcess(String processFilerName)
|
||||||
|
{
|
||||||
|
if (FindProcesses(processFilerName).Any())
|
||||||
|
AppendArg(RunPrefix + processFilerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Application_Exit()
|
||||||
|
{
|
||||||
|
ExitProcess("FanControl");
|
||||||
|
ExitProcess("PowerControl");
|
||||||
|
ExitProcess("PerformanceOverlay");
|
||||||
|
ExitProcess("SteamController");
|
||||||
|
ExitProcess("Updater");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AppendArg(string arg)
|
||||||
|
{
|
||||||
|
var setCommandLineArgs = typeof(Environment).GetMethod(
|
||||||
|
"SetCommandLineArgs", BindingFlags.Static | BindingFlags.NonPublic,
|
||||||
|
new Type[] { typeof(string[]) });
|
||||||
|
if (setCommandLineArgs is null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// append `-run:<process>` to command line args
|
||||||
|
setCommandLineArgs.Invoke(null, new object[] {
|
||||||
|
Environment.GetCommandLineArgs().Append(arg).ToArray()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool ExitProcess(String processFilerName)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
foreach (var process in FindProcesses(processFilerName))
|
||||||
|
{
|
||||||
|
if (process.CloseMainWindow())
|
||||||
|
{
|
||||||
|
process.WaitForExit((int)TimeSpan.FromSeconds(10)
|
||||||
|
.TotalMilliseconds); //give some time to process message
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!process.HasExited)
|
||||||
|
{
|
||||||
|
process.Kill(); //TODO show UI message asking user to close program himself instead of silently killing it
|
||||||
|
}
|
||||||
|
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<Process> FindProcesses(String processFilerName)
|
||||||
|
{
|
||||||
|
var currentProcess = Process.GetCurrentProcess();
|
||||||
|
var currentDir = Path.GetDirectoryName(currentProcess.MainModule?.FileName);
|
||||||
|
|
||||||
|
foreach (var process in Process.GetProcessesByName(processFilerName))
|
||||||
|
{
|
||||||
|
string? processFileName, processDir;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
processFileName = process.MainModule?.FileName;
|
||||||
|
if (processFileName is null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
processDir = Path.GetDirectoryName(processFileName);
|
||||||
|
}
|
||||||
|
catch (Win32Exception)
|
||||||
|
{
|
||||||
|
// Current process should be same as processes created by other instances of the application so it should be able to access modules of other instances.
|
||||||
|
// This means this is not the process we are looking for so we can safely skip this.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//get all instances of assembly except current
|
||||||
|
if (process.Id != currentProcess.Id && currentDir == processDir)
|
||||||
|
{
|
||||||
|
yield return process;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
83
Updater/Resources.Designer.cs
generated
Normal file
83
Updater/Resources.Designer.cs
generated
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
// Runtime Version:4.0.30319.42000
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace Updater {
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||||
|
/// </summary>
|
||||||
|
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||||
|
// class via a tool like ResGen or Visual Studio.
|
||||||
|
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||||
|
// with the /str option, or rebuild your VS project.
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
internal class Resources {
|
||||||
|
|
||||||
|
private static global::System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
|
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
|
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
|
internal Resources() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the cached ResourceManager instance used by this class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||||
|
get {
|
||||||
|
if (object.ReferenceEquals(resourceMan, null)) {
|
||||||
|
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Updater.Resources", typeof(Resources).Assembly);
|
||||||
|
resourceMan = temp;
|
||||||
|
}
|
||||||
|
return resourceMan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Overrides the current thread's CurrentUICulture property for all
|
||||||
|
/// resource lookups using this strongly typed resource class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Globalization.CultureInfo Culture {
|
||||||
|
get {
|
||||||
|
return resourceCulture;
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
resourceCulture = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Icon update {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("update", resourceCulture);
|
||||||
|
return ((System.Drawing.Icon)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap update1 {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("update1", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
127
Updater/Resources.resx
Normal file
127
Updater/Resources.resx
Normal file
|
|
@ -0,0 +1,127 @@
|
||||||
|
<?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>
|
||||||
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
|
<data name="update" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>Resources\update.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="update1" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>Resources\update.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
BIN
Updater/Resources/update.ico
Normal file
BIN
Updater/Resources/update.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 170 KiB |
BIN
Updater/Resources/update.png
Normal file
BIN
Updater/Resources/update.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
36
Updater/Updater.csproj
Normal file
36
Updater/Updater.csproj
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>net6.0-windows</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<ApplicationIcon>Resources\update.ico</ApplicationIcon>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="Resources\update.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\CommonHelpers\CommonHelpers.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Update="Resources.Designer.cs">
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Update="Resources.resx">
|
||||||
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
61
Updater/app.manifest
Normal file
61
Updater/app.manifest
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<assemblyIdentity version="0.1.0.0" name="PerformanceOverlay.app"/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<!-- UAC Manifest Options
|
||||||
|
If you want to change the Windows User Account Control level replace the
|
||||||
|
requestedExecutionLevel node with one of the following.
|
||||||
|
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||||
|
|
||||||
|
Specifying requestedExecutionLevel element will disable file and registry virtualization.
|
||||||
|
Remove this element if your application requires this virtualization for backwards
|
||||||
|
compatibility.
|
||||||
|
-->
|
||||||
|
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||||
|
<!--<requestedExecutionLevel level="requireAdministrator" uiAccess="true" />-->
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- Windows 10 -->
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
|
||||||
|
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
|
||||||
|
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
|
||||||
|
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
|
||||||
|
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config.
|
||||||
|
|
||||||
|
Makes the application long-path aware. See https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
|
||||||
|
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<windowsSettings>
|
||||||
|
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
|
||||||
|
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
|
||||||
|
</windowsSettings>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
|
||||||
|
<!--
|
||||||
|
<dependency>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity
|
||||||
|
type="win32"
|
||||||
|
name="Microsoft.Windows.Common-Controls"
|
||||||
|
version="6.0.0.0"
|
||||||
|
processorArchitecture="*"
|
||||||
|
publicKeyToken="6595b64144ccf1df"
|
||||||
|
language="*"
|
||||||
|
/>
|
||||||
|
</dependentAssembly>
|
||||||
|
</dependency>
|
||||||
|
-->
|
||||||
|
|
||||||
|
</assembly>
|
||||||
7
docs/updates/debug_zip.xml
Normal file
7
docs/updates/debug_zip.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<item>
|
||||||
|
<version>0.5.31</version>
|
||||||
|
<url>https://github.com/ayufan/steam-deck-tools/releases/download/0.5.31/SteamDeckTools-0.5.31-debug.zip</url>
|
||||||
|
<changelog2>https://github.com/ayufan/steam-deck-tools/releases/tag/0.5.31</changelog2>
|
||||||
|
<mandatory>false</mandatory>
|
||||||
|
</item>
|
||||||
7
docs/updates/release_zip.xml
Normal file
7
docs/updates/release_zip.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<item>
|
||||||
|
<version>0.5.31</version>
|
||||||
|
<url>https://github.com/ayufan/steam-deck-tools/releases/download/0.5.31/SteamDeckTools-0.5.31.zip</url>
|
||||||
|
<changelog2>https://github.com/ayufan/steam-deck-tools/releases/tag/0.5.31</changelog2>
|
||||||
|
<mandatory>false</mandatory>
|
||||||
|
</item>
|
||||||
Loading…
Reference in a new issue