From a09d8bf14bf1b5aca8b5abbd2d6c529d704d945f Mon Sep 17 00:00:00 2001 From: Jaime Bernardo Date: Wed, 6 Apr 2022 15:54:11 +0100 Subject: [PATCH] [FancyZones]Fix rounded corners optimized bug (#17560) * [FancyZones]Fix rounded corners optimized bug * Use proper flags * Use WideChar version of functions --- .../fancyzones/FancyZonesLib/WindowUtils.cpp | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/modules/fancyzones/FancyZonesLib/WindowUtils.cpp b/src/modules/fancyzones/FancyZonesLib/WindowUtils.cpp index d9698fbd33..129cac7c0e 100644 --- a/src/modules/fancyzones/FancyZonesLib/WindowUtils.cpp +++ b/src/modules/fancyzones/FancyZonesLib/WindowUtils.cpp @@ -485,10 +485,18 @@ void FancyZonesWindowUtils::DisableRoundCorners(HWND window) noexcept // 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)); + static_assert(sizeof(int) == 4); + static_assert(sizeof(HANDLE) == 8); + static_assert(sizeof(HANDLE) == sizeof(uint64_t)); - if (!SetProp(window, ZonedWindowProperties::PropertyCornerPreference, preferenceHandle)) + // 0 is a valid value, so use a high bit to distinguish between 0 and a GetProp fail + uint64_t cornerPreference64 = static_cast(cornerPreference); + cornerPreference64 = (cornerPreference64 & 0xFFFFFFFF) | 0x100000000; + + HANDLE preferenceHandle = {}; + memcpy(&preferenceHandle, &cornerPreference64, sizeof(HANDLE)); + + if (!SetPropW(window, ZonedWindowProperties::PropertyCornerPreference, preferenceHandle)) { Logger::error(L"Failed to save corner preference, {}", get_last_error_or_default(GetLastError())); } @@ -507,15 +515,22 @@ void FancyZonesWindowUtils::ResetRoundCornersPreference(HWND window) noexcept HANDLE handle = GetPropW(window, ZonedWindowProperties::PropertyCornerPreference); if (handle) { - int cornerPreference; - memcpy(&cornerPreference, &handle, sizeof(int)); + static_assert(sizeof(int) == 4); + static_assert(sizeof(HANDLE) == 8); + static_assert(sizeof(HANDLE) == sizeof(uint64_t)); + + uint64_t cornerPreference64 = {}; + memcpy(&cornerPreference64, &handle, sizeof(uint64_t)); + cornerPreference64 = cornerPreference64 & 0xFFFFFFFF; + + int cornerPreference = static_cast(cornerPreference64); if (!SUCCEEDED(DwmSetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &cornerPreference, sizeof(cornerPreference)))) { Logger::error(L"Failed to set saved corner preference"); } - RemoveProp(window, ZonedWindowProperties::PropertyCornerPreference); + RemovePropW(window, ZonedWindowProperties::PropertyCornerPreference); } }