[PATCH 2/2] winemac: Don't pump messages in ChangeDisplaySettings.

Stefan Dösinger stefan at codeweavers.com
Thu Apr 16 05:18:39 CDT 2015


Same as the previous patch, just for winemac.drv.

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 | 8 ++++++--
 dlls/winemac.drv/window.c  | 4 ----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
index 10ecf67..f7ce163 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
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, &current_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




More information about the wine-patches mailing list