[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
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<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()));
}
@@ -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<int>(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);
}
}