Skip to content
Open
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
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Changed

- Replace the embedded CefSharp/CEF browser with Microsoft Edge WebView2. The Syncthing UI is now rendered by
a real child window with GPU compositing, instead of being rasterised on the CPU and copied into a WPF
bitmap every frame, which makes scrolling and interaction dramatically smoother. This also removes roughly
150MB of CEF binaries from the distribution.
- The embedded browser's data now lives in `data\webview2` (portable) or
`%LOCALAPPDATA%\SyncTrayzor\webview2` (installed). The old `cef\cache` folder can be deleted.

### Removed

- The Intel Xe graphics warning, and the CEF cache lockfile check that refused to start when a second
SyncTrayzor instance was running. Neither applies to WebView2. The "disable hardware rendering" setting
remains, and still applies to SyncTrayzor's own WPF interface.

### Requirements

- SyncTrayzor now requires the Microsoft Edge WebView2 Runtime. This ships with Windows 11 and is delivered to
Windows 10 via Microsoft Edge, so it is present on essentially all supported systems. If it is missing,
SyncTrayzor offers a link to the download page and continues to run Syncthing normally.

## [2.2.0] - 2026-07-18

### Added
Expand Down
4 changes: 2 additions & 2 deletions installer/common.iss
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ PrivilegesRequired=admin
PrivilegesRequiredOverridesAllowed=dialog
CloseApplications=yes
RestartApplications=no
; If we try and close CefSharp.BrowserSubprocess.exe we'll fail - it doesn't respond well
; However if we close *just* SyncTrayzor, that will take care of shutting down CefSharp and syncthing
; msedgewebview2.exe processes are shared with other applications and must not be closed by us
; However if we close *just* SyncTrayzor, that will take care of shutting down WebView2 and syncthing
CloseApplicationsFilter=SyncTrayzor.exe
TouchDate=current
WizardStyle=modern
Expand Down
4 changes: 2 additions & 2 deletions src/SyncTrayzor/App.Installed.config
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@
<DirectoryWatcherFolderExistenceCheckMilliseconds>3000</DirectoryWatcherFolderExistenceCheckMilliseconds>
<IssuesUrl>https://github.com/GermanCoding/SyncTrayzor/issues</IssuesUrl>
<EnableAutostartOnFirstStart>true</EnableAutostartOnFirstStart>
<CefRemoteDebuggingPort>2004</CefRemoteDebuggingPort>
<WebViewRemoteDebuggingPort>2004</WebViewRemoteDebuggingPort>
<Variant>Installed</Variant>
<SyncthingConnectTimeoutSeconds>600</SyncthingConnectTimeoutSeconds>
<EnforceSingleProcessPerUser>true</EnforceSingleProcessPerUser>
<PathConfiguration>
<LogFilePath>%APPDATA%\SyncTrayzor\logs</LogFilePath>
<ConfigurationFilePath>%APPDATA%\SyncTrayzor\config.xml</ConfigurationFilePath>
<ConfigurationFileBackupPath>%APPDATA%\SyncTrayzor\config-backups</ConfigurationFileBackupPath>
<CefCachePath>%LOCALAPPDATA%\SyncTrayzor\cef\cache</CefCachePath>
<WebView2DataPath>%LOCALAPPDATA%\SyncTrayzor\webview2</WebView2DataPath>
<SyncthingPath>%APPDATA%\SyncTrayzor\syncthing.exe</SyncthingPath>
<SyncthingHomePath/>
</PathConfiguration>
Expand Down
4 changes: 2 additions & 2 deletions src/SyncTrayzor/App.Portable.config
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@
<DirectoryWatcherFolderExistenceCheckMilliseconds>3000</DirectoryWatcherFolderExistenceCheckMilliseconds>
<IssuesUrl>https://github.com/GermanCoding/SyncTrayzor/issues</IssuesUrl>
<EnableAutostartOnFirstStart>false</EnableAutostartOnFirstStart>
<CefRemoteDebuggingPort>2004</CefRemoteDebuggingPort>
<WebViewRemoteDebuggingPort>2004</WebViewRemoteDebuggingPort>
<Variant>Portable</Variant>
<SyncthingConnectTimeoutSeconds>600</SyncthingConnectTimeoutSeconds>
<EnforceSingleProcessPerUser>true</EnforceSingleProcessPerUser>
<PathConfiguration>
<LogFilePath>logs</LogFilePath>
<ConfigurationFilePath>data\config.xml</ConfigurationFilePath>
<ConfigurationFileBackupPath>data\config-backups</ConfigurationFileBackupPath>
<CefCachePath>data\cef\cache</CefCachePath>
<WebView2DataPath>data\webview2</WebView2DataPath>
<SyncthingPath>data\syncthing.exe</SyncthingPath>
<SyncthingHomePath>data\syncthing</SyncthingHomePath>
</PathConfiguration>
Expand Down
4 changes: 2 additions & 2 deletions src/SyncTrayzor/Bootstrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,8 @@ protected override void Configure()

RecycleBinDeleter.Logger = s => LogManager.GetLogger(typeof(RecycleBinDeleter).FullName).Error(s);

// Workaround for Intel Xe processors, which mess up CefSharp unless we disable hardware
// rendering for WPF. See #606.
// Escape hatch for machines whose drivers don't get on with WPF's hardware rendering. This no
// longer affects the embedded browser: WebView2 renders in its own process and is unaffected.
if (configuration.DisableHardwareRendering)
{
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
Expand Down
14 changes: 1 addition & 13 deletions src/SyncTrayzor/Pages/BarAlerts/BarAlertsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,27 +13,21 @@ public class BarAlertsViewModel : Conductor<IBarAlert>.Collection.AllActive
private readonly IAlertsManager alertsManager;
private readonly ISyncthingManager syncthingManager;
private readonly Func<ConflictResolutionViewModel> conflictResolutionViewModelFactory;
private readonly Func<IntelXeGraphicsAlertViewModel> intelXeGraphicsAlertViewModelFactory;
private readonly IWindowManager windowManager;
private readonly IConfigurationProvider configurationProvider;
private readonly GraphicsCardDetector graphicsCardDetector;

public BarAlertsViewModel(
IAlertsManager alertsManager,
ISyncthingManager syncthingManager,
Func<ConflictResolutionViewModel> conflictResolutionViewModelFactory,
Func<IntelXeGraphicsAlertViewModel> intelXeGraphicsAlertViewModelFactory,
IWindowManager windowManager,
IConfigurationProvider configurationProvider,
GraphicsCardDetector graphicsCardDetector)
IConfigurationProvider configurationProvider)
{
this.alertsManager = alertsManager;
this.syncthingManager = syncthingManager;
this.conflictResolutionViewModelFactory = conflictResolutionViewModelFactory;
this.intelXeGraphicsAlertViewModelFactory = intelXeGraphicsAlertViewModelFactory;
this.windowManager = windowManager;
this.configurationProvider = configurationProvider;
this.graphicsCardDetector = graphicsCardDetector;
}

protected override void OnInitialActivate()
Expand Down Expand Up @@ -80,12 +74,6 @@ private void Load()
var vm = new PausedDevicesFromMeteringViewModel(pausedDeviceNames);
Items.Add(vm);
}

var configuration = configurationProvider.Load();
if (!configuration.DisableHardwareRendering && !configuration.HideIntelXeWarningMessage && graphicsCardDetector.IsIntelXe)
{
Items.Add(intelXeGraphicsAlertViewModelFactory());
}
}

private void OpenConflictResolver()
Expand Down
21 changes: 0 additions & 21 deletions src/SyncTrayzor/Pages/BarAlerts/IntelXeGraphicsAlertView.xaml

This file was deleted.

22 changes: 0 additions & 22 deletions src/SyncTrayzor/Pages/BarAlerts/IntelXeGraphicsAlertViewModel.cs

This file was deleted.

19 changes: 5 additions & 14 deletions src/SyncTrayzor/Pages/ThirdPartyComponentsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,21 +55,12 @@ public ThirdPartyComponentsViewModel(IProcessStartProvider processStartProvider)
},
new ThirdPartyComponent()
{
Name = "CEF",
Description = "Simple framework for embedding Chromium-based browsers in other applications",
Homepage = "https://code.google.com/p/chromiumembedded",
License = "Modified BSD License",
Notes = "Browser component - used to display Syncthing UI",
LicenseText = LoadLicense("CEF.txt")
},
new ThirdPartyComponent()
{
Name = "CefSharp",
Description = ".NET (WPF and Windows Forms) bindings for the Chromium Embedded Framework",
Homepage = "https://github.com/cefsharp/CefSharp",
Name = "WebView2",
Description = "Microsoft Edge WebView2 SDK, for embedding web content in native applications",
Homepage = "https://developer.microsoft.com/microsoft-edge/webview2/",
License = "New BSD License",
Notes = "WPF adapter for CEF",
LicenseText = LoadLicense("CefSharp.txt")
Notes = "Browser component - used to display Syncthing UI",
LicenseText = LoadLicense("WebView2.txt")
},
new ThirdPartyComponent()
{
Expand Down
27 changes: 7 additions & 20 deletions src/SyncTrayzor/Pages/ViewerView.xaml
Original file line number Diff line number Diff line change
@@ -1,30 +1,17 @@
<UserControl x:Class="SyncTrayzor.Pages.ViewerView"
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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:s="https://github.com/canton7/Stylet"
xmlns:l="clr-namespace:SyncTrayzor.Localization"
xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
mc:Ignorable="d"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<ContentControl Content="{Binding WebBrowser}" UseLayoutRounding="True">
<ContentControl.Resources>
<Style TargetType="cefSharp:ChromiumWebBrowser">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="{l:Loc Generic_Cut}" Command="{Binding WebBrowser.CutCommand}"/>
<MenuItem Header="{l:Loc Generic_Copy}" Command="{Binding WebBrowser.CopyCommand}"/>
<MenuItem Header="{l:Loc Generic_Paste}" Command="{Binding WebBrowser.PasteCommand}"/>
</ContextMenu>
</Setter.Value>
</Setter>
<Setter Property="RenderOptions.BitmapScalingMode" Value="NearestNeighbor"/>
</Style>
</ContentControl.Resources>
</ContentControl>
<!-- WebView2 hosts a native child window, which paints over any WPF content in the same cell.
It therefore has to be collapsed whenever one of the messages below is showing. -->
<ContentControl Content="{Binding WebBrowser}" UseLayoutRounding="True"
Visibility="{Binding ShowBrowser, Converter={x:Static s:BoolToVisibilityConverter.Instance}}"/>

<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{l:Loc ViewerView_SyncthingStarting}"
Visibility="{Binding ShowSyncthingStarting, Converter={x:Static s:BoolToVisibilityConverter.Instance}}"
Expand Down
Loading