diff --git a/EnvyUpdate.sln b/EnvyUpdate.sln
index d7abf71..5225e06 100644
--- a/EnvyUpdate.sln
+++ b/EnvyUpdate.sln
@@ -1,32 +1,23 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.6.33829.357
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29411.108
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvyUpdate", "EnvyUpdate\EnvyUpdate.csproj", "{1BF2468D-9579-462D-9153-4836E9C8721F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug - ignoregpu|Any CPU = Debug - ignoregpu|Any CPU
- Debug - ignoregpu|x86 = Debug - ignoregpu|x86
Debug|Any CPU = Debug|Any CPU
- Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
- Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|Any CPU.ActiveCfg = Debug - ignoregpu|Any CPU
{1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|Any CPU.Build.0 = Debug - ignoregpu|Any CPU
- {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|x86.ActiveCfg = Debug - ignoregpu|x86
- {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|x86.Build.0 = Debug - ignoregpu|x86
{1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|x86.ActiveCfg = Debug|x86
- {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|x86.Build.0 = Debug|x86
{1BF2468D-9579-462D-9153-4836E9C8721F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1BF2468D-9579-462D-9153-4836E9C8721F}.Release|Any CPU.Build.0 = Release|Any CPU
- {1BF2468D-9579-462D-9153-4836E9C8721F}.Release|x86.ActiveCfg = Release|x86
- {1BF2468D-9579-462D-9153-4836E9C8721F}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/EnvyUpdate/App.xaml b/EnvyUpdate/App.xaml
index de53160..414c0d4 100644
--- a/EnvyUpdate/App.xaml
+++ b/EnvyUpdate/App.xaml
@@ -2,14 +2,8 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:EnvyUpdate"
- xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
StartupUri="MainWindow.xaml">
-
-
-
-
-
-
+
diff --git a/EnvyUpdate/App.xaml.cs b/EnvyUpdate/App.xaml.cs
index 2d0e158..3bd4437 100644
--- a/EnvyUpdate/App.xaml.cs
+++ b/EnvyUpdate/App.xaml.cs
@@ -8,7 +8,6 @@ using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using Windows.Foundation.Collections;
-using Wpf.Ui.Markup;
namespace EnvyUpdate
{
@@ -19,28 +18,26 @@ namespace EnvyUpdate
{
protected override void OnStartup(StartupEventArgs e)
{
- // Remove placeholder light theme and apply system app theme
- Wpf.Ui.Appearance.Accent.ApplySystemAccent();
- Application.Current.Resources.MergedDictionaries.RemoveAt(0);
- ThemesDictionary themedict = new ThemesDictionary();
- if (Util.IsDarkTheme())
- themedict.Theme = Wpf.Ui.Appearance.ThemeType.Dark;
- else
- themedict.Theme = Wpf.Ui.Appearance.ThemeType.Light;
- Application.Current.Resources.MergedDictionaries.Add(themedict);
- // TODO: Watch for theme changes and dynamically update
-
// Listen to notification activation
- ToastNotificationManagerCompat.OnActivated += ToastNotificationManagerCompat_OnActivated;
- }
-
- private void ToastNotificationManagerCompat_OnActivated(ToastNotificationActivatedEventArgsCompat e)
- {
- // Need to dispatch to UI thread if performing UI operations
- Application.Current.Dispatcher.Invoke(delegate
+ ToastNotificationManagerCompat.OnActivated += toastArgs =>
{
- Util.ShowMain();
- });
+ // Obtain the arguments from the notification
+ ToastArguments args = ToastArguments.Parse(toastArgs.Argument);
+
+ // Need to dispatch to UI thread if performing UI operations
+ Application.Current.Dispatcher.Invoke(delegate
+ {
+ switch (args.Get("action"))
+ {
+ case "download":
+ Process.Start(Util.GetGpuUrl());
+ break;
+ default:
+ Util.ShowMain();
+ break;
+ }
+ });
+ };
}
}
}
diff --git a/EnvyUpdate/DashboardPage.xaml b/EnvyUpdate/DashboardPage.xaml
deleted file mode 100644
index dc9d964..0000000
--- a/EnvyUpdate/DashboardPage.xaml
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/EnvyUpdate/DashboardPage.xaml.cs b/EnvyUpdate/DashboardPage.xaml.cs
deleted file mode 100644
index f7e4f1d..0000000
--- a/EnvyUpdate/DashboardPage.xaml.cs
+++ /dev/null
@@ -1,410 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Net;
-using System.Text.RegularExpressions;
-using System.Threading;
-using System.Windows;
-using System.Windows.Threading;
-using Wpf.Ui.Controls;
-using MessageBox = System.Windows.MessageBox;
-
-namespace EnvyUpdate
-{
- ///
- /// Interaction logic for Dashboard.xaml
- ///
- public partial class DashboardPage
- {
- private string localDriv = null;
- private string onlineDriv = null;
- private string gpuURL = null;
- private string skippedVer = null;
-
- public DashboardPage()
- {
- InitializeComponent();
-
- if (Debug.isFake)
- localDriv = Debug.LocalDriv();
- else
- localDriv = Util.GetLocDriv();
-
- Debug.LogToFile("INFO Local driver version: " + localDriv);
-
- if (localDriv != null)
- {
- Debug.LogToFile("INFO Local driver version already known, updating info without reloading.");
- UpdateLocalVer(false);
- }
-
- Debug.LogToFile("INFO Detecting driver type.");
-
- if (Debug.isFake)
- textblockLocalType.Text = "DCH (Debug)";
- else if (Util.IsDCH())
- textblockLocalType.Text = "DCH";
- else
- textblockLocalType.Text = "Standard";
-
- Debug.LogToFile("INFO Done detecting driver type: " + textblockLocalType.Text);
-
- // Check for startup shortcut
- if (File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "EnvyUpdate.lnk")))
- {
- Debug.LogToFile("INFO Autostart is enabled.");
- switchAutostart.IsChecked = true;
- switchAutostart_Click(null, null); //Automatically recreate shortcut to account for moved EXE.
- }
-
- DispatcherTimer Dt = new DispatcherTimer();
- Dt.Tick += new EventHandler(Dt_Tick);
- // Check for new updates every 5 hours.
- Dt.Interval = new TimeSpan(5, 0, 0);
- Dt.Start();
- Debug.LogToFile("INFO Started check timer.");
-
- string watchDirPath = Path.Combine(Environment.ExpandEnvironmentVariables("%ProgramW6432%"), "NVIDIA Corporation\\Installer2\\InstallerCore");
- if (Directory.Exists(watchDirPath))
- {
- GlobalVars.monitoringInstall = true;
-
- var driverFileChangedWatcher = new FileSystemWatcher(watchDirPath);
- driverFileChangedWatcher.NotifyFilter = NotifyFilters.Attributes
- | NotifyFilters.CreationTime
- | NotifyFilters.FileName
- | NotifyFilters.LastAccess
- | NotifyFilters.LastWrite
- | NotifyFilters.Size;
- driverFileChangedWatcher.Changed += DriverFileChanged;
-
- driverFileChangedWatcher.Filter = "*.dll";
- driverFileChangedWatcher.IncludeSubdirectories = false;
- driverFileChangedWatcher.EnableRaisingEvents = true;
- Debug.LogToFile("INFO Started update file system watcher.");
- }
- else
- Debug.LogToFile("WARN Could not start update file system watcher. Path not found: " + watchDirPath);
-
- Load();
- }
-
- private void Dt_Tick(object sender, EventArgs e)
- {
- Load();
- }
-
- private void Load()
- {
- if (Util.GetDTID() == 18)
- {
- Debug.LogToFile("INFO Found studio driver.");
- switchStudioDriver.IsChecked = true;
- }
- else
- {
- Debug.LogToFile("INFO Found standard driver.");
- switchStudioDriver.IsChecked = false;
- }
-
- if (File.Exists(GlobalVars.exedirectory + "skip.envy"))
- {
- Debug.LogToFile("INFO Found version skip config.");
- skippedVer = File.ReadLines(GlobalVars.exedirectory + "skip.envy").First();
- }
-
- // This little bool check is necessary for debug fake mode.
- if (Debug.isFake)
- {
- localDriv = Debug.LocalDriv();
- cardLocal.Header = localDriv;
- textblockGPUName.Text = Debug.GPUname();
- }
-
- try
- {
- Debug.LogToFile("INFO Trying to get GPU update URL.");
- gpuURL = Util.GetGpuUrl();
- }
- catch (ArgumentException)
- {
- Debug.LogToFile("WARN Could not get GPU update URL, trying again with non-studio driver.");
- try
- {
- // disable SD and try with GRD
- if (File.Exists(GlobalVars.exedirectory + "sd.envy"))
- {
- File.Delete(GlobalVars.exedirectory + "sd.envy");
- }
-
- gpuURL = Util.GetGpuUrl(); //try again with GRD
- MessageBox.Show(Properties.Resources.ui_studionotsupported);
- switchStudioDriver.IsChecked = false;
- }
- catch (ArgumentNullException)
- {
- MessageBox.Show("ERROR: Could not get list of GPU models from Nvidia, please check your network connection.\nOtherwise, please report this issue on GitHub.");
- Environment.Exit(11);
- }
- catch (ArgumentException e)
- {
- // Now we have a problem.
- Debug.LogToFile("FATAL Invalid API response from Nvidia. Attempted API call: " + e.Message);
- MessageBox.Show("ERROR: Invalid API response from Nvidia. Please file an issue on GitHub.\nAttempted API call:\n" + e.Message);
- Environment.Exit(10);
- }
- }
-
- using (var c = new WebClient())
- {
- Debug.LogToFile("INFO Trying to get newest driver version.");
- string pContent = c.DownloadString(gpuURL);
- var pattern = @"Windows\/\d{3}\.\d{2}";
- Regex rgx = new Regex(pattern);
- var matches = rgx.Matches(pContent);
- onlineDriv = Regex.Replace(Convert.ToString(matches[0]), "Windows/", "");
- cardOnline.Header = onlineDriv;
- Debug.LogToFile("INFO Got online driver version: " + onlineDriv);
- }
-
- try
- {
- if (float.Parse(localDriv) < float.Parse(onlineDriv))
- {
- Debug.LogToFile("INFO Local version is older than online. Setting UI...");
- SetInfoBar(false);
- buttonDownload.Visibility = Visibility.Visible;
- if (skippedVer == null)
- {
- buttonSkipVersion.ToolTip = Properties.Resources.ui_skipversion;
- buttonSkipVersion.IsEnabled = true;
- buttonSkipVersion.Visibility = Visibility.Visible;
- }
- else
- {
- buttonSkipVersion.IsEnabled = true;
- buttonSkipVersion.ToolTip = Properties.Resources.ui_skipped;
- }
-
- Debug.LogToFile("INFO UI set.");
-
- if (skippedVer != onlineDriv)
- {
- Debug.LogToFile("INFO Showing update popup notification.");
- Notify.ShowDrivUpdatePopup();
- }
- }
- else
- {
- Debug.LogToFile("INFO Local version is up to date.");
- buttonSkipVersion.Visibility = Visibility.Collapsed;
- SetInfoBar(true);
- }
- }
- catch (FormatException)
- {
- Debug.LogToFile("INFO Caught FormatException, assuming locale workaround is necessary.");
- //Thank you locales. Some languages need , instead of . for proper parsing
- string cLocalDriv = localDriv.Replace('.', ',');
- string cOnlineDriv = onlineDriv.Replace('.', ',');
- if (float.Parse(cLocalDriv) < float.Parse(cOnlineDriv))
- {
- Debug.LogToFile("INFO Local version is older than online. Setting UI...");
- SetInfoBar(false);
- buttonDownload.Visibility = Visibility.Visible;
- if (skippedVer == null)
- {
- buttonSkipVersion.IsEnabled = true;
- buttonSkipVersion.Visibility = Visibility.Visible;
- }
- else
- {
- buttonSkipVersion.IsEnabled = false;
- buttonSkipVersion.ToolTip = Properties.Resources.ui_skipped;
- }
-
- if (skippedVer != onlineDriv)
- {
- Debug.LogToFile("INFO Showing update popup notification.");
- Notify.ShowDrivUpdatePopup();
- }
- }
- else
- {
- Debug.LogToFile("INFO Local version is up to date.");
- buttonSkipVersion.Visibility = Visibility.Collapsed;
- SetInfoBar(true);
- }
- }
-
- //Check for different version than skipped version
- if (skippedVer != null && skippedVer != onlineDriv)
- {
- Debug.LogToFile("INFO Skipped version is surpassed, deleting setting.");
- skippedVer = null;
- if (File.Exists(GlobalVars.exedirectory + "skip.envy"))
- File.Delete(GlobalVars.exedirectory + "skip.envy");
- buttonSkipVersion.ToolTip = Properties.Resources.ui_skipversion;
- buttonSkipVersion.IsEnabled = true;
- buttonSkipVersion.Visibility = Visibility.Visible;
- }
- }
-
- private void switchStudioDriver_Unchecked(object sender, RoutedEventArgs e)
- {
- if (File.Exists(GlobalVars.exedirectory + "sd.envy"))
- {
- Debug.LogToFile("INFO Switching to game ready driver.");
- File.Delete(GlobalVars.exedirectory + "sd.envy");
- Load();
- }
- }
-
- private void switchStudioDriver_Checked(object sender, RoutedEventArgs e)
- {
- if (!File.Exists(GlobalVars.exedirectory + "sd.envy"))
- {
- Debug.LogToFile("INFO Switching to studio driver.");
- File.Create(GlobalVars.exedirectory + "sd.envy").Close();
- Load();
- }
- }
-
- private void switchAutostart_Click(object sender, RoutedEventArgs e)
- {
- if (File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "EnvyUpdate.lnk")))
- {
- Debug.LogToFile("INFO Removing autostart entry.");
- File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "EnvyUpdate.lnk"));
- }
- if (switchAutostart.IsChecked == true)
- {
- Debug.LogToFile("INFO Creating autostart entry.");
- Util.CreateShortcut("EnvyUpdate", Environment.GetFolderPath(Environment.SpecialFolder.Startup), GlobalVars.exeloc, "NVidia Update Checker", "/minimize");
- }
- }
-
- private void buttonSkipVersion_Click(object sender, RoutedEventArgs e)
- {
- Debug.LogToFile("INFO Skipping version.");
- skippedVer = onlineDriv;
- File.WriteAllText(GlobalVars.exedirectory + "skip.envy", onlineDriv);
- buttonSkipVersion.IsEnabled = false;
- buttonSkipVersion.ToolTip = Properties.Resources.ui_skipped;
- MessageBox.Show(Properties.Resources.skip_confirm);
- }
-
- private void UpdateLocalVer(bool reloadLocalDriv = true)
- {
- Debug.LogToFile("INFO Updating local driver version in UI.");
- if (reloadLocalDriv)
- {
- Debug.LogToFile("INFO Reloading local driver version.");
- localDriv = Util.GetLocDriv();
- }
- cardLocal.Header = localDriv;
- if (GlobalVars.isMobile)
- textblockGPUName.Text = Util.GetGPUName(false) + " (mobile)";
- else
- textblockGPUName.Text = Util.GetGPUName(false);
- }
-
- void DriverFileChanged(object sender, FileSystemEventArgs e)
- {
- Debug.LogToFile("INFO Watched driver file changed! Reloading data.");
- System.Threading.Thread.Sleep(10000);
- Application.Current.Dispatcher.Invoke(delegate
- {
- UpdateLocalVer();
- Load();
- });
- }
-
- private void CardOnline_Click(object sender, RoutedEventArgs e)
- {
- Debug.LogToFile("INFO Opening download page.");
- Process.Start(gpuURL);
- }
-
- private void SetInfoBar (bool good)
- {
- if (good)
- {
- infoBarStatus.Severity = Wpf.Ui.Controls.InfoBarSeverity.Success;
- infoBarStatus.Title = Properties.Resources.ui_info_uptodate;
- infoBarStatus.Message = Properties.Resources.ui_message_good;
- }
- else
- {
- infoBarStatus.Severity = Wpf.Ui.Controls.InfoBarSeverity.Warning;
- infoBarStatus.Title = Properties.Resources.ui_info_outdated;
- infoBarStatus.Message = Properties.Resources.ui_message_update;
- }
- }
-
- private void buttonDownload_Click(object sender, RoutedEventArgs e)
- {
- progressbarDownload.Visibility = Visibility.Visible;
- buttonDownload.IsEnabled = false;
-
- Thread thread = new Thread(() => {
- WebClient client = new WebClient();
- client.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0";
- client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
- client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
- client.DownloadFileAsync(new Uri(Util.GetDirectDownload(gpuURL)), Path.Combine(GlobalVars.exedirectory, "nvidia-installer.exe.downloading"));
- });
- thread.Start();
- }
-
- void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
- {
- double bytesIn = double.Parse(e.BytesReceived.ToString());
- double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
- double percentage = bytesIn / totalBytes * 100;
- Application.Current.Dispatcher.Invoke(new Action(() => {
- progressbarDownload.Value = int.Parse(Math.Truncate(percentage).ToString());
- }));
- }
- void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
- {
- Application.Current.Dispatcher.Invoke(new Action(() => {
- buttonDownload.IsEnabled = true;
- progressbarDownload.Visibility = Visibility.Collapsed;
- }));
- if (e.Error == null)
- {
- Application.Current.Dispatcher.Invoke(new Action(() => {
- showSnackbar(Wpf.Ui.Common.ControlAppearance.Success, Wpf.Ui.Common.SymbolRegular.CheckmarkCircle24, Properties.Resources.info_download_success, Properties.Resources.info_download_success_title);
- buttonDownload.Visibility = Visibility.Collapsed;
- buttonInstall.Visibility = Visibility.Visible;
- }));
- if (File.Exists(Path.Combine(GlobalVars.exedirectory, "nvidia-installer.exe")))
- File.Delete(Path.Combine(GlobalVars.exedirectory, "nvidia-installer.exe"));
- File.Move(Path.Combine(GlobalVars.exedirectory, "nvidia-installer.exe.downloading"), Path.Combine(GlobalVars.exedirectory, "nvidia-installer.exe"));
- }
- else
- {
- File.Delete(Path.Combine(GlobalVars.exedirectory, "nvidia-installer.exe.downloading"));
- Application.Current.Dispatcher.Invoke(new Action(() => {
- showSnackbar(Wpf.Ui.Common.ControlAppearance.Danger, Wpf.Ui.Common.SymbolRegular.ErrorCircle24, Properties.Resources.info_download_error, Properties.Resources.info_download_error_title);
- }));
- }
- }
- private void buttonInstall_Click(object sender, RoutedEventArgs e)
- {
-
- }
-
- private void showSnackbar (Wpf.Ui.Common.ControlAppearance appearance, Wpf.Ui.Common.SymbolRegular icon, string message = "", string title = "")
- {
- snackbarInfo.Appearance = appearance;
- snackbarInfo.Icon = icon;
- snackbarInfo.Title = title;
- snackbarInfo.Message = message;
- snackbarInfo.Show();
- }
- }
-}
diff --git a/EnvyUpdate/EnvyUpdate.csproj b/EnvyUpdate/EnvyUpdate.csproj
index 29dd347..b3e717f 100644
--- a/EnvyUpdate/EnvyUpdate.csproj
+++ b/EnvyUpdate/EnvyUpdate.csproj
@@ -72,37 +72,6 @@
app.manifest
-
- true
- bin\x86\Debug\
- DEBUG;TRACE
- full
- x86
- 7.3
- prompt
- true
-
-
- bin\x86\Release\
- TRACE
- true
- pdbonly
- x86
- 7.3
- prompt
- true
-
-
- true
- bin\x86\Debug - ignoregpu\
- DEBUG;TRACE
- full
- x86
- 7.3
- prompt
- MinimumRecommendedRules.ruleset
- true
-
@@ -131,25 +100,21 @@
+
+ InfoWindow.xaml
+
-
- DashboardPage.xaml
-
-
- True
- True
- Licenses.resx
-
Resources.de.resx
True
True
-
- SettingsPage.xaml
-
+
+ Designer
+ MSBuild:Compile
+
MSBuild:Compile
Designer
@@ -162,14 +127,6 @@
MainWindow.xaml
Code
-
- Designer
- MSBuild:Compile
-
-
- Designer
- MSBuild:Compile
-
@@ -185,10 +142,6 @@
Settings.settings
True
-
- ResXFileCodeGenerator
- Licenses.Designer.cs
-
PublicResXFileCodeGenerator
Resources.de.Designer.cs
@@ -244,6 +197,9 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
+
+ 1.1.0
+
7.1.3
@@ -253,9 +209,6 @@
7.0.1
-
- 2.0.3
-
\ No newline at end of file
diff --git a/EnvyUpdate/InfoWindow.xaml b/EnvyUpdate/InfoWindow.xaml
new file mode 100644
index 0000000..e9d09c5
--- /dev/null
+++ b/EnvyUpdate/InfoWindow.xaml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/EnvyUpdate/SettingsPage.xaml.cs b/EnvyUpdate/InfoWindow.xaml.cs
similarity index 69%
rename from EnvyUpdate/SettingsPage.xaml.cs
rename to EnvyUpdate/InfoWindow.xaml.cs
index 28fe8b7..6f369cb 100644
--- a/EnvyUpdate/SettingsPage.xaml.cs
+++ b/EnvyUpdate/InfoWindow.xaml.cs
@@ -1,15 +1,16 @@
using System;
-using System.IO;
using System.Windows;
+using System.Windows.Input;
+using System.IO;
namespace EnvyUpdate
{
///
- /// Interaction logic for SettingsPage.xaml
+ /// Interaction logic for InfoWindow.xaml
///
- public partial class SettingsPage
+ public partial class InfoWindow : Window
{
- public SettingsPage()
+ public InfoWindow()
{
InitializeComponent();
@@ -17,22 +18,15 @@ namespace EnvyUpdate
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
- textBlockVer.Text = version;
+ labelVer.Content += " " + version;
if (GlobalVars.monitoringInstall)
- textBlockVer.FontStyle = FontStyles.Italic;
+ labelVer.FontStyle = FontStyles.Italic;
if (File.Exists(Path.Combine(GlobalVars.exedirectory, "envyupdate.log")))
chkLog.IsChecked = true;
-
- textBoxLicEnvyupdate.Text = Properties.Licenses.EnvyUpdate;
- textBoxLicFody.Text = Properties.Licenses.Fody;
- textBoxLicCostura.Text = Properties.Licenses.CosturaFody;
- textBoxLicResourceembedder.Text = Properties.Licenses.ResourceEmbedder;
- textBoxLicWindowscommunitytoolkit.Text = Properties.Licenses.WindowsCommunityToolkit;
- textBoxLicWpfui.Text = Properties.Licenses.wpfui;
}
- private void CardWeb_Click(object sender, RoutedEventArgs e)
+ private void ButtonWeb_Click(object sender, RoutedEventArgs e)
{
Debug.LogToFile("INFO Launching website.");
System.Diagnostics.Process.Start("https://github.com/fyr77/EnvyUpdate/");
diff --git a/EnvyUpdate/MainWindow.xaml b/EnvyUpdate/MainWindow.xaml
index f12d454..81f4d3d 100644
--- a/EnvyUpdate/MainWindow.xaml
+++ b/EnvyUpdate/MainWindow.xaml
@@ -1,63 +1,31 @@
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/EnvyUpdate/MainWindow.xaml.cs b/EnvyUpdate/MainWindow.xaml.cs
index 6efb4fc..07909e0 100644
--- a/EnvyUpdate/MainWindow.xaml.cs
+++ b/EnvyUpdate/MainWindow.xaml.cs
@@ -1,17 +1,27 @@
using Microsoft.Toolkit.Uwp.Notifications;
using System;
+using System.Diagnostics;
using System.IO;
using System.Linq;
+using System.Management;
+using System.Net;
+using System.Text.RegularExpressions;
using System.Windows;
+using System.Windows.Media;
+using System.Windows.Threading;
namespace EnvyUpdate
{
///
/// Interaction logic for MainWindow.xaml
///
- public partial class MainWindow
+ public partial class MainWindow : Window
{
+ private string localDriv = null;
+ private string onlineDriv = null;
+ private string gpuURL = null;
private string[] arguments = null;
+ private string skippedVer = null;
public MainWindow()
{
@@ -42,7 +52,6 @@ namespace EnvyUpdate
{
Debug.LogToFile("FATAL Found another instance, terminating.");
-
MessageBox.Show(Properties.Resources.instance_already_running);
Environment.Exit(1);
}
@@ -51,19 +60,53 @@ namespace EnvyUpdate
if (Directory.Exists(GlobalVars.appdata))
{
Debug.LogToFile("INFO Found old appdata installation, uninstalling.");
- Util.UninstallAll();
+ UninstallAll();
}
- if (arguments.Contains("/fake"))
+ GlobalVars.isMobile = Util.IsMobile();
+ Debug.LogToFile("INFO Mobile: " + GlobalVars.isMobile);
+
+ localDriv = Util.GetLocDriv();
+
+ Debug.LogToFile("INFO Local driver version: " + localDriv);
+
+ if (localDriv != null)
{
- Debug.isFake = true;
- Debug.LogToFile("WARN Faking GPU with debug info.");
+ Debug.LogToFile("INFO Local driver version already known, updating info without reloading.");
+ UpdateLocalVer(false);
}
- else if (!Util.IsNvidia())
+ else
{
- Debug.LogToFile("FATAL No supported GPU found, terminating.");
- MessageBox.Show(Properties.Resources.no_compatible_gpu);
- Environment.Exit(255);
+ if (arguments.Contains("/fake"))
+ {
+ Debug.isFake = true;
+ Debug.LogToFile("WARN Faking GPU with debug info.");
+ }
+ else
+ {
+ Debug.LogToFile("FATAL No supported GPU found, terminating.");
+ MessageBox.Show(Properties.Resources.no_compatible_gpu);
+ Environment.Exit(255);
+ }
+ }
+
+ Debug.LogToFile("INFO Detecting driver type.");
+
+ if (Util.IsDCH())
+ textblockLocalType.Text = "DCH";
+ else if (Debug.isFake)
+ textblockLocalType.Text = "DCH (Debug)";
+ else
+ textblockLocalType.Text = "Standard";
+
+ Debug.LogToFile("INFO Done detecting driver type: " + textblockLocalType.Text);
+
+ // Check for startup shortcut
+ if (File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "EnvyUpdate.lnk")))
+ {
+ Debug.LogToFile("INFO Autostart is enabled.");
+ chkAutostart.IsChecked = true;
+ chkAutostart_Click(null, null); //Automatically recreate shortcut to account for moved EXE.
}
//Check if launched as miminized with arg
@@ -74,9 +117,204 @@ namespace EnvyUpdate
Hide();
}
- GlobalVars.isMobile = Util.IsMobile();
- Debug.LogToFile("INFO Mobile: " + GlobalVars.isMobile);
+ DispatcherTimer Dt = new DispatcherTimer();
+ Dt.Tick += new EventHandler(Dt_Tick);
+ // Check for new updates every 5 hours.
+ Dt.Interval = new TimeSpan(5, 0, 0);
+ Dt.Start();
+ Debug.LogToFile("INFO Started check timer.");
+
+ string watchDirPath = Path.Combine(Environment.ExpandEnvironmentVariables("%ProgramW6432%"), "NVIDIA Corporation\\Installer2\\InstallerCore");
+ if (Directory.Exists(watchDirPath))
+ {
+ GlobalVars.monitoringInstall = true;
+
+ var driverFileChangedWatcher = new FileSystemWatcher(watchDirPath);
+ driverFileChangedWatcher.NotifyFilter = NotifyFilters.Attributes
+ | NotifyFilters.CreationTime
+ | NotifyFilters.FileName
+ | NotifyFilters.LastAccess
+ | NotifyFilters.LastWrite
+ | NotifyFilters.Size;
+ driverFileChangedWatcher.Changed += DriverFileChanged;
+
+ driverFileChangedWatcher.Filter = "*.dll";
+ driverFileChangedWatcher.IncludeSubdirectories = false;
+ driverFileChangedWatcher.EnableRaisingEvents = true;
+ Debug.LogToFile("INFO Started update file system watcher.");
+ }
+
+ Load();
}
+
+ private void Dt_Tick(object sender, EventArgs e)
+ {
+ Load();
+ }
+
+ private void buttonHelp_Click(object sender, RoutedEventArgs e)
+ {
+ Debug.LogToFile("INFO Showing info window.");
+ InfoWindow infoWin = new InfoWindow();
+ infoWin.ShowDialog();
+ }
+
+ private void Load()
+ {
+ if (Util.GetDTID() == 18)
+ {
+ Debug.LogToFile("INFO Found studio driver.");
+ radioSD.IsChecked = true;
+ }
+ else
+ {
+ Debug.LogToFile("INFO Found standard driver.");
+ radioGRD.IsChecked = true;
+ }
+
+ if (File.Exists(GlobalVars.exedirectory + "skip.envy"))
+ {
+ Debug.LogToFile("INFO Found version skip config.");
+ skippedVer = File.ReadLines(GlobalVars.exedirectory + "skip.envy").First();
+ }
+
+ // This little bool check is necessary for debug mode on systems without an Nvidia GPU.
+ if (Debug.isFake)
+ {
+ localDriv = Debug.LocalDriv();
+ textblockGPU.Text = localDriv;
+ textblockGPUName.Text = Debug.GPUname();
+ }
+
+ try
+ {
+ Debug.LogToFile("INFO Trying to get GPU update URL.");
+ gpuURL = Util.GetGpuUrl();
+ }
+ catch (ArgumentException)
+ {
+ Debug.LogToFile("WARN Could not get GPU update URL, trying again with non-studio driver.");
+ try
+ {
+ // disable SD and try with GRD
+ if (File.Exists(GlobalVars.exedirectory + "sd.envy"))
+ {
+ File.Delete(GlobalVars.exedirectory + "sd.envy");
+ }
+
+ gpuURL = Util.GetGpuUrl(); //try again with GRD
+ MessageBox.Show(Properties.Resources.ui_studionotsupported);
+ radioGRD.IsChecked = true;
+ }
+ catch (ArgumentNullException)
+ {
+ MessageBox.Show("ERROR: Could not get list of GPU models from Nvidia, please check your network connection.\nOtherwise, please report this issue on GitHub.");
+ Environment.Exit(11);
+ }
+ catch (ArgumentException e)
+ {
+ // Now we have a problem.
+ Debug.LogToFile("FATAL Invalid API response from Nvidia. Attempted API call: " + e.Message);
+ MessageBox.Show("ERROR: Invalid API response from Nvidia. Please file an issue on GitHub.\nAttempted API call:\n" + e.Message);
+ Environment.Exit(10);
+ }
+ }
+
+ using (var c = new WebClient())
+ {
+ Debug.LogToFile("INFO Trying to get newest driver version.");
+ string pContent = c.DownloadString(gpuURL);
+ var pattern = @"Windows\/\d{3}\.\d{2}";
+ Regex rgx = new Regex(pattern);
+ var matches = rgx.Matches(pContent);
+ onlineDriv = Regex.Replace(Convert.ToString(matches[0]), "Windows/", "");
+ textblockOnline.Text = onlineDriv;
+ Debug.LogToFile("INFO Got online driver version: " + onlineDriv);
+ }
+
+ try
+ {
+ if (float.Parse(localDriv) < float.Parse(onlineDriv))
+ {
+ Debug.LogToFile("INFO Local version is older than online. Setting UI...");
+ textblockOnline.Foreground = Brushes.Red;
+ buttonDL.IsEnabled = true;
+ if (skippedVer == null)
+ {
+ buttonSkip.Content = Properties.Resources.ui_skipversion;
+ buttonSkip.IsEnabled = true;
+ }
+ else
+ buttonSkip.Content = Properties.Resources.ui_skipped;
+
+ Debug.LogToFile("INFO UI set.");
+
+ if (skippedVer != onlineDriv)
+ {
+ Debug.LogToFile("INFO Showing update popup notification.");
+ Notify.ShowDrivUpdatePopup();
+ }
+ }
+ else
+ {
+ Debug.LogToFile("INFO Local version is up to date.");
+ buttonSkip.IsEnabled = false;
+ textblockOnline.Foreground = Brushes.Green;
+ }
+ }
+ catch (FormatException)
+ {
+ Debug.LogToFile("INFO Caught FormatException, assuming locale workaround is necessary.");
+ //Thank you locales. Some languages need , instead of . for proper parsing
+ string cLocalDriv = localDriv.Replace('.', ',');
+ string cOnlineDriv = onlineDriv.Replace('.', ',');
+ if (float.Parse(cLocalDriv) < float.Parse(cOnlineDriv))
+ {
+ Debug.LogToFile("INFO Local version is older than online. Setting UI...");
+ textblockOnline.Foreground = Brushes.Red;
+ buttonDL.IsEnabled = true;
+ if (skippedVer == null)
+ buttonSkip.IsEnabled = true;
+ else
+ buttonSkip.Content = Properties.Resources.ui_skipped;
+ if (skippedVer != onlineDriv)
+ {
+ Debug.LogToFile("INFO Showing update popup notification.");
+ Notify.ShowDrivUpdatePopup();
+ }
+ }
+ else
+ {
+ Debug.LogToFile("INFO Local version is up to date.");
+ buttonSkip.IsEnabled = false;
+ textblockOnline.Foreground = Brushes.Green;
+ }
+ }
+
+ //Check for different version than skipped version
+ if (skippedVer != null && skippedVer != onlineDriv)
+ {
+ Debug.LogToFile("INFO Skipped version is surpassed, deleting setting.");
+ skippedVer = null;
+ if (File.Exists(GlobalVars.exedirectory + "skip.envy"))
+ File.Delete(GlobalVars.exedirectory + "skip.envy");
+ buttonSkip.Content = Properties.Resources.ui_skipversion;
+ buttonSkip.IsEnabled = true;
+ }
+ }
+
+ private void buttonDL_Click(object sender, RoutedEventArgs e)
+ {
+ Debug.LogToFile("INFO Opening download page.");
+ Process.Start(gpuURL);
+ }
+
+ private void TaskbarIcon_TrayLeftMouseDown(object sender, RoutedEventArgs e)
+ {
+ Debug.LogToFile("INFO Tray was clicked, opening main window.");
+ Util.ShowMain();
+ }
+
private void Window_StateChanged(object sender, EventArgs e)
{
if (WindowState == WindowState.Minimized)
@@ -86,25 +324,115 @@ namespace EnvyUpdate
}
}
- private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+ public void UninstallAll()
{
- Debug.LogToFile("INFO Uninstalling notifications and shutting down.");
- ToastNotificationManagerCompat.Uninstall(); // Uninstall notifications to prevent issues with the app being portable.
- Application.Current.Shutdown();
+ if (File.Exists(GlobalVars.startup + "\\EnvyUpdate.lnk"))
+ {
+ Debug.LogToFile("INFO Deleted startup entry.");
+ File.Delete(GlobalVars.startup + "\\EnvyUpdate.lnk");
+ }
+
+ if (File.Exists(GlobalVars.startmenu + "\\EnvyUpdate.lnk"))
+ {
+ Debug.LogToFile("INFO Deleted start menu entry.");
+ File.Delete(GlobalVars.startmenu + "\\EnvyUpdate.lnk");
+ }
+ if ((GlobalVars.exedirectory == GlobalVars.appdata) && File.Exists(GlobalVars.appdata + "EnvyUpdate.exe"))
+ {
+ Debug.LogToFile("INFO Deleting EnvyUpdate appdata and self.");
+ MessageBox.Show(Properties.Resources.uninstall_legacy_message);
+ Util.SelfDelete();
+ }
+ else if (Directory.Exists(GlobalVars.appdata))
+ {
+ Debug.LogToFile("INFO Deleting EnvyUpdate appdata folder");
+ Directory.Delete(GlobalVars.appdata, true);
+ }
}
- private void UiWindow_Activated(object sender, EventArgs e)
+ private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
- // This is a workaround for a bug (?) in the UI library, which causes the nav to not load the first item on startup.
- // Without this, the nav attempts to navigate before the window is shown, which doesn't work.
- try
+ if (MessageBox.Show(Properties.Resources.exit_confirm, "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
- var test = RootNavigation.Current.PageType;
+ Debug.LogToFile("INFO Uninstalling notifications and shutting down.");
+ ToastNotificationManagerCompat.Uninstall(); // Uninstall notifications to prevent issues with the app being portable.
+ Application.Current.Shutdown();
}
- catch (NullReferenceException)
+ else
{
- RootNavigation.Navigate(0);
+ Debug.LogToFile("INFO Application shutdown was cancelled.");
+ e.Cancel = true;
}
}
+
+ private void radioGRD_Checked(object sender, RoutedEventArgs e)
+ {
+ if (File.Exists(GlobalVars.exedirectory + "sd.envy"))
+ {
+ Debug.LogToFile("INFO Switching to game ready driver.");
+ File.Delete(GlobalVars.exedirectory + "sd.envy");
+ Load();
+ }
+ }
+
+ private void radioSD_Checked(object sender, RoutedEventArgs e)
+ {
+ if (!File.Exists(GlobalVars.exedirectory + "sd.envy"))
+ {
+ Debug.LogToFile("INFO Switching to studio driver.");
+ File.Create(GlobalVars.exedirectory + "sd.envy").Close();
+ Load();
+ }
+ }
+
+ private void chkAutostart_Click(object sender, RoutedEventArgs e)
+ {
+ if (File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "EnvyUpdate.lnk")))
+ {
+ Debug.LogToFile("INFO Removing autostart entry.");
+ File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "EnvyUpdate.lnk"));
+ }
+ if (chkAutostart.IsChecked == true)
+ {
+ Debug.LogToFile("INFO Creating autostart entry.");
+ Util.CreateShortcut("EnvyUpdate", Environment.GetFolderPath(Environment.SpecialFolder.Startup), GlobalVars.exeloc, "NVidia Update Checker", "/minimize");
+ }
+ }
+
+ private void buttonSkip_Click(object sender, RoutedEventArgs e)
+ {
+ Debug.LogToFile("INFO Skipping version.");
+ skippedVer = onlineDriv;
+ File.WriteAllText(GlobalVars.exedirectory + "skip.envy", onlineDriv);
+ buttonSkip.IsEnabled = false;
+ buttonSkip.Content = Properties.Resources.ui_skipped;
+ MessageBox.Show(Properties.Resources.skip_confirm);
+ }
+
+ private void UpdateLocalVer(bool reloadLocalDriv = true)
+ {
+ Debug.LogToFile("INFO Updating local driver version in UI.");
+ if (reloadLocalDriv)
+ {
+ Debug.LogToFile("INFO Reloading local driver version.");
+ localDriv = Util.GetLocDriv();
+ }
+ textblockGPU.Text = localDriv;
+ if (GlobalVars.isMobile)
+ textblockGPUName.Text = Util.GetGPUName(false) + " (mobile)";
+ else
+ textblockGPUName.Text = Util.GetGPUName(false);
+ }
+
+ void DriverFileChanged(object sender, FileSystemEventArgs e)
+ {
+ Debug.LogToFile("INFO Watched driver file changed! Reloading data.");
+ System.Threading.Thread.Sleep(10000);
+ Application.Current.Dispatcher.Invoke(delegate
+ {
+ UpdateLocalVer();
+ Load();
+ });
+ }
}
}
\ No newline at end of file
diff --git a/EnvyUpdate/Notify.cs b/EnvyUpdate/Notify.cs
index ac317c1..6230c6a 100644
--- a/EnvyUpdate/Notify.cs
+++ b/EnvyUpdate/Notify.cs
@@ -8,6 +8,9 @@ namespace EnvyUpdate
{
var toast = new ToastContentBuilder();
toast.AddText(Properties.Resources.update_popup_message);
+ toast.AddButton(new ToastButton()
+ .SetContent("Download")
+ .AddArgument("action", "download"));
toast.Show();
}
}
diff --git a/EnvyUpdate/Properties/AssemblyInfo.cs b/EnvyUpdate/Properties/AssemblyInfo.cs
index 15d4b57..322a88d 100644
--- a/EnvyUpdate/Properties/AssemblyInfo.cs
+++ b/EnvyUpdate/Properties/AssemblyInfo.cs
@@ -49,5 +49,5 @@ using System.Windows;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("3.0")]
-[assembly: AssemblyFileVersion("3.0")]
+[assembly: AssemblyVersion("2.20")]
+[assembly: AssemblyFileVersion("2.20")]
diff --git a/EnvyUpdate/Properties/Licenses.Designer.cs b/EnvyUpdate/Properties/Licenses.Designer.cs
deleted file mode 100644
index 5c0056d..0000000
--- a/EnvyUpdate/Properties/Licenses.Designer.cs
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// 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.
-//
-//------------------------------------------------------------------------------
-
-namespace EnvyUpdate.Properties {
- using System;
-
-
- ///
- /// A strongly-typed resource class, for looking up localized strings, etc.
- ///
- // 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 Licenses {
-
- private static global::System.Resources.ResourceManager resourceMan;
-
- private static global::System.Globalization.CultureInfo resourceCulture;
-
- [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
- internal Licenses() {
- }
-
- ///
- /// Returns the cached ResourceManager instance used by this class.
- ///
- [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("EnvyUpdate.Properties.Licenses", typeof(Licenses).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
-
- ///
- /// Overrides the current thread's CurrentUICulture property for all
- /// resource lookups using this strongly typed resource class.
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture {
- get {
- return resourceCulture;
- }
- set {
- resourceCulture = value;
- }
- }
-
- ///
- /// Looks up a localized string similar to The MIT License
- ///
- ///Copyright (c) 2012 Simon Cropp and contributors
- ///
- ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
- ///
- ///The ab [rest of string was truncated]";.
- ///
- internal static string CosturaFody {
- get {
- return ResourceManager.GetString("CosturaFody", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to MIT License
- ///
- ///Copyright (c) 2019-2023 Jakob Senkl
- ///
- ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
- ///
- ///The above copyright no [rest of string was truncated]";.
- ///
- internal static string EnvyUpdate {
- get {
- return ResourceManager.GetString("EnvyUpdate", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to MIT License
- ///
- ///Copyright (c) Simon Cropp
- ///
- ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
- ///
- ///The above copyright notice and t [rest of string was truncated]";.
- ///
- internal static string Fody {
- get {
- return ResourceManager.GetString("Fody", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to The MIT License (MIT)
- ///
- ///Copyright (c) MarcStan
- ///
- ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
- ///
- ///The above copyright notic [rest of string was truncated]";.
- ///
- internal static string ResourceEmbedder {
- get {
- return ResourceManager.GetString("ResourceEmbedder", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to # Windows Community Toolkit
- ///
- ///Copyright © .NET Foundation and Contributors
- ///
- ///All rights reserved.
- ///
- ///## MIT License (MIT)
- ///
- ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished [rest of string was truncated]";.
- ///
- internal static string WindowsCommunityToolkit {
- get {
- return ResourceManager.GetString("WindowsCommunityToolkit", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to MIT License
- ///
- ///Copyright (c) 2021-2023 Leszek Pomianowski and WPF UI Contributors. https://dev.lepo.co/
- ///
- ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject t [rest of string was truncated]";.
- ///
- internal static string wpfui {
- get {
- return ResourceManager.GetString("wpfui", resourceCulture);
- }
- }
- }
-}
diff --git a/EnvyUpdate/Properties/Licenses.resx b/EnvyUpdate/Properties/Licenses.resx
deleted file mode 100644
index 6ebf13d..0000000
--- a/EnvyUpdate/Properties/Licenses.resx
+++ /dev/null
@@ -1,190 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- The MIT License
-
-Copyright (c) 2012 Simon Cropp and contributors
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
- MIT License
-
-Copyright (c) 2019-2023 Jakob Senkl
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
- MIT License
-
-Copyright (c) Simon Cropp
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
- The MIT License (MIT)
-
-Copyright (c) MarcStan
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
- # Windows Community Toolkit
-
-Copyright © .NET Foundation and Contributors
-
-All rights reserved.
-
-## MIT License (MIT)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
- MIT License
-
-Copyright (c) 2021-2023 Leszek Pomianowski and WPF UI Contributors. https://dev.lepo.co/
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
\ No newline at end of file
diff --git a/EnvyUpdate/Properties/Resources.Designer.cs b/EnvyUpdate/Properties/Resources.Designer.cs
index e0ed7b3..cd696e7 100644
--- a/EnvyUpdate/Properties/Resources.Designer.cs
+++ b/EnvyUpdate/Properties/Resources.Designer.cs
@@ -78,42 +78,6 @@ namespace EnvyUpdate.Properties {
}
}
- ///
- /// Looks up a localized string similar to There was a problem downloading the driver installer. Please try again..
- ///
- public static string info_download_error {
- get {
- return ResourceManager.GetString("info_download_error", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to Error while downloading.
- ///
- public static string info_download_error_title {
- get {
- return ResourceManager.GetString("info_download_error_title", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to Driver installer successfully downloaded..
- ///
- public static string info_download_success {
- get {
- return ResourceManager.GetString("info_download_success", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to Download successful.
- ///
- public static string info_download_success_title {
- get {
- return ResourceManager.GetString("info_download_success_title", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to Preference reset..
///
@@ -150,15 +114,6 @@ namespace EnvyUpdate.Properties {
}
}
- ///
- /// Looks up a localized string similar to No.
- ///
- public static string no {
- get {
- return ResourceManager.GetString("no", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to No NVIDIA GPU found. Application will exit..
///
@@ -186,24 +141,6 @@ namespace EnvyUpdate.Properties {
}
}
- ///
- /// Looks up a localized string similar to Enable logging to file.
- ///
- public static string ui_enable_logging {
- get {
- return ResourceManager.GetString("ui_enable_logging", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to Home.
- ///
- public static string ui_home {
- get {
- return ResourceManager.GetString("ui_home", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to DCH driver.
///
@@ -222,24 +159,6 @@ namespace EnvyUpdate.Properties {
}
}
- ///
- /// Looks up a localized string similar to Update available..
- ///
- public static string ui_info_outdated {
- get {
- return ResourceManager.GetString("ui_info_outdated", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to Up to date..
- ///
- public static string ui_info_uptodate {
- get {
- return ResourceManager.GetString("ui_info_uptodate", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to EnvyUpdate website.
///
@@ -258,15 +177,6 @@ namespace EnvyUpdate.Properties {
}
}
- ///
- /// Looks up a localized string similar to Licenses.
- ///
- public static string ui_licenses {
- get {
- return ResourceManager.GetString("ui_licenses", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to Local driver version:.
///
@@ -285,24 +195,6 @@ namespace EnvyUpdate.Properties {
}
}
- ///
- /// Looks up a localized string similar to All good..
- ///
- public static string ui_message_good {
- get {
- return ResourceManager.GetString("ui_message_good", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to New driver found..
- ///
- public static string ui_message_update {
- get {
- return ResourceManager.GetString("ui_message_update", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to Online driver version:.
///
@@ -312,24 +204,6 @@ namespace EnvyUpdate.Properties {
}
}
- ///
- /// Looks up a localized string similar to Open website.
- ///
- public static string ui_openwebsite {
- get {
- return ResourceManager.GetString("ui_openwebsite", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to Settings.
- ///
- public static string ui_settings {
- get {
- return ResourceManager.GetString("ui_settings", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to Version skipped.
///
@@ -392,14 +266,5 @@ namespace EnvyUpdate.Properties {
return ResourceManager.GetString("update_popup_message", resourceCulture);
}
}
-
- ///
- /// Looks up a localized string similar to Yes.
- ///
- public static string yes {
- get {
- return ResourceManager.GetString("yes", resourceCulture);
- }
- }
}
}
diff --git a/EnvyUpdate/Properties/Resources.de.resx b/EnvyUpdate/Properties/Resources.de.resx
index 13bfb43..1329401 100644
--- a/EnvyUpdate/Properties/Resources.de.resx
+++ b/EnvyUpdate/Properties/Resources.de.resx
@@ -123,18 +123,6 @@
EnvyUpdate schließen?
-
- Fehler beim Herunterladen der Treiber-Installationsdatei. Bitte versuchen Sie es erneut.
-
-
- Fehler beim Herunterladen
-
-
- Treiber-Installationsdatei erfolgreich heruntergeladen.
-
-
- Herunterladen erfolgreich abgeschlossen
-
Einstellung zurückgesetzt.
@@ -147,9 +135,6 @@
Neue Version von EnvyUpdate gefunden. Die Anwendung wird neu starten.\nDies wird wahrscheinlich einige Sekunden dauern.
-
- Nein
-
Keine NVIDIA GPU gefunden. EnvyUpdate wird sich nun schließen.
@@ -159,54 +144,27 @@
Beim Start von Windows ausführen
-
- Programm-Log in Datei schreiben
-
-
- Start
-
DCH Treiber
Mobile Grafikkarte (Laptop, etc)?
-
- Aktualisierung verfügbar.
-
-
- Aktuell.
-
EnvyUpdate Webseite
Installieren
-
- Lizenzen
-
Lokale Treiberversion:
Lokaler Treibertyp:
-
- Alles in Ordnung.
-
-
- Neue Treiberversion gefunden.
-
Online Treiberversion:
-
- Webseite öffnen
-
-
- Einstellungen
-
Version übersprungen
@@ -228,7 +186,4 @@
Eine neue Treiberversion ist verfügbar.
-
- Ja
-
\ No newline at end of file
diff --git a/EnvyUpdate/Properties/Resources.resx b/EnvyUpdate/Properties/Resources.resx
index 308ba4e..abdfedd 100644
--- a/EnvyUpdate/Properties/Resources.resx
+++ b/EnvyUpdate/Properties/Resources.resx
@@ -123,18 +123,6 @@
Exit EnvyUpdate?
-
- There was a problem downloading the driver installer. Please try again.
-
-
- Error while downloading
-
-
- Driver installer successfully downloaded.
-
-
- Download successful
-
Preference reset.
@@ -147,9 +135,6 @@
New version of EnvyUpdate found. Application will restart.\nThis will probably take a few seconds.
-
- No
-
No NVIDIA GPU found. Application will exit.
@@ -159,54 +144,27 @@
Run at Windows startup
-
- Enable logging to file
-
-
- Home
-
DCH driver
Mobile GPU (Laptop, etc)?
-
- Update available.
-
-
- Up to date.
-
EnvyUpdate website
Install
-
- Licenses
-
Local driver version:
Local driver type:
-
- All good.
-
-
- New driver found.
-
Online driver version:
-
- Open website
-
-
- Settings
-
Version skipped
@@ -228,7 +186,4 @@
A new driver update is available for your graphics card.
-
- Yes
-
\ No newline at end of file
diff --git a/EnvyUpdate/SettingsPage.xaml b/EnvyUpdate/SettingsPage.xaml
deleted file mode 100644
index b707a27..0000000
--- a/EnvyUpdate/SettingsPage.xaml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/EnvyUpdate/Util.cs b/EnvyUpdate/Util.cs
index 5cd3410..c2f6711 100644
--- a/EnvyUpdate/Util.cs
+++ b/EnvyUpdate/Util.cs
@@ -1,5 +1,4 @@
-using EnvyUpdate.Properties;
-using IWshRuntimeLibrary;
+using IWshRuntimeLibrary;
using Microsoft.Win32;
using System;
using System.Diagnostics;
@@ -7,11 +6,13 @@ using System.IO;
using System.Linq;
using System.Management;
using System.Net;
+using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
-using System.Windows.Controls;
using System.Xml.Linq;
+using Windows.Devices.Radios;
+using Windows.UI.Xaml.Input;
namespace EnvyUpdate
{
@@ -58,22 +59,6 @@ namespace EnvyUpdate
}
}
- ///
- /// Check for existence of Nvidia GPU
- ///
- ///
- public static bool IsNvidia()
- {
- Debug.LogToFile("INFO Checking for existence of Nvidia GPU.");
-
- foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT * FROM Win32_VideoController").Get())
- {
- if (obj["Description"].ToString().ToLower().Contains("nvidia"))
- return true;
- }
- return false;
- }
-
///
/// Creates a standard Windows shortcut.
///
@@ -235,7 +220,7 @@ namespace EnvyUpdate
foreach (var name in names) // Looping through the XML Doc because the name is not the primary key
{
string sName = name.Value.ToString().ToLower();
- if (sName == query)
+ if (sName.Contains(query))
{
Debug.LogToFile("INFO Matched GetValueFromName query: " + sName);
string cleanResult = null;
@@ -350,7 +335,7 @@ namespace EnvyUpdate
{
GPUName = obj["VideoProcessor"].ToString().ToLower();
// Remove any 3GB, 6GB or similar from name. We don't need to know the VRAM to get results.
- GPUName = Regex.Match(GPUName, "(geforce )?.tx \\w*\\d*( ti)?").Value;
+ GPUName = Regex.Match(GPUName, "(geforce )((.tx )|(mx))?\\w*\\d*( ti)?").Value;
}
else
GPUName = obj["VideoProcessor"].ToString();
@@ -525,66 +510,10 @@ namespace EnvyUpdate
return gpuUrl;
}
- public static void UninstallAll()
+ public static void DownloadFile(string fileURL, string savePath)
{
- if (System.IO.File.Exists(GlobalVars.startup + "\\EnvyUpdate.lnk"))
- {
- Debug.LogToFile("INFO Deleted startup entry.");
- System.IO.File.Delete(GlobalVars.startup + "\\EnvyUpdate.lnk");
- }
-
- if (System.IO.File.Exists(GlobalVars.startmenu + "\\EnvyUpdate.lnk"))
- {
- Debug.LogToFile("INFO Deleted start menu entry.");
- System.IO.File.Delete(GlobalVars.startmenu + "\\EnvyUpdate.lnk");
- }
- if ((GlobalVars.exedirectory == GlobalVars.appdata) && System.IO.File.Exists(GlobalVars.appdata + "EnvyUpdate.exe"))
- {
- Debug.LogToFile("INFO Deleting EnvyUpdate appdata and self.");
- MessageBox.Show(Properties.Resources.uninstall_legacy_message);
- Util.SelfDelete();
- }
- else if (Directory.Exists(GlobalVars.appdata))
- {
- Debug.LogToFile("INFO Deleting EnvyUpdate appdata folder");
- Directory.Delete(GlobalVars.appdata, true);
- }
- }
-
- public static bool IsDarkTheme()
- {
- try
- {
- Debug.LogToFile("INFO Trying to get app theme...");
- int res = (int)Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", "AppsUseLightTheme", -1);
- switch (res)
- {
- case 0:
- Debug.LogToFile("INFO Using dark theme.");
- return true;
- case 1:
- Debug.LogToFile("INFO Using light theme.");
- return false;
- default:
- throw new IndexOutOfRangeException();
- }
- }
- catch (Exception)
- {
- Debug.LogToFile("WARN Could not determine theme. Setting light theme.");
- return false;
- }
- }
-
- public static string GetDirectDownload(string gpuUrl)
- {
- string webcontent;
- using (var wc = new WebClient())
- webcontent = wc.DownloadString(gpuUrl);
-
- string directUrl = Regex.Match(webcontent, "\\/Windows\\/\\d+\\.\\d+\\/[\\w\\d\\/\\-\\.]*exe").Value;
- directUrl = "https://us.download.nvidia.com" + directUrl;
- return directUrl;
+ //TODO Implement downloading
+ //TODO implement progress bar
}
}
}
diff --git a/README.md b/README.md
index 2b6a970..15c718d 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@ If you want to help me develop EnvyUpdate, you can start by creating issues with
* [TinyNvidiaUpdateChecker](https://github.com/ElPumpo/TinyNvidiaUpdateChecker) - a command line update checker and installer. Inspired EnvyUpdate to begin with.
* [nvidia-update](https://github.com/ZenitH-AT/nvidia-update) - a Powershell script to check for driver updates
-* [Disable-Nvidia-Telemetry](https://github.com/NateShoffner/Disable-Nvidia-Telemetry) - does pretty much what the name says. It disables Nvidia Telemetry.
+* [Disable-Nvidia-Telemtry](https://github.com/NateShoffner/Disable-Nvidia-Telemetry) - does pretty much what the name says. It disables Nvidia Telemetry.
* [NVCleanInstall](https://www.techpowerup.com/nvcleanstall/) - a closed-source application by TechPowerUp which does quite a lot of cool things.
EnvyUpdate is not a replacement for any of these tools. I will still try to implement as many features in EnvyUpdate as possible while keeping the simple interface and as little settings as possible.
@@ -49,7 +49,7 @@ EnvyUpdate is not a replacement for any of these tools. I will still try to impl
* This project: [MIT](https://github.com/fyr77/EnvyUpdate/blob/master/LICENSE)
* Fody (dependency of Costura.Fody): [MIT](https://github.com/Fody/Fody/blob/master/License.txt)
* Costura.Fody (for embedding DLLs into the main executable): [MIT](https://github.com/Fody/Costura/blob/develop/LICENSE)
-* Resource Embedder: [MIT](https://www.nuget.org/packages/Resource.Embedder/)
+* wpf-notifyicon (for showing an icon in the system tray): [CPOL](https://github.com/hardcodet/wpf-notifyicon/blob/master/LICENSE)
+* Resource Embedder: [MIT](https://github.com/MarcStan/resource-embedder/blob/master/LICENSE)
* Windows Community Toolkit: [MIT](https://github.com/CommunityToolkit/WindowsCommunityToolkit/blob/main/License.md)
-* wpfui: [MIT](https://github.com/lepoco/wpfui/blob/main/LICENSE)
* Icon made by Freepik from www.flaticon.com