[FancyZones]Fix rounded corners optimized bug (#17560)

* [FancyZones]Fix rounded corners optimized bug

* Use proper flags

* Use WideChar version of functions
This commit is contained in:
Jaime Bernardo
2022-04-06 15:54:11 +01:00
committed by GitHub
parent d5a5f858c0
commit a09d8bf14b

View File

@@ -485,10 +485,18 @@ void FancyZonesWindowUtils::DisableRoundCorners(HWND window) noexcept
// save corner preference if it wasn't set already // save corner preference if it wasn't set already
DwmGetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &cornerPreference, sizeof(cornerPreference)); DwmGetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &cornerPreference, sizeof(cornerPreference));
HANDLE preferenceHandle; static_assert(sizeof(int) == 4);
memcpy(&preferenceHandle, &cornerPreference, sizeof(int)); 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<uint64_t>(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())); 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); HANDLE handle = GetPropW(window, ZonedWindowProperties::PropertyCornerPreference);
if (handle) if (handle)
{ {
int cornerPreference; static_assert(sizeof(int) == 4);
memcpy(&cornerPreference, &handle, sizeof(int)); 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<int>(cornerPreference64);
if (!SUCCEEDED(DwmSetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &cornerPreference, sizeof(cornerPreference)))) if (!SUCCEEDED(DwmSetWindowAttribute(window, DWMWA_WINDOW_CORNER_PREFERENCE, &cornerPreference, sizeof(cornerPreference))))
{ {
Logger::error(L"Failed to set saved corner preference"); Logger::error(L"Failed to set saved corner preference");
} }
RemoveProp(window, ZonedWindowProperties::PropertyCornerPreference); RemovePropW(window, ZonedWindowProperties::PropertyCornerPreference);
} }
} }