complete UI rewrite
This commit is contained in:
parent
45c6dbce70
commit
cdcfccd87c
15 changed files with 1207 additions and 439 deletions
|
@ -2,8 +2,14 @@
|
|||
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">
|
||||
<Application.Resources>
|
||||
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ui:ThemesDictionary Theme="Light"/>
|
||||
<ui:ControlsDictionary />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
</Application>
|
||||
|
|
85
EnvyUpdate/DashboardPage.xaml
Normal file
85
EnvyUpdate/DashboardPage.xaml
Normal file
|
@ -0,0 +1,85 @@
|
|||
<ui:UiPage x:Class="EnvyUpdate.DashboardPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:EnvyUpdate"
|
||||
xmlns:p="clr-namespace:EnvyUpdate.Properties"
|
||||
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="400" d:DesignWidth="600"
|
||||
Title="DashboardPage">
|
||||
|
||||
<Grid Margin="8,0,8,8">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition />
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<ui:SymbolIcon Symbol="DeveloperBoard24" FontSize="64"/>
|
||||
<TextBlock Margin="8,0,0,0" x:Name="textblockGPUName" Grid.Column="1" Text="GPU..." FontSize="32" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
|
||||
</Grid>
|
||||
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<ui:InfoBar x:Name="infoBarStatus"
|
||||
Title="Checking"
|
||||
IsOpen="True"
|
||||
IsClosable="False"
|
||||
Message="..."
|
||||
Severity="Informational" />
|
||||
|
||||
<ui:Button x:Name="buttonSkipVersion" Margin="8,0,0,0" Grid.Column="1" Appearance="Secondary" Icon="ArrowForward24" Visibility="Collapsed" ToolTip="{x:Static p:Resources.ui_skipversion}" />
|
||||
|
||||
<ui:Button x:Name="buttonDownload" Margin="8,0,0,0" MinWidth="100" Grid.Column="2" Appearance="Primary" Icon="ArrowDownload24" Visibility="Collapsed" />
|
||||
</Grid>
|
||||
|
||||
<ProgressBar Grid.Row="2" Value="0" Visibility="Collapsed"/>
|
||||
<!-- This is for later automatic downloading. Todo! -->
|
||||
|
||||
<Grid Margin="0,12,0,0" Grid.Row="3">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<ui:CardExpander x:Name="cardLocal" Margin="0,0,4,0" Grid.Column="0" Grid.Row="0" Icon="Desktop32" Header="..." ToolTip="{x:Static p:Resources.ui_localdriver}">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBlock Grid.Column="0" FontWeight="Bold" Text="{x:Static p:Resources.ui_localdriver_type}"/>
|
||||
<TextBlock Grid.Column="1" x:Name="textblockLocalType" Text="?" />
|
||||
</Grid>
|
||||
</ui:CardExpander>
|
||||
<ui:CardExpander x:Name="cardOnline" Margin="4,0,0,0" Grid.Column="1" Grid.Row="0" Icon="Earth32" Header="..." ToolTip="{x:Static p:Resources.ui_onlinedriver}">
|
||||
<ui:Button Icon="Open24" Click="CardOnline_Click" Content="{x:Static p:Resources.ui_openwebsite}" HorizontalAlignment="Stretch"/>
|
||||
</ui:CardExpander>
|
||||
</Grid>
|
||||
|
||||
<ui:CardControl Margin="0,12,0,0" Grid.Row="4" Icon="Color24" Header="Studio Driver">
|
||||
<ui:ToggleSwitch x:Name="switchStudioDriver" IsChecked="False" />
|
||||
</ui:CardControl>
|
||||
|
||||
<ui:CardControl Margin="0,12,0,0" Grid.Row="5" Icon="LightbulbFilament48" Header="{x:Static p:Resources.ui_autostart}">
|
||||
<ui:ToggleSwitch x:Name="switchAutostart" IsChecked="False" Click="switchAutostart_Click" />
|
||||
</ui:CardControl>
|
||||
</Grid>
|
||||
</ui:UiPage>
|
415
EnvyUpdate/DashboardPage.xaml.cs
Normal file
415
EnvyUpdate/DashboardPage.xaml.cs
Normal file
|
@ -0,0 +1,415 @@
|
|||
using Microsoft.Build.Framework.XamlTypes;
|
||||
using Microsoft.Toolkit.Uwp.Notifications;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Threading;
|
||||
using Windows.ApplicationModel.VoiceCommands;
|
||||
|
||||
namespace EnvyUpdate
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for Dashboard.xaml
|
||||
/// </summary>
|
||||
public partial class DashboardPage
|
||||
{
|
||||
private string localDriv = null;
|
||||
private string onlineDriv = null;
|
||||
private string gpuURL = null;
|
||||
private string skippedVer = null;
|
||||
private string[] arguments = null;
|
||||
|
||||
public DashboardPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
// Try to get command line arguments
|
||||
try
|
||||
{
|
||||
arguments = Environment.GetCommandLineArgs();
|
||||
}
|
||||
catch (IndexOutOfRangeException)
|
||||
{
|
||||
// This is necessary, since .NET throws an exception if you check for a non-existant arg.
|
||||
}
|
||||
|
||||
// Delete installed legacy versions
|
||||
if (Directory.Exists(GlobalVars.appdata))
|
||||
{
|
||||
Debug.LogToFile("INFO Found old appdata installation, uninstalling.");
|
||||
UninstallAll();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
else
|
||||
{
|
||||
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.");
|
||||
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.");
|
||||
}
|
||||
|
||||
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 mode on systems without an Nvidia GPU.
|
||||
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 buttonDL_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Debug.LogToFile("INFO Opening download page.");
|
||||
Process.Start(gpuURL);
|
||||
}
|
||||
|
||||
public void UninstallAll()
|
||||
{
|
||||
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 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 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 buttonSkip_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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -100,21 +100,25 @@
|
|||
</ApplicationDefinition>
|
||||
<Compile Include="Debug.cs" />
|
||||
<Compile Include="GlobalVars.cs" />
|
||||
<Compile Include="InfoWindow.xaml.cs">
|
||||
<DependentUpon>InfoWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Notify.cs" />
|
||||
<Compile Include="DashboardPage.xaml.cs">
|
||||
<DependentUpon>DashboardPage.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Licenses.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Licenses.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Resources.de.Designer.cs">
|
||||
<DependentUpon>Resources.de.resx</DependentUpon>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<Compile Include="SettingsPage.xaml.cs">
|
||||
<DependentUpon>SettingsPage.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="StringExt.cs" />
|
||||
<Compile Include="Util.cs" />
|
||||
<Page Include="InfoWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="MainWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
|
@ -127,6 +131,14 @@
|
|||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Page Include="DashboardPage.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="SettingsPage.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Properties\AssemblyInfo.cs">
|
||||
|
@ -142,6 +154,10 @@
|
|||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Properties\Licenses.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Licenses.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.de.resx">
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.de.Designer.cs</LastGenOutput>
|
||||
|
@ -197,9 +213,6 @@
|
|||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Hardcodet.NotifyIcon.Wpf">
|
||||
<Version>1.1.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications">
|
||||
<Version>7.1.3</Version>
|
||||
</PackageReference>
|
||||
|
@ -209,6 +222,9 @@
|
|||
<PackageReference Include="System.Text.Json">
|
||||
<Version>7.0.1</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="WPF-UI">
|
||||
<Version>2.0.3</Version>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
File diff suppressed because one or more lines are too long
|
@ -1,4 +1,4 @@
|
|||
<Window x:Class="EnvyUpdate.MainWindow"
|
||||
<ui:UiWindow x:Class="EnvyUpdate.MainWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
|
@ -6,26 +6,58 @@
|
|||
xmlns:local="clr-namespace:EnvyUpdate"
|
||||
xmlns:p="clr-namespace:EnvyUpdate.Properties"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||
mc:Ignorable="d"
|
||||
Title="EnvyUpdate" Height="270" Width="389" Icon="icon.ico" StateChanged="Window_StateChanged" Closing="Window_Closing" ResizeMode="CanMinimize">
|
||||
<Grid Margin="0,0,0,0">
|
||||
ExtendsContentIntoTitleBar="True"
|
||||
WindowBackdropType="Mica"
|
||||
|
||||
Title="EnvyUpdate" MinHeight="400" Height="400" MinWidth="600" Width="600" Icon="icon.ico" StateChanged="Window_StateChanged" Closing="Window_Closing" ResizeMode="CanMinimize" Activated="UiWindow_Activated" WindowStyle="None">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="17*"/>
|
||||
<RowDefinition Height="86*"/>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
<tb:TaskbarIcon IconSource="/icon.ico" ToolTipText="EnvyUpdate" TrayLeftMouseDown="TaskbarIcon_TrayLeftMouseDown" Grid.RowSpan="3" />
|
||||
<TextBlock HorizontalAlignment="Left" Margin="10,81,0,0" TextWrapping="Wrap" FontWeight="Bold" Width="140" Height="16" VerticalAlignment="Top" Grid.Row="1"><Run Text="{x:Static p:Resources.ui_localdriver}"/></TextBlock>
|
||||
<TextBlock x:Name="textblockGPU" HorizontalAlignment="Right" Margin="0,81,10,0" TextWrapping="Wrap" Text="<none>" Width="134" Height="16" VerticalAlignment="Top" TextAlignment="Right" Grid.Row="1"/>
|
||||
<Button x:Name="buttonHelp" Content="..." Margin="0,12,10,0" Click="buttonHelp_Click" HorizontalAlignment="Right" Width="20" Height="20" VerticalAlignment="Top" Grid.RowSpan="2"/>
|
||||
<TextBlock Margin="10,102,0,0" TextWrapping="Wrap" FontWeight="Bold" Grid.Row="1" HorizontalAlignment="Left" Width="140" Height="16" VerticalAlignment="Top"><Run Text="{x:Static p:Resources.ui_onlinedriver}"/></TextBlock>
|
||||
<TextBlock x:Name="textblockOnline" HorizontalAlignment="Right" Margin="0,102,10,0" TextWrapping="Wrap" Text="<none>" Width="134" Grid.Row="1" Height="16" VerticalAlignment="Top" TextAlignment="Right"/>
|
||||
<Button x:Name="buttonDL" Content="⟱" Margin="10,151,10,10" FontSize="20" Click="buttonDL_Click" Foreground="White" Background="#FF3CDA00" Grid.Row="1" IsEnabled="False"/>
|
||||
<TextBlock x:Name="textblockGPUName" Margin="10,14,35,0" TextWrapping="Wrap" Text="GPU..." Height="16" VerticalAlignment="Top" TextAlignment="Center" Grid.RowSpan="2" FontWeight="Bold"/>
|
||||
<TextBlock HorizontalAlignment="Left" Margin="10,19,0,0" TextWrapping="Wrap" FontWeight="Bold" Width="140" Height="16" VerticalAlignment="Top" Grid.Row="1" Text="{x:Static p:Resources.ui_localdriver_type}"/>
|
||||
<TextBlock x:Name="textblockLocalType" HorizontalAlignment="Right" Margin="0,19,10,0" TextWrapping="Wrap" Width="134" Height="16" VerticalAlignment="Top" TextAlignment="Right" Grid.Row="1"><Run Text="<none>"/><LineBreak/><Run/></TextBlock>
|
||||
<RadioButton x:Name="radioGRD" Content="Game Ready / Standard Driver" HorizontalAlignment="Left" Margin="10,40,0,0" Grid.Row="1" VerticalAlignment="Top" Checked="radioGRD_Checked"/>
|
||||
<RadioButton x:Name="radioSD" Content="Studio Driver" HorizontalAlignment="Left" Margin="10,60,0,0" Grid.Row="1" VerticalAlignment="Top" Checked="radioSD_Checked"/>
|
||||
<CheckBox x:Name="chkAutostart" Content="{x:Static p:Resources.ui_autostart}" HorizontalAlignment="Left" Margin="10,131,0,0" Grid.Row="1" VerticalAlignment="Top" Click="chkAutostart_Click"/>
|
||||
<Button x:Name="buttonSkip" Content="{x:Static p:Resources.ui_skipversion}" Margin="0,131,10,0" Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Right" Click="buttonSkip_Click" IsEnabled="False"/>
|
||||
<ui:TitleBar
|
||||
Title="EnvyUpdate"
|
||||
Grid.Row="0"
|
||||
CanMaximize="False"
|
||||
ShowMaximize="False"
|
||||
Icon="/icon.ico">
|
||||
<ui:TitleBar.Tray>
|
||||
<ui:NotifyIcon
|
||||
FocusOnLeftClick="True"
|
||||
Icon="/icon.ico"
|
||||
MenuOnRightClick="False"
|
||||
TooltipText="EnvyUpdate"></ui:NotifyIcon>
|
||||
</ui:TitleBar.Tray>
|
||||
</ui:TitleBar>
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<ui:NavigationCompact
|
||||
x:Name="RootNavigation"
|
||||
Frame="{Binding ElementName=MainFrame}"
|
||||
Grid.Column="0"
|
||||
SelectedPageIndex="0">
|
||||
<ui:NavigationCompact.Items>
|
||||
<ui:NavigationItem
|
||||
Content="{x:Static p:Resources.ui_home}"
|
||||
Icon="Home24"
|
||||
PageType="{x:Type local:DashboardPage}"
|
||||
/>
|
||||
</ui:NavigationCompact.Items>
|
||||
<ui:NavigationCompact.Footer>
|
||||
<ui:NavigationItem
|
||||
Content="{x:Static p:Resources.ui_settings}"
|
||||
Icon="Settings24"
|
||||
PageType="{x:Type local:SettingsPage}"/>
|
||||
</ui:NavigationCompact.Footer>
|
||||
</ui:NavigationCompact>
|
||||
<Frame
|
||||
x:Name="MainFrame"
|
||||
Grid.Column="1" />
|
||||
</Grid>
|
||||
</Window>
|
||||
</Grid>
|
||||
</ui:UiWindow>
|
||||
|
|
|
@ -1,32 +1,29 @@
|
|||
using Microsoft.Toolkit.Uwp.Notifications;
|
||||
using Microsoft.Build.Framework.XamlTypes;
|
||||
using Microsoft.Toolkit.Uwp.Notifications;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Management;
|
||||
using System.Net;
|
||||
using System.Runtime.Remoting.Messaging;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Threading;
|
||||
using Wpf.Ui.Controls.Interfaces;
|
||||
|
||||
namespace EnvyUpdate
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MainWindow.xaml
|
||||
/// </summary>
|
||||
public partial class MainWindow : Window
|
||||
public partial class MainWindow
|
||||
{
|
||||
private string localDriv = null;
|
||||
private string onlineDriv = null;
|
||||
private string gpuURL = null;
|
||||
private string[] arguments = null;
|
||||
private string skippedVer = null;
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
// Try to get command line arguments
|
||||
try
|
||||
{
|
||||
|
@ -52,63 +49,11 @@ namespace EnvyUpdate
|
|||
{
|
||||
Debug.LogToFile("FATAL Found another instance, terminating.");
|
||||
|
||||
|
||||
MessageBox.Show(Properties.Resources.instance_already_running);
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
// Delete installed legacy versions
|
||||
if (Directory.Exists(GlobalVars.appdata))
|
||||
{
|
||||
Debug.LogToFile("INFO Found old appdata installation, uninstalling.");
|
||||
UninstallAll();
|
||||
}
|
||||
|
||||
GlobalVars.isMobile = Util.IsMobile();
|
||||
Debug.LogToFile("INFO Mobile: " + GlobalVars.isMobile);
|
||||
|
||||
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);
|
||||
}
|
||||
else
|
||||
{
|
||||
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
|
||||
if (arguments.Contains("/minimize"))
|
||||
{
|
||||
|
@ -117,204 +62,14 @@ namespace EnvyUpdate
|
|||
Hide();
|
||||
}
|
||||
|
||||
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.");
|
||||
GlobalVars.isMobile = Util.IsMobile();
|
||||
Debug.LogToFile("INFO Mobile: " + GlobalVars.isMobile);
|
||||
|
||||
string watchDirPath = Path.Combine(Environment.ExpandEnvironmentVariables("%ProgramW6432%"), "NVIDIA Corporation\\Installer2\\InstallerCore");
|
||||
if (Directory.Exists(watchDirPath))
|
||||
{
|
||||
GlobalVars.monitoringInstall = true;
|
||||
InitializeComponent();
|
||||
Wpf.Ui.Appearance.Accent.ApplySystemAccent();
|
||||
|
||||
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)
|
||||
|
@ -324,115 +79,25 @@ namespace EnvyUpdate
|
|||
}
|
||||
}
|
||||
|
||||
public void UninstallAll()
|
||||
{
|
||||
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 Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
if (MessageBox.Show(Properties.Resources.exit_confirm, "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
|
||||
{
|
||||
Debug.LogToFile("INFO Uninstalling notifications and shutting down.");
|
||||
ToastNotificationManagerCompat.Uninstall(); // Uninstall notifications to prevent issues with the app being portable.
|
||||
Application.Current.Shutdown();
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogToFile("INFO Application shutdown was cancelled.");
|
||||
e.Cancel = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void radioGRD_Checked(object sender, RoutedEventArgs e)
|
||||
private void UiWindow_Activated(object sender, EventArgs e)
|
||||
{
|
||||
if (File.Exists(GlobalVars.exedirectory + "sd.envy"))
|
||||
// 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
|
||||
{
|
||||
Debug.LogToFile("INFO Switching to game ready driver.");
|
||||
File.Delete(GlobalVars.exedirectory + "sd.envy");
|
||||
Load();
|
||||
var test = RootNavigation.Current.PageType;
|
||||
}
|
||||
}
|
||||
|
||||
private void radioSD_Checked(object sender, RoutedEventArgs e)
|
||||
catch (NullReferenceException)
|
||||
{
|
||||
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();
|
||||
});
|
||||
RootNavigation.Navigate(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
153
EnvyUpdate/Properties/Licenses.Designer.cs
generated
Normal file
153
EnvyUpdate/Properties/Licenses.Designer.cs
generated
Normal file
|
@ -0,0 +1,153 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <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 EnvyUpdate.Properties {
|
||||
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 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() {
|
||||
}
|
||||
|
||||
/// <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("EnvyUpdate.Properties.Licenses", typeof(Licenses).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 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]";.
|
||||
/// </summary>
|
||||
internal static string CosturaFody {
|
||||
get {
|
||||
return ResourceManager.GetString("CosturaFody", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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]";.
|
||||
/// </summary>
|
||||
internal static string EnvyUpdate {
|
||||
get {
|
||||
return ResourceManager.GetString("EnvyUpdate", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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]";.
|
||||
/// </summary>
|
||||
internal static string Fody {
|
||||
get {
|
||||
return ResourceManager.GetString("Fody", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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]";.
|
||||
/// </summary>
|
||||
internal static string ResourceEmbedder {
|
||||
get {
|
||||
return ResourceManager.GetString("ResourceEmbedder", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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]";.
|
||||
/// </summary>
|
||||
internal static string WindowsCommunityToolkit {
|
||||
get {
|
||||
return ResourceManager.GetString("WindowsCommunityToolkit", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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]";.
|
||||
/// </summary>
|
||||
internal static string wpfui {
|
||||
get {
|
||||
return ResourceManager.GetString("wpfui", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
190
EnvyUpdate/Properties/Licenses.resx
Normal file
190
EnvyUpdate/Properties/Licenses.resx
Normal file
|
@ -0,0 +1,190 @@
|
|||
<?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>
|
||||
<data name="CosturaFody" xml:space="preserve">
|
||||
<value>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.</value>
|
||||
</data>
|
||||
<data name="EnvyUpdate" xml:space="preserve">
|
||||
<value>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.</value>
|
||||
</data>
|
||||
<data name="Fody" xml:space="preserve">
|
||||
<value>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.</value>
|
||||
</data>
|
||||
<data name="ResourceEmbedder" xml:space="preserve">
|
||||
<value>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.</value>
|
||||
</data>
|
||||
<data name="WindowsCommunityToolkit" xml:space="preserve">
|
||||
<value># 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.</value>
|
||||
</data>
|
||||
<data name="wpfui" xml:space="preserve">
|
||||
<value>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.</value>
|
||||
</data>
|
||||
</root>
|
99
EnvyUpdate/Properties/Resources.Designer.cs
generated
99
EnvyUpdate/Properties/Resources.Designer.cs
generated
|
@ -114,6 +114,15 @@ namespace EnvyUpdate.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to No.
|
||||
/// </summary>
|
||||
public static string no {
|
||||
get {
|
||||
return ResourceManager.GetString("no", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to No NVIDIA GPU found. Application will exit..
|
||||
/// </summary>
|
||||
|
@ -141,6 +150,24 @@ namespace EnvyUpdate.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Enable logging to file.
|
||||
/// </summary>
|
||||
public static string ui_enable_logging {
|
||||
get {
|
||||
return ResourceManager.GetString("ui_enable_logging", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Home.
|
||||
/// </summary>
|
||||
public static string ui_home {
|
||||
get {
|
||||
return ResourceManager.GetString("ui_home", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to DCH driver.
|
||||
/// </summary>
|
||||
|
@ -159,6 +186,24 @@ namespace EnvyUpdate.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Update available..
|
||||
/// </summary>
|
||||
public static string ui_info_outdated {
|
||||
get {
|
||||
return ResourceManager.GetString("ui_info_outdated", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Up to date..
|
||||
/// </summary>
|
||||
public static string ui_info_uptodate {
|
||||
get {
|
||||
return ResourceManager.GetString("ui_info_uptodate", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to EnvyUpdate website.
|
||||
/// </summary>
|
||||
|
@ -177,6 +222,15 @@ namespace EnvyUpdate.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Licenses.
|
||||
/// </summary>
|
||||
public static string ui_licenses {
|
||||
get {
|
||||
return ResourceManager.GetString("ui_licenses", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Local driver version:.
|
||||
/// </summary>
|
||||
|
@ -195,6 +249,24 @@ namespace EnvyUpdate.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to All good..
|
||||
/// </summary>
|
||||
public static string ui_message_good {
|
||||
get {
|
||||
return ResourceManager.GetString("ui_message_good", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to New driver found..
|
||||
/// </summary>
|
||||
public static string ui_message_update {
|
||||
get {
|
||||
return ResourceManager.GetString("ui_message_update", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Online driver version:.
|
||||
/// </summary>
|
||||
|
@ -204,6 +276,24 @@ namespace EnvyUpdate.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Open website.
|
||||
/// </summary>
|
||||
public static string ui_openwebsite {
|
||||
get {
|
||||
return ResourceManager.GetString("ui_openwebsite", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Settings.
|
||||
/// </summary>
|
||||
public static string ui_settings {
|
||||
get {
|
||||
return ResourceManager.GetString("ui_settings", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Version skipped.
|
||||
/// </summary>
|
||||
|
@ -266,5 +356,14 @@ namespace EnvyUpdate.Properties {
|
|||
return ResourceManager.GetString("update_popup_message", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Yes.
|
||||
/// </summary>
|
||||
public static string yes {
|
||||
get {
|
||||
return ResourceManager.GetString("yes", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -135,6 +135,9 @@
|
|||
<data name="message_new_version" xml:space="preserve">
|
||||
<value>Neue Version von EnvyUpdate gefunden. Die Anwendung wird neu starten.\nDies wird wahrscheinlich einige Sekunden dauern.</value>
|
||||
</data>
|
||||
<data name="no" xml:space="preserve">
|
||||
<value>Nein</value>
|
||||
</data>
|
||||
<data name="no_compatible_gpu" xml:space="preserve">
|
||||
<value>Keine NVIDIA GPU gefunden. EnvyUpdate wird sich nun schließen.</value>
|
||||
</data>
|
||||
|
@ -144,27 +147,54 @@
|
|||
<data name="ui_autostart" xml:space="preserve">
|
||||
<value>Beim Start von Windows ausführen</value>
|
||||
</data>
|
||||
<data name="ui_enable_logging" xml:space="preserve">
|
||||
<value>Programm-Log in Datei schreiben</value>
|
||||
</data>
|
||||
<data name="ui_home" xml:space="preserve">
|
||||
<value>Start</value>
|
||||
</data>
|
||||
<data name="ui_info_dch" xml:space="preserve">
|
||||
<value>DCH Treiber</value>
|
||||
</data>
|
||||
<data name="ui_info_mobile" xml:space="preserve">
|
||||
<value>Mobile Grafikkarte (Laptop, etc)?</value>
|
||||
</data>
|
||||
<data name="ui_info_outdated" xml:space="preserve">
|
||||
<value>Aktualisierung verfügbar.</value>
|
||||
</data>
|
||||
<data name="ui_info_uptodate" xml:space="preserve">
|
||||
<value>Aktuell.</value>
|
||||
</data>
|
||||
<data name="ui_info_website" xml:space="preserve">
|
||||
<value>EnvyUpdate Webseite</value>
|
||||
</data>
|
||||
<data name="ui_install" xml:space="preserve">
|
||||
<value>Installieren</value>
|
||||
</data>
|
||||
<data name="ui_licenses" xml:space="preserve">
|
||||
<value>Lizenzen</value>
|
||||
</data>
|
||||
<data name="ui_localdriver" xml:space="preserve">
|
||||
<value>Lokale Treiberversion:</value>
|
||||
</data>
|
||||
<data name="ui_localdriver_type" xml:space="preserve">
|
||||
<value>Lokaler Treibertyp:</value>
|
||||
</data>
|
||||
<data name="ui_message_good" xml:space="preserve">
|
||||
<value>Alles in Ordnung.</value>
|
||||
</data>
|
||||
<data name="ui_message_update" xml:space="preserve">
|
||||
<value>Neue Treiberversion gefunden.</value>
|
||||
</data>
|
||||
<data name="ui_onlinedriver" xml:space="preserve">
|
||||
<value>Online Treiberversion:</value>
|
||||
</data>
|
||||
<data name="ui_openwebsite" xml:space="preserve">
|
||||
<value>Webseite öffnen</value>
|
||||
</data>
|
||||
<data name="ui_settings" xml:space="preserve">
|
||||
<value>Einstellungen</value>
|
||||
</data>
|
||||
<data name="ui_skipped" xml:space="preserve">
|
||||
<value>Version übersprungen</value>
|
||||
</data>
|
||||
|
@ -186,4 +216,7 @@
|
|||
<data name="update_popup_message" xml:space="preserve">
|
||||
<value>Eine neue Treiberversion ist verfügbar.</value>
|
||||
</data>
|
||||
<data name="yes" xml:space="preserve">
|
||||
<value>Ja</value>
|
||||
</data>
|
||||
</root>
|
|
@ -135,6 +135,9 @@
|
|||
<data name="message_new_version" xml:space="preserve">
|
||||
<value>New version of EnvyUpdate found. Application will restart.\nThis will probably take a few seconds.</value>
|
||||
</data>
|
||||
<data name="no" xml:space="preserve">
|
||||
<value>No</value>
|
||||
</data>
|
||||
<data name="no_compatible_gpu" xml:space="preserve">
|
||||
<value>No NVIDIA GPU found. Application will exit.</value>
|
||||
</data>
|
||||
|
@ -144,27 +147,54 @@
|
|||
<data name="ui_autostart" xml:space="preserve">
|
||||
<value>Run at Windows startup</value>
|
||||
</data>
|
||||
<data name="ui_enable_logging" xml:space="preserve">
|
||||
<value>Enable logging to file</value>
|
||||
</data>
|
||||
<data name="ui_home" xml:space="preserve">
|
||||
<value>Home</value>
|
||||
</data>
|
||||
<data name="ui_info_dch" xml:space="preserve">
|
||||
<value>DCH driver</value>
|
||||
</data>
|
||||
<data name="ui_info_mobile" xml:space="preserve">
|
||||
<value>Mobile GPU (Laptop, etc)?</value>
|
||||
</data>
|
||||
<data name="ui_info_outdated" xml:space="preserve">
|
||||
<value>Update available.</value>
|
||||
</data>
|
||||
<data name="ui_info_uptodate" xml:space="preserve">
|
||||
<value>Up to date.</value>
|
||||
</data>
|
||||
<data name="ui_info_website" xml:space="preserve">
|
||||
<value>EnvyUpdate website</value>
|
||||
</data>
|
||||
<data name="ui_install" xml:space="preserve">
|
||||
<value>Install</value>
|
||||
</data>
|
||||
<data name="ui_licenses" xml:space="preserve">
|
||||
<value>Licenses</value>
|
||||
</data>
|
||||
<data name="ui_localdriver" xml:space="preserve">
|
||||
<value>Local driver version:</value>
|
||||
</data>
|
||||
<data name="ui_localdriver_type" xml:space="preserve">
|
||||
<value>Local driver type:</value>
|
||||
</data>
|
||||
<data name="ui_message_good" xml:space="preserve">
|
||||
<value>All good.</value>
|
||||
</data>
|
||||
<data name="ui_message_update" xml:space="preserve">
|
||||
<value>New driver found.</value>
|
||||
</data>
|
||||
<data name="ui_onlinedriver" xml:space="preserve">
|
||||
<value>Online driver version:</value>
|
||||
</data>
|
||||
<data name="ui_openwebsite" xml:space="preserve">
|
||||
<value>Open website</value>
|
||||
</data>
|
||||
<data name="ui_settings" xml:space="preserve">
|
||||
<value>Settings</value>
|
||||
</data>
|
||||
<data name="ui_skipped" xml:space="preserve">
|
||||
<value>Version skipped</value>
|
||||
</data>
|
||||
|
@ -186,4 +216,7 @@
|
|||
<data name="update_popup_message" xml:space="preserve">
|
||||
<value>A new driver update is available for your graphics card.</value>
|
||||
</data>
|
||||
<data name="yes" xml:space="preserve">
|
||||
<value>Yes</value>
|
||||
</data>
|
||||
</root>
|
61
EnvyUpdate/SettingsPage.xaml
Normal file
61
EnvyUpdate/SettingsPage.xaml
Normal file
|
@ -0,0 +1,61 @@
|
|||
<ui:UiPage x:Class="EnvyUpdate.SettingsPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:EnvyUpdate"
|
||||
xmlns:p="clr-namespace:EnvyUpdate.Properties"
|
||||
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="400" d:DesignWidth="600"
|
||||
Title="SettingsPage">
|
||||
|
||||
<Grid Margin="8,0,8,8">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid Grid.Row="0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<ui:SymbolIcon Grid.Column="1" Symbol="WindowApps24" FontSize="32" />
|
||||
<TextBlock Grid.Column="2" x:Name="textBlockVer" Text="" VerticalAlignment="Center" FontSize="24"/>
|
||||
</Grid>
|
||||
|
||||
<ui:CardAction Grid.Row="1" Margin="0,12,0,0" Icon="Open24" Content="{x:Static p:Resources.ui_info_website}" Click="CardWeb_Click"/>
|
||||
<ui:CardControl Grid.Row="2" Margin="0,12,0,0" Icon="Bug24" Header="{x:Static p:Resources.ui_enable_logging}" >
|
||||
<ui:ToggleSwitch x:Name="chkLog" Checked="chkLog_Checked" Unchecked="chkLog_Unchecked"/>
|
||||
</ui:CardControl>
|
||||
|
||||
<Label Grid.Row="3" Content="{x:Static p:Resources.ui_licenses}" HorizontalAlignment="Left" VerticalAlignment="Top" FontWeight="Bold"/>
|
||||
<ScrollViewer Grid.Row="4" MaxHeight="700" HorizontalAlignment="Stretch">
|
||||
<StackPanel>
|
||||
<Expander Header="EnvyUpdate">
|
||||
<TextBox x:Name="textBoxLicEnvyupdate" IsReadOnly="True" TextWrapping="Wrap"/>
|
||||
</Expander>
|
||||
<Expander Margin="0,4,0,0" Header="Fody">
|
||||
<TextBox x:Name="textBoxLicFody" IsReadOnly="True" TextWrapping="Wrap"/>
|
||||
</Expander>
|
||||
<Expander Margin="0,4,0,0" Header="Costura.Fody">
|
||||
<TextBox x:Name="textBoxLicCostura" IsReadOnly="True" TextWrapping="Wrap"/>
|
||||
</Expander>
|
||||
<Expander Margin="0,4,0,0" Header="ResourceEmbedder">
|
||||
<TextBox x:Name="textBoxLicResourceembedder" IsReadOnly="True" TextWrapping="Wrap"/>
|
||||
</Expander>
|
||||
<Expander Margin="0,4,0,0" Header="Windows Community Toolkit">
|
||||
<TextBox x:Name="textBoxLicWindowscommunitytoolkit" IsReadOnly="True" TextWrapping="Wrap"/>
|
||||
</Expander>
|
||||
<Expander Margin="0,4,0,0" Header="WPF-UI">
|
||||
<TextBox x:Name="textBoxLicWpfui" IsReadOnly="True" TextWrapping="Wrap"/>
|
||||
</Expander>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
</ui:UiPage>
|
|
@ -1,32 +1,38 @@
|
|||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
|
||||
namespace EnvyUpdate
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for InfoWindow.xaml
|
||||
/// Interaction logic for SettingsPage.xaml
|
||||
/// </summary>
|
||||
public partial class InfoWindow : Window
|
||||
public partial class SettingsPage
|
||||
{
|
||||
public InfoWindow()
|
||||
public SettingsPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
|
||||
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
|
||||
string version = fvi.FileVersion;
|
||||
|
||||
labelVer.Content += " " + version;
|
||||
if (GlobalVars.monitoringInstall)
|
||||
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 ButtonWeb_Click(object sender, RoutedEventArgs e)
|
||||
private void CardWeb_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Debug.LogToFile("INFO Launching website.");
|
||||
System.Diagnostics.Process.Start("https://github.com/fyr77/EnvyUpdate/");
|
|
@ -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)
|
||||
* 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)
|
||||
* Resource Embedder: [MIT](https://www.nuget.org/packages/Resource.Embedder/)
|
||||
* 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
|
||||
|
|
Reference in a new issue