From a4048220a98ca98f118c6b2d42ec19479a79a5fb Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Tue, 13 Feb 2024 22:58:56 +0200 Subject: [PATCH 01/32] Fixed problem when remove clipboard listener operation fails. --- ReleaseNotes.md | 10 ++-------- .../Services/ClipboardHookServiceTests.cs | 4 ++-- .../Services/ClipboardHookService.cs | 10 +++++----- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 2cde3a4c..bf1aff60 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,11 +1,5 @@ ### Features -* Plugins support. -* Keep user settings from the previous version of the application after upgrade. -* Automatic restart on application crash. -* "Remove clips older than..." setting. -* Paste window settings. +* ### Fixes -* Fixed problem when the application breaks the clipboard viewer chain on exit. -* Fixed Main window bottom corners rounding when the window is maximized (#72). -* Fixed Main window shadow after restoring the window state (#73). +* Fixed problem when remove clipboard listener operation fails. diff --git a/Tests/Tum4ik.JustClipboardManager.UnitTests/Services/ClipboardHookServiceTests.cs b/Tests/Tum4ik.JustClipboardManager.UnitTests/Services/ClipboardHookServiceTests.cs index 8a553c64..1f89e412 100644 --- a/Tests/Tum4ik.JustClipboardManager.UnitTests/Services/ClipboardHookServiceTests.cs +++ b/Tests/Tum4ik.JustClipboardManager.UnitTests/Services/ClipboardHookServiceTests.cs @@ -68,7 +68,7 @@ internal async Task HwndHook_ManySequentialClipboardUpdateMsgs_PublishesClipboar [Fact] - internal void HwndHook_DestroyMsg_RemovesClipboardListener() + internal void HwndHook_CloseMsg_RemovesClipboardListener() { const nint WinHandle = 33; _pasteWindowService.WindowHandle.Returns(WinHandle); @@ -78,7 +78,7 @@ internal void HwndHook_DestroyMsg_RemovesClipboardListener() var testeeService = new ClipboardHookService(_pasteWindowService, _eventAggregator, _user32Dll); var handled = false; - testeeService.HwndHook(WinHandle, 0x0002, default, default, ref handled); + testeeService.HwndHook(WinHandle, 0x0010, default, default, ref handled); _user32Dll.Received(1).RemoveClipboardFormatListener(WinHandle); } diff --git a/Tum4ik.JustClipboardManager/Services/ClipboardHookService.cs b/Tum4ik.JustClipboardManager/Services/ClipboardHookService.cs index 534ac277..9b20de60 100644 --- a/Tum4ik.JustClipboardManager/Services/ClipboardHookService.cs +++ b/Tum4ik.JustClipboardManager/Services/ClipboardHookService.cs @@ -18,8 +18,8 @@ public ClipboardHookService(IPasteWindowService pasteWindowService, _eventAggregator = eventAggregator; _user32Dll = user32Dll; - _windowHandle = pasteWindowService.WindowHandle; - var isClipboardListenerAdded = user32Dll.AddClipboardFormatListener(_windowHandle); + _pasteWindowHandle = pasteWindowService.WindowHandle; + var isClipboardListenerAdded = user32Dll.AddClipboardFormatListener(_pasteWindowHandle); if (!isClipboardListenerAdded) { var ex = new Win32Exception(); @@ -35,7 +35,7 @@ public ClipboardHookService(IPasteWindowService pasteWindowService, private static readonly object s_locker = new(); - private readonly nint _windowHandle; + private readonly nint _pasteWindowHandle; private readonly System.Timers.Timer _timer = new(500) { @@ -59,8 +59,8 @@ public nint HwndHook(nint hWnd, int msg, nint wParam, nint lParam, ref bool hand } } break; - case WM_DESTROY: - var isClipboardListenerRemoved = _user32Dll.RemoveClipboardFormatListener(_windowHandle); + case WM_CLOSE: + var isClipboardListenerRemoved = _user32Dll.RemoveClipboardFormatListener(_pasteWindowHandle); if (!isClipboardListenerRemoved) { Crashes.TrackError(new Win32Exception(), new Dictionary From ecf68a60661c7a57489fec8e9d4a1e02d5a81c4b Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Tue, 13 Feb 2024 23:44:15 +0200 Subject: [PATCH 02/32] to .NET 8 --- .github/workflows/gated_application.yml | 56 ++++++++++++------- .github/workflows/gated_plugin-dev-kit.yml | 12 ++-- ...k.JustClipboardManager.PluginDevKit.csproj | 2 +- ...4ik.JustClipboardManager.TextPlugin.csproj | 4 +- SolutionProperties/Copyright.txt | 2 +- .../Tum4ik.Deployment.UnitTests.csproj | 2 +- ...m4ik.JustClipboardManager.UnitTests.csproj | 2 +- .../Tum4ik.JustClipboardManager.csproj | 10 ++-- 8 files changed, 53 insertions(+), 37 deletions(-) diff --git a/.github/workflows/gated_application.yml b/.github/workflows/gated_application.yml index 088b6727..c88c71d1 100644 --- a/.github/workflows/gated_application.yml +++ b/.github/workflows/gated_application.yml @@ -73,12 +73,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4.0.0 + uses: actions/checkout@v4.1.1 with: fetch-depth: 0 - name: Setup MSBuild - uses: microsoft/setup-msbuild@v1.3.1 + uses: microsoft/setup-msbuild@v2 - name: Define version id: define-version @@ -104,19 +104,27 @@ jobs: ${{ env.Scripts }}\MSBuildPublish.ps1 -Architecture x86 -Version $version ${{ env.Scripts }}\MSBuildPublish.ps1 -Architecture x64 -Version $version - - name: Setup VSTest.console.exe - uses: darenm/Setup-VSTest@v1.2 + # - name: Setup VSTest.console.exe + # uses: darenm/Setup-VSTest@v1.2 + # - name: Test + # run: | + # msbuild /t:Restore /t:Build /p:Configuration=Release + # vstest.console.exe .\Tests\*.UnitTests\bin\Release\*\*.UnitTests.dll ` + # /Parallel ` + # /Enablecodecoverage ` + # /Collect:"Code Coverage;Format=Cobertura" - name: Test - run: | - msbuild /t:Restore /t:Build /p:Configuration=Release - vstest.console.exe .\Tests\*.UnitTests\bin\Release\*\*.UnitTests.dll ` - /Parallel ` - /Enablecodecoverage ` - /Collect:"Code Coverage;Format=Cobertura" + uses: microsoft/vstest-action@v1.0.0 + with: + testAssembly: '*.UnitTests\bin\Release\*\*.UnitTests.dll' + searchFolder: .\Tests\ + runInParallel: true + codeCoverageEnabled: true + otherConsoleOptions: /Collect:"Code Coverage;Format=Cobertura" - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4.0.1 - name: Prepare PFX fil for code signing run: | @@ -159,7 +167,7 @@ jobs: run: Remove-Item -Path ${{ env.TemporaryPfxFilePath }} - name: Upload build artifacts - uses: actions/upload-artifact@v3.1.2 + uses: actions/upload-artifact@v4.3.1 with: if-no-files-found: error name: BuildFiles @@ -177,13 +185,21 @@ jobs: steps: - name: Download build artifacts - uses: actions/download-artifact@v3.0.2 + uses: actions/download-artifact@v4.1.2 - name: GitHub release - uses: softprops/action-gh-release@v0.1.15 - with: - tag_name: ${{ needs.build.outputs.version }} - draft: true - files: '**/*.exe' - body_path: BuildFiles/ReleaseNotes.md - fail_on_unmatched_files: true + env: + GH_REPO: ${{ github.repository }} + GITHUB_TOKEN: ${{ github.token }} + run: | + gh release create ${{ needs.build.outputs.version }} '**/*.exe' ` + --draft ` + --title ${{ needs.build.outputs.version }} ` + --notes-file BuildFiles/ReleaseNotes.md + # uses: softprops/action-gh-release@v0.1.15 + # with: + # tag_name: ${{ needs.build.outputs.version }} + # draft: true + # files: '**/*.exe' + # body_path: BuildFiles/ReleaseNotes.md + # fail_on_unmatched_files: true diff --git a/.github/workflows/gated_plugin-dev-kit.yml b/.github/workflows/gated_plugin-dev-kit.yml index 6ae2bcbc..6c964e17 100644 --- a/.github/workflows/gated_plugin-dev-kit.yml +++ b/.github/workflows/gated_plugin-dev-kit.yml @@ -32,14 +32,14 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4.0.0 + uses: actions/checkout@v4.1.1 with: fetch-depth: 0 - - name: Install .NET - uses: actions/setup-dotnet@v3.2.0 + - name: Setup .NET SDK + uses: actions/setup-dotnet@v4.0.0 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Define version id: define-version @@ -89,7 +89,7 @@ jobs: /p:SymbolPackageFormat=snupkg - name: Upload build artifacts - uses: actions/upload-artifact@v3.1.2 + uses: actions/upload-artifact@v4.3.1 with: if-no-files-found: error name: Package @@ -105,7 +105,7 @@ jobs: steps: - name: Download build artifacts - uses: actions/download-artifact@v3.0.2 + uses: actions/download-artifact@v4.1.2 - name: NuGet push run: | diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Tum4ik.JustClipboardManager.PluginDevKit.csproj b/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Tum4ik.JustClipboardManager.PluginDevKit.csproj index c881acd3..aec9b5a0 100644 --- a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Tum4ik.JustClipboardManager.PluginDevKit.csproj +++ b/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Tum4ik.JustClipboardManager.PluginDevKit.csproj @@ -1,7 +1,7 @@ - net7.0-windows + net8.0-windows enable enable true diff --git a/Plugins/Tum4ik.JustClipboardManager.TextPlugin/Tum4ik.JustClipboardManager.TextPlugin.csproj b/Plugins/Tum4ik.JustClipboardManager.TextPlugin/Tum4ik.JustClipboardManager.TextPlugin.csproj index ab27e8fc..da33db90 100644 --- a/Plugins/Tum4ik.JustClipboardManager.TextPlugin/Tum4ik.JustClipboardManager.TextPlugin.csproj +++ b/Plugins/Tum4ik.JustClipboardManager.TextPlugin/Tum4ik.JustClipboardManager.TextPlugin.csproj @@ -1,7 +1,7 @@ - net7.0-windows + net8.0-windows enable enable true @@ -14,7 +14,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/SolutionProperties/Copyright.txt b/SolutionProperties/Copyright.txt index e8b55be9..d1227a83 100644 --- a/SolutionProperties/Copyright.txt +++ b/SolutionProperties/Copyright.txt @@ -1 +1 @@ -© 2022-2023 Yevheniy Tymchishin. All rights reserved. +© 2022-2024 Yevheniy Tymchishin. All rights reserved. diff --git a/Tests/Tum4ik.Deployment.UnitTests/Tum4ik.Deployment.UnitTests.csproj b/Tests/Tum4ik.Deployment.UnitTests/Tum4ik.Deployment.UnitTests.csproj index 6148c17e..501b7ae1 100644 --- a/Tests/Tum4ik.Deployment.UnitTests/Tum4ik.Deployment.UnitTests.csproj +++ b/Tests/Tum4ik.Deployment.UnitTests/Tum4ik.Deployment.UnitTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable false diff --git a/Tests/Tum4ik.JustClipboardManager.UnitTests/Tum4ik.JustClipboardManager.UnitTests.csproj b/Tests/Tum4ik.JustClipboardManager.UnitTests/Tum4ik.JustClipboardManager.UnitTests.csproj index ae7df5fd..09f0b413 100644 --- a/Tests/Tum4ik.JustClipboardManager.UnitTests/Tum4ik.JustClipboardManager.UnitTests.csproj +++ b/Tests/Tum4ik.JustClipboardManager.UnitTests/Tum4ik.JustClipboardManager.UnitTests.csproj @@ -1,7 +1,7 @@ - net7.0-windows + net8.0-windows enable enable false diff --git a/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj b/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj index 7fbfe9d1..a0756d23 100644 --- a/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj +++ b/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj @@ -2,7 +2,7 @@ WinExe - net7.0-windows + net8.0-windows enable All true @@ -181,13 +181,13 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + all From 164ff5580add6450142856c28a44174f091811b2 Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Wed, 14 Feb 2024 00:44:13 +0200 Subject: [PATCH 03/32] prev vstest --- .github/workflows/gated_application.yml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/gated_application.yml b/.github/workflows/gated_application.yml index c88c71d1..12bc131a 100644 --- a/.github/workflows/gated_application.yml +++ b/.github/workflows/gated_application.yml @@ -107,21 +107,13 @@ jobs: # - name: Setup VSTest.console.exe # uses: darenm/Setup-VSTest@v1.2 - # - name: Test - # run: | - # msbuild /t:Restore /t:Build /p:Configuration=Release - # vstest.console.exe .\Tests\*.UnitTests\bin\Release\*\*.UnitTests.dll ` - # /Parallel ` - # /Enablecodecoverage ` - # /Collect:"Code Coverage;Format=Cobertura" - name: Test - uses: microsoft/vstest-action@v1.0.0 - with: - testAssembly: '*.UnitTests\bin\Release\*\*.UnitTests.dll' - searchFolder: .\Tests\ - runInParallel: true - codeCoverageEnabled: true - otherConsoleOptions: /Collect:"Code Coverage;Format=Cobertura" + run: | + msbuild /t:Restore /t:Build /p:Configuration=Release + vstest.console.exe .\Tests\*.UnitTests\bin\Release\*\*.UnitTests.dll ` + /Parallel ` + /Enablecodecoverage ` + /Collect:"Code Coverage;Format=Cobertura" - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v4.0.1 From 3c04a7f0a10485b42e76d64d044225fc179c2161 Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Wed, 14 Feb 2024 16:16:31 +0200 Subject: [PATCH 04/32] improved test step --- .github/workflows/gated_application.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gated_application.yml b/.github/workflows/gated_application.yml index 12bc131a..9eeb12fc 100644 --- a/.github/workflows/gated_application.yml +++ b/.github/workflows/gated_application.yml @@ -109,8 +109,16 @@ jobs: - name: Test run: | + $vswherePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + $vsInstallationPath = & $vswherePath ` + -latest ` + -products * ` + -requires Microsoft.VisualStudio.Workload.ManagedDesktop Microsoft.VisualStudio.Workload.Web ` + -requiresAny ` + -property installationPath + $vstestPath = Join-Path $vsInstallationPath "Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" msbuild /t:Restore /t:Build /p:Configuration=Release - vstest.console.exe .\Tests\*.UnitTests\bin\Release\*\*.UnitTests.dll ` + & $vstestPath .\Tests\*.UnitTests\bin\Release\*\*.UnitTests.dll ` /Parallel ` /Enablecodecoverage ` /Collect:"Code Coverage;Format=Cobertura" From 2714fab92cf3672420145da233979f8860a1f829 Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Wed, 14 Feb 2024 16:27:18 +0200 Subject: [PATCH 05/32] test step at the beginning of the workflow --- .github/workflows/gated_application.yml | 35 +++++++++++-------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/.github/workflows/gated_application.yml b/.github/workflows/gated_application.yml index 9eeb12fc..d9439497 100644 --- a/.github/workflows/gated_application.yml +++ b/.github/workflows/gated_application.yml @@ -80,6 +80,22 @@ jobs: - name: Setup MSBuild uses: microsoft/setup-msbuild@v2 + - name: Test + run: | + $vswherePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + $vsInstallationPath = & $vswherePath ` + -latest ` + -products * ` + -requires Microsoft.VisualStudio.Workload.ManagedDesktop Microsoft.VisualStudio.Workload.Web ` + -requiresAny ` + -property installationPath + $vstestPath = Join-Path $vsInstallationPath "Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" + msbuild /t:Restore /t:Build /p:Configuration=Release + & $vstestPath .\Tests\*.UnitTests\bin\Release\*\*.UnitTests.dll ` + /Parallel ` + /Enablecodecoverage ` + /Collect:"Code Coverage;Format=Cobertura" + - name: Define version id: define-version run: | @@ -104,25 +120,6 @@ jobs: ${{ env.Scripts }}\MSBuildPublish.ps1 -Architecture x86 -Version $version ${{ env.Scripts }}\MSBuildPublish.ps1 -Architecture x64 -Version $version - # - name: Setup VSTest.console.exe - # uses: darenm/Setup-VSTest@v1.2 - - - name: Test - run: | - $vswherePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" - $vsInstallationPath = & $vswherePath ` - -latest ` - -products * ` - -requires Microsoft.VisualStudio.Workload.ManagedDesktop Microsoft.VisualStudio.Workload.Web ` - -requiresAny ` - -property installationPath - $vstestPath = Join-Path $vsInstallationPath "Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" - msbuild /t:Restore /t:Build /p:Configuration=Release - & $vstestPath .\Tests\*.UnitTests\bin\Release\*\*.UnitTests.dll ` - /Parallel ` - /Enablecodecoverage ` - /Collect:"Code Coverage;Format=Cobertura" - - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v4.0.1 From a20a2daf954cc3e5d034c5607a2fdef19dc0e4fb Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Thu, 15 Feb 2024 22:46:01 +0200 Subject: [PATCH 06/32] Window style for Win 11 --- .editorconfig | 1 + Tum4ik.JustClipboardManager/App.xaml.cs | 9 +- .../Styles/GeneralStyles.xaml | 7 +- .../Tum4ik.JustClipboardManager.csproj | 1 + .../Views/Main/MainDialog.xaml | 15 +- .../Views/Main/MainDialogBefore11Window.xaml | 112 +++++++++++++ .../Main/MainDialogBefore11Window.xaml.cs | 153 ++++++++++++++++++ .../Views/Main/MainDialogWindow.xaml | 110 +------------ .../Views/Main/MainDialogWindow.xaml.cs | 119 +------------- .../Views/PasteWindow.xaml | 1 + .../Views/Shared/SimpleDialogWindow.xaml | 3 +- 11 files changed, 295 insertions(+), 236 deletions(-) create mode 100644 Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml create mode 100644 Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs diff --git a/.editorconfig b/.editorconfig index fe3764bd..f2fb4d7d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -201,6 +201,7 @@ dotnet_diagnostic.CA1062.severity = none dotnet_diagnostic.CS1591.severity = none dotnet_diagnostic.S1186.severity = none +dotnet_diagnostic.S1121.severity = none dotnet_diagnostic.S3885.severity = none dotnet_diagnostic.S4200.severity = none dotnet_diagnostic.S6602.severity = none diff --git a/Tum4ik.JustClipboardManager/App.xaml.cs b/Tum4ik.JustClipboardManager/App.xaml.cs index 4b1e1750..11e7a223 100644 --- a/Tum4ik.JustClipboardManager/App.xaml.cs +++ b/Tum4ik.JustClipboardManager/App.xaml.cs @@ -292,7 +292,14 @@ protected override void RegisterTypes(IContainerRegistry containerRegistry) .RegisterShell() .RegisterShell(); - containerRegistry.RegisterDialogWindow(WindowNames.MainAppWindow); + if (Environment.OSVersion.Version >= Version.Parse("10.0.22000")) + { + containerRegistry.RegisterDialogWindow(WindowNames.MainAppWindow); + } + else + { + containerRegistry.RegisterDialogWindow(WindowNames.MainAppWindow); + } containerRegistry.RegisterDialogWindow(WindowNames.SimpleDialogWindow); containerRegistry.RegisterSingleInstanceDialog(DialogNames.MainDialog); containerRegistry.RegisterDialog(DialogNames.UnregisteredHotkeysDialog); diff --git a/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml b/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml index a842ee6a..4fac707b 100644 --- a/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml +++ b/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml @@ -22,7 +22,7 @@ RenderingBias="Quality"/> - + + diff --git a/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj b/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj index a0756d23..057266c2 100644 --- a/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj +++ b/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj @@ -93,6 +93,7 @@ + diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialog.xaml b/Tum4ik.JustClipboardManager/Views/Main/MainDialog.xaml index e6cbc851..a40eaf73 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialog.xaml +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialog.xaml @@ -4,7 +4,6 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:prism="http://prismlibrary.com/" - xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:vm="clr-namespace:Tum4ik.JustClipboardManager.ViewModels.Main" xmlns:controls="clr-namespace:Tum4ik.JustClipboardManager.Controls" xmlns:const="clr-namespace:Tum4ik.JustClipboardManager.Constants" @@ -34,18 +33,6 @@ CommandParameter="{x:Static const:ViewNames.AboutView}"/> - - - - - - - - @@ -53,5 +40,5 @@ - + diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml new file mode 100644 index 00000000..57154f22 --- /dev/null +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs new file mode 100644 index 00000000..55ac018f --- /dev/null +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs @@ -0,0 +1,153 @@ +using System.Windows; +using System.Windows.Interop; +using Prism.Services.Dialogs; +using Tum4ik.JustClipboardManager.Services.Dialogs; +using Tum4ik.JustClipboardManager.Services.PInvokeWrappers; +using Windows.Win32.UI.HiDpi; +using Windows.Win32.Graphics.Gdi; +using static Windows.Win32.PInvoke; +using System.Windows.Controls; +using System.Windows.Media; + +namespace Tum4ik.JustClipboardManager.Views.Main; + +/// +/// Interaction logic for MainDialogWindow.xaml +/// +internal partial class MainDialogBefore11Window : IDialogWindowExtended +{ + private readonly IUser32DllService _user32Dll; + private readonly ISHCoreDllService _shCoreDll; + + public MainDialogBefore11Window(IUser32DllService user32Dll, + ISHCoreDllService shCoreDll) + { + _user32Dll = user32Dll; + _shCoreDll = shCoreDll; + + InitializeComponent(); + + HwndSource.FromHwnd(Handle).AddHook(HwndHook); + _initialMargin = Margin; + } + + + private readonly Thickness _initialMargin; + private bool _windowLocationChangedSubscribed; + + + public IDialogResult? Result { get; set; } + + + private nint? _handle; + public nint Handle => _handle ??= new WindowInteropHelper(this).EnsureHandle(); + + + private nint HwndHook(nint hWnd, int msg, nint wParam, nint lParam, ref bool handled) + { + switch ((uint) msg) + { + case WM_NCLBUTTONDBLCLK: + if (WindowState == WindowState.Normal) + { + SystemCommands.MaximizeWindow(this); + handled = true; + } + break; + case WM_SYSCOMMAND: + switch ((uint) wParam) + { + case 0xF012: // Window titlebar click + if (WindowState == WindowState.Maximized && !_windowLocationChangedSubscribed) + { + LocationChanged += MainDialogWindow_LocationChanged; + _windowLocationChangedSubscribed = true; + } + break; + case SC_MAXIMIZE: + case 0xF032: // SC_MAXIMIZE_DBLCLICK + BeforeMaximize(); + break; + case SC_RESTORE: + case 0xF122: // SC_RESTORE_DBLCLICK + if (WindowState != WindowState.Minimized) + { + BeforeRestore(); + } + break; + } + break; + } + return nint.Zero; + } + + + private void Border_SizeChanged(object sender, SizeChangedEventArgs e) + { + var border = (Border) sender; + var borderContent = (FrameworkElement) border.Child; + var rectGeometry = (RectangleGeometry) (borderContent.Clip ??= new RectangleGeometry()); + if (WindowState != WindowState.Maximized) + { + rectGeometry.RadiusX = rectGeometry.RadiusY = 8; + } + else + { + rectGeometry.RadiusX = rectGeometry.RadiusY = 0; + } + rectGeometry.Rect = new(0, 0, borderContent.ActualWidth, borderContent.ActualHeight); + } + + + private void MainDialogWindow_LocationChanged(object? sender, EventArgs e) + { + LocationChanged -= MainDialogWindow_LocationChanged; + BeforeRestore(); + _windowLocationChangedSubscribed = false; + } + + + private void BeforeMaximize() + { + var monitorHandle = _user32Dll.MonitorFromWindow(Handle, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST); + if (_user32Dll.GetMonitorInfo(monitorHandle, out var monitorInfo) + && _shCoreDll.GetDpiForMonitor(monitorHandle, MONITOR_DPI_TYPE.MDT_EFFECTIVE_DPI, out var dpiX, out var dpiY)) + { + MaxWidth = (monitorInfo.rcWork.right - monitorInfo.rcWork.left) / (dpiX / 96d); + MaxHeight = (monitorInfo.rcWork.bottom - monitorInfo.rcWork.top) / (dpiY / 96d); + Margin = new(0, 0, 0, 0); + } + } + + + private void BeforeRestore() + { + Margin = _initialMargin; + } + + + private void MinimizeButton_Click(object sender, RoutedEventArgs e) + { + SystemCommands.MinimizeWindow(this); + } + + + private void MaximizeRestoreButton_Click(object sender, RoutedEventArgs e) + { + if (WindowState == WindowState.Normal) + { + SystemCommands.MaximizeWindow(this); + } + else if (WindowState == WindowState.Maximized) + { + SystemCommands.RestoreWindow(this); + } + } + + + private void CloseButton_Click(object sender, RoutedEventArgs e) + { + Result = new DialogResult(); + Close(); + } +} diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml index 1149ace4..dbe9665a 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml @@ -1,110 +1,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + MinWidth="800" MinHeight="600" + WindowStartupLocation="CenterScreen"> + diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs index 36cd44f4..abc29efe 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs @@ -1,134 +1,23 @@ -using System.Windows; -using System.Windows.Interop; +using System.Windows.Interop; using Prism.Services.Dialogs; using Tum4ik.JustClipboardManager.Services.Dialogs; -using Tum4ik.JustClipboardManager.Services.PInvokeWrappers; -using Windows.Win32.UI.HiDpi; -using Windows.Win32.Graphics.Gdi; -using static Windows.Win32.PInvoke; -namespace Tum4ik.JustClipboardManager.Views.Main; +namespace Tum4ik.JustClipboardManager.Views.Main; /// /// Interaction logic for MainDialogWindow.xaml /// internal partial class MainDialogWindow : IDialogWindowExtended { - private readonly IUser32DllService _user32Dll; - private readonly ISHCoreDllService _shCoreDll; - - public MainDialogWindow(IUser32DllService user32Dll, - ISHCoreDllService shCoreDll) + public MainDialogWindow() { - _user32Dll = user32Dll; - _shCoreDll = shCoreDll; - InitializeComponent(); - - HwndSource.FromHwnd(Handle).AddHook(HwndHook); - _initialMargin = Margin; } - private readonly Thickness _initialMargin; - private bool _windowLocationChangedSubscribed; - - - public IDialogResult? Result { get; set; } - - private nint? _handle; public nint Handle => _handle ??= new WindowInteropHelper(this).EnsureHandle(); - private nint HwndHook(nint hWnd, int msg, nint wParam, nint lParam, ref bool handled) - { - switch ((uint) msg) - { - case WM_NCLBUTTONDBLCLK: - if (WindowState == WindowState.Normal) - { - SystemCommands.MaximizeWindow(this); - handled = true; - } - break; - case WM_SYSCOMMAND: - switch ((uint) wParam) - { - case 0xF012: // Window titlebar click - if (WindowState == WindowState.Maximized && !_windowLocationChangedSubscribed) - { - LocationChanged += MainDialogWindow_LocationChanged; - _windowLocationChangedSubscribed = true; - } - break; - case SC_MAXIMIZE: - case 0xF032: // SC_MAXIMIZE_DBLCLICK - BeforeMaximize(); - break; - case SC_RESTORE: - case 0xF122: // SC_RESTORE_DBLCLICK - if (WindowState != WindowState.Minimized) - { - BeforeRestore(); - } - break; - } - break; - } - return nint.Zero; - } - - - private void MainDialogWindow_LocationChanged(object? sender, EventArgs e) - { - LocationChanged -= MainDialogWindow_LocationChanged; - BeforeRestore(); - _windowLocationChangedSubscribed = false; - } - - - private void BeforeMaximize() - { - var monitorHandle = _user32Dll.MonitorFromWindow(Handle, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST); - if (_user32Dll.GetMonitorInfo(monitorHandle, out var monitorInfo) - && _shCoreDll.GetDpiForMonitor(monitorHandle, MONITOR_DPI_TYPE.MDT_EFFECTIVE_DPI, out var dpiX, out var dpiY)) - { - MaxWidth = (monitorInfo.rcWork.right - monitorInfo.rcWork.left) / (dpiX / 96d); - MaxHeight = (monitorInfo.rcWork.bottom - monitorInfo.rcWork.top) / (dpiY / 96d); - Margin = new(0, 0, 0, 0); - } - } - - - private void BeforeRestore() - { - Margin = _initialMargin; - } - - - private void MinimizeButton_Click(object sender, RoutedEventArgs e) - { - SystemCommands.MinimizeWindow(this); - } - - - private void MaximizeRestoreButton_Click(object sender, RoutedEventArgs e) - { - if (WindowState == WindowState.Normal) - { - SystemCommands.MaximizeWindow(this); - } - else if (WindowState == WindowState.Maximized) - { - SystemCommands.RestoreWindow(this); - } - } - - - private void CloseButton_Click(object sender, RoutedEventArgs e) - { - Result = new DialogResult(); - Close(); - } + public IDialogResult? Result { get; set; } } diff --git a/Tum4ik.JustClipboardManager/Views/PasteWindow.xaml b/Tum4ik.JustClipboardManager/Views/PasteWindow.xaml index 1c43d962..65e5c88d 100644 --- a/Tum4ik.JustClipboardManager/Views/PasteWindow.xaml +++ b/Tum4ik.JustClipboardManager/Views/PasteWindow.xaml @@ -14,6 +14,7 @@ SizeToContent="WidthAndHeight" WindowStartupLocation="Manual" Margin="24" + Style="{StaticResource WindowBefore11Style}" x:Name="This"> diff --git a/Tum4ik.JustClipboardManager/Views/Shared/SimpleDialogWindow.xaml b/Tum4ik.JustClipboardManager/Views/Shared/SimpleDialogWindow.xaml index a72b0544..14885134 100644 --- a/Tum4ik.JustClipboardManager/Views/Shared/SimpleDialogWindow.xaml +++ b/Tum4ik.JustClipboardManager/Views/Shared/SimpleDialogWindow.xaml @@ -10,7 +10,8 @@ WindowStartupLocation="CenterOwner" ShowInTaskbar="False" ResizeMode="NoResize" - SizeToContent="WidthAndHeight"> + SizeToContent="WidthAndHeight" + Style="{StaticResource WindowBefore11Style}"> From dfc9aacefb74c4e6345ca99283cc7b9ae20beb16 Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Sun, 18 Feb 2024 23:35:11 +0200 Subject: [PATCH 07/32] WinUI 3 backdrop for main window. --- JustClipboardManager.sln | 2 +- .../Attributes/PluginAttribute.cs | 0 .../Attributes/ServiceAttribute.cs | 0 .../Attributes/SvgIconResourceAttribute.cs | 0 .../Events/LanguageChangedEvent.cs | 0 .../Extensions/ContainerProviderExtensions.cs | 0 .../IPlugin.cs | 0 .../Icons/SvgIcon.cs | 0 .../LocalizableVisualTree.cs | 0 .../Models/ClipData.cs | 0 .../Plugin.cs | 0 .../PluginModule.cs | 0 .../Services/IInfoBarService.cs | 0 .../Services/IPluginSettingsService.cs | 0 .../Services/IPluginTranslationService.cs | 0 .../Services/IPluginsRegistryService.cs | 0 .../Services/PluginTranslationService.cs | 0 .../Theming/AppColors.cs | 0 ...k.JustClipboardManager.PluginDevKit.csproj | 0 ...4ik.JustClipboardManager.TextPlugin.csproj | 2 +- Tum4ik.JustClipboardManager/App.xaml.cs | 3 +- .../Controls/WindowTitleBar.xaml | 85 +++++++++++++++++ .../Controls/WindowTitleBar.xaml.cs | 71 ++++++++++++++ Tum4ik.JustClipboardManager/NativeMethods.txt | 10 ++ .../Services/Theme/ColorTheme.cs | 22 ++++- .../Services/Theme/ThemeService.cs | 10 +- .../Tum4ik.JustClipboardManager.csproj | 3 +- .../Views/Main/MainDialog.xaml | 2 +- .../Views/Main/MainDialogBefore11Window.xaml | 74 +-------------- .../Main/MainDialogBefore11Window.xaml.cs | 26 ------ .../Views/Main/MainDialogWindow.xaml | 30 ++++-- .../Views/Main/MainDialogWindow.xaml.cs | 93 ++++++++++++++++++- 32 files changed, 317 insertions(+), 116 deletions(-) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Attributes/PluginAttribute.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Attributes/ServiceAttribute.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Attributes/SvgIconResourceAttribute.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Events/LanguageChangedEvent.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Extensions/ContainerProviderExtensions.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/IPlugin.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Icons/SvgIcon.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/LocalizableVisualTree.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Models/ClipData.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Plugin.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/PluginModule.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Services/IInfoBarService.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Services/IPluginSettingsService.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Services/IPluginTranslationService.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Services/IPluginsRegistryService.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Services/PluginTranslationService.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Theming/AppColors.cs (100%) rename Plugins/{Tum4ik.JustClipboardManager.PluginsDevKit => Tum4ik.JustClipboardManager.PluginDevKit}/Tum4ik.JustClipboardManager.PluginDevKit.csproj (100%) create mode 100644 Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml create mode 100644 Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml.cs diff --git a/JustClipboardManager.sln b/JustClipboardManager.sln index b76bebf5..1102a9bd 100644 --- a/JustClipboardManager.sln +++ b/JustClipboardManager.sln @@ -50,7 +50,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tum4ik.JustClipboardManager EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{82637701-F680-4526-ACD7-01E54950444E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tum4ik.JustClipboardManager.PluginDevKit", "Plugins\Tum4ik.JustClipboardManager.PluginsDevKit\Tum4ik.JustClipboardManager.PluginDevKit.csproj", "{877793B0-8BB2-4F06-B8FA-39B95D5C8F0F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tum4ik.JustClipboardManager.PluginDevKit", "Plugins\Tum4ik.JustClipboardManager.PluginDevKit\Tum4ik.JustClipboardManager.PluginDevKit.csproj", "{877793B0-8BB2-4F06-B8FA-39B95D5C8F0F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tum4ik.JustClipboardManager.TextPlugin", "Plugins\Tum4ik.JustClipboardManager.TextPlugin\Tum4ik.JustClipboardManager.TextPlugin.csproj", "{6DA0F318-A17F-4518-A324-423E5236ECB9}" EndProject diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Attributes/PluginAttribute.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Attributes/PluginAttribute.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Attributes/PluginAttribute.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Attributes/PluginAttribute.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Attributes/ServiceAttribute.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Attributes/ServiceAttribute.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Attributes/ServiceAttribute.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Attributes/ServiceAttribute.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Attributes/SvgIconResourceAttribute.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Attributes/SvgIconResourceAttribute.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Attributes/SvgIconResourceAttribute.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Attributes/SvgIconResourceAttribute.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Events/LanguageChangedEvent.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Events/LanguageChangedEvent.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Events/LanguageChangedEvent.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Events/LanguageChangedEvent.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Extensions/ContainerProviderExtensions.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Extensions/ContainerProviderExtensions.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Extensions/ContainerProviderExtensions.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Extensions/ContainerProviderExtensions.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/IPlugin.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/IPlugin.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/IPlugin.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/IPlugin.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Icons/SvgIcon.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Icons/SvgIcon.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Icons/SvgIcon.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Icons/SvgIcon.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/LocalizableVisualTree.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/LocalizableVisualTree.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/LocalizableVisualTree.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/LocalizableVisualTree.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Models/ClipData.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Models/ClipData.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Models/ClipData.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Models/ClipData.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Plugin.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Plugin.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Plugin.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Plugin.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/PluginModule.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/PluginModule.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/PluginModule.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/PluginModule.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/IInfoBarService.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/IInfoBarService.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/IInfoBarService.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/IInfoBarService.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/IPluginSettingsService.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/IPluginSettingsService.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/IPluginSettingsService.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/IPluginSettingsService.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/IPluginTranslationService.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/IPluginTranslationService.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/IPluginTranslationService.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/IPluginTranslationService.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/IPluginsRegistryService.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/IPluginsRegistryService.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/IPluginsRegistryService.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/IPluginsRegistryService.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/PluginTranslationService.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/PluginTranslationService.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Services/PluginTranslationService.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Services/PluginTranslationService.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Theming/AppColors.cs b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Theming/AppColors.cs similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Theming/AppColors.cs rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Theming/AppColors.cs diff --git a/Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Tum4ik.JustClipboardManager.PluginDevKit.csproj b/Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Tum4ik.JustClipboardManager.PluginDevKit.csproj similarity index 100% rename from Plugins/Tum4ik.JustClipboardManager.PluginsDevKit/Tum4ik.JustClipboardManager.PluginDevKit.csproj rename to Plugins/Tum4ik.JustClipboardManager.PluginDevKit/Tum4ik.JustClipboardManager.PluginDevKit.csproj diff --git a/Plugins/Tum4ik.JustClipboardManager.TextPlugin/Tum4ik.JustClipboardManager.TextPlugin.csproj b/Plugins/Tum4ik.JustClipboardManager.TextPlugin/Tum4ik.JustClipboardManager.TextPlugin.csproj index da33db90..4a895273 100644 --- a/Plugins/Tum4ik.JustClipboardManager.TextPlugin/Tum4ik.JustClipboardManager.TextPlugin.csproj +++ b/Plugins/Tum4ik.JustClipboardManager.TextPlugin/Tum4ik.JustClipboardManager.TextPlugin.csproj @@ -10,7 +10,7 @@ - + diff --git a/Tum4ik.JustClipboardManager/App.xaml.cs b/Tum4ik.JustClipboardManager/App.xaml.cs index 11e7a223..a14d5959 100644 --- a/Tum4ik.JustClipboardManager/App.xaml.cs +++ b/Tum4ik.JustClipboardManager/App.xaml.cs @@ -88,7 +88,8 @@ private static void OnUnhandledException(object? sender, DispatcherUnhandledExce { { "Message", "Unhandled Exception" }, { "OS Architecture", Environment.Is64BitOperatingSystem ? "x64" : "x86" }, - { "App Architecture", Environment.Is64BitProcess ? "x64" : "x86" } + { "App Architecture", Environment.Is64BitProcess ? "x64" : "x86" }, + { "OS Version", Environment.OSVersion.Version.ToString() } }); Task.Delay(10000).Wait(); // Give Crashes some time to be able to record exception properly e.Handled = true; diff --git a/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml b/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml new file mode 100644 index 00000000..1e21dc90 --- /dev/null +++ b/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml.cs b/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml.cs new file mode 100644 index 00000000..b4b0b383 --- /dev/null +++ b/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml.cs @@ -0,0 +1,71 @@ +using System.Windows; + +namespace Tum4ik.JustClipboardManager.Controls; +/// +/// Interaction logic for WindowTitleBar.xaml +/// +public partial class WindowTitleBar +{ + public WindowTitleBar() + { + InitializeComponent(); + } + + + public static readonly DependencyProperty WindowStateProperty = DependencyProperty.Register( + nameof(WindowState), typeof(WindowState), typeof(WindowTitleBar) + ); + public WindowState WindowState + { + get => (WindowState) GetValue(WindowStateProperty); + set => SetValue(WindowStateProperty, value); + } + + + public static readonly DependencyProperty IsWindowActiveProperty = DependencyProperty.Register( + nameof(IsWindowActive), typeof(bool), typeof(WindowTitleBar) + ); + public bool IsWindowActive + { + get => (bool) GetValue(IsWindowActiveProperty); + set => SetValue(IsWindowActiveProperty, value); + } + + + private Window _window = null!; + + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + _window = Window.GetWindow(this); + _window.StateChanged += (s, e) => WindowState = _window.WindowState; + _window.Activated += (s, e) => IsWindowActive = true; + _window.Deactivated += (s, e) => IsWindowActive = false; + } + + + private void MinimizeButton_Click(object sender, RoutedEventArgs e) + { + SystemCommands.MinimizeWindow(_window); + } + + + private void MaximizeRestoreButton_Click(object sender, RoutedEventArgs e) + { + if (_window.WindowState == WindowState.Normal) + { + SystemCommands.MaximizeWindow(_window); + } + else if (_window.WindowState == WindowState.Maximized) + { + SystemCommands.RestoreWindow(_window); + } + } + + + private void CloseButton_Click(object sender, RoutedEventArgs e) + { + _window.Close(); + } +} diff --git a/Tum4ik.JustClipboardManager/NativeMethods.txt b/Tum4ik.JustClipboardManager/NativeMethods.txt index 74272788..79e1c4d9 100644 --- a/Tum4ik.JustClipboardManager/NativeMethods.txt +++ b/Tum4ik.JustClipboardManager/NativeMethods.txt @@ -6,6 +6,8 @@ SC_* // Enums ------------------------------------------------------------------------------------------ OBJECT_IDENTIFIER +DWM_SYSTEMBACKDROP_TYPE +WINDOW_STYLE // ------------------------------------------------------------------------------------------------ @@ -29,6 +31,9 @@ RemoveClipboardFormatListener SendInput SetForegroundWindow SetFocus +GetWindowLong +SetWindowLong +SetWindowLongPtr // ------------------------------------------------------------------------------------------------ @@ -41,3 +46,8 @@ GlobalDeleteAtom // Methods (SHCore.dll) --------------------------------------------------------------------------- GetDpiForMonitor // ------------------------------------------------------------------------------------------------ + + +// Methods (dwmapi.dll) --------------------------------------------------------------------------- +DwmSetWindowAttribute +// ------------------------------------------------------------------------------------------------ diff --git a/Tum4ik.JustClipboardManager/Services/Theme/ColorTheme.cs b/Tum4ik.JustClipboardManager/Services/Theme/ColorTheme.cs index 588a499e..74b11dde 100644 --- a/Tum4ik.JustClipboardManager/Services/Theme/ColorTheme.cs +++ b/Tum4ik.JustClipboardManager/Services/Theme/ColorTheme.cs @@ -2,4 +2,24 @@ namespace Tum4ik.JustClipboardManager.Services.Theme; -internal record ColorTheme(string Name, SvgIconType Icon, string XamlFileName); +internal class ColorTheme +{ + public ColorTheme(ThemeType themeType, SvgIconType icon, string xamlFileName) + { + ThemeType = themeType; + Name = themeType.ToString(); + Icon = icon; + XamlFileName = xamlFileName; + } + + public ThemeType ThemeType { get; } + public string Name { get; } + public SvgIconType Icon { get; } + public string XamlFileName { get; } +} + + +internal enum ThemeType +{ + Light, Dark +} diff --git a/Tum4ik.JustClipboardManager/Services/Theme/ThemeService.cs b/Tum4ik.JustClipboardManager/Services/Theme/ThemeService.cs index c655418c..e594702c 100644 --- a/Tum4ik.JustClipboardManager/Services/Theme/ThemeService.cs +++ b/Tum4ik.JustClipboardManager/Services/Theme/ThemeService.cs @@ -25,11 +25,11 @@ public ThemeService(ISettingsService settingsService, } - public ImmutableArray Themes { get; } = new[] - { - new ColorTheme("Light", SvgIconType.LightMode, "LightTheme.xaml"), - new ColorTheme("Dark", SvgIconType.DarkMode, "DarkTheme.xaml") - }.ToImmutableArray(); + public ImmutableArray Themes { get; } = + [ + new ColorTheme(ThemeType.Light, SvgIconType.LightMode, "LightTheme.xaml"), + new ColorTheme(ThemeType.Dark, SvgIconType.DarkMode, "DarkTheme.xaml") + ]; private ColorTheme? _selectedTheme; diff --git a/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj b/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj index 057266c2..2da23156 100644 --- a/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj +++ b/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj @@ -41,6 +41,7 @@ + @@ -203,7 +204,7 @@ - + diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialog.xaml b/Tum4ik.JustClipboardManager/Views/Main/MainDialog.xaml index a40eaf73..4d1359be 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialog.xaml +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialog.xaml @@ -32,7 +32,7 @@ IsChecked="{Binding IsAboutTabChecked}" CommandParameter="{x:Static const:ViewNames.AboutView}"/> - + diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml index 57154f22..c32d2e40 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml @@ -5,15 +5,15 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:controls="clr-namespace:Tum4ik.JustClipboardManager.Controls" - xmlns:theming="clr-namespace:Tum4ik.JustClipboardManager.PluginDevKit.Theming;assembly=Tum4ik.JustClipboardManager.PluginDevKit" - xmlns:debug="debug-mode" + xmlns:vm="clr-namespace:Tum4ik.JustClipboardManager.ViewModels.Main" mc:Ignorable="d" + d:DataContext="{d:DesignInstance {x:Type vm:MainDialogViewModel}}" Title="{Binding Title}" WindowStartupLocation="CenterScreen" Width="832" Height="632" Icon="/Resources/Icons/tray.ico" ResizeMode="NoResize" - Style="{StaticResource WindowBefore11Style}"> + Style="{StaticResource WindowBefore11Style}"> @@ -29,63 +29,7 @@ Effect="{TemplateBinding Effect}" SizeChanged="Border_SizeChanged"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -95,16 +39,6 @@ - - - - - - - - - - diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs index 55ac018f..32364c1e 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs @@ -124,30 +124,4 @@ private void BeforeRestore() { Margin = _initialMargin; } - - - private void MinimizeButton_Click(object sender, RoutedEventArgs e) - { - SystemCommands.MinimizeWindow(this); - } - - - private void MaximizeRestoreButton_Click(object sender, RoutedEventArgs e) - { - if (WindowState == WindowState.Normal) - { - SystemCommands.MaximizeWindow(this); - } - else if (WindowState == WindowState.Maximized) - { - SystemCommands.RestoreWindow(this); - } - } - - - private void CloseButton_Click(object sender, RoutedEventArgs e) - { - Result = new DialogResult(); - Close(); - } } diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml index dbe9665a..030a3d42 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml @@ -1,12 +1,26 @@ - - + WindowStartupLocation="CenterScreen" + WindowStyle="SingleBorderWindow"> + + + + + + + + + + + + diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs index abc29efe..f1ca66b2 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs @@ -1,6 +1,14 @@ using System.Windows.Interop; +using System.Windows.Media; +using Prism.Events; using Prism.Services.Dialogs; +using Tum4ik.JustClipboardManager.Events; using Tum4ik.JustClipboardManager.Services.Dialogs; +using Tum4ik.JustClipboardManager.Services.Theme; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.UI.WindowsAndMessaging; +using Windows.Win32.Graphics.Dwm; namespace Tum4ik.JustClipboardManager.Views.Main; @@ -9,15 +17,98 @@ namespace Tum4ik.JustClipboardManager.Views.Main; /// internal partial class MainDialogWindow : IDialogWindowExtended { - public MainDialogWindow() + private readonly IThemeService _themeService; + + public MainDialogWindow(IEventAggregator eventAggregator, + IThemeService themeService) { + _themeService = themeService; + eventAggregator.GetEvent().Subscribe(OnThemeChanged); InitializeComponent(); } + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + RemoveDefaultTitleBar(); + RemoveBackground(); + ApplyBackdrop(); // TODO: apply Mica backdrop from settings if allowed for OS + ApplyTheme(_themeService.SelectedTheme.ThemeType); + } + + private nint? _handle; public nint Handle => _handle ??= new WindowInteropHelper(this).EnsureHandle(); public IDialogResult? Result { get; set; } + + + private void OnThemeChanged() + { + ApplyTheme(_themeService.SelectedTheme.ThemeType); + } + + + private void RemoveDefaultTitleBar() + { + var hwnd = (HWND) Handle; + var windowStyleLong = PInvoke.GetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE); + windowStyleLong &= ~(int) WINDOW_STYLE.WS_SYSMENU; + if (nint.Size == 4) + { + _ = PInvoke.SetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE, windowStyleLong); + } + else + { + PInvoke.SetWindowLongPtr(hwnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE, windowStyleLong); + } + } + + + private void RemoveBackground() + { + SetCurrentValue(BackgroundProperty, Brushes.Transparent); + var windowSource = HwndSource.FromHwnd(Handle); + if (windowSource?.Handle != IntPtr.Zero && windowSource?.CompositionTarget != null) + { + windowSource.CompositionTarget.BackgroundColor = Colors.Transparent; + } + } + + + private unsafe void ApplyBackdrop() + { + if (Environment.OSVersion.Version >= new Version("10.0.22523")) + { + var backdropType = DWM_SYSTEMBACKDROP_TYPE.DWMSBT_MAINWINDOW; + PInvoke.DwmSetWindowAttribute( + (HWND) Handle, + DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, + &backdropType, + sizeof(DWM_SYSTEMBACKDROP_TYPE) + ); + } + else + { + var backdropPvAttribute = 1; + PInvoke.DwmSetWindowAttribute( + (HWND) Handle, + (DWMWINDOWATTRIBUTE) 1029, + &backdropPvAttribute, + sizeof(int) + ); + } + } + + + private unsafe void ApplyTheme(ThemeType themeType) + { + var dwAttribute = Environment.OSVersion.Version >= new Version("10.0.22523") + ? DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE + : (DWMWINDOWATTRIBUTE) 19; + var enableDark = themeType == ThemeType.Dark ? 0x1 : 0x0; + PInvoke.DwmSetWindowAttribute((HWND) Handle, dwAttribute, &enableDark, sizeof(int)); + } } From 5a9d394c55e0d4419c269643f4beb0673ae13f2b Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Sun, 18 Feb 2024 23:44:10 +0200 Subject: [PATCH 08/32] release notes --- ReleaseNotes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index bf1aff60..6526853d 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,5 @@ ### Features -* +* Possibility to use WinUI 3 Mica backdrop window style. ### Fixes * Fixed problem when remove clipboard listener operation fails. From 6fff6d7f6f42c5fa31b415d7d3260aa81fafb9ad Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Mon, 19 Feb 2024 20:57:03 +0200 Subject: [PATCH 09/32] Fixed border when window is maximized --- Tum4ik.JustClipboardManager/NativeMethods.txt | 1 + .../Main/MainDialogBefore11Window.xaml.cs | 2 +- .../Views/Main/MainDialogWindow.xaml | 15 +++--- .../Views/Main/MainDialogWindow.xaml.cs | 48 ++++++++++++++++++- 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/Tum4ik.JustClipboardManager/NativeMethods.txt b/Tum4ik.JustClipboardManager/NativeMethods.txt index 79e1c4d9..842fd751 100644 --- a/Tum4ik.JustClipboardManager/NativeMethods.txt +++ b/Tum4ik.JustClipboardManager/NativeMethods.txt @@ -18,6 +18,7 @@ AccessibleObjectFromWindow // Methods (user32.dll) --------------------------------------------------------------------------- GetCursorPos +GetSystemMetrics SetWindowPos ShowWindow GetForegroundWindow diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs index 32364c1e..48bc8f92 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs @@ -20,7 +20,7 @@ internal partial class MainDialogBefore11Window : IDialogWindowExtended private readonly ISHCoreDllService _shCoreDll; public MainDialogBefore11Window(IUser32DllService user32Dll, - ISHCoreDllService shCoreDll) + ISHCoreDllService shCoreDll) { _user32Dll = user32Dll; _shCoreDll = shCoreDll; diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml index 030a3d42..c97a5010 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml @@ -11,16 +11,19 @@ Title="{Binding Title}" MinWidth="800" MinHeight="600" WindowStartupLocation="CenterScreen" - WindowStyle="SingleBorderWindow"> + WindowStyle="SingleBorderWindow" + StateChanged="Window_StateChanged"> - + - - - - + + + + + + diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs index f1ca66b2..10d54f93 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs @@ -1,14 +1,18 @@ +using System.Windows; using System.Windows.Interop; using System.Windows.Media; using Prism.Events; using Prism.Services.Dialogs; using Tum4ik.JustClipboardManager.Events; using Tum4ik.JustClipboardManager.Services.Dialogs; +using Tum4ik.JustClipboardManager.Services.PInvokeWrappers; using Tum4ik.JustClipboardManager.Services.Theme; using Windows.Win32; using Windows.Win32.Foundation; -using Windows.Win32.UI.WindowsAndMessaging; using Windows.Win32.Graphics.Dwm; +using Windows.Win32.Graphics.Gdi; +using Windows.Win32.UI.HiDpi; +using Windows.Win32.UI.WindowsAndMessaging; namespace Tum4ik.JustClipboardManager.Views.Main; @@ -18,11 +22,17 @@ namespace Tum4ik.JustClipboardManager.Views.Main; internal partial class MainDialogWindow : IDialogWindowExtended { private readonly IThemeService _themeService; + private readonly IUser32DllService _user32Dll; + private readonly ISHCoreDllService _shCoreDll; public MainDialogWindow(IEventAggregator eventAggregator, - IThemeService themeService) + IThemeService themeService, + IUser32DllService user32Dll, + ISHCoreDllService shCoreDll) { _themeService = themeService; + _user32Dll = user32Dll; + _shCoreDll = shCoreDll; eventAggregator.GetEvent().Subscribe(OnThemeChanged); InitializeComponent(); } @@ -111,4 +121,38 @@ private unsafe void ApplyTheme(ThemeType themeType) var enableDark = themeType == ThemeType.Dark ? 0x1 : 0x0; PInvoke.DwmSetWindowAttribute((HWND) Handle, dwAttribute, &enableDark, sizeof(int)); } + + + private void Window_StateChanged(object sender, EventArgs e) + { + Padding = WindowState switch + { + WindowState.Maximized => GetPaddingForMaximizedWindow(), + _ => default + }; + } + + + private readonly Dictionary _monitorToMaximizedPadding = new(); + + private Thickness GetPaddingForMaximizedWindow() + { + var monitorHandle = _user32Dll.MonitorFromWindow(Handle, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST); + if (_monitorToMaximizedPadding.TryGetValue(monitorHandle, out var padding)) + { + return padding; + } + + if (_shCoreDll.GetDpiForMonitor(monitorHandle, MONITOR_DPI_TYPE.MDT_EFFECTIVE_DPI, out var dpiX, out var dpiY)) + { + var paddedBorder = (double) PInvoke.GetSystemMetrics(SYSTEM_METRICS_INDEX.SM_CXPADDEDBORDER); + var leftRight = SystemParameters.ResizeFrameVerticalBorderWidth + paddedBorder / (dpiX / 96d); + var topBottom = SystemParameters.ResizeFrameHorizontalBorderHeight + paddedBorder / (dpiY / 96d); + var thickness = new Thickness(leftRight, topBottom, leftRight, topBottom); + _monitorToMaximizedPadding[monitorHandle] = thickness; + return thickness; + } + + return default; + } } From aa522684cf8688ada7f461ba66745bf1bc5f4f60 Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Tue, 20 Feb 2024 21:34:24 +0200 Subject: [PATCH 10/32] window helper --- .../Controls/InfoBar.xaml | 3 +- .../Controls/WinUiComboBox.xaml | 6 +- .../Helpers/WindowHelper.cs | 60 +++++++++++++++ .../Styles/GeneralStyles.xaml | 1 + .../Themes/LightTheme.xaml | 2 +- .../Views/Main/MainDialog.xaml | 2 +- .../Views/Main/MainDialogWindow.xaml.cs | 75 ++----------------- 7 files changed, 74 insertions(+), 75 deletions(-) create mode 100644 Tum4ik.JustClipboardManager/Helpers/WindowHelper.cs diff --git a/Tum4ik.JustClipboardManager/Controls/InfoBar.xaml b/Tum4ik.JustClipboardManager/Controls/InfoBar.xaml index c403638f..cf3c177f 100644 --- a/Tum4ik.JustClipboardManager/Controls/InfoBar.xaml +++ b/Tum4ik.JustClipboardManager/Controls/InfoBar.xaml @@ -7,7 +7,8 @@ xmlns:theming="clr-namespace:Tum4ik.JustClipboardManager.PluginDevKit.Theming;assembly=Tum4ik.JustClipboardManager.PluginDevKit" xmlns:converters="clr-namespace:Tum4ik.JustClipboardManager.Converters" mc:Ignorable="d" - Opacity="0"> + Opacity="0" + Focusable="False"> diff --git a/Tum4ik.JustClipboardManager/Controls/WinUiComboBox.xaml b/Tum4ik.JustClipboardManager/Controls/WinUiComboBox.xaml index 99475b52..4ac49d58 100644 --- a/Tum4ik.JustClipboardManager/Controls/WinUiComboBox.xaml +++ b/Tum4ik.JustClipboardManager/Controls/WinUiComboBox.xaml @@ -8,13 +8,15 @@ mc:Ignorable="d" x:Name="this" Height="32" - MinWidth="128"> + MinWidth="128" + FocusVisualStyle="{x:Null}"> + Cursor="Hand" + Focusable="False"> = new Version("10.0.22523")) + { + var backdropType = DWM_SYSTEMBACKDROP_TYPE.DWMSBT_MAINWINDOW; + PInvoke.DwmSetWindowAttribute( + (HWND) windowHandle, + DWMWINDOWATTRIBUTE.DWMWA_SYSTEMBACKDROP_TYPE, + &backdropType, + sizeof(DWM_SYSTEMBACKDROP_TYPE) + ); + } + else + { + var backdropPvAttribute = 1; + PInvoke.DwmSetWindowAttribute( + (HWND) windowHandle, + (DWMWINDOWATTRIBUTE) 1029, + &backdropPvAttribute, + sizeof(int) + ); + } + } + + + public static unsafe void ApplyTheme(nint windowHandle, ThemeType themeType) + { + var dwAttribute = Environment.OSVersion.Version >= new Version("10.0.22523") + ? DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE + : (DWMWINDOWATTRIBUTE) 19; + var enableDark = themeType == ThemeType.Dark ? 0x1 : 0x0; + PInvoke.DwmSetWindowAttribute((HWND) windowHandle, dwAttribute, &enableDark, sizeof(int)); + } +} diff --git a/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml b/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml index 4fac707b..4fd79eb3 100644 --- a/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml +++ b/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml @@ -72,6 +72,7 @@ + + + + + + + + + + + diff --git a/Tum4ik.JustClipboardManager/Controls/NumberBox.xaml.cs b/Tum4ik.JustClipboardManager/Controls/NumberBox.xaml.cs index 4d0c7cef..157b194e 100644 --- a/Tum4ik.JustClipboardManager/Controls/NumberBox.xaml.cs +++ b/Tum4ik.JustClipboardManager/Controls/NumberBox.xaml.cs @@ -1,4 +1,6 @@ +using System.Globalization; using System.Windows; +using System.Windows.Controls.Primitives; using System.Windows.Input; namespace Tum4ik.JustClipboardManager.Controls; @@ -11,6 +13,21 @@ public partial class NumberBox public NumberBox() { InitializeComponent(); + } + + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + var window = Window.GetWindow(this); + var popup = (Popup) GetTemplateChild("_spinnerPopup"); + window.LocationChanged += (s, e) => + { + // to move spinner popup together with the window + var o = popup.HorizontalOffset; + popup.HorizontalOffset++; + popup.HorizontalOffset = o; + }; } @@ -34,8 +51,21 @@ public int MaxValue } + public static readonly DependencyProperty StepProperty = DependencyProperty.Register( + nameof(Step), typeof(int), typeof(NumberBox), new(1) + ); + public int Step + { + get => (int) GetValue(StepProperty); + set => SetValue(StepProperty, value); + } + + + private string? _valueBeforeClear; + private void ClearButton_Click(object sender, RoutedEventArgs e) { + _valueBeforeClear = Text; Text = string.Empty; } @@ -66,4 +96,39 @@ private void TextBox_GotFocus(object sender, RoutedEventArgs e) { SelectAll(); } + + + private void TextBox_LostFocus(object sender, RoutedEventArgs e) + { + if (string.IsNullOrEmpty(Text)) + { + Text = _valueBeforeClear; + } + } + + + private void IncreaseButton_Click(object sender, RoutedEventArgs e) + { + DoStep(Step); + } + + + private void DecreaseButton_Click(object sender, RoutedEventArgs e) + { + DoStep(-Step); + } + + + private void DoStep(int step) + { + if (int.TryParse(Text, out var number)) + { + var result = number + step; + if (result >= MinValue && result <= MaxValue) + { + Text = result.ToString(CultureInfo.InvariantCulture); + SelectAll(); + } + } + } } diff --git a/Tum4ik.JustClipboardManager/Controls/WinUiButton.xaml b/Tum4ik.JustClipboardManager/Controls/WinUiButton.xaml index a5ef77a4..abd5047a 100644 --- a/Tum4ik.JustClipboardManager/Controls/WinUiButton.xaml +++ b/Tum4ik.JustClipboardManager/Controls/WinUiButton.xaml @@ -1,163 +1,161 @@ diff --git a/Tum4ik.JustClipboardManager/Controls/WinUiButton.xaml.cs b/Tum4ik.JustClipboardManager/Controls/WinUiButton.xaml.cs index 5b007fae..b82c3cfc 100644 --- a/Tum4ik.JustClipboardManager/Controls/WinUiButton.xaml.cs +++ b/Tum4ik.JustClipboardManager/Controls/WinUiButton.xaml.cs @@ -9,6 +9,12 @@ namespace Tum4ik.JustClipboardManager.Controls; /// public partial class WinUiButton { + static WinUiButton() + { + HeightProperty.OverrideMetadata(typeof(WinUiButton), new FrameworkPropertyMetadata(32d)); + } + + public WinUiButton() { InitializeComponent(); diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/SvgIconType.cs b/Tum4ik.JustClipboardManager/Resources/Icons/SvgIconType.cs index ed110d46..d286e79b 100644 --- a/Tum4ik.JustClipboardManager/Resources/Icons/SvgIconType.cs +++ b/Tum4ik.JustClipboardManager/Resources/Icons/SvgIconType.cs @@ -13,6 +13,8 @@ public enum SvgIconType [SvgIconResource("check-circle")] CheckCircle, [SvgIconResource("check-circle-filled")] CheckCircleFilled, [SvgIconResource("chevron")] Chevron, + [SvgIconResource("chevron-down")] ChevronDown, + [SvgIconResource("chevron-up")] ChevronUp, [SvgIconResource("chrome-close")] ChromeClose, [SvgIconResource("chrome-maximize")] ChromeMaximize, [SvgIconResource("chrome-minimize")] ChromeMinimize, diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/chevron-down.svg b/Tum4ik.JustClipboardManager/Resources/Icons/chevron-down.svg new file mode 100644 index 00000000..ba839723 --- /dev/null +++ b/Tum4ik.JustClipboardManager/Resources/Icons/chevron-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/chevron-up.svg b/Tum4ik.JustClipboardManager/Resources/Icons/chevron-up.svg new file mode 100644 index 00000000..b3cb4122 --- /dev/null +++ b/Tum4ik.JustClipboardManager/Resources/Icons/chevron-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj b/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj index 2da23156..a3bac244 100644 --- a/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj +++ b/Tum4ik.JustClipboardManager/Tum4ik.JustClipboardManager.csproj @@ -55,6 +55,8 @@ + + @@ -137,6 +139,8 @@ + + From b85247b0b0ce3751c3cce49c3fd9c70919c4e0b3 Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Sat, 24 Feb 2024 14:12:06 +0200 Subject: [PATCH 12/32] Improved titlebar behavior --- .../Controls/WindowTitleBar.xaml | 2 +- .../Views/Main/MainDialogBefore11Window.xaml | 4 +++- .../Main/MainDialogBefore11Window.xaml.cs | 19 +++++++++++++++++++ .../Views/Main/MainDialogWindow.xaml | 13 ++++++++++--- .../Views/Main/MainDialogWindow.xaml.cs | 17 +++++++++++++++++ 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml b/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml index 1e21dc90..89f355cc 100644 --- a/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml +++ b/Tum4ik.JustClipboardManager/Controls/WindowTitleBar.xaml @@ -57,7 +57,7 @@ Icon="ChromeMaximize" Click="MaximizeRestoreButton_Click"/> + Style="{StaticResource WindowBefore11Style}" + MouseDown="Window_MouseDown" + Deactivated="Window_Deactivated"> diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs index 48bc8f92..d2d44866 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogBefore11Window.xaml.cs @@ -8,6 +8,7 @@ using static Windows.Win32.PInvoke; using System.Windows.Controls; using System.Windows.Media; +using System.Windows.Input; namespace Tum4ik.JustClipboardManager.Views.Main; @@ -124,4 +125,22 @@ private void BeforeRestore() { Margin = _initialMargin; } + + + private void Window_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + ResetFocus(); + } + + + private void Window_Deactivated(object sender, EventArgs e) + { + ResetFocus(); + } + + + private void ResetFocus() + { + MoveFocus(new(FocusNavigationDirection.Last)); + } } diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml index c97a5010..1a6658f2 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml @@ -12,18 +12,25 @@ MinWidth="800" MinHeight="600" WindowStartupLocation="CenterScreen" WindowStyle="SingleBorderWindow" - StateChanged="Window_StateChanged"> + StateChanged="Window_StateChanged" + MouseDown="Window_MouseDown" + Deactivated="Window_Deactivated"> - + - + + + + + + diff --git a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs index d91b2eaa..6e88e914 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs +++ b/Tum4ik.JustClipboardManager/Views/Main/MainDialogWindow.xaml.cs @@ -1,4 +1,5 @@ using System.Windows; +using System.Windows.Input; using System.Windows.Interop; using Prism.Events; using Prism.Services.Dialogs; @@ -90,4 +91,20 @@ private Thickness GetPaddingForMaximizedWindow() return default; } + + + private void Window_MouseDown(object sender, MouseButtonEventArgs e) + { + ResetFocus(); + } + + private void Window_Deactivated(object sender, EventArgs e) + { + ResetFocus(); + } + + private void ResetFocus() + { + MoveFocus(new(FocusNavigationDirection.Last)); + } } From 92e9bfbcddc3be5560a317163eaae2ecacf15c6d Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Sat, 24 Feb 2024 23:22:07 +0200 Subject: [PATCH 13/32] Toggle switch improvement --- .../Controls/ToggleSwitch.xaml | 381 +++++++++--------- 1 file changed, 188 insertions(+), 193 deletions(-) diff --git a/Tum4ik.JustClipboardManager/Controls/ToggleSwitch.xaml b/Tum4ik.JustClipboardManager/Controls/ToggleSwitch.xaml index 0a8b2e3e..ebe366f6 100644 --- a/Tum4ik.JustClipboardManager/Controls/ToggleSwitch.xaml +++ b/Tum4ik.JustClipboardManager/Controls/ToggleSwitch.xaml @@ -1,201 +1,196 @@ - - - - 0:0:0.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + 0:0:0.15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7304090656d9cc67936cb3acdb2a1529e23af3ea Mon Sep 17 00:00:00 2001 From: Yevheniy Tymchishin Date: Mon, 26 Feb 2024 00:30:27 +0200 Subject: [PATCH 14/32] App bar buttons instead tab buttons. --- .../Controls/AppBarNavigationButton.xaml | 71 ++++++++++++++ .../Controls/AppBarNavigationButton.xaml.cs | 44 +++++++++ .../Styles/GeneralStyles.xaml | 33 ++++--- .../Tum4ik.JustClipboardManager.csproj | 1 + .../Views/Main/AboutView.xaml | 2 +- .../Views/Main/MainDialog.xaml | 92 +++++++++++-------- .../Views/Main/Plugins/PluginsView.xaml | 7 +- .../Views/Main/Settings/SettingsView.xaml | 7 +- 8 files changed, 195 insertions(+), 62 deletions(-) create mode 100644 Tum4ik.JustClipboardManager/Controls/AppBarNavigationButton.xaml create mode 100644 Tum4ik.JustClipboardManager/Controls/AppBarNavigationButton.xaml.cs diff --git a/Tum4ik.JustClipboardManager/Controls/AppBarNavigationButton.xaml b/Tum4ik.JustClipboardManager/Controls/AppBarNavigationButton.xaml new file mode 100644 index 00000000..c8d82611 --- /dev/null +++ b/Tum4ik.JustClipboardManager/Controls/AppBarNavigationButton.xaml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tum4ik.JustClipboardManager/Controls/AppBarNavigationButton.xaml.cs b/Tum4ik.JustClipboardManager/Controls/AppBarNavigationButton.xaml.cs new file mode 100644 index 00000000..086cb14c --- /dev/null +++ b/Tum4ik.JustClipboardManager/Controls/AppBarNavigationButton.xaml.cs @@ -0,0 +1,44 @@ +using System.Windows; +using Tum4ik.JustClipboardManager.Resources.Icons; + +namespace Tum4ik.JustClipboardManager.Controls; + +/// +/// Interaction logic for AppBarNavigationButton.xaml +/// +public partial class AppBarNavigationButton +{ + public AppBarNavigationButton() + { + InitializeComponent(); + } + + + public static readonly DependencyProperty IconProperty = DependencyProperty.Register( + nameof(Icon), typeof(SvgIconType?), typeof(AppBarNavigationButton) + ); + public SvgIconType? Icon + { + get => (SvgIconType?) GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + + public static readonly DependencyProperty TextProperty = DependencyProperty.Register( + nameof(Text), typeof(string), typeof(AppBarNavigationButton) + ); + public string Text + { + get => (string) GetValue(TextProperty); + set => SetValue(TextProperty, value); + } + + + private void RadioButton_Loaded(object sender, RoutedEventArgs e) + { + if (IsChecked is true && Command.CanExecute(CommandParameter)) + { + Command.Execute(CommandParameter); + } + } +} diff --git a/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml b/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml index 4fd79eb3..314012e2 100644 --- a/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml +++ b/Tum4ik.JustClipboardManager/Styles/GeneralStyles.xaml @@ -1,7 +1,7 @@ @@ -13,7 +13,7 @@ - - + + - - - - - - - - - - - - + mc:Ignorable="d" + d:DataContext="{d:DesignInstance Type=vm:MainDialogViewModel}"> + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tum4ik.JustClipboardManager/Views/Main/Plugins/PluginsView.xaml b/Tum4ik.JustClipboardManager/Views/Main/Plugins/PluginsView.xaml index bcef7ded..bec06599 100644 --- a/Tum4ik.JustClipboardManager/Views/Main/Plugins/PluginsView.xaml +++ b/Tum4ik.JustClipboardManager/Views/Main/Plugins/PluginsView.xaml @@ -10,7 +10,7 @@ mc:Ignorable="d" xmlns:vm="clr-namespace:Tum4ik.JustClipboardManager.ViewModels.Main.Plugins" d:DataContext="{d:DesignInstance Type=vm:PluginsViewModel}"> - + + + diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/SvgIconType.cs b/Tum4ik.JustClipboardManager/Resources/Icons/SvgIconType.cs index d286e79b..9831bcb7 100644 --- a/Tum4ik.JustClipboardManager/Resources/Icons/SvgIconType.cs +++ b/Tum4ik.JustClipboardManager/Resources/Icons/SvgIconType.cs @@ -3,6 +3,8 @@ namespace Tum4ik.JustClipboardManager.Resources.Icons; public enum SvgIconType { + [SvgIconResource("auto-delete")] AutoDelete, + [SvgIconResource("autostart-app")] AutostartApp, [SvgIconResource("bug-report")] BugReport, [SvgIconResource("cancel-circle-filled")] CancelCircleFilled, [SvgIconResource("caret-down")] CaretDown, @@ -33,19 +35,23 @@ public enum SvgIconType [SvgIconResource("file")] File, [SvgIconResource("files")] Files, [SvgIconResource("format-list-numbered-rtl")] FormatListNumberedRtl, + [SvgIconResource("frame")] Frame, [SvgIconResource("info")] Info, [SvgIconResource("info-filled")] InfoFilled, [SvgIconResource("keyboard")] Keyboard, + [SvgIconResource("language")] Language, [SvgIconResource("lightbulb")] Lightbulb, [SvgIconResource("light-mode")] LightMode, [SvgIconResource("live-help")] LiveHelp, [SvgIconResource("manage-search")] ManageSearch, + [SvgIconResource("palette")] Palette, [SvgIconResource("paste-window")] PasteWindow, [SvgIconResource("scroll-left-arrow")] ScrollLeftArrow, [SvgIconResource("scroll-right-arrow")] ScrollRightArrow, [SvgIconResource("search")] Search, [SvgIconResource("settings")] Settings, [SvgIconResource("spinner")] Spinner, + [SvgIconResource("tune")] Tune, [SvgIconResource("ukraine")] Ukraine, [SvgIconResource("usa")] USA, [SvgIconResource("warning-circle-filled")] WarningCircleFilled diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/auto-delete.svg b/Tum4ik.JustClipboardManager/Resources/Icons/auto-delete.svg new file mode 100644 index 00000000..da8aff9d --- /dev/null +++ b/Tum4ik.JustClipboardManager/Resources/Icons/auto-delete.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/autostart-app.svg b/Tum4ik.JustClipboardManager/Resources/Icons/autostart-app.svg new file mode 100644 index 00000000..9ebc03af --- /dev/null +++ b/Tum4ik.JustClipboardManager/Resources/Icons/autostart-app.svg @@ -0,0 +1,3 @@ + + + diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/frame.svg b/Tum4ik.JustClipboardManager/Resources/Icons/frame.svg new file mode 100644 index 00000000..b5bbc110 --- /dev/null +++ b/Tum4ik.JustClipboardManager/Resources/Icons/frame.svg @@ -0,0 +1,3 @@ + + + diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/language.svg b/Tum4ik.JustClipboardManager/Resources/Icons/language.svg new file mode 100644 index 00000000..15f939d3 --- /dev/null +++ b/Tum4ik.JustClipboardManager/Resources/Icons/language.svg @@ -0,0 +1,3 @@ + + + diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/palette.svg b/Tum4ik.JustClipboardManager/Resources/Icons/palette.svg new file mode 100644 index 00000000..b8b0bcac --- /dev/null +++ b/Tum4ik.JustClipboardManager/Resources/Icons/palette.svg @@ -0,0 +1,3 @@ + + + diff --git a/Tum4ik.JustClipboardManager/Resources/Icons/tune.svg b/Tum4ik.JustClipboardManager/Resources/Icons/tune.svg new file mode 100644 index 00000000..e9951535 --- /dev/null +++ b/Tum4ik.JustClipboardManager/Resources/Icons/tune.svg @@ -0,0 +1,3 @@ + + + diff --git a/Tum4ik.JustClipboardManager/Resources/Translations/Translation.Designer.cs b/Tum4ik.JustClipboardManager/Resources/Translations/Translation.Designer.cs index 0f37ff36..80f622f2 100644 --- a/Tum4ik.JustClipboardManager/Resources/Translations/Translation.Designer.cs +++ b/Tum4ik.JustClipboardManager/Resources/Translations/Translation.Designer.cs @@ -96,6 +96,15 @@ internal static string AutoStartApplication { } } + /// + /// Looks up a localized string similar to Starts automatically when you sign in. + /// + internal static string AutoStartApplication_Description { + get { + return ResourceManager.GetString("AutoStartApplication_Description", resourceCulture); + } + } + /// /// Looks up a localized string similar to Looks like the corresponding file with plugins info is corrupted or has wrong format. Please try again later.. /// @@ -240,6 +249,15 @@ internal static string DeleteClipsOlderThan { } } + /// + /// Looks up a localized string similar to Automatically deletes clips that are older than a specified number of days/months/years. + /// + internal static string DeleteClipsOlderThan_Description { + get { + return ResourceManager.GetString("DeleteClipsOlderThan_Description", resourceCulture); + } + } + /// /// Looks up a localized string similar to Development. /// @@ -375,6 +393,15 @@ internal static string Language { } } + /// + /// Looks up a localized string similar to The language for the user interface. + /// + internal static string Language_Description { + get { + return ResourceManager.GetString("Language_Description", resourceCulture); + } + } + /// /// Looks up a localized string similar to Leave a feedback. /// @@ -618,6 +645,15 @@ internal static string Theme { } } + /// + /// Looks up a localized string similar to The visual appearance of the user interface. + /// + internal static string Theme_Description { + get { + return ResourceManager.GetString("Theme_Description", resourceCulture); + } + } + /// /// Looks up a localized string similar to Top left. /// diff --git a/Tum4ik.JustClipboardManager/Resources/Translations/Translation.resx b/Tum4ik.JustClipboardManager/Resources/Translations/Translation.resx index fcebc54a..acb34845 100644 --- a/Tum4ik.JustClipboardManager/Resources/Translations/Translation.resx +++ b/Tum4ik.JustClipboardManager/Resources/Translations/Translation.resx @@ -1,4 +1,4 @@ - +