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
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [1.20.19] - 2026-06-12
## [1.20.20] - 2026-06-12

### Fixed
- **Much better screen-reader support across the app.** Many buttons, toggles, drop-downs, search/filter boxes, data grids, and per-row actions had no accessible name, so screen readers announced them generically (or not at all). Added clear, specific accessible names to interactive controls across 21 tabs — including destructive actions (Delete, Shred, Clear History), per-row buttons (now named after the item they act on), and unlabeled inputs. No visual change.

### Fixed
- **Activity history can no longer be corrupted by concurrent updates.** The recent-actions log saved its data outside the lock that protects it, so two actions logged at the same time could clash and produce a "collection modified" error or a truncated file. It now writes a consistent snapshot taken under the lock.
Expand Down
6 changes: 3 additions & 3 deletions SysManager/SysManager/SysManager.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
<RootNamespace>SysManager</RootNamespace>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoWarn>NU1603;NU1701</NoWarn>
<Version>1.20.19</Version>
<FileVersion>1.20.19.0</FileVersion>
<AssemblyVersion>1.20.19.0</AssemblyVersion>
<Version>1.20.20</Version>
<FileVersion>1.20.20.0</FileVersion>
<AssemblyVersion>1.20.20.0</AssemblyVersion>
<Product>SysManager</Product>
<Description>SysManager — Windows system monitoring toolkit by laurentiu021. Network, updates, health, logs, safe deep cleanup.</Description>
<PackageProjectUrl>https://github.com/laurentiu021/SystemManager</PackageProjectUrl>
Expand Down
5 changes: 5 additions & 0 deletions SysManager/SysManager/Views/AppAlertsView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,19 @@
<DockPanel>
<StackPanel Orientation="Horizontal" DockPanel.Dock="Left">
<Button Content="Start Monitoring" Command="{Binding StartMonitoringCommand}"
AutomationProperties.Name="Start monitoring app installations"
Style="{StaticResource PrimaryButton}" Padding="14,8" Margin="0,0,8,0"/>
<Button Content="Stop" Command="{Binding StopMonitoringCommand}"
AutomationProperties.Name="Stop monitoring"
Style="{StaticResource SecondaryButton}" Padding="12,8" Margin="0,0,8,0"/>
<Button Content="Show Installed" Command="{Binding RefreshInstalledAppsCommand}"
AutomationProperties.Name="Show installed apps"
Style="{StaticResource SecondaryButton}" Padding="12,8" Margin="0,0,8,0"/>
<Button Content="Acknowledge All" Command="{Binding AcknowledgeAllCommand}"
AutomationProperties.Name="Acknowledge all alerts"
Style="{StaticResource SecondaryButton}" Padding="12,8" Margin="0,0,8,0"/>
<Button Content="Clear History" Command="{Binding ClearHistoryCommand}"
AutomationProperties.Name="Clear alert history"
Style="{StaticResource DangerButton}" Padding="12,8"/>
</StackPanel>
<TextBlock DockPanel.Dock="Right" VerticalAlignment="Center" HorizontalAlignment="Right"
Expand Down
3 changes: 2 additions & 1 deletion SysManager/SysManager/Views/AppBlockerView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling">
<DataGrid.Columns>
<DataGridCheckBoxColumn Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" Width="40" MinWidth="40" CanUserResize="False" />
<DataGridCheckBoxColumn Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" Width="40" MinWidth="40" CanUserResize="False"
AutomationProperties.Name="Select application" />
<DataGridTextColumn Header="Executable" Binding="{Binding ExecutableName}" Width="*" MinWidth="120" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
Expand Down
11 changes: 7 additions & 4 deletions SysManager/SysManager/Views/AppUpdatesView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
Visibility="{Binding IsElevated, Converter={StaticResource FlexVis}, ConverterParameter=Inverse}">
<DockPanel>
<Button Content="Run as administrator" Command="{Binding RelaunchAsAdminCommand}"
AutomationProperties.Name="Relaunch as administrator"
Style="{StaticResource AdminButton}" DockPanel.Dock="Right" Padding="14,8"/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="&#xE83D;" FontFamily="Segoe Fluent Icons,Segoe MDL2 Assets"
Expand Down Expand Up @@ -53,10 +54,10 @@

<Border Grid.Row="2" Style="{StaticResource Card}" Margin="28,16,28,0">
<StackPanel Orientation="Horizontal">
<Button Content="Scan for updates" Command="{Binding ScanCommand}" Style="{StaticResource PrimaryButton}"/>
<Button Content="Upgrade selected" Command="{Binding UpgradeSelectedCommand}" Style="{StaticResource SecondaryButton}" Margin="8,0,0,0"/>
<Button Content="Cancel" Command="{Binding CancelCommand}" Style="{StaticResource GhostButton}" Margin="6,0,0,0"/>
<CheckBox Content="Select all" IsChecked="{Binding SelectAll}" Margin="16,0,0,0" VerticalAlignment="Center"/>
<Button Content="Scan for updates" Command="{Binding ScanCommand}" AutomationProperties.Name="Scan for updates" Style="{StaticResource PrimaryButton}"/>
<Button Content="Upgrade selected" Command="{Binding UpgradeSelectedCommand}" AutomationProperties.Name="Upgrade selected packages" Style="{StaticResource SecondaryButton}" Margin="8,0,0,0"/>
<Button Content="Cancel" Command="{Binding CancelCommand}" AutomationProperties.Name="Cancel update operation" Style="{StaticResource GhostButton}" Margin="6,0,0,0"/>
<CheckBox Content="Select all" IsChecked="{Binding SelectAll}" AutomationProperties.Name="Select all packages" Margin="16,0,0,0" VerticalAlignment="Center"/>
</StackPanel>
</Border>

Expand All @@ -75,12 +76,14 @@
<Style TargetType="CheckBox">
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Margin" Value="4,0"/>
<Setter Property="AutomationProperties.Name" Value="{Binding Name, StringFormat='Select {0}'}"/>
</Style>
</DataGridCheckBoxColumn.ElementStyle>
<DataGridCheckBoxColumn.EditingElementStyle>
<Style TargetType="CheckBox">
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Margin" Value="4,0"/>
<Setter Property="AutomationProperties.Name" Value="{Binding Name, StringFormat='Select {0}'}"/>
</Style>
</DataGridCheckBoxColumn.EditingElementStyle>
</DataGridCheckBoxColumn>
Expand Down
2 changes: 2 additions & 0 deletions SysManager/SysManager/Views/BulkInstallerView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@
Command="{Binding DataContext.AddToInstallListCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"
Style="{StaticResource GhostButton}"
AutomationProperties.Name="{Binding Name, StringFormat='Add {0} to install list'}"
Padding="10,4" FontSize="11"/>
</Grid>
</Border>
Expand Down Expand Up @@ -204,6 +205,7 @@
<!-- Checkbox -->
<CheckBox Grid.Column="0" VerticalAlignment="Center"
IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"
AutomationProperties.Name="{Binding Name, StringFormat='Select {0}'}"
Margin="0,0,12,0"/>

<!-- App icon (real favicon or category glyph fallback) -->
Expand Down
9 changes: 9 additions & 0 deletions SysManager/SysManager/Views/ContextMenuView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
Visibility="{Binding IsElevated, Converter={StaticResource FlexVis}, ConverterParameter=Inverse}">
<DockPanel>
<Button Content="Run as administrator" Command="{Binding RelaunchAsAdminCommand}"
AutomationProperties.Name="Run as administrator"
Style="{StaticResource AdminButton}" DockPanel.Dock="Right" Padding="14,8"/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="&#xE83D;" FontFamily="Segoe Fluent Icons,Segoe MDL2 Assets"
Expand Down Expand Up @@ -65,6 +66,7 @@
<StackPanel Orientation="Horizontal">
<!-- Win10 button with hover preview -->
<Button Content="Win10 Default" Margin="0,0,8,0"
AutomationProperties.Name="Apply Win10 Default menu style"
Command="{Binding ApplyPresetCommand}" CommandParameter="win10"
Style="{StaticResource SecondaryButton}" Padding="12,8" FontSize="12">
<Button.ToolTip>
Expand All @@ -90,6 +92,7 @@
</Button>
<!-- Win11 button with hover preview -->
<Button Content="Win11 Default" Margin="0,0,8,0"
AutomationProperties.Name="Apply Win11 Default menu style"
Command="{Binding ApplyPresetCommand}" CommandParameter="win11"
Style="{StaticResource SecondaryButton}" Padding="12,8" FontSize="12">
<Button.ToolTip>
Expand Down Expand Up @@ -119,6 +122,7 @@
</Button>
<!-- Custom indicator -->
<Button Content="Custom" Margin="0,0,8,0"
AutomationProperties.Name="Apply Custom menu style"
Command="{Binding ApplyPresetCommand}" CommandParameter="custom"
Style="{StaticResource SecondaryButton}" Padding="12,8" FontSize="12"
ToolTip="Active menu style + your manual entry toggles from the list below. Toggle any entry to switch to Custom mode."/>
Expand All @@ -137,9 +141,11 @@
<StackPanel Orientation="Horizontal" DockPanel.Dock="Left">
<ComboBox ItemsSource="{Binding LocationFilters}"
SelectedItem="{Binding SelectedLocation}"
AutomationProperties.Name="Filter by location"
Width="160" Margin="0,0,8,0"
VerticalAlignment="Center"/>
<TextBox Text="{Binding FilterText, UpdateSourceTrigger=PropertyChanged}"
AutomationProperties.Name="Search entries"
Width="200" Margin="0,0,8,0"
VerticalAlignment="Center">
<TextBox.Style>
Expand All @@ -153,9 +159,11 @@
</TextBox.Style>
</TextBox>
<Button Content="Refresh" Command="{Binding RefreshCommand}"
AutomationProperties.Name="Refresh entries"
Style="{StaticResource SecondaryButton}" Margin="0,0,8,0"/>
<CheckBox Content="Show system entries"
IsChecked="{Binding ShowSystemEntries}"
AutomationProperties.Name="Show system entries"
VerticalAlignment="Center" Margin="8,0,0,0"/>
</StackPanel>
<TextBlock DockPanel.Dock="Right" VerticalAlignment="Center" HorizontalAlignment="Right"
Expand Down Expand Up @@ -187,6 +195,7 @@
IsChecked="{Binding IsEnabled, UpdateSourceTrigger=PropertyChanged}"
Command="{Binding DataContext.ToggleEntryCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
AutomationProperties.Name="{Binding Name, StringFormat='Toggle {0}'}"
VerticalAlignment="Center" HorizontalAlignment="Center"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
Expand Down
14 changes: 8 additions & 6 deletions SysManager/SysManager/Views/DeepCleanupView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<CheckBox Grid.Column="0" IsChecked="{Binding IsSelected, Mode=TwoWay}" VerticalAlignment="Center" Margin="0,0,12,0"/>
<CheckBox Grid.Column="0" AutomationProperties.Name="{Binding Name, StringFormat='Select {0} for cleanup'}" IsChecked="{Binding IsSelected, Mode=TwoWay}" VerticalAlignment="Center" Margin="0,0,12,0"/>
<StackPanel Grid.Column="1">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" FontWeight="SemiBold" FontSize="14" Foreground="{DynamicResource TextPrimary}"/>
Expand Down Expand Up @@ -109,7 +109,7 @@
<Button Content="Clean selected" Command="{Binding CleanCommand}"
Style="{StaticResource PrimaryButton}"
IsEnabled="{Binding IsCleaning, Converter={StaticResource BoolInvert}}"/>
<Button Content="Cancel" Command="{Binding CancelCommand}" Style="{StaticResource GhostButton}" Margin="8,0,0,0"/>
<Button Content="Cancel" AutomationProperties.Name="Cancel cleanup" Command="{Binding CancelCommand}" Style="{StaticResource GhostButton}" Margin="8,0,0,0"/>
</StackPanel>
</Grid>
</Border>
Expand Down Expand Up @@ -154,12 +154,12 @@
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Location:" Foreground="{DynamicResource TextSecondary}" VerticalAlignment="Center" Margin="0,0,8,0"/>
<ComboBox Grid.Column="1" ItemsSource="{Binding ScanLocations}" SelectedItem="{Binding SelectedLocation, Mode=TwoWay}"
<ComboBox Grid.Column="1" AutomationProperties.Name="Scan location" ItemsSource="{Binding ScanLocations}" SelectedItem="{Binding SelectedLocation, Mode=TwoWay}"
DisplayMemberPath="Label" MaxWidth="380" HorizontalAlignment="Left"/>
<TextBlock Grid.Column="2" Text="Min size (MB):" Foreground="{DynamicResource TextSecondary}" VerticalAlignment="Center" Margin="16,0,8,0"/>
<TextBox Grid.Column="3" Text="{Binding MinSizeMB, Mode=TwoWay}" Width="80"/>
<TextBox Grid.Column="3" AutomationProperties.Name="Minimum file size in megabytes" Text="{Binding MinSizeMB, Mode=TwoWay}" Width="80"/>
<TextBlock Grid.Column="4" Text="Top:" Foreground="{DynamicResource TextSecondary}" VerticalAlignment="Center" Margin="16,0,8,0"/>
<TextBox Grid.Column="5" Text="{Binding TopCount, Mode=TwoWay}" Width="60"/>
<TextBox Grid.Column="5" AutomationProperties.Name="Number of top results to show" Text="{Binding TopCount, Mode=TwoWay}" Width="60"/>
</Grid>

<TextBlock Text="{Binding LargeScanStatus}" Style="{StaticResource Subtle}" Margin="0,0,0,8"
Expand All @@ -178,7 +178,7 @@
<TextBlock Grid.Column="0" Text="{Binding LargeFilesScanned, StringFormat={}{0:N0} files}" Foreground="{DynamicResource TextPrimary}" FontWeight="SemiBold" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text=" · " Foreground="{DynamicResource TextMuted}" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="{Binding LargeBytesScannedDisplay, StringFormat=scanned {0}}" Foreground="{DynamicResource TextSecondary}" VerticalAlignment="Center"/>
<Button Grid.Column="3" Content="Cancel" Command="{Binding CancelCommand}" Style="{StaticResource GhostButton}" Padding="10,4"/>
<Button Grid.Column="3" Content="Cancel" AutomationProperties.Name="Cancel large file scan" Command="{Binding CancelCommand}" Style="{StaticResource GhostButton}" Padding="10,4"/>
</Grid>
<TextBlock Text="{Binding LargeCurrentFolder}" Foreground="{DynamicResource TextMuted}" FontSize="11" Margin="0,4,0,0" TextTrimming="CharacterEllipsis"/>
</StackPanel>
Expand All @@ -201,10 +201,12 @@
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="Show" Padding="10,4"
AutomationProperties.Name="{Binding Name, StringFormat='Show {0} in Explorer'}"
Command="{Binding DataContext.ShowInExplorerCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding Path}"
Style="{StaticResource SecondaryButton}"/>
<Button Content="Copy" Padding="10,4" Margin="6,0,0,0"
AutomationProperties.Name="{Binding Name, StringFormat='Copy path of {0}'}"
Command="{Binding DataContext.CopyPathCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding Path}"
Style="{StaticResource GhostButton}"/>
Expand Down
Loading
Loading