diff --git a/src/modules/fancyzones/lib/FancyZones.cpp b/src/modules/fancyzones/lib/FancyZones.cpp index 311c4aaaf8..27a945298f 100644 --- a/src/modules/fancyzones/lib/FancyZones.cpp +++ b/src/modules/fancyzones/lib/FancyZones.cpp @@ -68,6 +68,10 @@ public: } return GUID_NULL; } + IFACEMETHODIMP_(int) GetZoneHighlightOpacity() noexcept + { + return m_settings->GetSettings().zoneHighlightOpacity; + } LRESULT WndProc(HWND, UINT, WPARAM, LPARAM) noexcept; void OnDisplayChange(DisplayChangeType changeType) noexcept; @@ -321,7 +325,6 @@ void FancyZones::ToggleEditor() noexcept monitor = MonitorFromWindow(foregroundWindow, MONITOR_DEFAULTTOPRIMARY); } - if (!monitor) { return; @@ -352,7 +355,7 @@ void FancyZones::ToggleEditor() noexcept const auto taskbar_x_offset = MulDiv(mi.rcWork.left - mi.rcMonitor.left, DPIAware::DEFAULT_DPI, dpi_x); const auto taskbar_y_offset = MulDiv(mi.rcWork.top - mi.rcMonitor.top, DPIAware::DEFAULT_DPI, dpi_y); - + // Do not scale window params by the dpi, that will be done in the editor - see LayoutModel.Apply const auto x = mi.rcMonitor.left + taskbar_x_offset; const auto y = mi.rcMonitor.top + taskbar_y_offset; diff --git a/src/modules/fancyzones/lib/FancyZones.h b/src/modules/fancyzones/lib/FancyZones.h index 1581204e3a..035b2e83a3 100644 --- a/src/modules/fancyzones/lib/FancyZones.h +++ b/src/modules/fancyzones/lib/FancyZones.h @@ -36,6 +36,7 @@ interface __declspec(uuid("{5C8D99D6-34B2-4F4A-A8E5-7483F6869775}")) IZoneWindow IFACEMETHOD_(void, MoveWindowsOnActiveZoneSetChange)() = 0; IFACEMETHOD_(COLORREF, GetZoneHighlightColor)() = 0; IFACEMETHOD_(GUID, GetCurrentMonitorZoneSetId)(HMONITOR monitor) = 0; + IFACEMETHOD_(int, GetZoneHighlightOpacity)() = 0; }; winrt::com_ptr MakeFancyZones(HINSTANCE hinstance, IFancyZonesSettings* settings) noexcept; diff --git a/src/modules/fancyzones/lib/Settings.cpp b/src/modules/fancyzones/lib/Settings.cpp index b15ada70fc..09ded242de 100644 --- a/src/modules/fancyzones/lib/Settings.cpp +++ b/src/modules/fancyzones/lib/Settings.cpp @@ -49,6 +49,7 @@ private: const std::wstring m_zoneHiglightName = L"fancyzones_zoneHighlightColor"; const std::wstring m_editorHotkeyName = L"fancyzones_editor_hotkey"; const std::wstring m_excludedAppsName = L"fancyzones_excluded_apps"; + const std::wstring m_zoneHighlightOpacity = L"fancyzones_highlight_opacity"; }; IFACEMETHODIMP_(bool) FancyZonesSettings::GetConfig(_Out_ PWSTR buffer, _Out_ int *buffer_size) noexcept @@ -76,6 +77,7 @@ IFACEMETHODIMP_(bool) FancyZonesSettings::GetConfig(_Out_ PWSTR buffer, _Out_ in settings.add_bool_toogle(setting.name, setting.resourceId, *setting.value); } + settings.add_int_spinner(m_zoneHighlightOpacity, IDS_SETTINGS_HIGHLIGHT_OPACITY, m_settings.zoneHighlightOpacity, 0, 100, 1); settings.add_color_picker(m_zoneHiglightName, IDS_SETTING_DESCRIPTION_ZONEHIGHLIGHTCOLOR, m_settings.zoneHightlightColor); settings.add_multiline_string(m_excludedAppsName, IDS_SETTING_EXCLCUDED_APPS_DESCRIPTION, m_settings.excludedApps); @@ -153,6 +155,11 @@ void FancyZonesSettings::LoadSettings(PCWSTR config, bool fromFile) noexcept try } } } + + if (auto val = values.get_int_value(m_zoneHighlightOpacity)) + { + m_settings.zoneHighlightOpacity = *val; + } } CATCH_LOG(); @@ -166,6 +173,7 @@ void FancyZonesSettings::SaveSettings() noexcept try } values.add_property(m_zoneHiglightName, m_settings.zoneHightlightColor); + values.add_property(m_zoneHighlightOpacity, m_settings.zoneHighlightOpacity); values.add_property(m_editorHotkeyName, m_settings.editorHotkey.get_json()); values.add_property(m_excludedAppsName, m_settings.excludedApps); diff --git a/src/modules/fancyzones/lib/Settings.h b/src/modules/fancyzones/lib/Settings.h index 5f0515ac04..492e074110 100644 --- a/src/modules/fancyzones/lib/Settings.h +++ b/src/modules/fancyzones/lib/Settings.h @@ -15,6 +15,7 @@ struct Settings bool appLastZone_moveWindows = false; bool use_cursorpos_editor_startupscreen = true; std::wstring zoneHightlightColor = L"#0078D7"; + int zoneHighlightOpacity = 90; PowerToysSettings::HotkeyObject editorHotkey = PowerToysSettings::HotkeyObject::from_settings(true, false, false, false, VK_OEM_3); std::wstring excludedApps = L""; std::vector excludedAppsArray; diff --git a/src/modules/fancyzones/lib/ZoneWindow.cpp b/src/modules/fancyzones/lib/ZoneWindow.cpp index 89768025b1..dc354e5d2c 100644 --- a/src/modules/fancyzones/lib/ZoneWindow.cpp +++ b/src/modules/fancyzones/lib/ZoneWindow.cpp @@ -546,8 +546,8 @@ void ZoneWindow::DrawActiveZoneSet(wil::unique_hdc& hdc, RECT const& clientRect) // { fillAlpha, fill, borderAlpha, border, thickness } ColorSetting const colorHints { 225, RGB(81, 92, 107), 255, RGB(104, 118, 138), -2 }; - ColorSetting colorViewer { 225, 0, 255, RGB(40, 50, 60), -2 }; - ColorSetting colorHighlight { 225, 0, 255, 0, -2 }; + ColorSetting colorViewer { OpacitySettingToAlpha(m_host->GetZoneHighlightOpacity()), 0, 255, RGB(40, 50, 60), -2 }; + ColorSetting colorHighlight { OpacitySettingToAlpha(m_host->GetZoneHighlightOpacity()), 0, 255, 0, -2 }; ColorSetting const colorFlash { 200, RGB(81, 92, 107), 200, RGB(104, 118, 138), -2 }; auto zones = m_activeZoneSet->GetZones(); diff --git a/src/modules/fancyzones/lib/fancyzones.rc b/src/modules/fancyzones/lib/fancyzones.rc index a48e87df14..f021414f3a 100644 Binary files a/src/modules/fancyzones/lib/fancyzones.rc and b/src/modules/fancyzones/lib/fancyzones.rc differ diff --git a/src/modules/fancyzones/lib/resource.h b/src/modules/fancyzones/lib/resource.h index 5a11a3da33..158b68a3e0 100644 --- a/src/modules/fancyzones/lib/resource.h +++ b/src/modules/fancyzones/lib/resource.h @@ -13,3 +13,4 @@ #define IDS_SETTING_LAUNCH_EDITOR_DESCRIPTION 113 #define IDS_SETTING_LAUNCH_EDITOR_HOTKEY_LABEL 114 #define IDS_SETTING_EXCLCUDED_APPS_DESCRIPTION 115 +#define IDS_SETTINGS_HIGHLIGHT_OPACITY 116 diff --git a/src/modules/fancyzones/lib/util.h b/src/modules/fancyzones/lib/util.h index dd6e0605c3..9f59f21121 100644 --- a/src/modules/fancyzones/lib/util.h +++ b/src/modules/fancyzones/lib/util.h @@ -133,3 +133,9 @@ inline void ParseDeviceId(PCWSTR deviceId, PWSTR parsedId, size_t size) StringCchCopy(parsedId, size, L"FallbackDevice"); } } + +inline int OpacitySettingToAlpha(int opacity) +{ + // convert percentage to a 0-255 alpha value + return opacity * 2.55; +} diff --git a/src/modules/fancyzones/tests/UnitTests/ZoneWindow.Spec.cpp b/src/modules/fancyzones/tests/UnitTests/ZoneWindow.Spec.cpp index 0319e24d37..82dac19251 100644 --- a/src/modules/fancyzones/tests/UnitTests/ZoneWindow.Spec.cpp +++ b/src/modules/fancyzones/tests/UnitTests/ZoneWindow.Spec.cpp @@ -22,6 +22,11 @@ namespace FancyZonesUnitTests { return m_guid; } + IFACEMETHODIMP_(int) + GetZoneHighlightOpacity() noexcept + { + return 100; + } GUID m_guid; };