mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-04 18:26:39 +02:00
[FancyZones] Restore original corners and setting(#17425)
* fix corners * save corner preference * added fz setting * add option to settings * return original preference despite the setting * removed reset to default corner preference
This commit is contained in:
@@ -9,6 +9,7 @@ namespace ZonedWindowProperties
|
||||
{
|
||||
const wchar_t PropertyRestoreSizeID[] = L"FancyZones_RestoreSize";
|
||||
const wchar_t PropertyRestoreOriginID[] = L"FancyZones_RestoreOrigin";
|
||||
const wchar_t PropertyCornerPreference[] = L"FancyZones_CornerPreference";
|
||||
|
||||
const wchar_t MultiMonitorDeviceID[] = L"FancyZones#MultiMonitorDevice";
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ namespace NonLocalizable
|
||||
const wchar_t MakeDraggedWindowTransparentID[] = L"fancyzones_makeDraggedWindowTransparent";
|
||||
const wchar_t AllowPopupWindowSnapID[] = L"fancyzones_allowPopupWindowSnap";
|
||||
const wchar_t AllowChildWindowSnapID[] = L"fancyzones_allowChildWindowSnap";
|
||||
const wchar_t DisableRoundCornersOnSnapping[] = L"fancyzones_disableRoundCornersOnSnap";
|
||||
|
||||
const wchar_t SystemThemeID[] = L"fancyzones_systemTheme";
|
||||
const wchar_t ZoneColorID[] = L"fancyzones_zoneColor";
|
||||
@@ -126,6 +127,7 @@ void FancyZonesSettings::LoadSettings()
|
||||
SetBoolFlag(values, NonLocalizable::ShowZoneNumberID, SettingId::ShowZoneNumber, m_settings.showZoneNumber);
|
||||
SetBoolFlag(values, NonLocalizable::AllowPopupWindowSnapID, SettingId::AllowSnapPopupWindows, m_settings.allowSnapPopupWindows);
|
||||
SetBoolFlag(values, NonLocalizable::AllowChildWindowSnapID, SettingId::AllowSnapChildWindows, m_settings.allowSnapChildWindows);
|
||||
SetBoolFlag(values, NonLocalizable::DisableRoundCornersOnSnapping, SettingId::DisableRoundCornersOnSnapping, m_settings.disableRoundCorners);
|
||||
|
||||
// colors
|
||||
if (auto val = values.get_string_value(NonLocalizable::ZoneColorID))
|
||||
|
||||
@@ -45,6 +45,7 @@ struct Settings
|
||||
bool showZoneNumber = true;
|
||||
bool allowSnapPopupWindows = false;
|
||||
bool allowSnapChildWindows = false;
|
||||
bool disableRoundCorners = false;
|
||||
std::wstring zoneColor = L"#AACDFF";
|
||||
std::wstring zoneBorderColor = L"#FFFFFF";
|
||||
std::wstring zoneHighlightColor = L"#008CFF";
|
||||
|
||||
@@ -33,4 +33,5 @@ enum class SettingId
|
||||
ExcludedApps,
|
||||
AllowSnapPopupWindows,
|
||||
AllowSnapChildWindows,
|
||||
DisableRoundCornersOnSnapping,
|
||||
};
|
||||
@@ -247,6 +247,8 @@ void WindowMoveHandler::MoveSizeEnd(HWND window, POINT const& ptScreen, const st
|
||||
}
|
||||
}
|
||||
|
||||
FancyZonesWindowUtils::ResetRoundCornersPreference(window);
|
||||
|
||||
auto monitor = MonitorFromWindow(window, MONITOR_DEFAULTTONULL);
|
||||
if (monitor)
|
||||
{
|
||||
|
||||
@@ -339,11 +339,6 @@ void FancyZonesWindowUtils::SizeWindowToRect(HWND window, RECT rect) noexcept
|
||||
ScreenToWorkAreaCoords(window, rect);
|
||||
|
||||
placement.rcNormalPosition = rect;
|
||||
|
||||
// Set window corner preference on Windows 11 to "Do not round"
|
||||
int corner_preference = DWMWCP_DONOTROUND;
|
||||
DwmSetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &corner_preference, sizeof(corner_preference));
|
||||
|
||||
placement.flags |= WPF_ASYNCWINDOWPLACEMENT;
|
||||
|
||||
auto result = ::SetWindowPlacement(window, &placement);
|
||||
@@ -413,11 +408,6 @@ void FancyZonesWindowUtils::RestoreWindowSize(HWND window) noexcept
|
||||
SizeWindowToRect(window, rect);
|
||||
}
|
||||
|
||||
// Set window corner preference on Windows 11 to "Default"
|
||||
// TODO: Should probably store preference from before snap
|
||||
int corner_preference = DWMWCP_DEFAULT;
|
||||
DwmSetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &corner_preference, sizeof(corner_preference));
|
||||
|
||||
::RemoveProp(window, ZonedWindowProperties::PropertyRestoreSizeID);
|
||||
}
|
||||
}
|
||||
@@ -486,6 +476,49 @@ RECT FancyZonesWindowUtils::AdjustRectForSizeWindowToRect(HWND window, RECT rect
|
||||
return newWindowRect;
|
||||
}
|
||||
|
||||
void FancyZonesWindowUtils::DisableRoundCorners(HWND window) noexcept
|
||||
{
|
||||
HANDLE handle = GetPropW(window, ZonedWindowProperties::PropertyCornerPreference);
|
||||
if (!handle)
|
||||
{
|
||||
int cornerPreference = DWMWCP_DEFAULT;
|
||||
// save corner preference if it wasn't set already
|
||||
DwmGetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &cornerPreference, sizeof(cornerPreference));
|
||||
|
||||
HANDLE preferenceHandle;
|
||||
memcpy(&preferenceHandle, &cornerPreference, sizeof(int));
|
||||
|
||||
if (!SetProp(window, ZonedWindowProperties::PropertyCornerPreference, preferenceHandle))
|
||||
{
|
||||
Logger::error(L"Failed to save corner preference, {}", get_last_error_or_default(GetLastError()));
|
||||
}
|
||||
}
|
||||
|
||||
// Set window corner preference on Windows 11 to "Do not round"
|
||||
int cornerPreference = DWMWCP_DONOTROUND;
|
||||
if (!SUCCEEDED(DwmSetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &cornerPreference, sizeof(cornerPreference))))
|
||||
{
|
||||
Logger::error(L"Failed to set DWMWCP_DONOTROUND corner preference");
|
||||
}
|
||||
}
|
||||
|
||||
void FancyZonesWindowUtils::ResetRoundCornersPreference(HWND window) noexcept
|
||||
{
|
||||
HANDLE handle = GetPropW(window, ZonedWindowProperties::PropertyCornerPreference);
|
||||
if (handle)
|
||||
{
|
||||
int cornerPreference;
|
||||
memcpy(&cornerPreference, &handle, sizeof(int));
|
||||
|
||||
if (!SUCCEEDED(DwmSetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &cornerPreference, sizeof(cornerPreference))))
|
||||
{
|
||||
Logger::error(L"Failed to set saved corner preference");
|
||||
}
|
||||
|
||||
RemoveProp(window, ZonedWindowProperties::PropertyCornerPreference);
|
||||
}
|
||||
}
|
||||
|
||||
void FancyZonesWindowUtils::MakeWindowTransparent(HWND window)
|
||||
{
|
||||
int const pos = -GetSystemMetrics(SM_CXVIRTUALSCREEN) - 8;
|
||||
|
||||
@@ -27,4 +27,7 @@ namespace FancyZonesWindowUtils
|
||||
void RestoreWindowOrigin(HWND window) noexcept;
|
||||
void MakeWindowTransparent(HWND window);
|
||||
RECT AdjustRectForSizeWindowToRect(HWND window, RECT rect, HWND windowOfRect) noexcept; // Parameter rect is in windowOfRect coordinates
|
||||
|
||||
void DisableRoundCorners(HWND window) noexcept;
|
||||
void ResetRoundCornersPreference(HWND window) noexcept;
|
||||
}
|
||||
@@ -245,6 +245,11 @@ ZoneSet::MoveWindowIntoZoneByIndexSet(HWND window, HWND workAreaWindow, const Zo
|
||||
|
||||
auto rect = FancyZonesWindowUtils::AdjustRectForSizeWindowToRect(window, size, workAreaWindow);
|
||||
FancyZonesWindowUtils::SizeWindowToRect(window, rect);
|
||||
|
||||
if (FancyZonesSettings::settings().disableRoundCorners)
|
||||
{
|
||||
FancyZonesWindowUtils::DisableRoundCorners(window);
|
||||
}
|
||||
}
|
||||
|
||||
FancyZonesWindowProperties::StampZoneIndexProperty(window, indexSet);
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
#define ShowZonesOnAllMonitorsKey "ShowZonesOnAllMonitors"
|
||||
#define SpanZonesAcrossMonitorsKey "SpanZonesAcrossMonitors"
|
||||
#define MakeDraggedWindowTransparentKey "MakeDraggedWindowTransparent"
|
||||
#define AllowSnapChildWindows "AllowSnapChildWindows"
|
||||
#define AllowSnapPopupWindows "AllowSnapPopupWindows"
|
||||
#define DisableRoundCornersOnSnapping "DisableRoundCornersOnSnapping"
|
||||
#define ZoneColorKey "ZoneColor"
|
||||
#define ZoneBorderColorKey "ZoneBorderColor"
|
||||
#define ZoneHighlightColorKey "ZoneHighlightColor"
|
||||
@@ -324,6 +327,9 @@ void Trace::SettingsTelemetry(const Settings& settings) noexcept
|
||||
TraceLoggingBoolean(settings.showZonesOnAllMonitors, ShowZonesOnAllMonitorsKey),
|
||||
TraceLoggingBoolean(settings.spanZonesAcrossMonitors, SpanZonesAcrossMonitorsKey),
|
||||
TraceLoggingBoolean(settings.makeDraggedWindowTransparent, MakeDraggedWindowTransparentKey),
|
||||
TraceLoggingBoolean(settings.allowSnapChildWindows, AllowSnapChildWindows),
|
||||
TraceLoggingBoolean(settings.allowSnapPopupWindows, AllowSnapPopupWindows),
|
||||
TraceLoggingBoolean(settings.disableRoundCorners, DisableRoundCornersOnSnapping),
|
||||
TraceLoggingWideString(settings.zoneColor.c_str(), ZoneColorKey),
|
||||
TraceLoggingWideString(settings.zoneBorderColor.c_str(), ZoneBorderColorKey),
|
||||
TraceLoggingWideString(settings.zoneHighlightColor.c_str(), ZoneHighlightColorKey),
|
||||
|
||||
Reference in New Issue
Block a user