Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion Installer/setup.iss
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,11 @@ Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

; Intentionally do not auto-launch after setup to keep package-manager installs unattended.
; Normal/package-manager installs stay unattended. In-app updates opt in through
; /THREADPILOTUPDATE=1 and relaunch ThreadPilot after the replacement completes.
[Run]
Filename: "{app}\{#MyAppExeName}"; Flags: nowait; Check: IsThreadPilotUpdate

; ThreadPilot user data is preserved during install/update. Inno removes installed
; files and shortcuts automatically only when the generated uninstaller runs.
; Per-user AppData cleanup is limited to the account context used by uninstall.
Expand Down Expand Up @@ -108,3 +112,8 @@ begin
DeleteLegacyBetaUninstallEntry(HKCU);
Result := True;
end;

function IsThreadPilotUpdate(): Boolean;
begin
Result := CompareText(ExpandConstant('{param:THREADPILOTUPDATE|0}'), '1') = 0;
end;
4 changes: 1 addition & 3 deletions Locales/de-DE.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@
<sys:String x:Key="Settings_UpdateNotChecked">Nicht überprüft</sys:String>
<sys:String x:Key="Settings_UpdateLastCheckedNever">Niemals</sys:String>
<sys:String x:Key="Settings_UpdateConfirmTitle">Installieren Sie das ThreadPilot-Update</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot lädt Version {0} herunter und überprüft sie. Anschließend fordert Windows die Berechtigung zum Starten des Installationsprogramms an. Fortfahren?</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot lädt Version {0} herunter, überprüft und installiert sie und startet anschließend automatisch neu. Fortfahren?</sys:String>
<sys:String x:Key="Settings_StatusUpdateCanceled">Update abgebrochen.</sys:String>
<sys:String x:Key="Settings_StatusDownloadingUpdate">Update wird heruntergeladen und überprüft...</sys:String>
<sys:String x:Key="Settings_StatusUpdateInstallerStarted">Update-Installer gestartet.</sys:String>
Expand Down Expand Up @@ -530,8 +530,6 @@
<sys:String x:Key="SystemTweak_CoreParking_Desc">Steuert CPU core parking für die Energieverwaltung</sys:String>
<sys:String x:Key="SystemTweak_CStates_Name">C-States</sys:String>
<sys:String x:Key="SystemTweak_CStates_Desc">Steuert CPU C-States für die Energieverwaltung</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Name">HPET</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Desc">Hochpräziser Ereigniszeitgeber für die Systemzeitmessung</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Name">SysMain-Dienst</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Desc">Windows Superfetch/SysMain Dienst für die Speicherverwaltung</sys:String>
<sys:String x:Key="SystemTweak_Prefetch_Name">Prefetch</sys:String>
Expand Down
4 changes: 1 addition & 3 deletions Locales/en-US.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@
<sys:String x:Key="Settings_UpdateNotChecked">Not checked</sys:String>
<sys:String x:Key="Settings_UpdateLastCheckedNever">Never</sys:String>
<sys:String x:Key="Settings_UpdateConfirmTitle">Install ThreadPilot update</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot will download and verify version {0}, then ask Windows for permission to run the installer. Continue?</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot will download, verify and install version {0}, then restart automatically. Continue?</sys:String>
<sys:String x:Key="Settings_StatusUpdateCanceled">Update canceled.</sys:String>
<sys:String x:Key="Settings_StatusDownloadingUpdate">Downloading and verifying update...</sys:String>
<sys:String x:Key="Settings_StatusUpdateInstallerStarted">Update installer started.</sys:String>
Expand Down Expand Up @@ -530,8 +530,6 @@
<sys:String x:Key="SystemTweak_CoreParking_Desc">Controls CPU core parking for power management</sys:String>
<sys:String x:Key="SystemTweak_CStates_Name">C-States</sys:String>
<sys:String x:Key="SystemTweak_CStates_Desc">Controls CPU C-States for power management</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Name">HPET</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Desc">High Precision Event Timer for system timing</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Name">SysMain Service</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Desc">Windows Superfetch/SysMain service for memory management</sys:String>
<sys:String x:Key="SystemTweak_Prefetch_Name">Prefetch</sys:String>
Expand Down
4 changes: 1 addition & 3 deletions Locales/es-ES.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@
<sys:String x:Key="Settings_UpdateNotChecked">No comprobado</sys:String>
<sys:String x:Key="Settings_UpdateLastCheckedNever">nunca</sys:String>
<sys:String x:Key="Settings_UpdateConfirmTitle">Instalar la actualización ThreadPilot</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot descargará y verificará la versión {0}, y luego solicitará permiso a Windows para ejecutar el instalador. ¿Continuar?</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot descargará, verificará e instalará la versión {0} y se reiniciará automáticamente. ¿Continuar?</sys:String>
<sys:String x:Key="Settings_StatusUpdateCanceled">Actualización cancelada.</sys:String>
<sys:String x:Key="Settings_StatusDownloadingUpdate">Descargando y verificando actualización...</sys:String>
<sys:String x:Key="Settings_StatusUpdateInstallerStarted">Se inició el instalador de la actualización.</sys:String>
Expand Down Expand Up @@ -530,8 +530,6 @@
<sys:String x:Key="SystemTweak_CoreParking_Desc">Controles CPU core parking para administración de energía</sys:String>
<sys:String x:Key="SystemTweak_CStates_Name">C-States</sys:String>
<sys:String x:Key="SystemTweak_CStates_Desc">Controles CPU C-States para administración de energía</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Name">HPET</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Desc">Temporizador de eventos de alta precisión para la temporización del sistema</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Name">SysMain Servicio</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Desc">Windows Superfetch/SysMain servicio para gestión de memoria</sys:String>
<sys:String x:Key="SystemTweak_Prefetch_Name">Prefetch</sys:String>
Expand Down
4 changes: 1 addition & 3 deletions Locales/fr-FR.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@
<sys:String x:Key="Settings_UpdateNotChecked">Non vérifié</sys:String>
<sys:String x:Key="Settings_UpdateLastCheckedNever">Jamais</sys:String>
<sys:String x:Key="Settings_UpdateConfirmTitle">Installer la mise à jour ThreadPilot</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot téléchargera et vérifiera la version {0}, puis demandera à Windows l'autorisation d'exécuter le programme d'installation. Continuer ?</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot téléchargera, vérifiera et installera la version {0}, puis redémarrera automatiquement. Continuer ?</sys:String>
<sys:String x:Key="Settings_StatusUpdateCanceled">Mise à jour annulée.</sys:String>
<sys:String x:Key="Settings_StatusDownloadingUpdate">Téléchargement et vérification de la mise à jour...</sys:String>
<sys:String x:Key="Settings_StatusUpdateInstallerStarted">Le programme d'installation de la mise à jour a démarré.</sys:String>
Expand Down Expand Up @@ -530,8 +530,6 @@
<sys:String x:Key="SystemTweak_CoreParking_Desc">Contrôle CPU core parking pour la gestion de l'alimentation</sys:String>
<sys:String x:Key="SystemTweak_CStates_Name">C-States</sys:String>
<sys:String x:Key="SystemTweak_CStates_Desc">Contrôle CPU C-States pour la gestion de l'alimentation</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Name">HPET</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Desc">Minuteur d'événements haute précision pour la synchronisation du système</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Name">Service SysMain</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Desc">Service Windows Superfetch/SysMain pour la gestion de la mémoire</sys:String>
<sys:String x:Key="SystemTweak_Prefetch_Name">Prefetch</sys:String>
Expand Down
4 changes: 1 addition & 3 deletions Locales/it-IT.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@
<sys:String x:Key="Settings_UpdateNotChecked">Non controllato</sys:String>
<sys:String x:Key="Settings_UpdateLastCheckedNever">Mai</sys:String>
<sys:String x:Key="Settings_UpdateConfirmTitle">Installa l'aggiornamento ThreadPilot</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot scaricherà e verificherà la versione {0}, quindi chiederà a Windows l'autorizzazione per eseguire il programma di installazione. Continuare?</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot scaricherà, verificherà e installerà la versione {0}, quindi si riavvierà automaticamente. Continuare?</sys:String>
<sys:String x:Key="Settings_StatusUpdateCanceled">Aggiornamento annullato.</sys:String>
<sys:String x:Key="Settings_StatusDownloadingUpdate">Download e verifica dell'aggiornamento in corso...</sys:String>
<sys:String x:Key="Settings_StatusUpdateInstallerStarted">Avviato il programma di installazione dell'aggiornamento.</sys:String>
Expand Down Expand Up @@ -530,8 +530,6 @@
<sys:String x:Key="SystemTweak_CoreParking_Desc">Controlla CPU core parking per la gestione dell'alimentazione</sys:String>
<sys:String x:Key="SystemTweak_CStates_Name">C-States</sys:String>
<sys:String x:Key="SystemTweak_CStates_Desc">Controlla CPU C-States per la gestione dell'alimentazione</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Name">HPET</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Desc">Timer eventi ad alta precisione per la temporizzazione del sistema</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Name">SysMain Servizio</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Desc">Windows Superfetch/SysMain servizio per la gestione della memoria</sys:String>
<sys:String x:Key="SystemTweak_Prefetch_Name">Prefetch</sys:String>
Expand Down
4 changes: 1 addition & 3 deletions Locales/ru-RU.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@
<sys:String x:Key="Settings_UpdateNotChecked">Не проверено</sys:String>
<sys:String x:Key="Settings_UpdateLastCheckedNever">Никогда</sys:String>
<sys:String x:Key="Settings_UpdateConfirmTitle">Установите обновление ThreadPilot</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot загрузит и проверит версию {0}, затем запросит у Windows разрешение на запуск установщика. Продолжить?</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot загрузит, проверит и установит версию {0}, а затем автоматически перезапустится. Продолжить?</sys:String>
<sys:String x:Key="Settings_StatusUpdateCanceled">Обновление отменено.</sys:String>
<sys:String x:Key="Settings_StatusDownloadingUpdate">Загрузка и проверка обновления...</sys:String>
<sys:String x:Key="Settings_StatusUpdateInstallerStarted">Установщик обновлений запустился.</sys:String>
Expand Down Expand Up @@ -530,8 +530,6 @@
<sys:String x:Key="SystemTweak_CoreParking_Desc">Элементы управления CPU core parking для управления питанием</sys:String>
<sys:String x:Key="SystemTweak_CStates_Name">C-States</sys:String>
<sys:String x:Key="SystemTweak_CStates_Desc">Элементы управления CPU C-States для управления питанием</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Name">HPET</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Desc">Высокоточный таймер событий для системной синхронизации</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Name">SysMain Сервис</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Desc">Windows Superfetch/SysMain сервис управления памятью</sys:String>
<sys:String x:Key="SystemTweak_Prefetch_Name">Prefetch</sys:String>
Expand Down
4 changes: 1 addition & 3 deletions Locales/zh-CN.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@
<sys:String x:Key="Settings_UpdateNotChecked">尚未检查</sys:String>
<sys:String x:Key="Settings_UpdateLastCheckedNever">从未检查</sys:String>
<sys:String x:Key="Settings_UpdateConfirmTitle">安装 ThreadPilot 更新</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot 将下载并验证版本 {0},然后请求 Windows 权限运行安装程序。是否继续?</sys:String>
<sys:String x:Key="Settings_UpdateConfirmMessageFormat">ThreadPilot 将下载、验证并安装版本 {0},然后自动重启。是否继续?</sys:String>
<sys:String x:Key="Settings_StatusUpdateCanceled">更新已取消。</sys:String>
<sys:String x:Key="Settings_StatusDownloadingUpdate">正在下载并验证更新...</sys:String>
<sys:String x:Key="Settings_StatusUpdateInstallerStarted">更新安装程序已启动。</sys:String>
Expand Down Expand Up @@ -530,8 +530,6 @@
<sys:String x:Key="SystemTweak_CoreParking_Desc">控制 CPU 核心休眠以进行电源管理</sys:String>
<sys:String x:Key="SystemTweak_CStates_Name">C-States 状态</sys:String>
<sys:String x:Key="SystemTweak_CStates_Desc">控制 CPU C-States 以进行节能电源管理</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Name">HPET 定时器</sys:String>
<sys:String x:Key="SystemTweak_Hpet_Desc">高精度事件计时器,用于系统精准定时</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Name">SysMain 服务</sys:String>
<sys:String x:Key="SystemTweak_SysMain_Desc">Windows Superfetch/SysMain 服务,用于内存管理</sys:String>
<sys:String x:Key="SystemTweak_Prefetch_Name">预取 (Prefetch)</sys:String>
Expand Down
43 changes: 39 additions & 4 deletions MainWindow.Behaviors.partial.cs
Original file line number Diff line number Diff line change
Expand Up @@ -156,10 +156,40 @@ private async Task CheckForUpdatesAtStartupAsync()
return;
}

await this.notificationService.ShowNotificationAsync(
"Update available",
$"ThreadPilot {result.Release.Version} is available. Open Settings to download and install it.",
NotificationType.Information);
var title = Application.Current.TryFindResource("Settings_UpdateConfirmTitle") as string
?? "Install ThreadPilot update";
var messageFormat = Application.Current.TryFindResource("Settings_UpdateConfirmMessageFormat") as string
?? "ThreadPilot will download, verify and install version {0}, then restart automatically. Continue?";
var confirmation = MessageBox.Show(
this,
string.Format(messageFormat, result.Release.Version),
title,
MessageBoxButton.YesNo,
MessageBoxImage.Information);

if (confirmation != MessageBoxResult.Yes)
{
this.LogDebug($"Startup update declined: {result.Release.Version}");
return;
}

var downloadingMessage = Application.Current.TryFindResource("Settings_StatusDownloadingUpdate") as string
?? "Downloading and verifying update...";
await this.notificationService.ShowNotificationAsync(title, downloadingMessage, NotificationType.Information);

var installResult = await updateService.DownloadAndInstallAsync(result.Release);
if (installResult.Status != UpdateInstallStatus.Started)
{
var failureFormat = Application.Current.TryFindResource("Settings_StatusUpdateInstallFailedFormat") as string
?? "Update install failed: {0}";
MessageBox.Show(
this,
string.Format(failureFormat, installResult.Message),
title,
MessageBoxButton.OK,
MessageBoxImage.Error);
}

this.LogDebug($"Startup update check found update: installed {result.CurrentVersion}, latest {result.Release.Version}");
}
catch (Exception ex)
Expand Down Expand Up @@ -402,6 +432,11 @@ private async Task LoadViewModelsAsync()
this.LogDebug($"ProcessViewModel fallback (LoadProcesses only) completed after exception, process count: {this.processViewModel.Processes?.Count ?? 0}, filtered count: {this.processViewModel.FilteredProcesses?.Count ?? 0}");
}

this.LogDebug("Detecting persisted system tweak state...");
await this.systemTweaksViewModel.LoadAsync();
this.initializedSections.Add("Tweaks");
this.LogDebug("System tweak state detected successfully");

this.LogDebug("Skipping inactive view initialization until each page is opened.");

// Initialize keyboard shortcuts after window is loaded
Expand Down
5 changes: 1 addition & 4 deletions MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,10 @@
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource QuietRowBackgroundBrush}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderSubtleBrush}"/>
</Trigger>
<Trigger Property="IsActive" Value="True">
<Setter Property="Background" Value="{DynamicResource SoftSelectionBackgroundBrush}"/>
<Setter Property="BorderThickness" Value="3,0,0,0"/>
<Setter Property="BorderBrush" Value="{DynamicResource AccentFillColorDefaultBrush}"/>
<Setter Property="BorderThickness" Value="0"/>
</Trigger>
</Style.Triggers>
</Style>
Expand Down
9 changes: 0 additions & 9 deletions Models/ApplicationSettingsModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,6 @@ public partial class ApplicationSettingsModel : ObservableObject, IModel
[ObservableProperty]
private DateTimeOffset? lastUpdateCheckUtc = null;

[ObservableProperty]
private int updateCheckIntervalDays = 7;

[ObservableProperty]
private bool includePrereleaseUpdates = false;

Expand Down Expand Up @@ -238,7 +235,6 @@ public void CopyFrom(ApplicationSettingsModel other)
this.Language = LocalizationService.NormalizeLanguage(other.Language);
this.EnableAutomaticUpdateChecks = other.EnableAutomaticUpdateChecks;
this.LastUpdateCheckUtc = other.LastUpdateCheckUtc;
this.UpdateCheckIntervalDays = other.UpdateCheckIntervalDays;
this.IncludePrereleaseUpdates = other.IncludePrereleaseUpdates;

// Monitoring Settings
Expand Down Expand Up @@ -285,11 +281,6 @@ public ValidationResult Validate()
errors.Add("Fallback polling interval must be between 1 and 60 seconds");
}

if (this.UpdateCheckIntervalDays < 1 || this.UpdateCheckIntervalDays > 365)
{
errors.Add("Update check interval must be between 1 and 365 days");
}

return errors.Count == 0 ? ValidationResult.Success() : ValidationResult.Failure(errors.ToArray());
}

Expand Down
Loading
Loading