From: Stefan Dösinger Subject: [PATCH 2/2] winemac: Don't pump messages in ChangeDisplaySettings (v2). Message-Id: <1429261776-2183-2-git-send-email-stefan@codeweavers.com> Date: Fri, 17 Apr 2015 11:09:36 +0200 Version 2: Also update macdrv_displays_changed. Supersedes 110793. The message ping-pong between the ChangeDisplaySettings calling thread and the desktop thread is more complicated here than in winex11. The problem again is that sendMessageTimeout(SMTO_BLOCK) will not process messages sent by the desktop, leading to a deadlock. Replacing SendMessageTimeout in the desktop with PostMessage is not an option either because then messages will be executed in a different order in the thread that called ChangeDisplaySettings. This patch will lead to DISPLAYCHANGE messages being sent on redundant changes. This matches the behavior of winex11 and happens to fix the user32/sysparam.ok test, but it fixes it for the wrong reason (the real problem afaics is that OSX only supports 32 bpp, so no change takes place although one was requested). I think redundant changes should be intercepted in user32 before the display driver is called. --- dlls/winemac.drv/display.c | 12 ++++++++++-- dlls/winemac.drv/window.c | 4 ---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 10ecf67..c86e044 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -564,8 +564,12 @@ better: size_t width = CGDisplayModeGetWidth(best_display_mode); size_t height = CGDisplayModeGetHeight(best_display_mode); - SendMessageW(GetDesktopWindow(), WM_MACDRV_UPDATE_DESKTOP_RECT, mode_bpp, - MAKELPARAM(width, height)); + SendMessageTimeoutW(HWND_BROADCAST, WM_MACDRV_RESET_DEVICE_METRICS, 0, 0, + SMTO_BLOCK | SMTO_ABORTIFHUNG, 2000, NULL); + SendMessageTimeoutW(GetDesktopWindow(), WM_MACDRV_UPDATE_DESKTOP_RECT, mode_bpp, + MAKELPARAM(width, height), SMTO_BLOCK, ~0U, NULL); + SendMessageTimeoutW(HWND_BROADCAST, WM_MACDRV_DISPLAYCHANGE, mode_bpp, + MAKELPARAM(width, height), SMTO_BLOCK | SMTO_ABORTIFHUNG, 2000, NULL); ret = DISP_CHANGE_SUCCESSFUL; } else @@ -1056,7 +1060,11 @@ void macdrv_displays_changed(const macdrv_event *event) int mode_bpp = display_mode_bits_per_pixel(mode); CGDisplayModeRelease(mode); + SendMessageTimeoutW(HWND_BROADCAST, WM_MACDRV_RESET_DEVICE_METRICS, 0, 0, + SMTO_ABORTIFHUNG, 2000, NULL); SendMessageW(hwnd, WM_MACDRV_UPDATE_DESKTOP_RECT, mode_bpp, MAKELPARAM(width, height)); + SendMessageTimeoutW(HWND_BROADCAST, WM_MACDRV_DISPLAYCHANGE, mode_bpp, + MAKELPARAM(width, height), SMTO_ABORTIFHUNG, 2000, NULL); } } diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index 7a777e6..fa12af5 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -1666,13 +1666,9 @@ LRESULT CDECL macdrv_WindowMessage(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) if (!GetWindowRect(hwnd, ¤t_desktop_rect) || !CGRectEqualToRect(cgrect_from_rect(current_desktop_rect), new_desktop_rect)) { - SendMessageTimeoutW(HWND_BROADCAST, WM_MACDRV_RESET_DEVICE_METRICS, 0, 0, - SMTO_ABORTIFHUNG, 2000, NULL); SetWindowPos(hwnd, 0, CGRectGetMinX(new_desktop_rect), CGRectGetMinY(new_desktop_rect), CGRectGetWidth(new_desktop_rect), CGRectGetHeight(new_desktop_rect), SWP_NOZORDER | SWP_NOACTIVATE | SWP_DEFERERASE); - SendMessageTimeoutW(HWND_BROADCAST, WM_MACDRV_DISPLAYCHANGE, wp, lp, - SMTO_ABORTIFHUNG, 2000, NULL); } } return 0; -- 2.3.4