5 Commits

Author SHA1 Message Date
eebd23f702 Handle when Process V2 isn't available 2023-04-03 08:23:20 -04:00
ebd9dc607b Add setting to show process ID 2023-04-02 12:43:52 -04:00
f93983e992 Update to use Process V2 performance counter 2023-04-02 12:06:41 -04:00
d9d0f33788 Refactor update check 2018-02-23 12:05:13 -05:00
8f550463b7 Refactor update check 2018-02-22 20:55:42 -05:00
13 changed files with 345 additions and 104 deletions

View File

@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<configSections> <configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <sectionGroup name="userSettings"
<section name="ProcessCpuUsageStatusWindow.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="ProcessCpuUsageStatusWindow.Properties.Settings"
type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup> </sectionGroup>
</configSections> </configSections>
<startup> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup> </startup>
<userSettings> <userSettings>
<ProcessCpuUsageStatusWindow.Properties.Settings> <ProcessCpuUsageStatusWindow.Properties.Settings>
@@ -25,6 +29,9 @@
<setting name="FirstRun" serializeAs="String"> <setting name="FirstRun" serializeAs="String">
<value>True</value> <value>True</value>
</setting> </setting>
<setting name="ShowProcessId" serializeAs="String">
<value>False</value>
</setting>
</ProcessCpuUsageStatusWindow.Properties.Settings> </ProcessCpuUsageStatusWindow.Properties.Settings>
</userSettings> </userSettings>
</configuration> </configuration>

View File

@@ -4,21 +4,43 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:windows="clr-namespace:Common.Wpf.Windows;assembly=Common.Wpf" xmlns:windows="clr-namespace:Common.Wpf.Windows;assembly=Common.Wpf"
xmlns:properties="clr-namespace:ProcessCpuUsageStatusWindow.Properties"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="300" d:DesignHeight="300"
d:DesignWidth="300"> d:DesignWidth="300">
<Grid> <Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Text="[Application Name]" <TextBlock Text="[Application Name]"
Name="ApplicationNameLabel" Name="ApplicationNameLabel"
VerticalAlignment="Top" VerticalAlignment="Top"
FontWeight="Bold" /> FontWeight="Bold"
Grid.Row="0" />
<TextBlock Text="[Application Version]" <TextBlock Text="[Application Version]"
Margin="0,22,0,0" Margin="0,6,0,0"
Name="VersionLabel" Name="VersionLabel"
VerticalAlignment="Top" /> VerticalAlignment="Top"
Grid.Row="1" />
<TextBlock Text="[Company]" <TextBlock Text="[Company]"
Margin="0,44,0,0" Margin="0,6,0,0"
Name="CompanyLabel" Name="CompanyLabel"
VerticalAlignment="Top" /> VerticalAlignment="Top"
Grid.Row="2" />
<StackPanel Grid.Row="3"
Grid.Column="0"
Margin="0,20,0,0"
Orientation="Horizontal">
<Button Content="{x:Static properties:Resources.CheckUpdate}"
HorizontalAlignment="Left"
Padding="6,2"
Click="HandleCheckForUpdateButtonClick"
VerticalContentAlignment="Center" />
<Label Name="UpdateMessage" Content="" VerticalContentAlignment="Center" Padding="6,0" />
</StackPanel>
</Grid> </Grid>
</windows:CategoryPanel> </windows:CategoryPanel>

View File

@@ -1,5 +1,5 @@
using Common.Update; using System.Reflection;
using System.Reflection; using System.Windows;
namespace ProcessCpuUsageStatusWindow.Options namespace ProcessCpuUsageStatusWindow.Options
{ {
@@ -32,5 +32,10 @@ namespace ProcessCpuUsageStatusWindow.Options
} }
public override string CategoryName => Properties.Resources.OptionCategory_About; public override string CategoryName => Properties.Resources.OptionCategory_About;
private async void HandleCheckForUpdateButtonClick(object sender, RoutedEventArgs e)
{
await UpdateCheck.CheckUpdate((status, message) => UpdateMessage.Content = message);
}
} }
} }

View File

@@ -15,6 +15,7 @@
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition> <RowDefinition Height="*"></RowDefinition>
@@ -23,18 +24,34 @@
Name="StartWithWindows" Name="StartWithWindows"
VerticalAlignment="Top" VerticalAlignment="Top"
VerticalContentAlignment="Center" VerticalContentAlignment="Center"
Grid.Column="0"
Grid.Row="0"
Grid.ColumnSpan="2" /> Grid.ColumnSpan="2" />
<Label Grid.Column="0" <Label Grid.Column="0"
Grid.Row="1" Grid.Row="1"
Content="{x:Static properties:Resources.NumberOfProcesses}" Content="{x:Static properties:Resources.NumberOfProcesses}"
Margin="0,6,6,6" Margin="0,4,6,4"
Padding="0" Padding="0"
VerticalContentAlignment="Center" VerticalAlignment="Center" /> VerticalContentAlignment="Center"
VerticalAlignment="Center"
Target="{x:Reference NumberOfProcesses}" />
<xctk:IntegerUpDown Grid.Column="1" <xctk:IntegerUpDown Grid.Column="1"
Grid.Row="1" x:Name="NumberOfProcesses" Grid.Row="1"
Minimum="1" Maximum="20" x:Name="NumberOfProcesses"
TextAlignment="Left" Margin="6" Minimum="1"
Maximum="20"
TextAlignment="Left"
Margin="0,12,6,12"
Width="50" Width="50"
VerticalContentAlignment="Center"
VerticalAlignment="Center"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
<CheckBox Content="{x:Static properties:Resources.ShowProcessId}"
Name="ShowProcessId"
VerticalAlignment="Top"
VerticalContentAlignment="Center"
Grid.Column="0"
Grid.Row="2"
Grid.ColumnSpan="2" />
</Grid> </Grid>
</windows:CategoryPanel> </windows:CategoryPanel>

View File

@@ -5,9 +5,13 @@ namespace ProcessCpuUsageStatusWindow.Options
{ {
public partial class GeneralOptionsPanel public partial class GeneralOptionsPanel
{ {
public GeneralOptionsPanel() private bool IsV2 { get; }
public GeneralOptionsPanel(bool isV2)
{ {
InitializeComponent(); InitializeComponent();
IsV2 = isV2;
} }
public override void LoadPanel(object data) public override void LoadPanel(object data)
@@ -18,6 +22,9 @@ namespace ProcessCpuUsageStatusWindow.Options
StartWithWindows.IsChecked = settings.AutoStart; StartWithWindows.IsChecked = settings.AutoStart;
NumberOfProcesses.Text = settings.ProcessCount.ToString(); NumberOfProcesses.Text = settings.ProcessCount.ToString();
ShowProcessId.IsChecked = settings.ShowProcessId;
ShowProcessId.Visibility = IsV2 ? Visibility.Visible : Visibility.Collapsed;
} }
public override bool ValidatePanel() public override bool ValidatePanel()
@@ -34,6 +41,9 @@ namespace ProcessCpuUsageStatusWindow.Options
settings.ProcessCount = int.Parse(NumberOfProcesses.Text); settings.ProcessCount = int.Parse(NumberOfProcesses.Text);
if (ShowProcessId.IsChecked.HasValue && settings.ShowProcessId != ShowProcessId.IsChecked.Value)
settings.ShowProcessId = ShowProcessId.IsChecked.Value;
Application.Current.SetStartWithWindows(settings.AutoStart); Application.Current.SetStartWithWindows(settings.AutoStart);
} }

View File

@@ -136,6 +136,7 @@
<Compile Include="Options\GeneralOptionsPanel.xaml.cs"> <Compile Include="Options\GeneralOptionsPanel.xaml.cs">
<DependentUpon>GeneralOptionsPanel.xaml</DependentUpon> <DependentUpon>GeneralOptionsPanel.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="UpdateCheck.cs" />
<Compile Include="WindowSource.cs" /> <Compile Include="WindowSource.cs" />
<Page Include="Options\AboutOptionsPanel.xaml"> <Page Include="Options\AboutOptionsPanel.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>

View File

@@ -28,6 +28,8 @@ namespace ProcessCpuUsageStatusWindow
public Dictionary<string, ProcessCpuUsage> CurrentProcessList; public Dictionary<string, ProcessCpuUsage> CurrentProcessList;
public bool IsV2 => _processCategory.CategoryName == "Process V2";
#endregion #endregion
#region Initialize and terminate #region Initialize and terminate
@@ -40,18 +42,19 @@ namespace ProcessCpuUsageStatusWindow
CurrentProcessList = new Dictionary<string, ProcessCpuUsage>(); CurrentProcessList = new Dictionary<string, ProcessCpuUsage>();
// Get the category for process performance info // Get the category for process performance info
_processCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == "Process"); _processCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == "Process V2") ??
PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == "Process");
if (_processCategory == null) if (_processCategory == null)
return; return;
// Read the entire category // Read the entire category
InstanceDataCollectionCollection processCategoryData = _processCategory.ReadCategory(); var processCategoryData = _processCategory.ReadCategory();
// Get the processor time data // Get the processor time data
InstanceDataCollection processorTimeData = processCategoryData["% processor time"]; var processorTimeData = processCategoryData["% processor time"];
if (processorTimeData == null || processorTimeData.Values == null) if (processorTimeData?.Values == null)
return; return;
// Loop over each instance and add it to the list // Loop over each instance and add it to the list
@@ -109,15 +112,15 @@ namespace ProcessCpuUsageStatusWindow
private void UpdateCurrentProcessList() private void UpdateCurrentProcessList()
{ {
// Get a timestamp for the current time that we can use to see if a process was found this check // Get a timestamp for the current time that we can use to see if a process was found this check
DateTime checkStart = DateTime.Now; var checkStart = DateTime.Now;
// Read the entire category // Read the entire category
InstanceDataCollectionCollection processCategoryData = _processCategory.ReadCategory(); var processCategoryData = _processCategory.ReadCategory();
// Get the processor time data // Get the processor time data
InstanceDataCollection processorTimeData = processCategoryData["% processor time"]; var processorTimeData = processCategoryData["% processor time"];
if (processorTimeData == null || processorTimeData.Values == null) if (processorTimeData?.Values == null)
return; return;
// Loop over each instance and add it to the list // Loop over each instance and add it to the list
@@ -127,7 +130,7 @@ namespace ProcessCpuUsageStatusWindow
if (CurrentProcessList.ContainsKey(instanceData.InstanceName)) if (CurrentProcessList.ContainsKey(instanceData.InstanceName))
{ {
// Get the previous process usage object // Get the previous process usage object
ProcessCpuUsage processCpuUsage = CurrentProcessList[instanceData.InstanceName]; var processCpuUsage = CurrentProcessList[instanceData.InstanceName];
// Update the CPU usage with new data // Update the CPU usage with new data
processCpuUsage.UpdateCpuUsage(instanceData, checkStart); processCpuUsage.UpdateCpuUsage(instanceData, checkStart);

View File

@@ -19,7 +19,7 @@ namespace ProcessCpuUsageStatusWindow.Properties {
// class via a tool like ResGen or Visual Studio. // class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen // To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project. // with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class Resources { public class Resources {
@@ -88,6 +88,33 @@ namespace ProcessCpuUsageStatusWindow.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Checking for update....
/// </summary>
public static string CheckingForUpdate {
get {
return ResourceManager.GetString("CheckingForUpdate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Check for Update.
/// </summary>
public static string CheckUpdate {
get {
return ResourceManager.GetString("CheckUpdate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Downloading update....
/// </summary>
public static string DownloadingUpdate {
get {
return ResourceManager.GetString("DownloadingUpdate", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to CPU: {0,4:f1}% - Total. /// Looks up a localized string similar to CPU: {0,4:f1}% - Total.
/// </summary> /// </summary>
@@ -106,6 +133,15 @@ namespace ProcessCpuUsageStatusWindow.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Installing update....
/// </summary>
public static string InstallingUpdate {
get {
return ResourceManager.GetString("InstallingUpdate", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Loading.... /// Looks up a localized string similar to Loading....
/// </summary> /// </summary>
@@ -115,6 +151,15 @@ namespace ProcessCpuUsageStatusWindow.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to No update found.
/// </summary>
public static string NoUpdate {
get {
return ResourceManager.GetString("NoUpdate", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to _Number of processes:. /// Looks up a localized string similar to _Number of processes:.
/// </summary> /// </summary>
@@ -188,6 +233,33 @@ namespace ProcessCpuUsageStatusWindow.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to CPU: {1,4:f1}% - {0} ({2}).
/// </summary>
public static string ProcessLineWithProcessId {
get {
return ResourceManager.GetString("ProcessLineWithProcessId", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Restarting application....
/// </summary>
public static string RestartingAfterUpdate {
get {
return ResourceManager.GetString("RestartingAfterUpdate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Show _process ID.
/// </summary>
public static string ShowProcessId {
get {
return ResourceManager.GetString("ShowProcessId", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to _Start when Windows starts. /// Looks up a localized string similar to _Start when Windows starts.
/// </summary> /// </summary>

View File

@@ -127,15 +127,30 @@
<data name="ApplicationName" xml:space="preserve"> <data name="ApplicationName" xml:space="preserve">
<value>Process CPU Usage</value> <value>Process CPU Usage</value>
</data> </data>
<data name="CheckingForUpdate" xml:space="preserve">
<value>Checking for update...</value>
</data>
<data name="CheckUpdate" xml:space="preserve">
<value>_Check for Update</value>
</data>
<data name="DownloadingUpdate" xml:space="preserve">
<value>Downloading update...</value>
</data>
<data name="FooterLine" xml:space="preserve"> <data name="FooterLine" xml:space="preserve">
<value>CPU: {0,4:f1}% - Total</value> <value>CPU: {0,4:f1}% - Total</value>
</data> </data>
<data name="HeaderLine" xml:space="preserve"> <data name="HeaderLine" xml:space="preserve">
<value /> <value />
</data> </data>
<data name="InstallingUpdate" xml:space="preserve">
<value>Installing update...</value>
</data>
<data name="Loading" xml:space="preserve"> <data name="Loading" xml:space="preserve">
<value>Loading...</value> <value>Loading...</value>
</data> </data>
<data name="NoUpdate" xml:space="preserve">
<value>No update found</value>
</data>
<data name="NumberOfProcesses" xml:space="preserve"> <data name="NumberOfProcesses" xml:space="preserve">
<value>_Number of processes:</value> <value>_Number of processes:</value>
</data> </data>
@@ -166,4 +181,13 @@
<data name="Updating" xml:space="preserve"> <data name="Updating" xml:space="preserve">
<value>Updating application...</value> <value>Updating application...</value>
</data> </data>
<data name="RestartingAfterUpdate" xml:space="preserve">
<value>Restarting application...</value>
</data>
<data name="ProcessLineWithProcessId" xml:space="preserve">
<value>CPU: {1,4:f1}% - {0} ({2})</value>
</data>
<data name="ShowProcessId" xml:space="preserve">
<value>Show _process ID</value>
</data>
</root> </root>

View File

@@ -12,7 +12,7 @@ namespace ProcessCpuUsageStatusWindow.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.5.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -82,5 +82,17 @@ namespace ProcessCpuUsageStatusWindow.Properties {
this["FirstRun"] = value; this["FirstRun"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool ShowProcessId {
get {
return ((bool)(this["ShowProcessId"]));
}
set {
this["ShowProcessId"] = value;
}
}
} }
} }

View File

@@ -17,5 +17,8 @@
<Setting Name="FirstRun" Type="System.Boolean" Scope="User"> <Setting Name="FirstRun" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value> <Value Profile="(Default)">True</Value>
</Setting> </Setting>
<Setting Name="ShowProcessId" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings> </Settings>
</SettingsFile> </SettingsFile>

71
UpdateCheck.cs Normal file
View File

@@ -0,0 +1,71 @@
using Squirrel;
using System;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Threading.Tasks;
namespace ProcessCpuUsageStatusWindow
{
public static class UpdateCheck
{
public enum UpdateStatus
{
Checking,
None,
Downloading,
Installing,
Restarting
}
public delegate void UpdateStatusDelegate(UpdateStatus updateStatus, string message);
public static Version LocalVersion => Assembly.GetEntryAssembly().GetName().Version;
public static async Task<bool> CheckUpdate(UpdateStatusDelegate onUpdateStatus)
{
try
{
onUpdateStatus.Invoke(UpdateStatus.Checking, Properties.Resources.CheckingForUpdate);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
using (var updateManager = await UpdateManager.GitHubUpdateManager(App.UpdateUrl))
{
var updates = await updateManager.CheckForUpdate();
var lastVersion = updates?.ReleasesToApply?.OrderBy(releaseEntry => releaseEntry.Version).LastOrDefault();
if (lastVersion == null)
{
onUpdateStatus.Invoke(UpdateStatus.None, Properties.Resources.NoUpdate);
return false;
}
onUpdateStatus.Invoke(UpdateStatus.Downloading, Properties.Resources.DownloadingUpdate);
Common.Settings.Extensions.BackupSettings();
await updateManager.DownloadReleases(new[] { lastVersion });
onUpdateStatus.Invoke(UpdateStatus.Installing, Properties.Resources.InstallingUpdate);
await updateManager.ApplyReleases(updates);
await updateManager.UpdateApp();
}
onUpdateStatus.Invoke(UpdateStatus.Restarting, Properties.Resources.RestartingAfterUpdate);
UpdateManager.RestartApp();
return true;
}
catch (Exception exception)
{
Console.WriteLine(exception);
return false;
}
}
}
}

View File

@@ -2,13 +2,10 @@
using FloatingStatusWindowLibrary; using FloatingStatusWindowLibrary;
using ProcessCpuUsageStatusWindow.Options; using ProcessCpuUsageStatusWindow.Options;
using ProcessCpuUsageStatusWindow.Properties; using ProcessCpuUsageStatusWindow.Properties;
using Squirrel;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net;
using System.Text; using System.Text;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Threading; using System.Windows.Threading;
@@ -29,48 +26,28 @@ namespace ProcessCpuUsageStatusWindow
_processCpuUsageWatcher = new ProcessCpuUsageWatcher(); _processCpuUsageWatcher = new ProcessCpuUsageWatcher();
Task.Factory.StartNew(UpdateApp); Task.Factory.StartNew(UpdateApp).ContinueWith(task => StartUpdate(task.Result.Result));
} }
private async Task UpdateApp() private void StartUpdate(bool updateRequired)
{ {
try if (updateRequired)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
using (var updateManager = await UpdateManager.GitHubUpdateManager(App.UpdateUrl))
{
var updates = await updateManager.CheckForUpdate();
var lastVersion = updates?.ReleasesToApply?.OrderBy(releaseEntry => releaseEntry.Version).LastOrDefault();
if (lastVersion == null)
return; return;
_dispatcher.Invoke(() => _floatingStatusWindow.SetText(Resources.Updating)); Task.Factory.StartNew(() => _processCpuUsageWatcher.Initialize(Settings.Default.UpdateInterval, UpdateDisplay, _dispatcher));
Thread.Sleep(500);
Common.Settings.Extensions.BackupSettings();
#if !DEBUG
await updateManager.DownloadReleases(new[] { lastVersion });
await updateManager.ApplyReleases(updates);
await updateManager.UpdateApp();
#endif
} }
#if !DEBUG private async Task<bool> UpdateApp()
UpdateManager.RestartApp();
#endif
}
catch (Exception exception)
{ {
Console.WriteLine(exception); return await UpdateCheck.CheckUpdate(HandleUpdateStatus);
} }
finally
private void HandleUpdateStatus(UpdateCheck.UpdateStatus status, string message)
{ {
await Task.Factory.StartNew(() => _processCpuUsageWatcher.Initialize(Settings.Default.UpdateInterval, UpdateDisplay, _dispatcher)); if (status == UpdateCheck.UpdateStatus.None)
} message = Resources.Loading;
_dispatcher.Invoke(() => _floatingStatusWindow.SetText(message));
} }
public void Dispose() public void Dispose()
@@ -85,7 +62,7 @@ namespace ProcessCpuUsageStatusWindow
{ {
var panels = new List<CategoryPanel> var panels = new List<CategoryPanel>
{ {
new GeneralOptionsPanel(), new GeneralOptionsPanel(_processCpuUsageWatcher.IsV2),
new AboutOptionsPanel() new AboutOptionsPanel()
}; };
@@ -138,6 +115,7 @@ namespace ProcessCpuUsageStatusWindow
{ {
public const string Total = "_Total"; public const string Total = "_Total";
public const string Idle = "Idle"; public const string Idle = "Idle";
public const string IdleWithProcessId = "Idle:0";
} }
private void UpdateDisplay(Dictionary<string, ProcessCpuUsage> currentProcessList) private void UpdateDisplay(Dictionary<string, ProcessCpuUsage> currentProcessList)
@@ -146,13 +124,13 @@ namespace ProcessCpuUsageStatusWindow
var validProcessList = (currentProcessList.Values.Where( var validProcessList = (currentProcessList.Values.Where(
process => process =>
process.UsageValid && process.ProcessName != PredefinedProcessName.Total && process.UsageValid && process.ProcessName != PredefinedProcessName.Total &&
process.ProcessName != PredefinedProcessName.Idle)).ToList(); process.ProcessName != (_processCpuUsageWatcher.IsV2 ? PredefinedProcessName.IdleWithProcessId : PredefinedProcessName.Idle))).ToList();
// Calculate the total usage by adding up all the processes we know about // Calculate the total usage by adding up all the processes we know about
var totalUsage = validProcessList.Sum(process => process.PercentUsage); var totalUsage = validProcessList.Sum(process => process.PercentUsage);
// Sort the process list by usage and take only the top few // Sort the process list by usage and take only the top few
var sortedProcessList = (validProcessList.OrderByDescending(process => process.PercentUsage)).Take(Settings.Default.ProcessCount); var sortedProcessList = validProcessList.OrderByDescending(process => process.PercentUsage).Take(Settings.Default.ProcessCount);
// Create a new string builder // Create a new string builder
var stringBuilder = new StringBuilder(); var stringBuilder = new StringBuilder();
@@ -166,15 +144,31 @@ namespace ProcessCpuUsageStatusWindow
} }
// Loop over all processes in the sorted list // Loop over all processes in the sorted list
foreach (ProcessCpuUsage processCpuUsage in sortedProcessList) foreach (var processCpuUsage in sortedProcessList)
{ {
// Move to the next line if it isn't the first line // Move to the next line if it isn't the first line
if (stringBuilder.Length != 0) if (stringBuilder.Length != 0)
stringBuilder.AppendLine(); stringBuilder.AppendLine();
if (_processCpuUsageWatcher.IsV2)
{
// Split the process name from the process ID
var colonPosition = processCpuUsage.ProcessName.LastIndexOf(':');
var processName = processCpuUsage.ProcessName.Substring(0, colonPosition);
var processId = processCpuUsage.ProcessName.Substring(colonPosition + 1);
var formatString = Settings.Default.ShowProcessId ? Resources.ProcessLineWithProcessId : Resources.ProcessLine;
// Format the process information into a string to display
stringBuilder.AppendFormat(formatString, processName, processCpuUsage.PercentUsage, processId);
}
else
{
// Format the process information into a string to display // Format the process information into a string to display
stringBuilder.AppendFormat(Resources.ProcessLine, processCpuUsage.ProcessName, processCpuUsage.PercentUsage); stringBuilder.AppendFormat(Resources.ProcessLine, processCpuUsage.ProcessName, processCpuUsage.PercentUsage);
} }
}
// Add the footer line (if any) // Add the footer line (if any)
if (Resources.FooterLine.Length > 0) if (Resources.FooterLine.Length > 0)