From 579619952da5f6c56d9c1fac3f50fa6f8edce1cd Mon Sep 17 00:00:00 2001 From: Seraphima Zykova Date: Fri, 23 Aug 2024 09:28:13 +0200 Subject: [PATCH] [New Module] Workspaces (#34324) * spell checker * Adding OOBE Projects page * changed the default hotkey * module interface * rename projects editor * bug report tool * installer * gpo * exit event constant * extend search for projects by search over the containing apps' names * [Projects] fix grammatical issue #43 (1 app - many apps) * [Projects] Editor: Main page: fix layout if there are many apps, launch button not disappearing on the right side * dsc * github * pipeline * guid prefix * [Projects] fixing general settings gpo handling in runner + minor changes * arm build fix * Do not allow saving project if name or applist is empty. Also minor UI changes * version * editor version * spellcheck * editor dll signing * update projects names to filter them out * shortcut saving fix * [Projects] Editor: brining the highlighted app's icon into the foreground. + minor UI fixes * spell checker * spellcheck * [Projects] re-implementing icon size calculation to have similar sized icons for every app. * [projects] Adding info message for cases: there are no projects or no results for the search * [Projects] Adding Edit button to the popup. + minor changes * [Projects] Making popup having rounded corners * changed "no projects" text color and position * remove opening the first proj * fix placing windows of the same app in the project * [Projects] bringing back the breadcrumb on the editor page. Make it clickable. * [Projects] optimizing click handlers * [Projects] Removing not selected apps on save * moved on thread executor to common * moved display utils * added convert rect * unsigned monitor number * set awareness * app placement * [Projects] Re-implementing preview drawing - one common image * [Projects] fix boundary calculation, use DPI aware values * fix launching with command line args * Fix ARM64 CI build * launch packaged apps using names when possible * spell-check * update packaged apps path * projects editor single instance * [Projects] Add Select all checkbox, Delete selected button * Add Checkbox for per monitor selection * modifying highlight in preview * spell checker * logs * exclude help windows https://github.com/JaneaSystems/PowerToys-DevProjects/issues/49 * Add intermediate step to project creation * minor bugfix * mutex fix * modifying highlight for minimized apps * Fixing bug: re-draw the preview on app deletion in the editor * Adding helper class for getting the right bounds for screens * spell checker * spell checker * Minor fixes in the capture dialog * get dpi unaware screen bounds * refactoring: added utils * changed window filter https://github.com/JaneaSystems/PowerToys-DevProjects/issues/2 * clean up * refactoring * projects common lib * localizable default project prefix * launcher resources * clean up * change snapshot project saving https://github.com/JaneaSystems/PowerToys-DevProjects/issues/14 * changed project data https://github.com/JaneaSystems/PowerToys-DevProjects/issues/14 * changed project creation save-cancel handles https://github.com/JaneaSystems/PowerToys-DevProjects/issues/14 * spell-check * Remove checkboxes, delete feature * remove unused from the project * get command line args in the snapshot * minimized settings snap fix * set window property after launching * FZ: ignore projects launched windows * Implementing major new features: remove button, position manipulation, arguments, admin, minimized, maximized * modifying colors * launcher project filters * clean up * Hide Admin checkbox * hide WIP * spell-check * Revert "Hide Admin checkbox" This reverts commit 3036df9d7fe48de6418b0ebeff6422d535cb25e2. * get app elevated property * Implementing Launch and Edit feature * fixing: update of listed projects on the main page after hitting save in editor * Fix for packaged app's icons * fixing scroll speed issue * change scroll speed to 15 * launch elevated apps * minor fixes * minor fix * enhancing shortcut handling * can-launch-elevated check * projects module interface telemetry * Implementing store of setting "order by". * minor string correction * moved projects data parsing * telemetry * add move apps checkbox * notification about elevated apps * restart unelevated * move existing windows * keep opened windows at the same positions * handle powertoys settings * use common theme * fix corrupted data: project id and monitor id * project launch on "launch and edit" * clean up * show screen numbers instead of monitor names * launcher error messages * fix default shortcut * Adding launch button to projects settings, dashboard and flyout * Adding new app which is launched when launching a project. It shows the status of the launch process * spell checker * Renaming Projects to App Layouts. Replacing only string values, not the variable names * Re-ordering modules after Renaming Projects + spell checker * setting window size according to the screen (making it bigger) * commenting out feature "move apps if exist" * spell checker * Add ProjectsLauncherUI to signing * opening apps in minimized state which are placed on a monitor, which is not found at the moment of launching * consistent file name * removed unused sln * telemetry: create event * WindowPosition comparison * telemetry: edit event * fix muted Launch as admin checkbox * telemetry: delete event * updated Edit telemetry event * added invoke point to launcher args * added utils * parse invoke point * replaced tuple with struct * telemetry: launch event * MonitorRect comparison * resources * rename: folders * remove outdated * rename: window property * rename: files and folders * rename: common data structures * rename: telemetry namespace * rename: workspaces data * rename ProjectsLib -> WorkspacesLib * rename: gpo * rename: settings * rename: launcher UI * rename: other * rename: pt run * rename: fz * rename: module interface * rename: icon * rename: snapshot tool * rename: editor * rename: common files * rename: launcher * rename: editor resources * fix empty file crash * rename: json * rename: module interface * fix custom actions build * added launch editor event constant * xaml formatting * Add missing method defition to interop::Constants idl Remove Any CPU config * more .sln cleanup * [Run][PowerToys] Fix Workspaces utility (#34336) polished workspaces utility * build fix - align CppWinRT version * address PR comment: fix isdigit * indentation * address PR comment: rename function * address PR comment: changed version for workspaces and revision * added supported version definition * addressPR comment: use BringToForeground * address PR comments: updated projects * address PR comment: uncomment gpo in settings * address PR comment: rename oobe view * update OOBE image with current module name * moved AppUtils * launching with AppUserModel.ID * fixed module order in settings * fix xaml formatting * [Workspaces] Close launcher if there are failed launches. Plus adding new spinner gif * fix topmost LauncherUI * clean up * UI closing * BugReportTool - omit cmd arg data * Delete icon on workspace removal * Adding cancellation to launcher UI. * reordered launching * fix terminating UI * Removing old shortcut on workspace renaming * Sentence case labels * get process path without waiting * comment out unused * remove unused argument * logs * New icon * fix launch and edit for the new project * fix launch and edit: save new project * Update exe icons --------- Co-authored-by: donlaci Co-authored-by: Jaime Bernardo Co-authored-by: Stefan Markovic Co-authored-by: Davide Giacometti Co-authored-by: Niels Laute --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + .github/ISSUE_TEMPLATE/translation_issue.yml | 1 + .github/actions/spell-check/expect.txt | 16 + .pipelines/ESRPSigning_core.json | 8 + PowerToys.sln | 119 ++- doc/images/icons/Workspaces.png | Bin 0 -> 25026 bytes installer/PowerToysSetup/Common.wxi | 1 + installer/PowerToysSetup/Resources.wxs | 9 + .../CustomAction.cpp | 6 +- src/common/Common.UI/SettingsDeepLink.cs | 3 + src/common/Display/Display.vcxproj | 5 +- src/common/Display/DisplayUtils.cpp | 143 ++++ src/common/Display/DisplayUtils.h | 21 + src/common/Display/MonitorEnumerator.h | 35 + src/common/Display/dpi_aware.cpp | 20 + src/common/Display/dpi_aware.h | 1 + src/common/GPOWrapper/GPOWrapper.cpp | 6 +- src/common/GPOWrapper/GPOWrapper.h | 3 +- src/common/GPOWrapper/GPOWrapper.idl | 1 + src/common/GPOWrapperProjection/GPOWrapper.cs | 5 + src/common/ManagedCommon/ModuleType.cs | 1 + src/common/interop/Constants.cpp | 4 + src/common/interop/Constants.h | 1 + src/common/interop/Constants.idl | 1 + src/common/interop/shared_constants.h | 4 + src/common/logger/logger_settings.h | 4 + src/common/utils/OnThreadExecutor.h | 72 ++ src/common/utils/gpo.h | 6 + .../examples/disableAllModules.dsc.yaml | 2 + .../examples/enableAllModules.dsc.yaml | 2 + src/gpo/assets/PowerToys.admx | 15 +- src/gpo/assets/en-US/PowerToys.adml | 9 + src/modules/Workspaces/Assets/Workspaces.ico | Bin 0 -> 467385 bytes .../WorkspacesWindowPropertyUtils.h | 16 + .../Workspaces/WorkspacesEditor/App.config | 9 + .../Workspaces/WorkspacesEditor/App.xaml | 20 + .../Workspaces/WorkspacesEditor/App.xaml.cs | 120 +++ .../Controls/ResetIsEnabled.cs | 22 + .../BooleanToInvertedVisibilityConverter.cs | 29 + .../WorkspacesEditor/Data/InvokePoint.cs | 14 + .../WorkspacesEditor/Data/ProjectData.cs | 96 +++ .../WorkspacesEditor/Data/TempProjectData.cs | 27 + .../WorkspacesEditor/Data/WorkspacesData.cs | 36 + .../Data/WorkspacesEditorData`1.cs | 36 + .../WorkspacesEditor/HeadingTextBlock.cs | 31 + .../Workspaces/WorkspacesEditor/MainPage.xaml | 322 ++++++++ .../WorkspacesEditor/MainPage.xaml.cs | 63 ++ .../WorkspacesEditor/MainWindow.xaml | 29 + .../WorkspacesEditor/MainWindow.xaml.cs | 71 ++ .../Models/AppListDataTemplateSelector.cs | 31 + .../WorkspacesEditor/Models/Application.cs | 474 ++++++++++++ .../WorkspacesEditor/Models/Monitor.cs | 33 + .../Models/MonitorHeaderRow.cs | 13 + .../WorkspacesEditor/Models/MonitorSetup.cs | 33 + .../WorkspacesEditor/Models/Project.cs | 376 ++++++++++ .../WorkspacesEditor/OverlayWindow.xaml | 16 + .../WorkspacesEditor/OverlayWindow.xaml.cs | 19 + .../Properties/Resources.Designer.cs | 693 ++++++++++++++++++ .../Properties/Resources.resx | 333 +++++++++ .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + .../WorkspacesEditor/SnapshotWindow.xaml | 59 ++ .../WorkspacesEditor/SnapshotWindow.xaml.cs | 40 + .../WorkspacesEditor/Styles/ButtonStyles.xaml | 55 ++ .../WorkspacesEditor/Telemetry/CreateEvent.cs | 39 + .../WorkspacesEditor/Telemetry/DeleteEvent.cs | 23 + .../WorkspacesEditor/Telemetry/EditEvent.cs | 48 ++ .../WorkspacesEditor/Themes/Dark.xaml | 26 + .../Themes/HighContrast1.xaml | 26 + .../Themes/HighContrast2.xaml | 26 + .../Themes/HighContrastBlack.xaml | 26 + .../Themes/HighContrastWhite.xaml | 26 + .../WorkspacesEditor/Themes/Light.xaml | 26 + .../Utils/DashCaseNamingPolicy.cs | 18 + .../WorkspacesEditor/Utils/DrawHelper.cs | 358 +++++++++ .../WorkspacesEditor/Utils/FolderUtils.cs | 28 + .../WorkspacesEditor/Utils/IOUtils.cs | 54 ++ .../WorkspacesEditor/Utils/MonitorHelper.cs | 50 ++ .../WorkspacesEditor/Utils/NativeMethods.cs | 58 ++ .../WorkspacesEditor/Utils/ParsingResult.cs | 22 + .../WorkspacesEditor/Utils/Settings.cs | 27 + .../WorkspacesEditor/Utils/StringUtils.cs | 22 + .../Utils/WorkspacesEditorIO.cs | 182 +++++ .../WorkspacesEditor/Utils/WorkspacesIcon.cs | 153 ++++ .../ViewModels/MainViewModel.cs | 598 +++++++++++++++ .../WorkspacesEditor/WorkspacesEditor.csproj | 106 +++ .../WorkspacesEditorPage.xaml | 420 +++++++++++ .../WorkspacesEditorPage.xaml.cs | 221 ++++++ .../Workspaces/WorkspacesEditor/app.manifest | 74 ++ .../WorkspacesEditor/images/DefaultIcon.ico | Bin 0 -> 112730 bytes .../WorkspacesEditor/images/Workspaces.ico | Bin 0 -> 467385 bytes .../WorkspacesLauncher/AppLauncher.cpp | 479 ++++++++++++ .../WorkspacesLauncher/AppLauncher.h | 7 + .../WorkspacesLauncher/LauncherUIHelper.cpp | 78 ++ .../WorkspacesLauncher/LauncherUIHelper.h | 16 + .../WorkspacesLauncher/LaunchingApp.h | 13 + .../WorkspacesLauncher/PropertySheet.props | 16 + .../WorkspacesLauncher/RegistryUtils.cpp | 84 +++ .../WorkspacesLauncher/RegistryUtils.h | 6 + .../WorkspacesLauncher/Resource.resx | 139 ++++ .../WorkspacesLauncher.vcxproj | 183 +++++ .../WorkspacesLauncher.vcxproj.filters | 76 ++ .../WorkspacesLauncherResource.base.rc | 52 ++ .../Workspaces/WorkspacesLauncher/main.cpp | 244 ++++++ .../WorkspacesLauncher/packages.config | 5 + .../Workspaces/WorkspacesLauncher/pch.cpp | 1 + .../Workspaces/WorkspacesLauncher/pch.h | 6 + .../WorkspacesLauncher/resource.base.h | 13 + .../Workspaces/WorkspacesLauncher/utils.h | 20 + .../WorkspacesLauncherUI/App.config | 9 + .../Workspaces/WorkspacesLauncherUI/App.xaml | 20 + .../WorkspacesLauncherUI/App.xaml.cs | 113 +++ .../BooleanToInvertedVisibilityConverter.cs | 29 + .../Data/AppLaunchData.cs | 38 + .../Data/AppLaunchInfoData.cs | 30 + .../Data/AppLaunchInfosData.cs | 22 + .../Data/WorkspacesEditorData`1.cs | 36 + .../WorkspacesLauncherUI/HeadingTextBlock.cs | 31 + .../Models/AppLaunching.cs | 209 ++++++ .../Properties/Resources.Designer.cs | 90 +++ .../Properties/Resources.resx | 129 ++++ .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + .../WorkspacesLauncherUI/StatusWindow.xaml | 94 +++ .../WorkspacesLauncherUI/StatusWindow.xaml.cs | 40 + .../Styles/ButtonStyles.xaml | 55 ++ .../WorkspacesLauncherUI/Themes/Dark.xaml | 26 + .../Themes/HighContrast1.xaml | 26 + .../Themes/HighContrast2.xaml | 26 + .../Themes/HighContrastBlack.xaml | 26 + .../Themes/HighContrastWhite.xaml | 26 + .../WorkspacesLauncherUI/Themes/Light.xaml | 26 + .../Utils/DashCaseNamingPolicy.cs | 18 + .../WorkspacesLauncherUI/Utils/FolderUtils.cs | 28 + .../WorkspacesLauncherUI/Utils/IOUtils.cs | 54 ++ .../WorkspacesLauncherUI/Utils/StringUtils.cs | 22 + .../ViewModels/MainViewModel.cs | 120 +++ .../WorkspacesLauncherUI.csproj | 120 +++ .../WorkspacesLauncherUI/app.manifest | 74 ++ .../images/DefaultIcon.ico | Bin 0 -> 112730 bytes .../images/Workspaces.ico | Bin 0 -> 467385 bytes .../WorkspacesLauncherUI/images/checkmark.png | Bin 0 -> 2829 bytes .../WorkspacesLauncherUI/images/failed.png | Bin 0 -> 14789 bytes .../WorkspacesLauncherUI/images/spinner.gif | Bin 0 -> 49905 bytes .../Workspaces/WorkspacesLib/AppUtils.cpp | 252 +++++++ .../Workspaces/WorkspacesLib/AppUtils.h | 25 + .../WorkspacesLib/WorkspacesData.cpp | 475 ++++++++++++ .../Workspaces/WorkspacesLib/WorkspacesData.h | 146 ++++ .../WorkspacesLib/WorkspacesLib.vcxproj | 56 ++ .../WorkspacesLib.vcxproj.filters | 41 ++ src/modules/Workspaces/WorkspacesLib/pch.cpp | 5 + src/modules/Workspaces/WorkspacesLib/pch.h | 14 + .../Workspaces/WorkspacesLib/trace.cpp | 95 +++ src/modules/Workspaces/WorkspacesLib/trace.h | 25 + .../WorkspacesModuleInterface.rc | 55 ++ .../WorkspacesModuleInterface.vcxproj | 79 ++ .../WorkspacesModuleInterface.vcxproj.filters | 44 ++ .../WorkspacesModuleInterface/dllmain.cpp | 346 +++++++++ .../WorkspacesModuleInterface/packages.config | 5 + .../WorkspacesModuleInterface/pch.cpp | 1 + .../WorkspacesModuleInterface/pch.h | 9 + .../WorkspacesModuleInterface/resource.h | 16 + .../WorkspacesModuleInterface/targetver.h | Bin 0 -> 630 bytes .../WorkspacesSnapshotTool/JsonUtils.h | 57 ++ .../PropertySheet.props | 16 + .../WorkspacesSnapshotTool/Resource.resx | 135 ++++ .../WorkspacesSnapshotTool/SnapshotUtils.cpp | 277 +++++++ .../WorkspacesSnapshotTool/SnapshotUtils.h | 8 + .../WorkspacesSnapshotTool.vcxproj | 181 +++++ .../WorkspacesSnapshotTool.vcxproj.filters | 61 ++ .../WorkspacesSnapshotToolResources.base.rc | 52 ++ .../WorkspacesSnapshotTool/main.cpp | 83 +++ .../WorkspacesSnapshotTool/packages.config | 5 + .../Workspaces/WorkspacesSnapshotTool/pch.cpp | 1 + .../Workspaces/WorkspacesSnapshotTool/pch.h | 6 + .../WorkspacesSnapshotTool/resource.base.h | 13 + .../Workspaces/workspaces-common/GuidUtils.h | 34 + .../workspaces-common/InvokePoint.h | 9 + .../workspaces-common/MonitorEnumerator.h | 35 + .../workspaces-common/MonitorUtils.h | 46 ++ .../workspaces-common/VirtualDesktop.h | 49 ++ .../workspaces-common/WindowEnumerator.h | 35 + .../workspaces-common/WindowFilter.h | 65 ++ .../workspaces-common/WindowUtils.h | 122 +++ .../FancyZonesWindowProcessing.cpp | 7 + .../FancyZonesWindowProcessing.h | 3 +- .../FancyZonesWindowProperties.cpp | 8 + .../FancyZonesWindowProperties.h | 2 + .../Components/UtilityHelper.cs | 2 + .../Components/UtilityKey.cs | 1 + .../Components/UtilityProvider.cs | 15 + ...soft.PowerToys.Run.Plugin.PowerToys.csproj | 4 + .../Properties/Resources.Designer.cs | 9 + .../Properties/Resources.resx | 4 + src/runner/main.cpp | 1 + src/runner/settings_window.cpp | 6 + src/runner/settings_window.h | 1 + .../Settings.UI.Library/EnabledModules.cs | 17 + .../WorkspacesProperties.cs | 37 + .../Settings.UI.Library/WorkspacesSettings.cs | 51 ++ .../Assets/Settings/Icons/Workspaces.png | Bin 0 -> 1852 bytes .../Settings/Modules/OOBE/Workspaces.png | Bin 0 -> 85482 bytes .../Settings.UI/Helpers/ModuleHelper.cs | 6 + .../OOBE/Enums/PowerToysModules.cs | 1 + .../Settings.UI/PowerToys.Settings.csproj | 9 + .../Settings.UI/SettingsXAML/App.xaml.cs | 1 + .../SettingsXAML/Flyout/LaunchPage.xaml.cs | 8 + .../OOBE/Views/OobeShellPage.xaml | 4 + .../OOBE/Views/OobeShellPage.xaml.cs | 7 + .../OOBE/Views/OobeWorkspaces.xaml | 32 + .../OOBE/Views/OobeWorkspaces.xaml.cs | 47 ++ .../SettingsXAML/Views/ShellPage.xaml | 7 +- .../SettingsXAML/Views/WorkspacesPage.xaml | 50 ++ .../SettingsXAML/Views/WorkspacesPage.xaml.cs | 29 + .../Settings.UI/Strings/en-us/Resources.resw | 51 +- .../ViewModels/DashboardViewModel.cs | 20 + .../ViewModels/Flyout/LauncherViewModel.cs | 2 + .../ViewModels/WorkspacesViewModel.cs | 155 ++++ tools/BugReportTool/BugReportTool/Main.cpp | 1 + .../BugReportTool/ProcessesList.cpp | 4 + .../BugReportTool/ReportGPOValues.cpp | 1 + 221 files changed, 12909 insertions(+), 12 deletions(-) create mode 100644 doc/images/icons/Workspaces.png create mode 100644 src/common/Display/DisplayUtils.cpp create mode 100644 src/common/Display/DisplayUtils.h create mode 100644 src/common/Display/MonitorEnumerator.h create mode 100644 src/common/utils/OnThreadExecutor.h create mode 100644 src/modules/Workspaces/Assets/Workspaces.ico create mode 100644 src/modules/Workspaces/WindowProperties/WorkspacesWindowPropertyUtils.h create mode 100644 src/modules/Workspaces/WorkspacesEditor/App.config create mode 100644 src/modules/Workspaces/WorkspacesEditor/App.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/App.xaml.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Controls/ResetIsEnabled.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Converters/BooleanToInvertedVisibilityConverter.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Data/InvokePoint.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Data/ProjectData.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Data/TempProjectData.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Data/WorkspacesData.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Data/WorkspacesEditorData`1.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/HeadingTextBlock.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/MainPage.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/MainPage.xaml.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Models/AppListDataTemplateSelector.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Models/Application.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Models/Monitor.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Models/MonitorHeaderRow.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Models/MonitorSetup.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Models/Project.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/OverlayWindow.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/OverlayWindow.xaml.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Properties/Resources.Designer.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Properties/Resources.resx create mode 100644 src/modules/Workspaces/WorkspacesEditor/Properties/Settings.Designer.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Properties/Settings.settings create mode 100644 src/modules/Workspaces/WorkspacesEditor/SnapshotWindow.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/SnapshotWindow.xaml.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Styles/ButtonStyles.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/Telemetry/CreateEvent.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Telemetry/DeleteEvent.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Telemetry/EditEvent.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Themes/Dark.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/Themes/HighContrast1.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/Themes/HighContrast2.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/Themes/HighContrastBlack.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/Themes/HighContrastWhite.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/Themes/Light.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/DashCaseNamingPolicy.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/DrawHelper.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/FolderUtils.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/IOUtils.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/MonitorHelper.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/NativeMethods.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/ParsingResult.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/Settings.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/StringUtils.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/WorkspacesEditorIO.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/Utils/WorkspacesIcon.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/ViewModels/MainViewModel.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/WorkspacesEditor.csproj create mode 100644 src/modules/Workspaces/WorkspacesEditor/WorkspacesEditorPage.xaml create mode 100644 src/modules/Workspaces/WorkspacesEditor/WorkspacesEditorPage.xaml.cs create mode 100644 src/modules/Workspaces/WorkspacesEditor/app.manifest create mode 100644 src/modules/Workspaces/WorkspacesEditor/images/DefaultIcon.ico create mode 100644 src/modules/Workspaces/WorkspacesEditor/images/Workspaces.ico create mode 100644 src/modules/Workspaces/WorkspacesLauncher/AppLauncher.cpp create mode 100644 src/modules/Workspaces/WorkspacesLauncher/AppLauncher.h create mode 100644 src/modules/Workspaces/WorkspacesLauncher/LauncherUIHelper.cpp create mode 100644 src/modules/Workspaces/WorkspacesLauncher/LauncherUIHelper.h create mode 100644 src/modules/Workspaces/WorkspacesLauncher/LaunchingApp.h create mode 100644 src/modules/Workspaces/WorkspacesLauncher/PropertySheet.props create mode 100644 src/modules/Workspaces/WorkspacesLauncher/RegistryUtils.cpp create mode 100644 src/modules/Workspaces/WorkspacesLauncher/RegistryUtils.h create mode 100644 src/modules/Workspaces/WorkspacesLauncher/Resource.resx create mode 100644 src/modules/Workspaces/WorkspacesLauncher/WorkspacesLauncher.vcxproj create mode 100644 src/modules/Workspaces/WorkspacesLauncher/WorkspacesLauncher.vcxproj.filters create mode 100644 src/modules/Workspaces/WorkspacesLauncher/WorkspacesLauncherResource.base.rc create mode 100644 src/modules/Workspaces/WorkspacesLauncher/main.cpp create mode 100644 src/modules/Workspaces/WorkspacesLauncher/packages.config create mode 100644 src/modules/Workspaces/WorkspacesLauncher/pch.cpp create mode 100644 src/modules/Workspaces/WorkspacesLauncher/pch.h create mode 100644 src/modules/Workspaces/WorkspacesLauncher/resource.base.h create mode 100644 src/modules/Workspaces/WorkspacesLauncher/utils.h create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/App.config create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/App.xaml create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/App.xaml.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Converters/BooleanToInvertedVisibilityConverter.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Data/AppLaunchData.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Data/AppLaunchInfoData.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Data/AppLaunchInfosData.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Data/WorkspacesEditorData`1.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/HeadingTextBlock.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Models/AppLaunching.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Properties/Resources.Designer.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Properties/Resources.resx create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Properties/Settings.Designer.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Properties/Settings.settings create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/StatusWindow.xaml create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/StatusWindow.xaml.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Styles/ButtonStyles.xaml create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Themes/Dark.xaml create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Themes/HighContrast1.xaml create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Themes/HighContrast2.xaml create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Themes/HighContrastBlack.xaml create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Themes/HighContrastWhite.xaml create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Themes/Light.xaml create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Utils/DashCaseNamingPolicy.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Utils/FolderUtils.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Utils/IOUtils.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/Utils/StringUtils.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/ViewModels/MainViewModel.cs create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/WorkspacesLauncherUI.csproj create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/app.manifest create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/images/DefaultIcon.ico create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/images/Workspaces.ico create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/images/checkmark.png create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/images/failed.png create mode 100644 src/modules/Workspaces/WorkspacesLauncherUI/images/spinner.gif create mode 100644 src/modules/Workspaces/WorkspacesLib/AppUtils.cpp create mode 100644 src/modules/Workspaces/WorkspacesLib/AppUtils.h create mode 100644 src/modules/Workspaces/WorkspacesLib/WorkspacesData.cpp create mode 100644 src/modules/Workspaces/WorkspacesLib/WorkspacesData.h create mode 100644 src/modules/Workspaces/WorkspacesLib/WorkspacesLib.vcxproj create mode 100644 src/modules/Workspaces/WorkspacesLib/WorkspacesLib.vcxproj.filters create mode 100644 src/modules/Workspaces/WorkspacesLib/pch.cpp create mode 100644 src/modules/Workspaces/WorkspacesLib/pch.h create mode 100644 src/modules/Workspaces/WorkspacesLib/trace.cpp create mode 100644 src/modules/Workspaces/WorkspacesLib/trace.h create mode 100644 src/modules/Workspaces/WorkspacesModuleInterface/WorkspacesModuleInterface.rc create mode 100644 src/modules/Workspaces/WorkspacesModuleInterface/WorkspacesModuleInterface.vcxproj create mode 100644 src/modules/Workspaces/WorkspacesModuleInterface/WorkspacesModuleInterface.vcxproj.filters create mode 100644 src/modules/Workspaces/WorkspacesModuleInterface/dllmain.cpp create mode 100644 src/modules/Workspaces/WorkspacesModuleInterface/packages.config create mode 100644 src/modules/Workspaces/WorkspacesModuleInterface/pch.cpp create mode 100644 src/modules/Workspaces/WorkspacesModuleInterface/pch.h create mode 100644 src/modules/Workspaces/WorkspacesModuleInterface/resource.h create mode 100644 src/modules/Workspaces/WorkspacesModuleInterface/targetver.h create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/JsonUtils.h create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/PropertySheet.props create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/Resource.resx create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/SnapshotUtils.cpp create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/SnapshotUtils.h create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/WorkspacesSnapshotTool.vcxproj create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/WorkspacesSnapshotTool.vcxproj.filters create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/WorkspacesSnapshotToolResources.base.rc create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/main.cpp create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/packages.config create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/pch.cpp create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/pch.h create mode 100644 src/modules/Workspaces/WorkspacesSnapshotTool/resource.base.h create mode 100644 src/modules/Workspaces/workspaces-common/GuidUtils.h create mode 100644 src/modules/Workspaces/workspaces-common/InvokePoint.h create mode 100644 src/modules/Workspaces/workspaces-common/MonitorEnumerator.h create mode 100644 src/modules/Workspaces/workspaces-common/MonitorUtils.h create mode 100644 src/modules/Workspaces/workspaces-common/VirtualDesktop.h create mode 100644 src/modules/Workspaces/workspaces-common/WindowEnumerator.h create mode 100644 src/modules/Workspaces/workspaces-common/WindowFilter.h create mode 100644 src/modules/Workspaces/workspaces-common/WindowUtils.h create mode 100644 src/settings-ui/Settings.UI.Library/WorkspacesProperties.cs create mode 100644 src/settings-ui/Settings.UI.Library/WorkspacesSettings.cs create mode 100644 src/settings-ui/Settings.UI/Assets/Settings/Icons/Workspaces.png create mode 100644 src/settings-ui/Settings.UI/Assets/Settings/Modules/OOBE/Workspaces.png create mode 100644 src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeWorkspaces.xaml create mode 100644 src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeWorkspaces.xaml.cs create mode 100644 src/settings-ui/Settings.UI/SettingsXAML/Views/WorkspacesPage.xaml create mode 100644 src/settings-ui/Settings.UI/SettingsXAML/Views/WorkspacesPage.xaml.cs create mode 100644 src/settings-ui/Settings.UI/ViewModels/WorkspacesViewModel.cs diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 78affbb16f..7e9445f893 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -76,6 +76,7 @@ body: - System tray interaction - TextExtractor - Video Conference Mute + - Workspaces - Welcome / PowerToys Tour window validations: required: true diff --git a/.github/ISSUE_TEMPLATE/translation_issue.yml b/.github/ISSUE_TEMPLATE/translation_issue.yml index 88114730c6..8a6cd56280 100644 --- a/.github/ISSUE_TEMPLATE/translation_issue.yml +++ b/.github/ISSUE_TEMPLATE/translation_issue.yml @@ -50,6 +50,7 @@ body: - System tray interaction - TextExtractor - Video Conference Mute + - Workspaces - Welcome / PowerToys Tour window validations: required: true diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index 2bf5ff9492..f5bc0156f8 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -56,11 +56,14 @@ APPBARDATA appdata APPEXECLINK Appium +applayout Applicationcan +APPLICATIONFRAMEHOST appmanifest APPNAME appref appsettings +appsfolder appwindow appwiz APSTUDIO @@ -240,6 +243,7 @@ CONTEXTMENUHANDLER CONTROLL CONTROLPARENT copiedcolorrepresentation +COREWINDOW cotaskmem COULDNOT countof @@ -832,6 +836,7 @@ lpwcx lpwndpl LReader LRESULT +LSTATUS lstrcmp lstrcmpi lstrlen @@ -1205,6 +1210,8 @@ projectname PROPBAG PROPERTYKEY propkey +propsys +PROPVARIANT propvarutil prvpane psapi @@ -1370,6 +1377,7 @@ sddl SDKDDK sdns searchterm +SEARCHUI secpol SENDCHANGE sendinput @@ -1552,7 +1560,9 @@ SYSKEYUP SYSLIB SYSMENU SYSTEMAPPS +systemsettings SYSTEMTIME +SYSTEMWOW tapp TApplication TApplied @@ -1664,9 +1674,11 @@ urlmon Usb USEDEFAULT USEFILEATTRIBUTES +USEPOSITION USERDATA Userenv USESHOWWINDOW +USESIZE USESTDHANDLES USRDLL UType @@ -1734,6 +1746,7 @@ vswhere Vtbl WANTPALM wbem +Wbemidl wbemuuid WBounds Wca @@ -1821,6 +1834,9 @@ WNDCLASSEXW WNDCLASSW WNDPROC workarounds +WORKSPACESEDITOR +WORKSPACESLAUNCHER +WORKSPACESSNAPSHOTTOOL wox wparam wpf diff --git a/.pipelines/ESRPSigning_core.json b/.pipelines/ESRPSigning_core.json index 03a30fbe8d..b873c42b90 100644 --- a/.pipelines/ESRPSigning_core.json +++ b/.pipelines/ESRPSigning_core.json @@ -189,6 +189,14 @@ "WinUI3Apps\\PowerToys.PowerRenameContextMenu.dll", "WinUI3Apps\\PowerRenameContextMenuPackage.msix", + "PowerToys.WorkspacesSnapshotTool.exe", + "PowerToys.WorkspacesLauncher.exe", + "PowerToys.WorkspacesEditor.exe", + "PowerToys.WorkspacesEditor.dll", + "PowerToys.WorkspacesLauncherUI.exe", + "PowerToys.WorkspacesLauncherUI.dll", + "PowerToys.WorkspacesModuleInterface.dll", + "WinUI3Apps\\PowerToys.RegistryPreviewExt.dll", "WinUI3Apps\\PowerToys.RegistryPreviewUILib.dll", "WinUI3Apps\\PowerToys.RegistryPreview.dll", diff --git a/PowerToys.sln b/PowerToys.sln index d2b3e1c00c..d6c33873e2 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -171,14 +171,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject src\.editorconfig = src\.editorconfig .vsconfig = .vsconfig + src\Common.Dotnet.CsWinRT.props = src\Common.Dotnet.CsWinRT.props + src\Common.SelfContained.props = src\Common.SelfContained.props Cpp.Build.props = Cpp.Build.props Directory.Build.props = Directory.Build.props Directory.Build.targets = Directory.Build.targets Directory.Packages.props = Directory.Packages.props Solution.props = Solution.props src\Version.props = src\Version.props - src\Common.SelfContained.props = src\Common.SelfContained.props - src\Common.Dotnet.CsWinRT.props = src\Common.Dotnet.CsWinRT.props EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Settings.UI.Library", "src\settings-ui\Settings.UI.Library\Settings.UI.Library.csproj", "{B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}" @@ -277,6 +277,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "utils", "utils", "{B39DC643 src\common\utils\modulesRegistry.h = src\common\utils\modulesRegistry.h src\common\utils\MsiUtils.h = src\common\utils\MsiUtils.h src\common\utils\MsWindowsSettings.h = src\common\utils\MsWindowsSettings.h + src\common\utils\OnThreadExecutor.h = src\common\utils\OnThreadExecutor.h src\common\utils\os-detect.h = src\common\utils\os-detect.h src\common\utils\package.h = src\common\utils\package.h src\common\utils\ProcessWaiter.h = src\common\utils\ProcessWaiter.h @@ -456,7 +457,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FileLocksmithExt", "src\mod EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileLocksmithUI", "src\modules\FileLocksmith\FileLocksmithUI\FileLocksmithUI.csproj", "{E69B044A-2F8A-45AA-AD0B-256C59421807}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FileLocksmithLibInterop", "src\modules\FileLocksmith\FileLocksmithLibInterop\FileLocksmithLibInterop.vcxproj", "{C604B37E-9D0E-4484-8778-E8B31B0E1B3A}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerToys.FileLocksmithLib.Interop", "src\modules\FileLocksmith\FileLocksmithLibInterop\FileLocksmithLibInterop.vcxproj", "{C604B37E-9D0E-4484-8778-E8B31B0E1B3A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GPOWrapper", "src\common\GPOWrapper\GPOWrapper.vcxproj", "{E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}" EndProject @@ -583,6 +584,37 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerToys.Settings.DSC.Sche EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerToys.Interop", "src\common\interop\PowerToys.Interop.vcxproj", "{F055103B-F80B-4D0C-BF48-057C55620033}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workspaces", "Workspaces", "{A2221D7E-55E7-4BEA-90D1-4F162D670BBF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workspaces-common", "workspaces-common", "{BE126CBB-AE12-406A-9837-A05ACFCA57A7}" + ProjectSection(SolutionItems) = preProject + src\modules\Workspaces\workspaces-common\GuidUtils.h = src\modules\Workspaces\workspaces-common\GuidUtils.h + src\modules\Workspaces\workspaces-common\InvokePoint.h = src\modules\Workspaces\workspaces-common\InvokePoint.h + src\modules\Workspaces\workspaces-common\MonitorEnumerator.h = src\modules\Workspaces\workspaces-common\MonitorEnumerator.h + src\modules\Workspaces\workspaces-common\MonitorUtils.h = src\modules\Workspaces\workspaces-common\MonitorUtils.h + src\modules\Workspaces\workspaces-common\VirtualDesktop.h = src\modules\Workspaces\workspaces-common\VirtualDesktop.h + src\modules\Workspaces\workspaces-common\WindowEnumerator.h = src\modules\Workspaces\workspaces-common\WindowEnumerator.h + src\modules\Workspaces\workspaces-common\WindowFilter.h = src\modules\Workspaces\workspaces-common\WindowFilter.h + src\modules\Workspaces\workspaces-common\WindowUtils.h = src\modules\Workspaces\workspaces-common\WindowUtils.h + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WindowProperties", "WindowProperties", "{14CB58B7-D280-4A7A-95DE-4B2DF14EA000}" + ProjectSection(SolutionItems) = preProject + src\modules\Workspaces\WindowProperties\WorkspacesWindowPropertyUtils.h = src\modules\Workspaces\WindowProperties\WorkspacesWindowPropertyUtils.h + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WorkspacesLib", "src\modules\Workspaces\WorkspacesLib\WorkspacesLib.vcxproj", "{B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkspacesLauncherUI", "src\modules\Workspaces\WorkspacesLauncherUI\WorkspacesLauncherUI.csproj", "{9C53CC25-0623-4569-95BC-B05410675EE3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WorkspacesModuleInterface", "src\modules\Workspaces\WorkspacesModuleInterface\WorkspacesModuleInterface.vcxproj", "{45285DF2-9742-4ECA-9AC9-58951FC26489}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WorkspacesSnapshotTool", "src\modules\Workspaces\WorkspacesSnapshotTool\WorkspacesSnapshotTool.vcxproj", "{3D63307B-9D27-44FD-B033-B26F39245B85}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkspacesEditor", "src\modules\Workspaces\WorkspacesEditor\WorkspacesEditor.csproj", "{367D7543-7DBA-4381-99F1-BF6142A996C4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WorkspacesLauncher", "src\modules\Workspaces\WorkspacesLauncher\WorkspacesLauncher.vcxproj", "{2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 @@ -2601,6 +2633,78 @@ Global {F055103B-F80B-4D0C-BF48-057C55620033}.Release|x64.Build.0 = Release|x64 {F055103B-F80B-4D0C-BF48-057C55620033}.Release|x86.ActiveCfg = Release|x64 {F055103B-F80B-4D0C-BF48-057C55620033}.Release|x86.Build.0 = Release|x64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|ARM64.Build.0 = Debug|ARM64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|x64.ActiveCfg = Debug|x64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|x64.Build.0 = Debug|x64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|x86.ActiveCfg = Debug|x64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|x86.Build.0 = Debug|x64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|ARM64.ActiveCfg = Release|ARM64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|ARM64.Build.0 = Release|ARM64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x64.ActiveCfg = Release|x64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x64.Build.0 = Release|x64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x86.ActiveCfg = Release|x64 + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x86.Build.0 = Release|x64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|ARM64.Build.0 = Debug|ARM64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|x64.ActiveCfg = Debug|x64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|x64.Build.0 = Debug|x64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|x86.ActiveCfg = Debug|x64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|x86.Build.0 = Debug|x64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|ARM64.ActiveCfg = Release|ARM64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|ARM64.Build.0 = Release|ARM64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|x64.ActiveCfg = Release|x64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|x64.Build.0 = Release|x64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|x86.ActiveCfg = Release|x64 + {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|x86.Build.0 = Release|x64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|ARM64.Build.0 = Debug|ARM64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|x64.ActiveCfg = Debug|x64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|x64.Build.0 = Debug|x64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|x86.ActiveCfg = Debug|x64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|x86.Build.0 = Debug|x64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|ARM64.ActiveCfg = Release|ARM64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|ARM64.Build.0 = Release|ARM64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|x64.ActiveCfg = Release|x64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|x64.Build.0 = Release|x64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|x86.ActiveCfg = Release|x64 + {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|x86.Build.0 = Release|x64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|ARM64.Build.0 = Debug|ARM64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|x64.ActiveCfg = Debug|x64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|x64.Build.0 = Debug|x64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|x86.ActiveCfg = Debug|x64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|x86.Build.0 = Debug|x64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|ARM64.ActiveCfg = Release|ARM64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|ARM64.Build.0 = Release|ARM64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|x64.ActiveCfg = Release|x64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|x64.Build.0 = Release|x64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|x86.ActiveCfg = Release|x64 + {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|x86.Build.0 = Release|x64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|ARM64.Build.0 = Debug|ARM64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|x64.ActiveCfg = Debug|x64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|x64.Build.0 = Debug|x64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|x86.ActiveCfg = Debug|x64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|x86.Build.0 = Debug|x64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|ARM64.ActiveCfg = Release|ARM64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|ARM64.Build.0 = Release|ARM64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|x64.ActiveCfg = Release|x64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|x64.Build.0 = Release|x64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|x86.ActiveCfg = Release|x64 + {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|x86.Build.0 = Release|x64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|ARM64.Build.0 = Debug|ARM64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|x64.ActiveCfg = Debug|x64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|x64.Build.0 = Debug|x64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|x86.ActiveCfg = Debug|x64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|x86.Build.0 = Debug|x64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|ARM64.ActiveCfg = Release|ARM64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|ARM64.Build.0 = Release|ARM64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|x64.ActiveCfg = Release|x64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|x64.Build.0 = Release|x64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|x86.ActiveCfg = Release|x64 + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|x86.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2817,6 +2921,15 @@ Global {C0974915-8A1D-4BF0-977B-9587D3807AB7} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {1D6893CB-BC0C-46A8-A76C-9728706CA51A} = {557C4636-D7E1-4838-A504-7D19B725EE95} {F055103B-F80B-4D0C-BF48-057C55620033} = {5A7818A8-109C-4E1C-850D-1A654E234B0E} + {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} + {BE126CBB-AE12-406A-9837-A05ACFCA57A7} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} + {14CB58B7-D280-4A7A-95DE-4B2DF14EA000} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} + {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} + {9C53CC25-0623-4569-95BC-B05410675EE3} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} + {45285DF2-9742-4ECA-9AC9-58951FC26489} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} + {3D63307B-9D27-44FD-B033-B26F39245B85} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} + {367D7543-7DBA-4381-99F1-BF6142A996C4} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} + {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96} = {A2221D7E-55E7-4BEA-90D1-4F162D670BBF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0} diff --git a/doc/images/icons/Workspaces.png b/doc/images/icons/Workspaces.png new file mode 100644 index 0000000000000000000000000000000000000000..18f13f1c0c1559b5f416f0e17f15d07991d1be6a GIT binary patch literal 25026 zcmV)xK$E|TP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vG=O8@{YO97=lmZ<;$VOL2+K~#8N?Y()R zWmR!5{?$JBcHf>SplJ~iV+0XL5KSBqW0y3s_9`h3wuaX=jM-t&dLdU1S zpvI^18MQ$aoEQ>2j(`$1Dx(qvn{E*3iKeG}&#L!FeO0UWKDVK1`!=`X7Ti92uf0~S zT2)`wsWu)d z5#Sop@;yjdwf1ov*WipZN|)^v?S7JO!4&N}EjjVrnOkOUeZKVZVgOHo$iV;>*j2qR zb*rl0Bft#`y{Z7`Z`>r`#>H>j)~z^2yN~YGB2%<;v|!oa&C~wKtI;%n4&WdGWkX2sNF%Bm-l3{0Kmo80z~{Gb)4#swD{sHO+j5F_4^271uF%n^56#_o?jsxYj)LMC zNb^cSM?^#z>F+b#iwH9C6Sc}z^*0LqEk?_yHe7h>`gYYR`faJJ{3*H@TDbJA1Bx~; zgY=#S=o0}PD1woU*Q(P2Y!4J|6rzl>x;rzGWl$cG?F3^+%0GNC7IZtg$^S=On zG9YtBFs&QioeZNT@L6@J3J||FJ*vR9Yb;Z1pw8a|dCNI0^oJa%vxlN6aK-xb-};Qy zV2XBu9(oRN`svNS*X+ArU&|v3^jL_zN}!LXDuls37Nse>F{*{kcEIZ_8gPu1D%n4& zZj`oYJm<+*0f;J8Ab+!N;q)``u{VyU3R84HXi)nPRyub1^trS3*+amw1@bHi4i(7k zwhp-R9Hb5kc}k$#hK-X|i^Z!|4^L`$(RPCN3^54$uDMikt2SdNZCLS+AGIz_(N5EN z#(q%IqLV%`r%c;?JfQDZ$fE^1LxCYgM2>K7)b;^|swj{bu#SFr0@iPXHlLt zZLf2jXm71^dSq(>%3!RakOJVG^_%p+Pu(%zHG0rFz(KG1KO-AAZ`cn-AE(kg38Kpc zShO=k9Y6KxMq{TO^#OQ}PuvzByECmRofnt3r{UbJ9@Q(kC zhEufDG@fPmN?LN_xihzpZ2LoP^hGE*TtprVM*0?tcbMgP?r$J;FppceMtyn#!@Olh z0HA`J8s!}x18ziiGID1Mc>7I&&g?Sibgcc!_2<9!^_`1Tv=cOrb@wh>@S=|#s6(S~ zN7MWfRObq01cDyY3N|Qk73qmVG48sW8(6yls22%hyV4_d2IRmlPX;s!ut8M5sM`PD zP_MVPUu33Ad10eC79#t#x$&re@P?a4HTMmhOmuA8hS3GLU-qthg2fc=6zz2mu<(`3 z=gPLSq>tXy06i9v7mHv<4U=h4y+sw{J1+0u#!BS_)XD#qcf9->bPS4L1Gov06@4`S zy7Bx|e%a+Rd+G9hhai6q!5;}Q$4WT{*bFr2SV;X_gM#v3Hk^0rr&5I}+6fvD5tEV@ zy!;~vma);LB66Gnk5=HIMx<#+%`WBxAaN~1=s^7z$WxwVSxbGuEjvkS&%RW3vp_Bo z$YtpDez!!aF+dOD(6L-ps#x;d=!5n>4E=N6T_{NTCW`F=Ok<^VWRz zjhnldr)bACfS?DOW-nd7Z==mY4a(C1yiyuG6%bp@M#^ERr1UJX{G-A{Z6QkVdo}K? zAQq{_l_R+>ew}qY(t0|g(9KZX4AEafd;c(R*6d4f{`Bj%M)$iw^IrO)M@iFs4Uj_s z?(!sxv@=;ZC%Vf?q4}c`fD2rYApIci6gB_bbxh8@=J& z;RWlrei8+L3_&v>9*_z`R^gK2Kl{)V?mqw2>)Z9G=-y~Ry?c_DoOtfcEhF2O0(dQe zBLq4Ek!flFTMhJfO`>?o2;~l#g#8n||RvL;I}9 zdCNv8;%UqU%g*@=Rs5AmGaXenm@sV(aD-?Yky6SkG|h?YSG@HW==j%)Z-St!N0rn!z#WAZe{Dii%80j1V4-f7P`z_H7x&!2^3Met&XJVh11E21+Hd*>eA;K1a=UM$QYjwqNeb@KeghgFD` zm@PU?;z+ka<>~_Y=SKDNZB6e#H=lRPZNYL6(EO$6ya~WrA~IsrQQcfk)RNtjJ-xlx z!%26om~w#oLxZZ_jkM^bPs}OPH@#U^UIXAjfz&UH2Wa8Zy1S1aQQ1?IfhZsUJE+HV z3Ma>WO&#(gQ-H7bOLG>+#(uJ4{rXM#))`~9?Vh9gOV4=|RL+zJGk}ic^G32mpA(!Y zu(~PwftgMJW2??TZA*vc6x|E$RtH%8st?ZEx_Q=O$hIemG_Mws=Kwn2u13DXG=w=0 zXMl+K0}^@N*l>(#Kd1XOlOZt1;S|7E6cyYiz%K;2aCEHs%-vsp%U#|24+O;wV0W|` z>(iiZLtvv8y+t8EhRSC)+;!K#Jx~t2x6=Sfc7>Llc<#*2GdI6LwE1IEJOP470T`|| zyqiF7MDUhzy;el}9QD;0?W07rqcV8qWm1&%Z-!mO$+7#a%Lkk zgZ^4c<$6HBF3@lEWawvi?BVq6!AQTg1I#=5@1G|{&j#>F0cI*7ot!=cwcdpCFfBkS z{v0AB?F!>X`T%R% zamf#+QI-nmw54e|eQf>Eskp`2aRC9KV_NVl06!4H%2^ou?B0?aFIaZYpQ*}!gJ6xQ z{!7yzzVNOuy?JV3J3(~69bnFjKfI_n)PD~ke=H&gFz>FZ3Zw2gsYqu}BO<(|HH7ux zOfXKASMwOvqTvw&QPtG~IbVS9j28WmyEn@%_xT*oB%^sRKl_nGD*KLY(_c(@dba$A z=}UC`;y$Jw(nnbgY34w*NWlh`=Jwujx%oG@uf7Fm9P^-EU)(PTSai}S=Jcm+`g;Lh zsgNOo-G4HeMkFR`;|&Kat4`6*>nVaSWXD500Uzg4iS-rN7nFZ&M*E+iyZ-JwZvNI8 zzttlN4`y0&?o~6lZJTp=Q_5>0asm`{M4F+Z+5@x^01)Zh6Wkb6=uIke1;+5{wWl5O zgD$_lop#OvmaXV5&|8mEZ9Xc3Cwhc;Ah*((9Qa$H&3pd5oVIKLOLJ<|G>f!+LZGVm zh{%m7`rXpQ`5SIu`<kR8wp?d`Mb+Wng0;YXH!{{;$pmDnalBMe5JjaA=Ht7$3} zqUaak$AEsM>Ff9Je8kUh#K|Z3yWQ<=v{Mc+@8l0XuhHJQ01mE^7fF2{xdG3D;<(t> zWV^3gKi$>zI$TGiyV&gm_z@tNit4wU(*N0=Upn=+iFh30K|#xJn7*Il*?raH1o~`k zaF{^+-a@4mqm&O2*5Kw>X^m=-|AgRkD$TiT-}acj`r*6#bbv)K{rf}vQdUaS?9Y6^ z?z1aWz+i*+MkUGWSh_^#u*jkU5qoP|QoKKx?2e&wRUhSll&xbw-ZbOxjX3X&?QQ;3 zIp1$r==Gv_`(5ui^qXwB z*U^q0;Plg*h1V`TswloFiifpgbVTmBk%hR@S?b2Qlk-XE5pArzDDWGo-XemF`{;jW zLZ4kMjFI(TV;nXKj?9SD0rmlv9<}E$v zp9J!%sL)PPTty;{O^u!(cJoGlD*Rdg>I0@c;BFN8T5lT8z&%@Ty=%kfEmI5H9n<2! zzwY3E!Kn&a3g~=(Lr%DCqP9J_7}!&D*7Erv-IPr35rAhR6rWDDJhek#RsVTpPvsc z#`8~Gn_5g!q6L3<)jXLoasbNkk&Wof6!JU)X4=&Xz*sJ&E#^3`Ky8Kan#!bOkL(`5 zoNCl}{JWLI;;PuLDDPc2d&@a^lz0fVE)pxPZE_+ppkv+f;KBR9$cfEsHrZ{ zgEf_}*bJ461pSLthJL>OjytcNiu60C1t0mvfxXfGQYemt;7|YuM5H$u2J*7bZB1q= zt5HsJocvlRQdPhQs56aM==bFPR8{YW;En4}JM8nFs*{ph%`KjDg@5SvcG*$dsfOC5N{^y2AXKlFOUlxBT(djFP_L;xr`6~KaK%NK1ED@Pr zwNu6)}8mYs9CK%O3+obpMS0y?`ugQUP_DE_|b<0EUo^wwLawlBw_ zb9H#p=Ifr(Nb{lseHwRg=GP!Cgn#|8@|acaJR#61@_v~8Qe^iE9h}8QZ(t_sG(#UM{Tw3P2A7@E8#p zA-MB`bzt!-E#N9OO>;Q#1H6L>9Cv|R7p+l`lg2gxKUBz$v8O=r zdIb(@ZG4ceV<(EztpeXI1pt-)+t$DH2_KG@lZ*ra<}F>myaC<>!H@}Fr@y?g5zF6uy7xZRBmbgLTssFF<;~K_YgP5({tdZKHGi5Q$^*(wV=`#z5Vh@q_N}!$ zl$ALEopVB_FpX9HvPyF%wh#Y&-IiPK8F=RZ+^dEcZJzb0e!u)G@{@aF{INk%gJkIvj@Xmsd85&8Y@#hoEhoHsnO{dKqh--q6-xfg%%C$qFS zW3e`RL|^eI0vsz+A3Wpz55Y&iAc`~9rW zk~6Q{XRG!v1MsAr<}i(ldesk71ptud*mduG>?Kig5>cZ)Sp+l>gUPJ$v~$pW17!;Q zLS{6VKUBcK&pB8B?!t4f|LC-7@*Rbq4aM;SJyZw54{9m2SGN{x_9G&ZO;{W?42x8S zYS={q_+4PACmQX3!Y~`4I8%E4Bd5=q|N6BX9{ZW~?>_XWy8?aySo6+9?^MxG5bzYo zKApsV7Ai2Ju*JHns`kfzr*fNIBny`=|8ENX4Q%>s-Q^RZ!rir7E)JlScdxtP)DNbT z2Nf+`e#6{e+5RYPhMucMUk=DqeFLBs%u}?hD&j)|KuwtwV0ao|CrTR5*8$#rkN%3b z9#3Hs-dDv<0Ime^^;xq1%d1ZN{oQ)=asFBV@p$xmmx#y`7O4Q~yBt)5U#uSjG=I7N z-G{x8mnIc8+Tbu#rzBf2I>l|h)FQ>3(#Lt}%7ca$o^{RB7k=ov4>UzD=ws;XTJS+Y zjsmATEe=hs;3v2vTHC3i)apT#Dius~7~7SP9Jr6<3B!)n%EB%RRotq;hf&HO4M{nE z-JH$;W!*au``qpZKLALtw*kPNA(yH-WsUU7`74Y7sFtxs!Dy0EQ%X6AlbV$%|KnjM zPJ5<)#Sb=I`1YGy74~L2edW-?bFO{aqO-66f;7#=A~;o{&lO;a-Q*l3!!L+hn+`I- zLBH@aPwO4=#8On^BG#Iw2p?>%voR>Hk-oeV=>Oi_yKjHb+IJm({vD?s{>zEH;WV@z z+W~A9cW59G!Xd^`HG8{4T0i77$*2*PMXgkaQ-K*IEycKfCUz%SRrHFzJ@?=5oS!b< z=j`jBz3}WC&RjHq$+eBj`GB4b=sc*#ZjR~4^KeqmfF%Nb?A(ae;Z+BIaZgHak$GBW zLp(ub3D@1K_=&21q(3AtSi9-=C*Ae#$NuxWcRv2tH=l9Lo_p3NO>AwcAsn}74HY-Q zm_jzx>XVCP!P4bhAQ%Y;$fUfd?T^6Os1-IXzjpl>-~Q=Ni%Cz5Klqbb+hqD5^m@G$ zpyi1oI81@r!e?hDT+}3M;w&`uZd*=fcboTwg&-WiyT%^z=J?AGr@;cG6q0(S2RKE=LzSZd1%C&#- z#7X((`38dN-CQSSL}JgW#ANLe39342y?Q)aa_&_#7oK(fDPz5nA2dDrEVR5H(4*9T znUR3yB8ZtDY{(8~!*bZ(>(vl%O(I?Lt+aZs9#UA7ao%zVrk23wqIzW?{pVwB%k%Hr zSpL7e-f`$RH@)pKcRWzw&m=JK6rKcfY}Nu4*Q06PCqJ)^A?%*~toi0FVXC zmWNW+p8KiM%6EpqRdP~)Ddi;_E;#kewPcdf=_`l!S+L*1rO3emUM-Ll0nAGg9x3ix zQ3NuxrNwEx`x84I);2|V)&gqlF1328RTNOMCG~Ga@GAu_8xsA@9q)MDjqx?yNkTpY z063BZqCRvpAU8|Vs{#Gg`mJ|eGH_RU5|b=gy1W>;eK*6eI7rg{NKSdGs#^4=lhOf} z-!OeqfAm;L?-dFhDXIq|epwP2fFu3ELUG-eOsP!TKJN#-v-r&NbA5$N$Kuv zSQV-J>F)0_#xxVwNY5;HM^QhjSYMnqHJ;{F0Js~9Pc_o}DEfNqU7K&)vNuFbbAWP@ zh05j={rnuYN~UodM8_TS1--r-csy)iPOT09D!N>}&Ve(!5w3{c8ah z=BOUk{5>~$!D`rqw7x@YQ-E65PfRC9?PR7pKpW`!@#W2;dRGy>x~Fo{Xrn7Oo_6@& z_Y#29e?Dyt^Cega4XXqcUiQFd}4#3u7#~!a1V-}Ck?)?MXp`9>GtdPhDiTF(FvFT`gi*} z{Kr6f3eY?Xz2sERGCJ4^vNb@RwvAohDXHnMZ;n79@<8qa9d!ClBX`f)`lo30 z{eX-J_XoQn+sl}i6QcQfnsG=ime(98`$-46c-{@HH(r+EJcvH7lmt?`x zbKKHQSvixZbzj83lqZ)WFL|IA!Hdqi`dtO`-bQ4umkmbwR)imid~CHUy~ImcC1O!H zj6hI;TcG;SjpARmnRflUyZ`U4Q;~jrI(p?zBQvJWc!r3c4Cvzld8{ht`?i8-rw%mQ zuxdS!S@$8_Ufw7yZDD#FfN!JU|I2?l=D;heB!iS3fJo1vM`ybmfUgUR$V)b?*z*ox zX;1SN0cPZFNUFy{8}i#0X2&Vgg0;<^!}B)XO##K2s$M1{pXxXIFB>;v)84)dGLdw| zMYqn}Z=a#1K>u|L908S?BIwZ^178P)hpe!x6~$c4c7{@W{F)Z!Qq^69@3IxSwi(lt zFFR(*&!dA5nFDkqy~&`?9OixT#3O(`zYC-)3(vgfC~f3|M&w~BpU+cO4eE9A?%oho z*Y?#3qAD+nMV(WJ3bw~QirC`x^)Tqa_EpYC#cAu2(W;= zXgRMBSh;;t%tGgSoJ0mb4g)hC|4)HURc})*Z&>u31HOLV$ujVR9yJ z?rm>9-jj6f6~BHsO7m1f?_@w93*ZpgTP0c)*^7lN19G*X1G~P`rDMl&%}PA_tdfJB zo3#KNfb!079(}+ka#H|k2Ykp4-A*pn&H;t&30zwMZItq2xUH=#m}1kq1@5@4ER720ny zpdSF}3$R9k>md5gp@L7{@vg_+{@dJGc`(!SFIh8dXh#14?cphc-fJNE1N%*aP&f?C z;s7Mz1;tWo0c}Q#IGQC{<}PkVU05WsGPIUZ`= zkY*qSBJHUZXyNi3=3=yeE}*Y4ZFFl`6z_n(rF>M-vpzNobR~*>PNjeCynE){FxlT> z`9RVOzq{%XY2-LT?|CA6C=>?)t?xl=ioPvS!=O|RRIizt!a$Bf1GuKQPk5a+*o|tv z?iC~NglA(~@DD4W`>?n8^*jSum6U@;^v{E0St+_l9ALqjKYyk`zM{Z90FkSiVk{K6 zew{MdE2%2vZj|!T9)>wCGCc*C1m+xh z2OYq!7ZqvZkrQ97=71Jui3Ebe--EU^*Sx`-wE^BPYbQ2#394f{Bu`%XtR+_iF$2V? z3|#rHk#Pi!S)@jL!~stK`LqRd@Ckvu5|E}&Ra8>wlA3Bo7*~ucAa?^r;b9h|aA4isdfgjeOU~f!JB#Ix?ee3#u$|(C0ER z8_(OQ4q=g|0%L$7uN3`ik!{PqbmO^XwjVVD5yLuz^?$5 zQKO0>DUwM1Q-^SaDE?^O+^uI!fq#5D{_-_XJMQw^J}_<8j0?2LHx&9lDSDK~)@3VD zcfsB|SBFiyR!ULjcTJM%%x>Ps+bhGEI;cC*y&iVb9-A1{R>s-E0><{Is=$#d(;pA+ z0s(b_!fhTa6_FG~i7k%OttMeXn6Oq!@yH~%MkWMa{eq? zZQzG~;FAR4H#6({z&_L~4uadr>Z_6aQHu!R{TejSKjNyZhMNGkU-w?@ITx5u#O+nr zK$q`?kg6W7N+-4RcHiA|)`18_ac2>{bKQF$_v@)V-vEF7mACKz!pqk@=lJifIcwI) zq1OuJe5gJ{fw@o_@<^XSMXZSfKb{jKsewmS3mtp1r5 zEY;42S7O{LSgG$|MuAoGs+=Mks2)9i)vS>QT0Pb4B!_5YuGVWcm?%=n^LUs$HYauU zd0ms#YN(<>|NjjKJ?>i%b?`s`k~Onlc=>H7&76M7$I&kr^&nqGgHr)K8ZeO9dav8E zYBvKdp)M?72Pt((cJY)|$c>wb<2Pd)-w zJsNZNd01neMT$cNRmSP0ZinsxTKLyLK0pMI;dEvlyZnexA5BZ^3f$UEmrr1vTi*{A zdhwO379IcnHE)?V7gzV7p9SzIB6uoPXJ%jrFiU_ttJLA3u=_(X6R0&z03}cR5Y{(r z(^fDLdZMF|H?=XB`t~fO<%E!W=hp;qgao&``(xK#5U5W?fJ__K(PNsHw{{)NZv?kN z*AaJOXl!KqVO)0`$N?LUkBd`N)(cD-K+zTJ-hTKk_0of%j$V1w$P2%_>X74pu==~3oM{ii0Ea~Jl3i^6ZxB^#Q5Z&cO)oq0W&>DViN{qW;2U;V0?(?>qr8|r;s`uM5> zuNGi_jvWkrsv6+83j}0)OVK_FR(rCt0@Ofhr?w-a?kP1%V12F(%sAfO*|VZucWAM! zzH_uxBFbxDWx18YG=28$XB37 zp~He0@$G1XnemRkCHM&IL|&3&S_)=S<~|nA=Jo17)qBJQA@RH2(LP)v97!bjDF8g& z?i$$ZxUFiPr6T_lq#45XI?*IDpK7*SdK4{Jq!L{Y7DkuDO{eojJ z|Me4&yJGd99Dl`{%OLnJR8Ix4SRgYUj};q!SmBWXMYjH@E#KgzuZAEib10=qQ>z>H zqQD}i84QfjW~lVYLI4wR9v^d9yQG19T7c*A zAv8v$q#X|r;(&+`FNF*~J0l)f=nysi@#cXOE(}xHR@66UyF5N~M}?HjtG8u7%tJXg@77Wv3T-^oq(r9fMBdQ5aXmH3p{r*ka+j<#llMQdRFqr2B-2nGJ6w@< zj3j+f?EIW~`Re0NxO~ke!=?9qg`R<;&xOeTVOyJ_)37tpG;PbX2H$p30hgM#(E(Wc zV`r9Xaz1ERx6A%%LJ=>#>q{`(ZKTv6ZOUb7uy8i493MoeLb(&A%$y|LycNd75i0hT z7>cgh!tVs<);7k-}i@C-1Y+%`5FW-P{jg3h5-({YiUwDzqh2&ud6#utq{?bXb7qRW?QJj zZl-veER@6%M#l&=3pk?~V%%m~@OtR2t&Q~|Qnw%7u{!O9X}gWv``|!H3J9bzJ&3(6 zr1gqRRd;|6wIJToT6L|7rbbIOZak`yM(1O7=jD%0?`^ry30M5)S(^`h_VO|`?LrY; zEYSBB)gzO&1IRF4@UsqooVnSItOf#D7l9Osj8O(8=%$+|} z+Y4!4QBTr;@J@#^@vF5K#{zS)!8-h82^EDlZ9XLl{oCt)ntr{_dNcLG(Q;SNetvelv^7}+do z*^iB=Q+@YS;iy6(Eslt^qYp=~TsicISFAbsxU1GY_k=6g{KND)vu^A) z&4&R!TorTdJI;w*!wjhP6zvN!QnQIi*KRqg`3>|Hl!OWY%)lw?dsK9#J5`)nEd!ym zC6ME?J0)O?$gB1u35nP~*R@S%amHjzy_8o02 zL=D_7b1mahk{h-*BI*oCyOYgJ=gG&*wDYA4ExA~~PU0G$1@F08#m8(-W;8|y13 zSf6@K50tr6eR@@G0uCyV>Lzc^RanRS zZvoI+s^4c7Zc{OOn-VGm zqD4dNzOTYO-LBV{_ZrX=1^D1L^p1QMAuz1h02Qm7Bt8j*SF~L~JtbqQ={~yyz#ig8 zs*|QrrdEr1wlB@w6%YKuk~XjHf@_9{SF$XfqDNIGQ;|BU%V*C5IfulH#ezIQsngO# z6ZITgpmBNP=iK_?1e|882aJXn%{@gRDjfl46!>+6_?dT-j$1I{qH@-~fnsQp;N$G`&=3 z8I;Lwpk*wKn?qJ5$7JikM;f}15932DM|oq6xEI`NRP)K~$vGd{6J!>&2rnUH++s=c z*p!jm?rA#y^3{K%!21Nc$nBy4)b{Mms7L^$xI|4_^tDJGU~yWVg9s;#m{M0W*8Ozy z5Aa&f#cCDY?83Y9kBopMIJK`3(JOBn zIsWq1|4SgJL3PAU6GM=OMo!8#?@&ANtw>3ijk3X5)tK18ef}2mGjfHstry#%>RPqB zR%n$C2ksQLX`2%l#5UP*=B;Um)%R?Kf8I?iNJZ-8?3oWmfyor%Tr3RMrHc_|vFVL& zz)viM*uv+uJxg<^kNjx^IR*A( z4gw+|A~!`&cn_PV(Ky(B(Pnj|2|$?5h+U7Qt@atTbcmY4RBE?zEWmn=-5&2D%&n=! z&mG(bRXPC;Ls_jaMJ#RXIysS_hqx+hdDw=rG8p=aL3n!e;sfy|o#R0TO>4fj!azJVDeih7d1=DyYY)YY9*6ZlA zD>~tj0%qD2PdZUIta=J$MQ(a61W|RW;HWhxHZZj{$n8p1OQw(!d`(Xp6#>CzV^jHqbg&jxme^OnjnBUYKEylP9 zd_fykb-=`@Lr7df{HvJQgDKFlKU%#nnrW8_FoU2oA_{4hP^2GplovK~`&G@`ol)`% zaJ7iwRvuH1&{0*4r8k^@*pu(A2RK`Bh|LcZ-DIZ(6o)wHxKxFi54&JDl-WghzE+Xf zYJFvlbKEf#5X87bCsa!d05Jr$@WUOZDz{&U+Kn(C50DL2(<{WuFm*P8r2RMMJ5lah=aderl zrE_CHU?;2NH>12J#kB4{oYJWn4=IqMm70c+S&6ZAW>(qL68{>b6Zbu>QwOs^?Hg;( z-+jPN5=e}tr{upuvevqeNWNFm+hK4Av9Hk;#N}ebZ(buazm23UFmd&2fQbG{7PSRYq zjUQCo&{5Jgv$J0#6TfaK%$F>}dIjsh{*&r>00Hck_X=(yhRn{KASDruo>urBEm*hi z0j3}|{RF=RK>M_2BAh@})n$Qkrv%Kx+~ca?j%I$Do^|VBnI>38e^kW0W^fyHJfM$L zG|^Plz7l2w^M}Bab2?EWe$7J4ue!B%E1h`Nt%pMOD5}aCzAoSAWZtV6(527GFxobO`FLp;L6m5uZlXjqf74(}WnJmhJ?&t*&1VBBja4 z?T@-}TLAF40CQHc)?9kCg(=N@-echB(=$dKy>f^gQA~4o(S~8$qmN9DcQ3u@2dfT* zVsYCVRV`u1j;hr_iP0Y<}FVJn|@3`Dp5`k>mZ>2<~S?AeZe5D;A( zx2zo?bJU7b~VTk5T2^ukc9eGnY(9Nt9J zHfZReaSKv>9~f(~S;#(t6n7t8k{F;LR4IHy1-}q5ach9FGVPJ+cd-EeUac9p6{W&2 zld(eEW|wT4)YPBpS4(-^s)@A~@RA{iMWGFcc+_qQmTk(QXcer_Xl+|<#?-t!c5eJS zWiVcOvJMr&n$}du?P>MM-WnP^yI|>F)NwLDWQi%NUV;l8XQHagMRgssX~2JO)K$gB zOq^Sg;1E*>!Dm7#a=zMeL=shE#^qGC$!mhCU;6t)wCBdnfOp-5O{BFd1`LG;WP^|G ztawwWJTebAEOP)=%(uy}6X40<*&FN;1J|oPt{rsLXNTZHB zJ&q%G-IgcP4R^-4P&@YCBHmQFDHm%HXB?fHL86KSj6ip(fN(zVGR76TPnzgl4k)E0 zo5=OSG3SArhgP;wpcEfV>|(KM9du{K7%cq`Fk+jJQy6QtlsqBSxHzi0OO0=o0Ity* z+ywrJ#6(e1>A|Hk3K`naBM?}}CajwKa%c>NQNNX_+vN&wq%^1vfOrO>^`#)!TrRWn z^njU1T(}$r3)7VLFh!8C>QOb|%I!(rm?qRtusUw@*+v^DotayJu+ z-6GQ(`>1R6Ov-*V{php{s}>44s*1d7gl^9hLjK+tBcGNX4j~K}%Dh}B`eC@z=gyo_ z!Vi^a8jSiL01eRE0#%yHv>15fTBteiJ(9mFfzyg?fbafLJ??&lgZee&!3!yC2oSo% z+M$a`ilALV=6K3wNh%W>F{ZGd|CmMeX{s}2!N%xnsB#BuC5Y>nM8p5gJ&0n;WXBdn zB9JufkW#4C<0;Rm@apR0c+>=u@Smzxu>o+Q=DPBM4&2$85E6UUMkUuCL5?^!vqiwD zyD~N+vop=peujesuI7v3S3?*vf?C(ardyo#)bkVTujV?|$^|zEGV!es8a&i*9>Nj2 zRe0+_D4X?M>(|mMTH5{cQKouOn@UVJ>eAZ>bE|DZqmI~}g8H|r-Sf)Q;F6|DFNc*| zLKbe73_amwHzmywp083$1C-PfQ;dl=!83p~e1NvPrR$CrQp8RR632oaTg+nfFlcq2 zsB3X7bgnG3IxT#ej$+$|3ZbF%BvKdVZcppN!EeV_H;Jqo94ukp{1y-SO@NvcXMfz4zDS(<)mmwFkFy9#>$23y>Wb#a8r zh_x}HdF&r*k8K-SK}gF^{UQ{`kZS;cp1wn#YFLMrcZ_9XNwwm|sO~G83OcqhAtyKo z>cjldHza5{z=X9=`>%r`cLs3{nvvL)&lV5b!D?hRL>rdT#?GGwoU08Jt~dBMt%#ut z>g+U`Uu-}G23qpfL0Sbh`80!+jeQofOErIrX^m$BfxQfuX$>M3^2lxdS$)b)(X`ql z`cK@=Hms=jE?I7M!Waxvy?srJ@G-&Ub8Wc2jn0kNQUe=6CK~@i7EA%AVpbNRo_Sd4 z%>|AR%5Ebv0D3y&LuG2>Tb!OA85eWGbobT^b02EWyl2Y9!?cL8+?y>c9*NZ2lsvuM z!O3PqV5yzaY^55>5FFs+NDQ>u@BNB0FQh|x+8FC1ARdf!3}+8u+T_792H}fKg+Dn~ zuh~bcYYl9qxlBc5ww+Hf*=B$#BrF|ctcqaB1%C{2!bnB5I1HIT8&XY(NLHvQQ+3Oz zyliQQwMe^4Y;E6o<^bI-0EKevF#Sck;ExoOg-K<7R1Ip#?c%W>L0x^1^$428*)d^Q zq%9o8E;3cb7VIJUsOR-S>+xtZvp?5LCk7|>c0tuD+bEN=TAmfM0e+Z9g^_}CICm7mBIuu#`U@y zXsWn1m$%C;-T)oQDvPTj4NH`}P3|bsj&o??qog)o9~LJBamQzQH)XIHp!}-#hcwI> zcyd}^vHxE^??q?N&*i(5w3LWf6&O^qV{ffsI*N>MAc;c6%t0Qm7>K`> zC14X|ZM5E&AWz|}=;x;Kwv1{?kEzP8TYUpQapE1Prq(`YAE1HCO`STFGKySkOB$hMs8dc!2yln%BwTzpyWQ3jPh#y442AX8`+$ znypvU;Kd@Mn`O-9n@FmC5UCmux)Fc@0h`im+^Frtrcl&J{Mu7E3}A8R&FeV0mElbl zK)sU+(-y%@V|Qe5H5&LWQ_AhF5y59*a6lQ0c(5<7`{hUzQg_BTanD%v>CHh8(`0KJ zvFr69Gj!lbnOZ@23(T0BvnlN5xXn$9b{gb{5kQ*8o=Na)X>4{N@RrPC7c`qPOhcxpK+Lb374pCqwodHFBCZ-zXpR_=GjiJ`2aK`9hsq)O)zFO#WKEI)fS)U@ zf7Y)f>}=LspkS52i%2uAH|;k9y)H-k)_52kf>Dy*XIp_x1LUzl^SK_HyB6#_fBTpY zuW1zjM?{YiV6KQvPdVOwQn9#dCzPaU(RgaI7;Xg2CBmc=yA7(A0=2ap*GxG+2e8bn zTlHEEtIEtb!iwMUu`XyQRtt@oajI@Kr7l@4rNwEoa2U6>ch76=D^8QEbC&R3B|8rZ zTwbe5`B-3bSszLy$I$A5$*tBP!`RsvexptXlD&PNiKI8w>LFnj>WJg8dd(f@ow7;L z{4;+GkY6Snml@RTNX4s!yI-Kx7>xv7x9sy$I(XO3{w0KfX{ z(bq1V@nsSHCHb&Y?cVhq3#9tT>+M;hCAJrMAgu3;x=(V&*?^V$58Qh%^~p+A&A%@^ z5u_#fyKYDcRDRL2&0K7yu!ePu&~kb);D@r@uic3dUwC(((Ph}#0TnPMuCQQGaqsN}C7aFPEt@9;0e$;ui+6?~dRL{J%BSl@*YL%#J!|s$T zpPv8N8%LqjUa6{^{89pYn6@fp&;lJX2S6CJR@^h%Ia1$wt$lZ^)Tx?j!k!=kjdt@z zc(w^qN9ASMS_RA8V*e)=piHZ6Vuk6F6N8bbD|w41EncHPJGH(51AxnC05y<%U4k}A zSyRhwPlCABpG{_|z^My5UUZvD5|~`w70ju;CuIS^9D>z6EQY+AhL^|^pmvZ#{yB+t zUp(b%03QG_)~*C3x$WOBpH64Hh0-HPv`+T=nL-hj@$*h9?&j{vetoLc<`EF?lkfH1aQNa*fv6Mt0rPK{DP+3do6@PXf za=O^8Y^k81R-r1{NUT2(2&Pc#)`UwNA1y(_KD?h6Myl@8pUJD*eT$Sz|NkoVI%_y6 zYRXn@VRw1e0Oo22WZ_Rw_v1!dm=rT+^6>~&04EN6i944EgfGXCy zWeFP=jTbu&jvKpZH^;;s%LXQvf2-?Tj6o$|cTfUeXKOkW^LrDbl>u3M>)nN+e%-OM z!xEAt8zrq`9FvJzk3UA1P&{4yan4@GiKL!F$ ztfGdHRXyFeLICT|f7`{4>T6YTTPm&{x0Tu|PV&WdFLL3G)BSpJRphs+TLE<-5&fvu ziCzUXfg0xEOcfkNt^^l`%BtwBtOQcudSEXDwkq*TL2KYfRSUH?TIcKIHXyPE<*}m3 zi>cgG^q)ei|BjmFRRpl~O4)&2>DhA`r;keE$K-hWh zv)i>_%QAVNEc4l~MFS210BbKe^7X#v-U&Iu@W#uAE3E)!=|@8iB4001^z@Q(jnze)b5LQYob^{~d?g@PXG z_0z1{qG+?T5t`Y9Dbtk(P*K!zpiDHsRc#MY7%7Vt7vT{r>4DDbcg-yh@+q@TwPJmx{-|K+TLXi`%nf#uG%$?g9A00ti3hxKCFtlIbG0&GX|Wl z>WK0+4#)N4Wp%;JH5m2B$dNG_(4*+qV?y$<4_U2PNexx zQQXRxB(yqD%F9K(?T@0+tvBDka6s4rQstB%HV{};B7Zv;*qY7W83Sp(IB_DV6k#&M zL2`GiDp?GJQc(%d)6G`((?m^)oYyzTcFOX)yTJjPL-}Y!G4u*wj5>O1>KcYIE^+Dy zsjpCF2tsyka)h%yBr(8-S9`b;t7?IOlv$cSYcDlS@XW?%b*+pkr45*u?UG}i=hl#$ z6=JVNxnH#Qyi-3V)8!9Q^dyD87QjD>$j`WIR3FL;`E`Rpt^)8G0sgcn@-aMZ?P!PX zxD@{D8!w#G%?f4}j*6B6c6yDmi&UD1UkMKVg5!0#1%(DwxmySX2&+S|CNb||v-<}& z^vtJPlk5#0xnDyB)Ie6VEn?Ay6xF(*%#ibV?O(DBZF?tNxKr&4e>6JQ39V;{Xdf$= zoXarHifZ*Z0t-hR{lHjJN6|^>ll?d|cO9*Pg8_?ee@n2aJbdYgM(!SMrt5HNhQ^x3 z{T>z%LuMD~9iu91QF?2KhVL00*|KGH%@Np&GtStlo3$hV{mL&v!a?NvgGs~hD7z4;pIpEelvO#~dQl8m$X$VVmAxm{@* zg?wcD@aA_;umgM$(2+KnT*#`@u%`jh!Q;@W*BC*Y`aDp@e2a-wrw<}ANy2M!chp+c zAfY^M0Uew<#MUeBbOSss(pMlQ2dKjPtmqwE#h4}Bc@kgyw*&A@slN4Nwc#|dy0Il)vSKxzt`brQ@>&#{fSS306=VE31!l0`j2Tli)Z9%y&Dd&G(B6D z$c(l=V!zHqMRXXHj&q|(MT_#edCG3rOg^?1B~sYN@|@_?hUQL@z#nb7?tuDv%!JfK zE83GUWiT#j$IA4eyiSq4w{cP|Nd6<*tun=8KLkI^CanXY+R(h*tX?f*HZX7Zir6zF z@*N47EyMuj@iev*2@{XH)lmbwv}y%>@U&6YaoOVEhff`}9ma#8)pcGD3i0=AM*Zl{ zAVL1=YmU^m&kCO6RE&}fg#g_$I#Aeb0v(*B7$jT*FHMIEY8MFGdVnd+`h48fu*({n zbFngGAfC@cej0RgQV5=-x{X)5KSs@Xu~RFIT_-Ii@)w5)0p2xd0MvqIjYw@1Aw?@Y z4PZMCtXM3CYTZa_LB}8V{#HIJ`yZY>c*T9Il?qxy;d@ zA9FTrNumA^1*KLyf^sxPi?g$>P(-8=a29i?2;ViXOj}LX$?X8z(vd6L3{%s8YM~xa zBuUd)05ak$J!wzoBwMeF)H6!&b4 zBLg?WVsaJ)e-4^*xhkOcZqU7gT1tcoZ)MaTtuf(KK))2rPgGsO;>nMZ#y>EFGmH_O zhTB>}SScE%*?^w}n!82{Zq|UR$XlA8-&+9oHmnb|I~jH&CV_KwHM&~6%6FL@MIEw{ zI!Sco0Ce~cgm$GmgMSs+oxwY`#1aX}S?;<9w4A^sa#!;*?|-jw0D_xVGV^$9&B_(4=)-d56;24o)D9B8S)xIU}Wer6IbV>h-AWM_wm!qHYuj92;w|7W{0j zLTHzTa z%@$5unI@;9H(#&N347VG+l+YhI)2eQ$!)?B{7>z?s>%u+AN86^&4qETZoHMAVjXeC z83JV?T_%ptc^d<-T+?#Jw?9q1?$kS6Ezn7rVjw&+!SX~2%f{&SStW*@8 zWYRi-qTFf+p)OOF8_ULAjbh`4pm{XL)(uDbZYC8GE$WLnmU3YW*Dwv3+64$(0A!8y zL4yUmFqX3kM?e@oMP#2GXyD-Ox}!1;R1Pw)#eX_t8&Aq+?VWFGYZRC_=ct2Cbrj}Z zb`Pa00sgd0t;XI>)D~}ZxOn`_cXh(kt$%)1v`VTTi`aZJr$B<+lCcsI4HnJ1#sCD5 zAD%XRLZ{JgBMa{iew$5+8EGwW-L4i%HH_w>x~(;>>-=)A*d0Du!un7zDtO12EsYa$&^M87#%#%4-M@ZeNd2|&WN!cD zPCebBZYVFCc&9=;n9U}23MBY<7uf6&7sC2f4AoWtROD}`zvuD^SqSj8DC!ZM=m|C3 zX`PPg3BC$TN ztwPyQl9{Tx;2}NZDlA|ozeJrLd#Vu^0OhxEq#@qYX30}aHv8a3+Q4%LC9d4-ZN84W0#$g(p!0mswm%`)DAGZam)3pxKg!f zslNdm*s+0`hcl3wG2^<00aF%w3QSjEI)GkPt6OR(-znPI?-mdP1dlNjH+}#Z{%2-k zqZWQ5(pTGAb#kr{u$;VB>7vLOtE$?<*;bFNsZ7^(mca1y;*6VD`S z#9PdSE@W>Yoj(oh!tQ~xAymoF%I zht|N?HmcvKa`N=S_(Su|QVmXkz|k_eE0n3LO5a7QzEFYR5izTnxNAF!_h)0#qyo+~ zp2pZf>NY3;RbO8?w!=*f4b-^}JP8aJr8-Z{$ng6Q1s80&bKB(I1#%kQIP!%?<=;HY zwqZ~;^Aa^%$N-WgfwA^u3n`k{11Ayy>dfR@Cz2#xJZD$>QlWOx8RcvTm zsotak)x_fjY&W5TqmLlsn``aJbKhisV=AszFe}k+;S3B(sF63}HOXy41b-LS#?~52 zv@yW>ozl*qby(Y3zxKi@_ehg5QY88^0Ujt!JX|&nb%rx5(k?=lr6qjThxq*jDSU*^zYdA4X9oS`{`K@+;7B$ zlEX4Qk5Zmei?BLsRXT6lyI1PN?9*-{2H+|Pd`H58pRc=RY#eD9kfdaoM*@y4ck4ct zt2yF4pK{#TadHZyR?iwIQ&@T{ylJU`#E3?z3{8yV;6DQ3rNn zQG`5&DH5cnm_}k#Ma%`(6;-VOelShef6{C3H4cDJAG3AV>{)Mv;Bx}q&M4|RV%rv> z4mS%N9@OZ%XRS;b~MkKSe~R*qKwEKmqU z2aBj(xwBgv3ymI^-PhPz@ZgZ>%r^`4Pp&!n@a^7c?{NSC8_sz0`mveQ-w0{muNpt? z+TH|reP~5WT%s*`xmquSac9WaW**%W8OZ#YQ#kq8so5lRC+4-NWVWmL_i_cK{jQ!m z-jFA~uaf}L6kh$oJ^P2!t94@OPcRk-o&DL{_d>2biqyXkhXMw!ts+++MJA$4%Q4{PM(W3ExU4L$7p(zB^{Ya#xgee*xifGa!QXYm6Xmd~43wN> zjS8?&K}`h{$k}(OfGi|;Ws3}JV~ZR4>H&)n_!3T*zBj{O=>RY%7(45kXR9_R0{A9? z{0<;-u$%sbMv% zW&IjGT7tRwHsH#GZCH;XO--v_$xcOqt$o$cZEgC0_N`-N;OD>gP6r_M&w9o;M}}v< zqCj3(ivBx51&8r#WU88r<}I56zz}xwdo(tCTQ3H{*pcx6z;uJS1d?6U#dM=PysVNn z<}?0Qtv#K?qdBGFB?GJnZdgYI7g+cuXX?c*z~tg zxueX!bVZrA^$%3bO8~vT!i3pE+OAH-9SA$_T-zb37Jehl49=*kZlAmy$?MT%9ZDAU zWT06EfQ_MzN`fb%c>p{X+%+V6^PK8f1NG5E(L!>L>(T0NJ3bw>64?YlfSzZ=X4OBhENxV4BQy)Yn$M z8PYow&=I$XMLAY*cObbDJ7h-8)oD04Yi<&}*{+s53hdM3C&Ab0lK>LWoW|#45GU}> zPY5`x>AbznS=gz@W6iY;bY;8YMezFL?MYy<_T*fr4OHNR5wB7U#02) z57mXv(}{4A0W-WjdN6m7Z)J#n?S)dUs;xW%umt3wr_J zXGez014NsR?nwwzY7$$WEiWUBp~6u1C)un0EatG0&|xb&+Qt$ z%qL1aiOi&el+J~LK0{nP3)JVn4exvav{ee1rTTAW$ti&Y4`&z;uZ;KtU>hJ8E6P7k zYlc@|bMoRHM*U0!45#Sc>8P)*db6TAQ$$AE(b36wY}}OfIw7Lq%Vk?&af3UL_LoqC zPXeK#D?ejz|I~13Y}=_0MF^yI#1BBRT}5x~@uzmR{m#u4h~6Uw^8xvxdwROY8b&^A zv}c1aNFRSSvQP8tpT1!K&E0zz_eSl}PtkqSkzZf^CMeDlU<78I_B2fp*%YsKL)M^N ztwLCI>U9AgHPfsC#13CYMgYpWdc;OTAsab+hp&^1A2U(%PjdoC6}zFV9>7z%%S_I7 zvWxVrCCK3H#>*yl9iNY`FTiSrUW=x=V2h5Ox9a7OSlec>^R(A5g7-M3?+sKlrVqwn z1*4cn=?ZK%@;GNrxUJ-DGJ1lIlSfM9k+4&FRsN14Zd=ucF1s2zP@`*QKUUz;AM8J5 zRaGEy<~8SG*Zjo$vhE~!8M0ZiDmC&RJJZdj;PX)ZuPEij?OR4)^ox@pcJ6NjeoQ&Q zE|A(6Vqj*oygrQWAn>~Ui&Q4>inPG%X^TZ$pAD=|fF?&uKV-UPe4}4)X?U{8%Re=7 zYF_TLY23rMevFxIGpZ7-3EQgnWpp+Eb>L#%I$IagdafdJU@z_cg=ctc zP4jjsH8bSYFi$APUFNQxk{{T)6($~bNI$5#Hq$XxRcZ2W4R~)))%}_*c}|A4w-AYa zM;XUm#Yvw@Z0Ab`X-`09Yf-(qfnM44df(WjqZjUI4}W*ilmpyP3I_m2!elu`s8e_~ za)-JA_A}LCYt7_H(ay-%{W7LdUtMDXWSv=^;wcon@wUc`)d$Kvk;)SKzJ1RBNy;oIWUUU1 zG| zBh-#&ar?1u_{r@Jc3(2EGNJWOl-)MntUilOc@qkGti?7EX%2$7m_Du z%=ZES^ODLxMD^*yS`Uoh&-|J~?}Rot1Gqw@f5DRd9{%m|p3&J;H01#Ilb-UGTVE)^ z`4E{Mp)LX6DKGHgTbUK*yub+C0(Rx$6h*9{_I9||wq_;+v7?l!ORZQJ13=3$BK%WM zE3LDLHBMfWIv0f)zZ@GK3yJ*S*?k64bl{H5d=%oUT``X0} zb4R-$7}9F`6H(hDa;zL%4&jIoIQljxe^qjjS487_Xkw_UHjPLrImgcssH^u}9w`$& zi(8sq zmKrhbalhl$F#&#~T5f^#z9B_EbNws!znMNeDQU_9c7dM!mDOJr;Dn6XHn2M9c}lRH z8Fj-ug=$haGJD3&6C*l93b^eVrTs=2WR!QEuC}X^vND~>OImE})FiSEic3`W-x}cC zTefV!W=}6>ca^3bU>E4g7v6e`h={oFSiBWdKa=jl&H-}XQ*Xm^FC z9AFpd374#y)!SBX17vphnnRd7KFB&YxJ5Ozo&z%Q!vI)e>TM$clc8g|0@W~EMhms z9NIvDsTOoo?L=+BI}|;?F%}(Qn@6y6S_5PW(o9g>Mw%6l$a2+Ri0Egf^uO0k?_GcO zPY$?sPdtY+8EDD@ehWJK^p!*FpY-VWLwfJ<#}44J+0j?`>RY;I9YF2-0yPq|ZPfE8 zLkB?1^LS#RwO(jD4V^3Yb_A+A2H-Lk{nYgB{mZ5u@`z3Uex%&@dtn}AH01!hfu8u~ z)fcPi^Pp%fe%FW6GWZ>mDc6R1fde0iO&53#r;2~3K&eo|bBO%vDBi1i$DM#&uciE? zhvDVdynJ!%Eol!$nsR{MK##lN=HKZx!=Hib)7$yK)^vs?K;89$h2uJ71i0IjCX@tj z_)GxA&8_Sd&P%o`^m_tX0WCkO;ZlAJ4jWYaKUYlL!(~<@Q6r< zM4+X3Bxcn2M;dZ-$7~dO22(eAQXzqFjkvhrnwhl)3T)O=&PUVxKNueR_v?SW&pi*7 zy#D^slmqNWdcuWk4n`@TQs5bY^ni-#)}j~;&oyId;WtJ60TYco3qTdBeL&WT$aSjy z^QRAwt@w|rNPnL+Ni|h@LO4|a9OuDXC?(% zrK&${nr1~`<=SnVw%o9{JclzGXvzU5fS&$^TV~ud+K9dcuXjI=GAuzY~qT0Kg+u zF^$u+_Zhp!|(a!@s0l? d&J^uN`hU7^^ISb-=3)Q<002ovPDHLkV1kd0%ohLv literal 0 HcmV?d00001 diff --git a/installer/PowerToysSetup/Common.wxi b/installer/PowerToysSetup/Common.wxi index 4d64a0c63c..f036b3797b 100644 --- a/installer/PowerToysSetup/Common.wxi +++ b/installer/PowerToysSetup/Common.wxi @@ -18,6 +18,7 @@ + diff --git a/installer/PowerToysSetup/Resources.wxs b/installer/PowerToysSetup/Resources.wxs index c4bf93d59b..0f4e10f4a6 100644 --- a/installer/PowerToysSetup/Resources.wxs +++ b/installer/PowerToysSetup/Resources.wxs @@ -449,6 +449,15 @@ + + + + + + diff --git a/installer/PowerToysSetupCustomActions/CustomAction.cpp b/installer/PowerToysSetupCustomActions/CustomAction.cpp index a00b6bdad7..6e931e4749 100644 --- a/installer/PowerToysSetupCustomActions/CustomAction.cpp +++ b/installer/PowerToysSetupCustomActions/CustomAction.cpp @@ -1223,7 +1223,7 @@ UINT __stdcall TerminateProcessesCA(MSIHANDLE hInstall) } processes.resize(bytes / sizeof(processes[0])); - std::array processesToTerminate = { + std::array processesToTerminate = { L"PowerToys.PowerLauncher.exe", L"PowerToys.Settings.exe", L"PowerToys.AdvancedPaste.exe", @@ -1255,6 +1255,10 @@ UINT __stdcall TerminateProcessesCA(MSIHANDLE hInstall) L"PowerToys.MouseWithoutBordersService.exe", L"PowerToys.CropAndLock.exe", L"PowerToys.EnvironmentVariables.exe", + L"PowerToys.WorkspacesSnapshotTool.exe", + L"PowerToys.WorkspacesLauncher.exe", + L"PowerToys.WorkspacesLauncherUI.exe", + L"PowerToys.WorkspacesEditor.exe", L"PowerToys.exe", }; diff --git a/src/common/Common.UI/SettingsDeepLink.cs b/src/common/Common.UI/SettingsDeepLink.cs index c3a81a49a1..41bd2c012e 100644 --- a/src/common/Common.UI/SettingsDeepLink.cs +++ b/src/common/Common.UI/SettingsDeepLink.cs @@ -31,6 +31,7 @@ namespace Common.UI EnvironmentVariables, Dashboard, AdvancedPaste, + Workspaces, } private static string SettingsWindowNameToString(SettingsWindow value) @@ -77,6 +78,8 @@ namespace Common.UI return "Dashboard"; case SettingsWindow.AdvancedPaste: return "AdvancedPaste"; + case SettingsWindow.Workspaces: + return "Workspaces"; default: { return string.Empty; diff --git a/src/common/Display/Display.vcxproj b/src/common/Display/Display.vcxproj index e69a2ada2d..87b74ba534 100644 --- a/src/common/Display/Display.vcxproj +++ b/src/common/Display/Display.vcxproj @@ -24,15 +24,18 @@ NotUsing - ..\..\..\;%(AdditionalIncludeDirectories) + ..\..\..\;..\..\common;.\;%(AdditionalIncludeDirectories) _LIB;%(PreprocessorDefinitions) + + + diff --git a/src/common/Display/DisplayUtils.cpp b/src/common/Display/DisplayUtils.cpp new file mode 100644 index 0000000000..85f9c4b1fc --- /dev/null +++ b/src/common/Display/DisplayUtils.cpp @@ -0,0 +1,143 @@ +#include "DisplayUtils.h" + +#include +#include +#include + +#include +#include + +#include + +namespace DisplayUtils +{ + std::wstring remove_non_digits(const std::wstring& input) + { + std::wstring result; + std::copy_if(input.begin(), input.end(), std::back_inserter(result), [](wchar_t ch) { return std::iswdigit(ch); }); + return result; + } + + std::pair SplitDisplayDeviceId(const std::wstring& str) noexcept + { + // format: \\?\DISPLAY#{device id}#{instance id}#{some other id} + // example: \\?\DISPLAY#GSM1388#4&125707d6&0&UID8388688#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7} + // output: { GSM1388, 4&125707d6&0&UID8388688 } + + size_t nameStartPos = str.find_first_of('#'); + size_t uidStartPos = str.find('#', nameStartPos + 1); + size_t uidEndPos = str.find('#', uidStartPos + 1); + + if (nameStartPos == std::string::npos || uidStartPos == std::string::npos || uidEndPos == std::string::npos) + { + return { str, L"" }; + } + + return { str.substr(nameStartPos + 1, uidStartPos - nameStartPos - 1), str.substr(uidStartPos + 1, uidEndPos - uidStartPos - 1) }; + } + + std::pair> GetDisplays() + { + bool success = true; + std::vector result{}; + auto allMonitors = MonitorEnumerator::Enumerate(); + + OnThreadExecutor dpiUnawareThread; + dpiUnawareThread.submit(OnThreadExecutor::task_t{ [&] { + SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE); + SetThreadDpiHostingBehavior(DPI_HOSTING_BEHAVIOR_MIXED); + } }).wait(); + + for (auto& monitorData : allMonitors) + { + MONITORINFOEX monitorInfo = monitorData.second; + MONITORINFOEX dpiUnawareMonitorInfo{}; + + dpiUnawareThread.submit(OnThreadExecutor::task_t{ [&] { + dpiUnawareMonitorInfo.cbSize = sizeof(dpiUnawareMonitorInfo); + if (!GetMonitorInfo(monitorData.first, &dpiUnawareMonitorInfo)) + { + return; + } + } }).wait(); + + UINT dpi = 0; + if (DPIAware::GetScreenDPIForMonitor(monitorData.first, dpi) != S_OK) + { + success = false; + break; + } + + DisplayUtils::DisplayData data{ + .monitor = monitorData.first, + .dpi = dpi, + .monitorRectDpiAware = monitorInfo.rcMonitor, + .monitorRectDpiUnaware = dpiUnawareMonitorInfo.rcMonitor, + }; + + bool foundActiveMonitor = false; + DISPLAY_DEVICE displayDevice{ .cb = sizeof(displayDevice) }; + DWORD displayDeviceIndex = 0; + while (EnumDisplayDevicesW(monitorInfo.szDevice, displayDeviceIndex, &displayDevice, EDD_GET_DEVICE_INTERFACE_NAME)) + { + /* + * if (WI_IsFlagSet(displayDevice.StateFlags, DISPLAY_DEVICE_ACTIVE) && + WI_IsFlagClear(displayDevice.StateFlags, DISPLAY_DEVICE_MIRRORING_DRIVER)) + */ + if (((displayDevice.StateFlags & DISPLAY_DEVICE_ACTIVE) == DISPLAY_DEVICE_ACTIVE) && + (displayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) == 0) + { + // Find display devices associated with the display. + foundActiveMonitor = true; + break; + } + + displayDeviceIndex++; + } + + if (foundActiveMonitor) + { + auto deviceId = SplitDisplayDeviceId(displayDevice.DeviceID); + data.id = deviceId.first; + data.instanceId = deviceId.second; + try + { + std::wstring numberStr = displayDevice.DeviceName; // \\.\DISPLAY1\Monitor0 + numberStr = numberStr.substr(0, numberStr.find_last_of('\\')); // \\.\DISPLAY1 + numberStr = remove_non_digits(numberStr); + data.number = std::stoi(numberStr); + } + catch (...) + { + success = false; + break; + } + } + else + { + success = false; + + // Use the display name as a fallback value when no proper device was found. + data.id = monitorInfo.szDevice; + data.instanceId = L""; + + try + { + std::wstring numberStr = monitorInfo.szDevice; // \\.\DISPLAY1 + numberStr = remove_non_digits(numberStr); + data.number = std::stoi(numberStr); + } + catch (...) + { + success = false; + break; + } + } + + result.push_back(data); + } + + return { success, result }; + } + +} diff --git a/src/common/Display/DisplayUtils.h b/src/common/Display/DisplayUtils.h new file mode 100644 index 0000000000..0b0e86e227 --- /dev/null +++ b/src/common/Display/DisplayUtils.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include +#include + +namespace DisplayUtils +{ + struct DisplayData + { + HMONITOR monitor{}; + std::wstring id; + std::wstring instanceId; + unsigned int number{}; + unsigned int dpi{}; + RECT monitorRectDpiAware{}; + RECT monitorRectDpiUnaware{}; + }; + + std::pair> GetDisplays(); +}; diff --git a/src/common/Display/MonitorEnumerator.h b/src/common/Display/MonitorEnumerator.h new file mode 100644 index 0000000000..c603bfee6d --- /dev/null +++ b/src/common/Display/MonitorEnumerator.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include + +class MonitorEnumerator +{ +public: + static std::vector> Enumerate() + { + MonitorEnumerator inst; + EnumDisplayMonitors(NULL, NULL, Callback, reinterpret_cast(&inst)); + return inst.m_monitors; + } + +private: + MonitorEnumerator() = default; + ~MonitorEnumerator() = default; + + static BOOL CALLBACK Callback(HMONITOR monitor, HDC /*hdc*/, LPRECT /*pRect*/, LPARAM param) + { + MonitorEnumerator* inst = reinterpret_cast(param); + MONITORINFOEX mi; + mi.cbSize = sizeof(mi); + if (GetMonitorInfo(monitor, &mi)) + { + inst->m_monitors.push_back({monitor, mi}); + } + + return TRUE; + } + + std::vector> m_monitors; +}; \ No newline at end of file diff --git a/src/common/Display/dpi_aware.cpp b/src/common/Display/dpi_aware.cpp index 2ed0228ae3..8397430c6d 100644 --- a/src/common/Display/dpi_aware.cpp +++ b/src/common/Display/dpi_aware.cpp @@ -1,7 +1,9 @@ #include "dpi_aware.h" + #include "monitors.h" #include #include +#include namespace DPIAware { @@ -60,6 +62,24 @@ namespace DPIAware } } + void Convert(HMONITOR monitor_handle, RECT& rect) + { + if (monitor_handle == NULL) + { + const POINT ptZero = { 0, 0 }; + monitor_handle = MonitorFromPoint(ptZero, MONITOR_DEFAULTTOPRIMARY); + } + + UINT dpi_x, dpi_y; + if (GetDpiForMonitor(monitor_handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y) == S_OK) + { + rect.left = static_cast(std::round(rect.left * static_cast(dpi_x) / DEFAULT_DPI)); + rect.right = static_cast(std::round(rect.right * static_cast(dpi_x) / DEFAULT_DPI)); + rect.top = static_cast(std::round(rect.top * static_cast(dpi_y) / DEFAULT_DPI)); + rect.bottom = static_cast(std::round(rect.bottom * static_cast(dpi_y) / DEFAULT_DPI)); + } + } + void ConvertByCursorPosition(float& width, float& height) { HMONITOR targetMonitor = nullptr; diff --git a/src/common/Display/dpi_aware.h b/src/common/Display/dpi_aware.h index f93e8f87ad..a63365aa2f 100644 --- a/src/common/Display/dpi_aware.h +++ b/src/common/Display/dpi_aware.h @@ -12,6 +12,7 @@ namespace DPIAware HRESULT GetScreenDPIForPoint(POINT p, UINT& dpi); HRESULT GetScreenDPIForCursor(UINT& dpi); void Convert(HMONITOR monitor_handle, float& width, float& height); + void Convert(HMONITOR monitor_handle, RECT& rect); void ConvertByCursorPosition(float& width, float& height); void InverseConvert(HMONITOR monitor_handle, float& width, float& height); void EnableDPIAwarenessForThisProcess(); diff --git a/src/common/GPOWrapper/GPOWrapper.cpp b/src/common/GPOWrapper/GPOWrapper.cpp index de987ed81e..08c896d0f3 100644 --- a/src/common/GPOWrapper/GPOWrapper.cpp +++ b/src/common/GPOWrapper/GPOWrapper.cpp @@ -1,4 +1,4 @@ -#include "pch.h" +#include "pch.h" #include "GPOWrapper.h" #include "GPOWrapper.g.cpp" @@ -176,6 +176,10 @@ namespace winrt::PowerToys::GPOWrapper::implementation { return static_cast(powertoys_gpo::getAllowedAdvancedPasteOnlineAIModelsValue()); } + GpoRuleConfigured GPOWrapper::GetConfiguredWorkspacesEnabledValue() + { + return static_cast(powertoys_gpo::getConfiguredWorkspacesEnabledValue()); + } GpoRuleConfigured GPOWrapper::GetConfiguredMwbClipboardSharingEnabledValue() { return static_cast(powertoys_gpo::getConfiguredMwbClipboardSharingEnabledValue()); diff --git a/src/common/GPOWrapper/GPOWrapper.h b/src/common/GPOWrapper/GPOWrapper.h index 670124527b..b0392cea1e 100644 --- a/src/common/GPOWrapper/GPOWrapper.h +++ b/src/common/GPOWrapper/GPOWrapper.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "GPOWrapper.g.h" #include @@ -50,6 +50,7 @@ namespace winrt::PowerToys::GPOWrapper::implementation static GpoRuleConfigured GetConfiguredQoiPreviewEnabledValue(); static GpoRuleConfigured GetConfiguredQoiThumbnailsEnabledValue(); static GpoRuleConfigured GetAllowedAdvancedPasteOnlineAIModelsValue(); + static GpoRuleConfigured GetConfiguredWorkspacesEnabledValue(); static GpoRuleConfigured GetConfiguredMwbClipboardSharingEnabledValue(); static GpoRuleConfigured GetConfiguredMwbFileTransferEnabledValue(); static GpoRuleConfigured GetConfiguredMwbUseOriginalUserInterfaceValue(); diff --git a/src/common/GPOWrapper/GPOWrapper.idl b/src/common/GPOWrapper/GPOWrapper.idl index 27c2420b6e..81ff61121a 100644 --- a/src/common/GPOWrapper/GPOWrapper.idl +++ b/src/common/GPOWrapper/GPOWrapper.idl @@ -54,6 +54,7 @@ namespace PowerToys static GpoRuleConfigured GetConfiguredQoiPreviewEnabledValue(); static GpoRuleConfigured GetConfiguredQoiThumbnailsEnabledValue(); static GpoRuleConfigured GetAllowedAdvancedPasteOnlineAIModelsValue(); + static GpoRuleConfigured GetConfiguredWorkspacesEnabledValue(); static GpoRuleConfigured GetConfiguredMwbClipboardSharingEnabledValue(); static GpoRuleConfigured GetConfiguredMwbFileTransferEnabledValue(); static GpoRuleConfigured GetConfiguredMwbUseOriginalUserInterfaceValue(); diff --git a/src/common/GPOWrapperProjection/GPOWrapper.cs b/src/common/GPOWrapperProjection/GPOWrapper.cs index f0c0b8421c..6cb91a69ac 100644 --- a/src/common/GPOWrapperProjection/GPOWrapper.cs +++ b/src/common/GPOWrapperProjection/GPOWrapper.cs @@ -61,5 +61,10 @@ namespace PowerToys.GPOWrapperProjection { return (GpoRuleConfigured)PowerToys.GPOWrapper.GPOWrapper.GetRunPluginEnabledValue(pluginID); } + + public static GpoRuleConfigured GetConfiguredWorkspacesEnabledValue() + { + return (GpoRuleConfigured)PowerToys.GPOWrapper.GPOWrapper.GetConfiguredWorkspacesEnabledValue(); + } } } diff --git a/src/common/ManagedCommon/ModuleType.cs b/src/common/ManagedCommon/ModuleType.cs index de57f5138c..6f15bc3a15 100644 --- a/src/common/ManagedCommon/ModuleType.cs +++ b/src/common/ManagedCommon/ModuleType.cs @@ -30,5 +30,6 @@ namespace ManagedCommon MeasureTool, ShortcutGuide, PowerOCR, + Workspaces, } } diff --git a/src/common/interop/Constants.cpp b/src/common/interop/Constants.cpp index 30969a75b4..63e9782346 100644 --- a/src/common/interop/Constants.cpp +++ b/src/common/interop/Constants.cpp @@ -147,4 +147,8 @@ namespace winrt::PowerToys::Interop::implementation { return CommonSharedConstants::SHOW_ENVIRONMENT_VARIABLES_ADMIN_EVENT; } + hstring Constants::WorkspacesLaunchEditorEvent() + { + return CommonSharedConstants::WORKSPACES_LAUNCH_EDITOR_EVENT; + } } diff --git a/src/common/interop/Constants.h b/src/common/interop/Constants.h index cc8ebc01b1..978ca8ab60 100644 --- a/src/common/interop/Constants.h +++ b/src/common/interop/Constants.h @@ -40,6 +40,7 @@ namespace winrt::PowerToys::Interop::implementation static hstring CropAndLockReparentEvent(); static hstring ShowEnvironmentVariablesSharedEvent(); static hstring ShowEnvironmentVariablesAdminSharedEvent(); + static hstring WorkspacesLaunchEditorEvent(); }; } diff --git a/src/common/interop/Constants.idl b/src/common/interop/Constants.idl index 72d9fc58a0..4c4125b7db 100644 --- a/src/common/interop/Constants.idl +++ b/src/common/interop/Constants.idl @@ -37,6 +37,7 @@ namespace PowerToys static String CropAndLockReparentEvent(); static String ShowEnvironmentVariablesSharedEvent(); static String ShowEnvironmentVariablesAdminSharedEvent(); + static String WorkspacesLaunchEditorEvent(); } } } \ No newline at end of file diff --git a/src/common/interop/shared_constants.h b/src/common/interop/shared_constants.h index c5d44524c9..5237c15737 100644 --- a/src/common/interop/shared_constants.h +++ b/src/common/interop/shared_constants.h @@ -43,6 +43,8 @@ namespace CommonSharedConstants const wchar_t FANCY_ZONES_EDITOR_TOGGLE_EVENT[] = L"Local\\FancyZones-ToggleEditorEvent-1e174338-06a3-472b-874d-073b21c62f14"; + const wchar_t WORKSPACES_LAUNCH_EDITOR_EVENT[] = L"Local\\Workspaces-LaunchEditorEvent-a55ff427-cf62-4994-a2cd-9f72139296bf"; + const wchar_t SHOW_HOSTS_EVENT[] = L"Local\\Hosts-ShowHostsEvent-5a0c0aae-5ff5-40f5-95c2-20e37ed671f0"; const wchar_t SHOW_HOSTS_ADMIN_EVENT[] = L"Local\\Hosts-ShowHostsAdminEvent-60ff44e2-efd3-43bf-928a-f4d269f98bec"; @@ -98,6 +100,8 @@ namespace CommonSharedConstants const wchar_t SHOW_ENVIRONMENT_VARIABLES_EVENT[] = L"Local\\PowerToysEnvironmentVariables-ShowEnvironmentVariablesEvent-1021f616-e951-4d64-b231-a8f972159978"; const wchar_t SHOW_ENVIRONMENT_VARIABLES_ADMIN_EVENT[] = L"Local\\PowerToysEnvironmentVariables-EnvironmentVariablesAdminEvent-8c95d2ad-047c-49a2-9e8b-b4656326cfb2"; + const wchar_t WORKSPACES_EXIT_EVENT[] = L"Local\\PowerToys-Workspaces-ExitEvent-29a1566f-f4f8-4d56-9435-d2a437f727c6"; + // Max DWORD for key code to disable keys. const DWORD VK_DISABLED = 0x100; } diff --git a/src/common/logger/logger_settings.h b/src/common/logger/logger_settings.h index cc1b3825ce..345286a38b 100644 --- a/src/common/logger/logger_settings.h +++ b/src/common/logger/logger_settings.h @@ -69,6 +69,10 @@ struct LogSettings inline const static std::string environmentVariablesLoggerName = "environment-variables"; inline const static std::wstring cmdNotFoundLogPath = L"Logs\\cmd-not-found-log.txt"; inline const static std::string cmdNotFoundLoggerName = "cmd-not-found"; + inline const static std::string workspacesLauncherLoggerName = "workspaces-launcher"; + inline const static std::wstring workspacesLauncherLogPath = L"workspaces-launcher-log.txt"; + inline const static std::string workspacesSnapshotToolLoggerName = "workspaces-snapshot-tool"; + inline const static std::wstring workspacesSnapshotToolLogPath = L"workspaces-snapshot-tool-log.txt"; inline const static int retention = 30; std::wstring logLevel; LogSettings(); diff --git a/src/common/utils/OnThreadExecutor.h b/src/common/utils/OnThreadExecutor.h new file mode 100644 index 0000000000..c361a33700 --- /dev/null +++ b/src/common/utils/OnThreadExecutor.h @@ -0,0 +1,72 @@ +#pragma once + +#include +#include +#include +#include +#include + +// OnThreadExecutor allows its caller to off-load some work to a persistently running background thread. +// This might come in handy if you use the API which sets thread-wide global state and the state needs +// to be isolated. + +class OnThreadExecutor final +{ +public: + using task_t = std::packaged_task; + + OnThreadExecutor() : + _shutdown_request{ false }, + _worker_thread{ [this] { worker_thread(); } } + { + } + + ~OnThreadExecutor() + { + _shutdown_request = true; + _task_cv.notify_one(); + _worker_thread.join(); + } + + std::future submit(task_t task) + { + auto future = task.get_future(); + std::lock_guard lock{ _task_mutex }; + _task_queue.emplace(std::move(task)); + _task_cv.notify_one(); + return future; + } + + void cancel() + { + std::lock_guard lock{ _task_mutex }; + _task_queue = {}; + _task_cv.notify_one(); + } + +private: + void worker_thread() + { + while (!_shutdown_request) + { + task_t task; + { + std::unique_lock task_lock{ _task_mutex }; + _task_cv.wait(task_lock, [this] { return !_task_queue.empty() || _shutdown_request; }); + if (_shutdown_request) + { + return; + } + task = std::move(_task_queue.front()); + _task_queue.pop(); + } + task(); + } + } + + std::mutex _task_mutex; + std::condition_variable _task_cv; + std::atomic_bool _shutdown_request; + std::queue> _task_queue; + std::thread _worker_thread; +}; diff --git a/src/common/utils/gpo.h b/src/common/utils/gpo.h index cba300d8e5..8f71a21205 100644 --- a/src/common/utils/gpo.h +++ b/src/common/utils/gpo.h @@ -60,6 +60,7 @@ namespace powertoys_gpo { const std::wstring POLICY_CONFIGURE_ENABLED_ENVIRONMENT_VARIABLES = L"ConfigureEnabledUtilityEnvironmentVariables"; const std::wstring POLICY_CONFIGURE_ENABLED_QOI_PREVIEW = L"ConfigureEnabledUtilityFileExplorerQOIPreview"; const std::wstring POLICY_CONFIGURE_ENABLED_QOI_THUMBNAILS = L"ConfigureEnabledUtilityFileExplorerQOIThumbnails"; + const std::wstring POLICY_CONFIGURE_ENABLED_WORKSPACES = L"ConfigureEnabledUtilityWorkspaces"; // The registry value names for PowerToys installer and update policies. const std::wstring POLICY_DISABLE_PER_USER_INSTALLATION = L"PerUserInstallationDisabled"; @@ -399,6 +400,11 @@ namespace powertoys_gpo { return getUtilityEnabledValue(POLICY_CONFIGURE_ENABLED_ADVANCED_PASTE); } + inline gpo_rule_configured_t getConfiguredWorkspacesEnabledValue() + { + return getUtilityEnabledValue(POLICY_CONFIGURE_ENABLED_WORKSPACES); + } + inline gpo_rule_configured_t getConfiguredVideoConferenceMuteEnabledValue() { return getUtilityEnabledValue(POLICY_CONFIGURE_ENABLED_VIDEO_CONFERENCE_MUTE); diff --git a/src/dsc/Microsoft.PowerToys.Configure/examples/disableAllModules.dsc.yaml b/src/dsc/Microsoft.PowerToys.Configure/examples/disableAllModules.dsc.yaml index 8fa39a1050..0cfc689316 100644 --- a/src/dsc/Microsoft.PowerToys.Configure/examples/disableAllModules.dsc.yaml +++ b/src/dsc/Microsoft.PowerToys.Configure/examples/disableAllModules.dsc.yaml @@ -57,6 +57,8 @@ properties: EnableQoiThumbnail: false PowerOcr: Enabled: false + Workspaces: + Enabled: false ShortcutGuide: Enabled: false VideoConference: diff --git a/src/dsc/Microsoft.PowerToys.Configure/examples/enableAllModules.dsc.yaml b/src/dsc/Microsoft.PowerToys.Configure/examples/enableAllModules.dsc.yaml index a7b69fd423..c3bd636177 100644 --- a/src/dsc/Microsoft.PowerToys.Configure/examples/enableAllModules.dsc.yaml +++ b/src/dsc/Microsoft.PowerToys.Configure/examples/enableAllModules.dsc.yaml @@ -57,6 +57,8 @@ properties: EnableQoiThumbnail: true PowerOcr: Enabled: true + Workspaces: + Enabled: true ShortcutGuide: Enabled: true VideoConference: diff --git a/src/gpo/assets/PowerToys.admx b/src/gpo/assets/PowerToys.admx index a0f70baa30..a79e6f627c 100644 --- a/src/gpo/assets/PowerToys.admx +++ b/src/gpo/assets/PowerToys.admx @@ -1,11 +1,11 @@ - + - + @@ -20,6 +20,7 @@ + @@ -364,6 +365,16 @@ + + + + + + + + + + diff --git a/src/gpo/assets/en-US/PowerToys.adml b/src/gpo/assets/en-US/PowerToys.adml index 761abde90f..37f8124bd1 100644 --- a/src/gpo/assets/en-US/PowerToys.adml +++ b/src/gpo/assets/en-US/PowerToys.adml @@ -10,6 +10,7 @@ Installer and Updates PowerToys Run Advanced Paste + Workspaces Mouse Without Borders General settings @@ -25,6 +26,7 @@ PowerToys version 0.81.0 or later PowerToys version 0.81.1 or later PowerToys version 0.83.0 or later + PowerToys version 0.84.0 or later This policy configures the enabled state for all PowerToys utilities. @@ -110,6 +112,12 @@ If you don't configure this setting, users are able to enable or disable the plu You can override this policy for individual plugins using the policy "Configure enabled state for individual plugins". Note: Changes require a restart of PowerToys Run. + + This policy configures the enabled disable state for the Workspaces utility. + +If you enable or don't configure this policy, the user takes control over the enabled state of the Workspaces utility. + +If you disable this policy, the user won't be able to enable Enable and use the Workspaces utility. With this policy you can configure an individual enabled state for each PowerToys Run plugin that you add to the list. @@ -219,6 +227,7 @@ If you disable or don't configure this policy, no predefined rules are applied. Peek: Configure enabled state Power Rename: Configure enabled state PowerToys Run: Configure enabled state + PowerToys Workspaces: Configure enabled state Quick Accent: Configure enabled state Registry Preview: Configure enabled state Screen Ruler: Configure enabled state diff --git a/src/modules/Workspaces/Assets/Workspaces.ico b/src/modules/Workspaces/Assets/Workspaces.ico new file mode 100644 index 0000000000000000000000000000000000000000..14292758fa2a98ddd72db0cfa95c2cfa63997e1c GIT binary patch literal 467385 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 uSSAv$u$-tuw0F?BOw>i|fmR=_0owJ2Sa1HR)V + +namespace WorkspacesWindowProperties +{ + namespace Properties + { + const wchar_t LaunchedByWorkspacesID[] = L"PowerToys_LaunchedByWorkspaces"; + } + + inline void StampWorkspacesLaunchedProperty(HWND window) + { + ::SetPropW(window, Properties::LaunchedByWorkspacesID, reinterpret_cast(1)); + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/App.config b/src/modules/Workspaces/WorkspacesEditor/App.config new file mode 100644 index 0000000000..e31368d227 --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/App.config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/modules/Workspaces/WorkspacesEditor/App.xaml b/src/modules/Workspaces/WorkspacesEditor/App.xaml new file mode 100644 index 0000000000..567a577389 --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/App.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Workspaces/WorkspacesEditor/MainPage.xaml.cs b/src/modules/Workspaces/WorkspacesEditor/MainPage.xaml.cs new file mode 100644 index 0000000000..30e9ed70bb --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/MainPage.xaml.cs @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Windows; +using System.Windows.Controls; +using WorkspacesEditor.Models; +using WorkspacesEditor.ViewModels; + +namespace WorkspacesEditor +{ + /// + /// Interaction logic for MainPage.xaml + /// + public partial class MainPage : Page + { + private MainViewModel _mainViewModel; + + public MainPage(MainViewModel mainViewModel) + { + InitializeComponent(); + _mainViewModel = mainViewModel; + this.DataContext = _mainViewModel; + } + + private /*async*/ void NewProjectButton_Click(object sender, RoutedEventArgs e) + { + _mainViewModel.EnterSnapshotMode(false); + } + + private void EditButtonClicked(object sender, RoutedEventArgs e) + { + _mainViewModel.CloseAllPopups(); + Button button = sender as Button; + Project selectedProject = button.DataContext as Project; + _mainViewModel.EditProject(selectedProject); + } + + private void DeleteButtonClicked(object sender, RoutedEventArgs e) + { + e.Handled = true; + Button button = sender as Button; + Project selectedProject = button.DataContext as Project; + _mainViewModel.DeleteProject(selectedProject); + } + + private void MoreButton_Click(object sender, RoutedEventArgs e) + { + e.Handled = true; + Button button = sender as Button; + Project project = button.DataContext as Project; + project.IsPopupVisible = true; + } + + private void LaunchButton_Click(object sender, RoutedEventArgs e) + { + e.Handled = true; + Button button = sender as Button; + Project project = button.DataContext as Project; + _mainViewModel.LaunchProject(project); + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml b/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml new file mode 100644 index 0000000000..0c5eb55ccc --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml @@ -0,0 +1,29 @@ + + + + + + + diff --git a/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs b/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs new file mode 100644 index 0000000000..adaf9c9a52 --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs @@ -0,0 +1,71 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Windows; +using System.Windows.Interop; +using ManagedCommon; +using WorkspacesEditor.Utils; +using WorkspacesEditor.ViewModels; + +namespace WorkspacesEditor +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + public MainViewModel MainViewModel { get; set; } + + private static MainPage _mainPage; + + public MainWindow(MainViewModel mainViewModel) + { + MainViewModel = mainViewModel; + mainViewModel.SetMainWindow(this); + + WindowInteropHelper windowInteropHelper = new WindowInteropHelper(this); + System.Windows.Forms.Screen screen = System.Windows.Forms.Screen.FromHandle(windowInteropHelper.Handle); + double dpi = MonitorHelper.GetScreenDpiFromScreen(screen); + this.Height = screen.WorkingArea.Height / dpi * 0.90; + this.Width = screen.WorkingArea.Width / dpi * 0.75; + this.Top = screen.WorkingArea.Top + (int)(screen.WorkingArea.Height / dpi * 0.05); + this.Left = screen.WorkingArea.Left + (int)(screen.WorkingArea.Width / dpi * 0.125); + + InitializeComponent(); + + _mainPage = new MainPage(mainViewModel); + + ContentFrame.Navigate(_mainPage); + + MaxWidth = SystemParameters.PrimaryScreenWidth; + MaxHeight = SystemParameters.PrimaryScreenHeight; + } + + private void OnClosing(object sender, EventArgs e) + { + App.Current.Shutdown(); + } + + // This is required to fix a WPF rendering bug when using custom chrome + private void OnContentRendered(object sender, EventArgs e) + { + // Get the window handle of the Workspaces Editor window + IntPtr handle = new WindowInteropHelper(this).Handle; + WindowHelpers.BringToForeground(handle); + + InvalidateVisual(); + } + + public void ShowPage(ProjectEditor editPage) + { + ContentFrame.Navigate(editPage); + } + + public void SwitchToMainView() + { + ContentFrame.GoBack(); + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/Models/AppListDataTemplateSelector.cs b/src/modules/Workspaces/WorkspacesEditor/Models/AppListDataTemplateSelector.cs new file mode 100644 index 0000000000..660793c1c2 --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Models/AppListDataTemplateSelector.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace WorkspacesEditor.Models +{ + public sealed class AppListDataTemplateSelector : System.Windows.Controls.DataTemplateSelector + { + public System.Windows.DataTemplate HeaderTemplate { get; set; } + + public System.Windows.DataTemplate AppTemplate { get; set; } + + public AppListDataTemplateSelector() + { + HeaderTemplate = new System.Windows.DataTemplate(); + AppTemplate = new System.Windows.DataTemplate(); + } + + public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) + { + if (item is MonitorHeaderRow) + { + return HeaderTemplate; + } + else + { + return AppTemplate; + } + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/Models/Application.cs b/src/modules/Workspaces/WorkspacesEditor/Models/Application.cs new file mode 100644 index 0000000000..92790aef43 --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Models/Application.cs @@ -0,0 +1,474 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; +using System.Windows.Media.Imaging; +using ManagedCommon; +using Windows.Management.Deployment; + +namespace WorkspacesEditor.Models +{ + public class Application : INotifyPropertyChanged, IDisposable + { + private bool _isInitialized; + + public event PropertyChangedEventHandler PropertyChanged; + + public Application() + { + } + + public Application(Application other) + { + AppName = other.AppName; + AppPath = other.AppPath; + AppTitle = other.AppTitle; + PackageFullName = other.PackageFullName; + AppUserModelId = other.AppUserModelId; + CommandLineArguments = other.CommandLineArguments; + IsElevated = other.IsElevated; + CanLaunchElevated = other.CanLaunchElevated; + Minimized = other.Minimized; + Maximized = other.Maximized; + Position = other.Position; + MonitorNumber = other.MonitorNumber; + + Parent = other.Parent; + IsNotFound = other.IsNotFound; + IsHighlighted = other.IsHighlighted; + RepeatIndex = other.RepeatIndex; + PackagedId = other.PackagedId; + PackagedName = other.PackagedName; + PackagedPublisherID = other.PackagedPublisherID; + Aumid = other.Aumid; + IsExpanded = other.IsExpanded; + IsIncluded = other.IsIncluded; + } + + public Project Parent { get; set; } + + public struct WindowPosition + { + public int X { get; set; } + + public int Y { get; set; } + + public int Width { get; set; } + + public int Height { get; set; } + + public static bool operator ==(WindowPosition left, WindowPosition right) + { + return left.X == right.X && left.Y == right.Y && left.Width == right.Width && left.Height == right.Height; + } + + public static bool operator !=(WindowPosition left, WindowPosition right) + { + return left.X != right.X || left.Y != right.Y || left.Width != right.Width || left.Height != right.Height; + } + + public override bool Equals(object obj) + { + if (obj == null || GetType() != obj.GetType()) + { + return false; + } + + WindowPosition pos = (WindowPosition)obj; + return X == pos.X && Y == pos.Y && Width == pos.Width && Height == pos.Height; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } + + public string AppName { get; set; } + + public string AppPath { get; set; } + + public string AppTitle { get; set; } + + public string PackageFullName { get; set; } + + public string AppUserModelId { get; set; } + + public string CommandLineArguments { get; set; } + + private bool _isElevated; + + public bool IsElevated + { + get => _isElevated; + set + { + _isElevated = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(AppMainParams))); + } + } + + public bool CanLaunchElevated { get; set; } + + internal void SwitchDeletion() + { + IsIncluded = !IsIncluded; + RedrawPreviewImage(); + } + + private void RedrawPreviewImage() + { + if (_isInitialized) + { + Parent.Initialize(App.ThemeManager.GetCurrentTheme()); + } + } + + private bool _minimized; + + public bool Minimized + { + get => _minimized; + set + { + _minimized = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(Minimized))); + OnPropertyChanged(new PropertyChangedEventArgs(nameof(EditPositionEnabled))); + RedrawPreviewImage(); + } + } + + private bool _maximized; + + public bool Maximized + { + get => _maximized; + set + { + _maximized = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(Maximized))); + OnPropertyChanged(new PropertyChangedEventArgs(nameof(EditPositionEnabled))); + RedrawPreviewImage(); + } + } + + public bool EditPositionEnabled { get => !Minimized && !Maximized; } + + private string _appMainParams; + + public string AppMainParams + { + get + { + _appMainParams = _isElevated ? Properties.Resources.Admin : string.Empty; + if (!string.IsNullOrWhiteSpace(CommandLineArguments)) + { + _appMainParams += (_appMainParams == string.Empty ? string.Empty : " | ") + Properties.Resources.Args + ": " + CommandLineArguments; + } + + OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsAppMainParamVisible))); + return _appMainParams; + } + } + + public bool IsAppMainParamVisible { get => !string.IsNullOrWhiteSpace(_appMainParams); } + + private bool _isNotFound; + + [JsonIgnore] + public bool IsNotFound + { + get + { + return _isNotFound; + } + + set + { + if (_isNotFound != value) + { + _isNotFound = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsNotFound))); + } + } + } + + [JsonIgnore] + public bool IsHighlighted { get; set; } + + [JsonIgnore] + public int RepeatIndex { get; set; } + + [JsonIgnore] + public string RepeatIndexString + { + get + { + return RepeatIndex <= 1 ? string.Empty : RepeatIndex.ToString(CultureInfo.InvariantCulture); + } + } + + [JsonIgnore] + private Icon _icon = null; + + [JsonIgnore] + public Icon Icon + { + get + { + if (_icon == null) + { + try + { + if (IsPackagedApp) + { + Uri uri = GetAppLogoByPackageFamilyName(); + var bitmap = new Bitmap(uri.LocalPath); + var iconHandle = bitmap.GetHicon(); + _icon = Icon.FromHandle(iconHandle); + } + else + { + _icon = Icon.ExtractAssociatedIcon(AppPath); + } + } + catch (Exception) + { + Logger.LogWarning($"Icon not found on app path: {AppPath}. Using default icon"); + IsNotFound = true; + _icon = new Icon(@"images\DefaultIcon.ico"); + } + } + + return _icon; + } + } + + public Uri GetAppLogoByPackageFamilyName() + { + var pkgManager = new PackageManager(); + var pkg = pkgManager.FindPackagesForUser(string.Empty, PackagedId).FirstOrDefault(); + + if (pkg == null) + { + return null; + } + + return pkg.Logo; + } + + private BitmapImage _iconBitmapImage; + + public BitmapImage IconBitmapImage + { + get + { + if (_iconBitmapImage == null) + { + try + { + Bitmap previewBitmap = new Bitmap(32, 32); + using (Graphics graphics = Graphics.FromImage(previewBitmap)) + { + graphics.SmoothingMode = SmoothingMode.AntiAlias; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + + graphics.DrawIcon(Icon, new Rectangle(0, 0, 32, 32)); + } + + using (var memory = new MemoryStream()) + { + previewBitmap.Save(memory, ImageFormat.Png); + memory.Position = 0; + + var bitmapImage = new BitmapImage(); + bitmapImage.BeginInit(); + bitmapImage.StreamSource = memory; + bitmapImage.CacheOption = BitmapCacheOption.OnLoad; + bitmapImage.EndInit(); + bitmapImage.Freeze(); + + _iconBitmapImage = bitmapImage; + } + } + catch (Exception e) + { + Logger.LogError($"Exception while drawing icon for app with path: {AppPath}. Exception message: {e.Message}"); + } + } + + return _iconBitmapImage; + } + } + + private WindowPosition _position; + + public WindowPosition Position + { + get => _position; + set + { + _position = value; + _scaledPosition = null; + } + } + + private WindowPosition? _scaledPosition; + + public WindowPosition ScaledPosition + { + get + { + if (_scaledPosition == null) + { + double scaleFactor = MonitorSetup.Dpi / 96.0; + _scaledPosition = new WindowPosition() + { + X = (int)(scaleFactor * Position.X), + Y = (int)(scaleFactor * Position.Y), + Height = (int)(scaleFactor * Position.Height), + Width = (int)(scaleFactor * Position.Width), + }; + } + + return _scaledPosition.Value; + } + } + + public int MonitorNumber { get; set; } + + private MonitorSetup _monitorSetup; + + public MonitorSetup MonitorSetup + { + get + { + if (_monitorSetup == null) + { + _monitorSetup = Parent.Monitors.Where(x => x.MonitorNumber == MonitorNumber).FirstOrDefault(); + } + + return _monitorSetup; + } + } + + public void OnPropertyChanged(PropertyChangedEventArgs e) + { + PropertyChanged?.Invoke(this, e); + } + + public void InitializationFinished() + { + _isInitialized = true; + } + + private bool? _isPackagedApp; + + public string PackagedId { get; set; } + + public string PackagedName { get; set; } + + public string PackagedPublisherID { get; set; } + + public string Aumid { get; set; } + + public bool IsPackagedApp + { + get + { + if (_isPackagedApp == null) + { + if (!AppPath.StartsWith("C:\\Program Files\\WindowsApps\\", StringComparison.InvariantCultureIgnoreCase)) + { + _isPackagedApp = false; + } + else + { + string appPath = AppPath.Replace("C:\\Program Files\\WindowsApps\\", string.Empty); + Regex packagedAppPathRegex = new Regex(@"(?[^_]*)_\d+.\d+.\d+.\d+_x64__(?[^\\]*)", RegexOptions.ExplicitCapture | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); + Match match = packagedAppPathRegex.Match(appPath); + _isPackagedApp = match.Success; + if (match.Success) + { + PackagedName = match.Groups["APPID"].Value; + PackagedPublisherID = match.Groups["PublisherID"].Value; + PackagedId = $"{PackagedName}_{PackagedPublisherID}"; + Aumid = $"{PackagedId}!App"; + } + } + } + + return _isPackagedApp.Value; + } + } + + private bool _isExpanded; + + public bool IsExpanded + { + get => _isExpanded; + set + { + if (_isExpanded != value) + { + _isExpanded = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsExpanded))); + } + } + } + + public string DeleteButtonContent { get => _isIncluded ? Properties.Resources.Delete : Properties.Resources.AddBack; } + + private bool _isIncluded = true; + + public bool IsIncluded + { + get => _isIncluded; + set + { + if (_isIncluded != value) + { + _isIncluded = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsIncluded))); + OnPropertyChanged(new PropertyChangedEventArgs(nameof(DeleteButtonContent))); + if (!_isIncluded) + { + IsExpanded = false; + } + } + } + } + + public void Dispose() + { + GC.SuppressFinalize(this); + } + + internal void CommandLineTextChanged(string newCommandLineValue) + { + CommandLineArguments = newCommandLineValue; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(AppMainParams))); + } + + internal void MaximizedChecked() + { + Minimized = false; + } + + internal void MinimizedChecked() + { + Maximized = false; + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/Models/Monitor.cs b/src/modules/Workspaces/WorkspacesEditor/Models/Monitor.cs new file mode 100644 index 0000000000..2a911eb1fe --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Models/Monitor.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Windows; + +namespace WorkspacesEditor.Models +{ + public class Monitor + { + public string MonitorName { get; private set; } + + public string MonitorInstanceId { get; private set; } + + public int MonitorNumber { get; private set; } + + public int Dpi { get; private set; } + + public Rect MonitorDpiUnawareBounds { get; private set; } + + public Rect MonitorDpiAwareBounds { get; private set; } + + public Monitor(string monitorName, string monitorInstanceId, int number, int dpi, Rect dpiAwareBounds, Rect dpiUnawareBounds) + { + MonitorName = monitorName; + MonitorInstanceId = monitorInstanceId; + MonitorNumber = number; + Dpi = dpi; + MonitorDpiAwareBounds = dpiAwareBounds; + MonitorDpiUnawareBounds = dpiUnawareBounds; + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/Models/MonitorHeaderRow.cs b/src/modules/Workspaces/WorkspacesEditor/Models/MonitorHeaderRow.cs new file mode 100644 index 0000000000..5a29ea146f --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Models/MonitorHeaderRow.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace WorkspacesEditor.Models +{ + internal sealed class MonitorHeaderRow + { + public string MonitorName { get; set; } + + public string SelectString { get; set; } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/Models/MonitorSetup.cs b/src/modules/Workspaces/WorkspacesEditor/Models/MonitorSetup.cs new file mode 100644 index 0000000000..e44365a988 --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Models/MonitorSetup.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.ComponentModel; +using System.Windows; + +namespace WorkspacesEditor.Models +{ + public class MonitorSetup : Monitor, INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public void OnPropertyChanged(PropertyChangedEventArgs e) + { + PropertyChanged?.Invoke(this, e); + } + + public string MonitorInfo { get => MonitorName; } + + public string MonitorInfoWithResolution { get => $"{MonitorName} {MonitorDpiAwareBounds.Width}x{MonitorDpiAwareBounds.Height}"; } + + public MonitorSetup(string monitorName, string monitorInstanceId, int number, int dpi, Rect dpiAwareBounds, Rect dpiUnawareBounds) + : base(monitorName, monitorInstanceId, number, dpi, dpiAwareBounds, dpiUnawareBounds) + { + } + + public MonitorSetup(MonitorSetup other) + : base(other.MonitorName, other.MonitorInstanceId, other.MonitorNumber, other.Dpi, other.MonitorDpiAwareBounds, other.MonitorDpiUnawareBounds) + { + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/Models/Project.cs b/src/modules/Workspaces/WorkspacesEditor/Models/Project.cs new file mode 100644 index 0000000000..b0065dd2ee --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Models/Project.cs @@ -0,0 +1,376 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using System.Windows.Media.Imaging; +using ManagedCommon; +using WorkspacesEditor.Data; +using WorkspacesEditor.Utils; + +namespace WorkspacesEditor.Models +{ + public class Project : INotifyPropertyChanged + { + [JsonIgnore] + public string EditorWindowTitle { get; set; } + + public string Id { get; private set; } + + private string _name; + + public string Name + { + get + { + return _name; + } + + set + { + _name = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(Name))); + OnPropertyChanged(new PropertyChangedEventArgs(nameof(CanBeSaved))); + } + } + + public long CreationTime { get; } // in seconds + + public long LastLaunchedTime { get; } // in seconds + + public bool IsShortcutNeeded { get; set; } + + public bool MoveExistingWindows { get; set; } + + public string LastLaunched + { + get + { + string lastLaunched = WorkspacesEditor.Properties.Resources.LastLaunched + ": "; + if (LastLaunchedTime == 0) + { + return lastLaunched + WorkspacesEditor.Properties.Resources.Never; + } + + const int SECOND = 1; + const int MINUTE = 60 * SECOND; + const int HOUR = 60 * MINUTE; + const int DAY = 24 * HOUR; + const int MONTH = 30 * DAY; + + DateTime lastLaunchDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(LastLaunchedTime); + + var now = DateTime.UtcNow.Ticks; + var ts = DateTime.UtcNow - lastLaunchDateTime; + double delta = Math.Abs(ts.TotalSeconds); + + if (delta < 1 * MINUTE) + { + return lastLaunched + WorkspacesEditor.Properties.Resources.Recently; + } + + if (delta < 2 * MINUTE) + { + return lastLaunched + WorkspacesEditor.Properties.Resources.OneMinuteAgo; + } + + if (delta < 45 * MINUTE) + { + return lastLaunched + ts.Minutes + " " + WorkspacesEditor.Properties.Resources.MinutesAgo; + } + + if (delta < 90 * MINUTE) + { + return lastLaunched + WorkspacesEditor.Properties.Resources.OneHourAgo; + } + + if (delta < 24 * HOUR) + { + return lastLaunched + ts.Hours + " " + WorkspacesEditor.Properties.Resources.HoursAgo; + } + + if (delta < 48 * HOUR) + { + return lastLaunched + WorkspacesEditor.Properties.Resources.Yesterday; + } + + if (delta < 30 * DAY) + { + return lastLaunched + ts.Days + " " + WorkspacesEditor.Properties.Resources.DaysAgo; + } + + if (delta < 12 * MONTH) + { + int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30)); + return lastLaunched + (months <= 1 ? WorkspacesEditor.Properties.Resources.OneMonthAgo : months + " " + WorkspacesEditor.Properties.Resources.MonthsAgo); + } + else + { + int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365)); + return lastLaunched + (years <= 1 ? WorkspacesEditor.Properties.Resources.OneYearAgo : years + " " + WorkspacesEditor.Properties.Resources.YearsAgo); + } + } + } + + public bool CanBeSaved + { + get => Name.Length > 0 && Applications.Count > 0; + } + + private bool _isRevertEnabled; + + public bool IsRevertEnabled + { + get => _isRevertEnabled; + set + { + if (_isRevertEnabled != value) + { + _isRevertEnabled = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsRevertEnabled))); + } + } + } + + private bool _isPopupVisible; + + [JsonIgnore] + public bool IsPopupVisible + { + get + { + return _isPopupVisible; + } + + set + { + _isPopupVisible = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsPopupVisible))); + } + } + + public List Applications { get; set; } + + public List ApplicationsListed + { + get + { + List applicationsListed = new List(); + ILookup apps = Applications.Where(x => !x.Minimized).ToLookup(x => x.MonitorSetup); + foreach (var appItem in apps.OrderBy(x => x.Key.MonitorDpiUnawareBounds.Left).ThenBy(x => x.Key.MonitorDpiUnawareBounds.Top)) + { + MonitorHeaderRow headerRow = new MonitorHeaderRow { MonitorName = "Screen " + appItem.Key.MonitorNumber, SelectString = Properties.Resources.SelectAllAppsOnMonitor + " " + appItem.Key.MonitorInfo }; + applicationsListed.Add(headerRow); + foreach (Application app in appItem) + { + applicationsListed.Add(app); + } + } + + var minimizedApps = Applications.Where(x => x.Minimized); + if (minimizedApps.Any()) + { + MonitorHeaderRow headerRow = new MonitorHeaderRow { MonitorName = Properties.Resources.Minimized_Apps, SelectString = Properties.Resources.SelectAllMinimizedApps }; + applicationsListed.Add(headerRow); + foreach (Application app in minimizedApps) + { + applicationsListed.Add(app); + } + } + + return applicationsListed; + } + } + + [JsonIgnore] + public string AppsCountString + { + get + { + int count = Applications.Count; + return count.ToString(CultureInfo.InvariantCulture) + " " + (count == 1 ? Properties.Resources.App : Properties.Resources.Apps); + } + } + + public List Monitors { get; } + + public bool IsPositionChangedManually { get; set; } // telemetry + + private BitmapImage _previewIcons; + private BitmapImage _previewImage; + private double _previewImageWidth; + + public Project(Project selectedProject) + { + Id = selectedProject.Id; + Name = selectedProject.Name; + PreviewIcons = selectedProject.PreviewIcons; + PreviewImage = selectedProject.PreviewImage; + IsShortcutNeeded = selectedProject.IsShortcutNeeded; + MoveExistingWindows = selectedProject.MoveExistingWindows; + + int screenIndex = 1; + + Monitors = new List(); + foreach (var item in selectedProject.Monitors.OrderBy(x => x.MonitorDpiAwareBounds.Left).ThenBy(x => x.MonitorDpiAwareBounds.Top)) + { + Monitors.Add(item); + screenIndex++; + } + + Applications = new List(); + foreach (var item in selectedProject.Applications) + { + Application newApp = new Application(item); + newApp.Parent = this; + newApp.InitializationFinished(); + Applications.Add(newApp); + } + } + + public Project(ProjectData.ProjectWrapper project) + { + Id = project.Id; + Name = project.Name; + CreationTime = project.CreationTime; + LastLaunchedTime = project.LastLaunchedTime; + IsShortcutNeeded = project.IsShortcutNeeded; + MoveExistingWindows = project.MoveExistingWindows; + Monitors = new List() { }; + Applications = new List { }; + + foreach (var app in project.Applications) + { + Models.Application newApp = new Models.Application() + { + AppName = app.Application, + AppPath = app.ApplicationPath, + AppTitle = app.Title, + PackageFullName = app.PackageFullName, + AppUserModelId = app.AppUserModelId, + Parent = this, + CommandLineArguments = app.CommandLineArguments, + IsElevated = app.IsElevated, + CanLaunchElevated = app.CanLaunchElevated, + Maximized = app.Maximized, + Minimized = app.Minimized, + IsNotFound = false, + Position = new Models.Application.WindowPosition() + { + Height = app.Position.Height, + Width = app.Position.Width, + X = app.Position.X, + Y = app.Position.Y, + }, + MonitorNumber = app.Monitor, + }; + newApp.InitializationFinished(); + Applications.Add(newApp); + } + + foreach (var monitor in project.MonitorConfiguration) + { + System.Windows.Rect dpiAware = new System.Windows.Rect(monitor.MonitorRectDpiAware.Left, monitor.MonitorRectDpiAware.Top, monitor.MonitorRectDpiAware.Width, monitor.MonitorRectDpiAware.Height); + System.Windows.Rect dpiUnaware = new System.Windows.Rect(monitor.MonitorRectDpiUnaware.Left, monitor.MonitorRectDpiUnaware.Top, monitor.MonitorRectDpiUnaware.Width, monitor.MonitorRectDpiUnaware.Height); + Monitors.Add(new MonitorSetup(monitor.Id, monitor.InstanceId, monitor.MonitorNumber, monitor.Dpi, dpiAware, dpiUnaware)); + } + } + + public BitmapImage PreviewIcons + { + get + { + return _previewIcons; + } + + set + { + _previewIcons = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(PreviewIcons))); + } + } + + public BitmapImage PreviewImage + { + get + { + return _previewImage; + } + + set + { + _previewImage = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(PreviewImage))); + } + } + + public double PreviewImageWidth + { + get + { + return _previewImageWidth; + } + + set + { + _previewImageWidth = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(PreviewImageWidth))); + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + public void OnPropertyChanged(PropertyChangedEventArgs e) + { + PropertyChanged?.Invoke(this, e); + } + + public async void Initialize(Theme currentTheme) + { + PreviewIcons = await Task.Run(() => DrawHelper.DrawPreviewIcons(this)); + Rectangle commonBounds = GetCommonBounds(); + PreviewImage = await Task.Run(() => DrawHelper.DrawPreview(this, commonBounds, currentTheme)); + PreviewImageWidth = commonBounds.Width / (commonBounds.Height * 1.2 / 200); + } + + private Rectangle GetCommonBounds() + { + double minX = Monitors.First().MonitorDpiAwareBounds.Left; + double minY = Monitors.First().MonitorDpiAwareBounds.Top; + double maxX = Monitors.First().MonitorDpiAwareBounds.Right; + double maxY = Monitors.First().MonitorDpiAwareBounds.Bottom; + for (int monitorIndex = 1; monitorIndex < Monitors.Count; monitorIndex++) + { + Monitor monitor = Monitors[monitorIndex]; + minX = Math.Min(minX, monitor.MonitorDpiAwareBounds.Left); + minY = Math.Min(minY, monitor.MonitorDpiAwareBounds.Top); + maxX = Math.Max(maxX, monitor.MonitorDpiAwareBounds.Right); + maxY = Math.Max(maxY, monitor.MonitorDpiAwareBounds.Bottom); + } + + return new Rectangle((int)minX, (int)minY, (int)(maxX - minX), (int)(maxY - minY)); + } + + public void UpdateAfterLaunchAndEdit(Project other) + { + Id = other.Id; + Name = other.Name; + IsRevertEnabled = true; + } + + internal void CloseExpanders() + { + foreach (Application app in Applications) + { + app.IsExpanded = false; + } + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/OverlayWindow.xaml b/src/modules/Workspaces/WorkspacesEditor/OverlayWindow.xaml new file mode 100644 index 0000000000..c10fb6233f --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/OverlayWindow.xaml @@ -0,0 +1,16 @@ + + + diff --git a/src/modules/Workspaces/WorkspacesEditor/OverlayWindow.xaml.cs b/src/modules/Workspaces/WorkspacesEditor/OverlayWindow.xaml.cs new file mode 100644 index 0000000000..54e892d9bd --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/OverlayWindow.xaml.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Windows; + +namespace WorkspacesEditor +{ + /// + /// Interaction logic for OverlayWindow.xaml + /// + public partial class OverlayWindow : Window + { + public OverlayWindow() + { + InitializeComponent(); + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/Properties/Resources.Designer.cs b/src/modules/Workspaces/WorkspacesEditor/Properties/Resources.Designer.cs new file mode 100644 index 0000000000..ce81b9785d --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Properties/Resources.Designer.cs @@ -0,0 +1,693 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WorkspacesEditor.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WorkspacesEditor.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Add Back. + /// + public static string AddBack { + get { + return ResourceManager.GetString("AddBack", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Admin. + /// + public static string Admin { + get { + return ResourceManager.GetString("Admin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Launch new app instances. + /// + public static string AlwaysLaunch { + get { + return ResourceManager.GetString("AlwaysLaunch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to app. + /// + public static string App { + get { + return ResourceManager.GetString("App", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to App name. + /// + public static string App_name { + get { + return ResourceManager.GetString("App_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to apps. + /// + public static string Apps { + get { + return ResourceManager.GetString("Apps", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure?. + /// + public static string Are_You_Sure { + get { + return ResourceManager.GetString("Are_You_Sure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to delete this Workspace?. + /// + public static string Are_You_Sure_Description { + get { + return ResourceManager.GetString("Are_You_Sure_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Args. + /// + public static string Args { + get { + return ResourceManager.GetString("Args", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + public static string Cancel { + get { + return ResourceManager.GetString("Cancel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CLI arguments. + /// + public static string CliArguments { + get { + return ResourceManager.GetString("CliArguments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Created. + /// + public static string Created { + get { + return ResourceManager.GetString("Created", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create Desktop Shortcut. + /// + public static string CreateShortcut { + get { + return ResourceManager.GetString("CreateShortcut", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create Workspace. + /// + public static string CreateWorkspace { + get { + return ResourceManager.GetString("CreateWorkspace", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to days ago. + /// + public static string DaysAgo { + get { + return ResourceManager.GetString("DaysAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Workspace. + /// + public static string DefaultWorkspaceNamePrefix { + get { + return ResourceManager.GetString("DefaultWorkspaceNamePrefix", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove. + /// + public static string Delete { + get { + return ResourceManager.GetString("Delete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete Workspace dialog.. + /// + public static string Delete_Workspace_Dialog_Announce { + get { + return ResourceManager.GetString("Delete_Workspace_Dialog_Announce", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove Selected Apps. + /// + public static string DeleteSelected { + get { + return ResourceManager.GetString("DeleteSelected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit. + /// + public static string Edit { + get { + return ResourceManager.GetString("Edit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to opened. + /// + public static string Edit_Project_Open_Announce { + get { + return ResourceManager.GetString("Edit_Project_Open_Announce", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit Workspace. + /// + public static string EditWorkspace { + get { + return ResourceManager.GetString("EditWorkspace", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error parsing Workspaces data.. + /// + public static string Error_Parsing_Message { + get { + return ResourceManager.GetString("Error_Parsing_Message", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Height. + /// + public static string Height { + get { + return ResourceManager.GetString("Height", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to hours ago. + /// + public static string HoursAgo { + get { + return ResourceManager.GetString("HoursAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last launched. + /// + public static string LastLaunched { + get { + return ResourceManager.GetString("LastLaunched", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Launch. + /// + public static string Launch { + get { + return ResourceManager.GetString("Launch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Launch args. + /// + public static string Launch_args { + get { + return ResourceManager.GetString("Launch_args", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Launch as Admin. + /// + public static string LaunchAsAdmin { + get { + return ResourceManager.GetString("LaunchAsAdmin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Launch & Edit. + /// + public static string LaunchEdit { + get { + return ResourceManager.GetString("LaunchEdit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Left. + /// + public static string Left { + get { + return ResourceManager.GetString("Left", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Workspaces Editor. + /// + public static string MainTitle { + get { + return ResourceManager.GetString("MainTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximized. + /// + public static string Maximized { + get { + return ResourceManager.GetString("Maximized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimized. + /// + public static string Minimized { + get { + return ResourceManager.GetString("Minimized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimized Apps. + /// + public static string Minimized_Apps { + get { + return ResourceManager.GetString("Minimized_Apps", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to minutes ago. + /// + public static string MinutesAgo { + get { + return ResourceManager.GetString("MinutesAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to months ago. + /// + public static string MonthsAgo { + get { + return ResourceManager.GetString("MonthsAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move apps if present. + /// + public static string MoveIfExist { + get { + return ResourceManager.GetString("MoveIfExist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + public static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to never. + /// + public static string Never { + get { + return ResourceManager.GetString("Never", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Workspace. + /// + public static string New_Workspace { + get { + return ResourceManager.GetString("New_Workspace", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no saved Workspaces.. + /// + public static string No_Workspaces_Message { + get { + return ResourceManager.GetString("No_Workspaces_Message", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The application cannot be found. + /// + public static string NotFoundTooltip { + get { + return ResourceManager.GetString("NotFoundTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No Workspaces match the current search.. + /// + public static string NoWorkspacesMatch { + get { + return ResourceManager.GetString("NoWorkspacesMatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to an hour ago. + /// + public static string OneHourAgo { + get { + return ResourceManager.GetString("OneHourAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to a minute ago. + /// + public static string OneMinuteAgo { + get { + return ResourceManager.GetString("OneMinuteAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to one month ago. + /// + public static string OneMonthAgo { + get { + return ResourceManager.GetString("OneMonthAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to one second ago. + /// + public static string OneSecondAgo { + get { + return ResourceManager.GetString("OneSecondAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to one year ago. + /// + public static string OneYearAgo { + get { + return ResourceManager.GetString("OneYearAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin Workspaces to Taskbar. + /// + public static string PinToTaskbar { + get { + return ResourceManager.GetString("PinToTaskbar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to recently. + /// + public static string Recently { + get { + return ResourceManager.GetString("Recently", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Revert. + /// + public static string Revert { + get { + return ResourceManager.GetString("Revert", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save Workspace. + /// + public static string Save_Workspace { + get { + return ResourceManager.GetString("Save_Workspace", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search. + /// + public static string Search { + get { + return ResourceManager.GetString("Search", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search for Workspaces or apps. + /// + public static string SearchExplanation { + get { + return ResourceManager.GetString("SearchExplanation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to seconds ago. + /// + public static string SecondsAgo { + get { + return ResourceManager.GetString("SecondsAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select All Apps on. + /// + public static string SelectAllAppsOnMonitor { + get { + return ResourceManager.GetString("SelectAllAppsOnMonitor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select All Minimized Apps. + /// + public static string SelectAllMinimizedApps { + get { + return ResourceManager.GetString("SelectAllMinimizedApps", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select All Apps in Workspace. + /// + public static string SelectedAllInWorkspace { + get { + return ResourceManager.GetString("SelectedAllInWorkspace", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit your layout and click "Capture" when finished.. + /// + public static string SnapshotDescription { + get { + return ResourceManager.GetString("SnapshotDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Snapshot Creator. + /// + public static string SnapshotWindowTitle { + get { + return ResourceManager.GetString("SnapshotWindowTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sort by. + /// + public static string SortBy { + get { + return ResourceManager.GetString("SortBy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Capture. + /// + public static string Take_Snapshot { + get { + return ResourceManager.GetString("Take_Snapshot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Top. + /// + public static string Top { + get { + return ResourceManager.GetString("Top", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Width. + /// + public static string Width { + get { + return ResourceManager.GetString("Width", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Workspace name. + /// + public static string WorkspaceName { + get { + return ResourceManager.GetString("WorkspaceName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Workspaces. + /// + public static string Workspaces { + get { + return ResourceManager.GetString("Workspaces", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write arguments here. + /// + public static string WriteArgs { + get { + return ResourceManager.GetString("WriteArgs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to years ago. + /// + public static string YearsAgo { + get { + return ResourceManager.GetString("YearsAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to yesterday. + /// + public static string Yesterday { + get { + return ResourceManager.GetString("Yesterday", resourceCulture); + } + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/Properties/Resources.resx b/src/modules/Workspaces/WorkspacesEditor/Properties/Resources.resx new file mode 100644 index 0000000000..b768d6682a --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Properties/Resources.resx @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add back + + + Admin + + + Launch new app instances + + + app + + + apps + + + App name + + + Are you sure? + + + Are you sure you want to delete this Workspace? + + + Args + Arguments + + + Cancel + + + CLI arguments + + + Created + + + Create Workspace + + + Create desktop shortcut + + + days ago + + + Workspace + + + Remove + + + Remove selected apps + + + Delete Workspace dialog. + + + Edit + + + Edit Workspace + + + opened + + + Error parsing Workspaces data. + + + Height + + + hours ago + + + Last launched + + + Launch + + + Launch as Admin + + + Launch & edit + + + Launch args + + + Left + the left x coordinate + + + Workspaces Editor + + + Maximized + + + Minimized + + + Minimized apps + + + minutes ago + + + months ago + + + Move apps if present + + + Name + + + never + + + New Workspace + + + No Workspaces match the current search. + + + The application cannot be found + + + There are no saved Workspaces. + + + an hour ago + + + a minute ago + + + one month ago + + + one second ago + + + one year ago + + + Pin Workspaces to taskbar + + + Workspace name + + + Workspaces + + + recently + + + Revert + + + Save Workspace + + + Search + + + Search for Workspaces or apps + + + seconds ago + + + Select all apps on + + + Select all minimized apps + + + Select all apps in Workspace + + + Edit your layout and click "Capture" when finished. + + + Snapshot Creator + + + Sort by + + + Capture + + + Top + the top y coordinate + + + Width + + + Write arguments here + + + years ago + + + yesterday + + \ No newline at end of file diff --git a/src/modules/Workspaces/WorkspacesEditor/Properties/Settings.Designer.cs b/src/modules/Workspaces/WorkspacesEditor/Properties/Settings.Designer.cs new file mode 100644 index 0000000000..f598f04bae --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WorkspacesEditor.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.1.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/src/modules/Workspaces/WorkspacesEditor/Properties/Settings.settings b/src/modules/Workspaces/WorkspacesEditor/Properties/Settings.settings new file mode 100644 index 0000000000..033d7a5e9e --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/modules/Workspaces/WorkspacesEditor/SnapshotWindow.xaml b/src/modules/Workspaces/WorkspacesEditor/SnapshotWindow.xaml new file mode 100644 index 0000000000..5dcceeb88b --- /dev/null +++ b/src/modules/Workspaces/WorkspacesEditor/SnapshotWindow.xaml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + +