Ken Thomases : winemac: Keep stable surface for layered windows using UpdateLayeredWindow().

Alexandre Julliard julliard at winehq.org
Tue Mar 26 15:11:13 CDT 2013


Module: wine
Branch: master
Commit: 4ec2809e7309b71eb7d07885649d7d2cc522929c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4ec2809e7309b71eb7d07885649d7d2cc522929c

Author: Ken Thomases <ken at codeweavers.com>
Date:   Tue Mar 26 08:54:51 2013 -0500

winemac: Keep stable surface for layered windows using UpdateLayeredWindow().

---

 dlls/winemac.drv/macdrv.h |    1 +
 dlls/winemac.drv/window.c |   15 ++++++++++-----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index aeeee2d..970a228 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -127,6 +127,7 @@ struct macdrv_win_data
     BOOL                on_screen : 1;          /* is window ordered in? (minimized or not) */
     BOOL                shaped : 1;             /* is window using a custom region shape? */
     BOOL                layered : 1;            /* is window layered and with valid attributes? */
+    BOOL                ulw_layered : 1;        /* has UpdateLayeredWindow() been called for window? */
     BOOL                per_pixel_alpha : 1;    /* is window using per-pixel alpha? */
     BOOL                minimized : 1;          /* is window minimized? */
     struct window_surface *surface;
diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c
index eba8d86..07c4643 100644
--- a/dlls/winemac.drv/window.c
+++ b/dlls/winemac.drv/window.c
@@ -971,6 +971,7 @@ void CDECL macdrv_SetWindowStyle(HWND hwnd, INT offset, STYLESTRUCT *style)
         if (offset == GWL_EXSTYLE && (changed & WS_EX_LAYERED)) /* changing WS_EX_LAYERED resets attributes */
         {
             data->layered = FALSE;
+            data->ulw_layered = FALSE;
             sync_window_opacity(data, 0, 0, FALSE, 0);
             if (data->surface) set_surface_use_alpha(data->surface, FALSE);
         }
@@ -1092,6 +1093,7 @@ BOOL CDECL macdrv_UpdateLayeredWindow(HWND hwnd, const UPDATELAYEREDWINDOWINFO *
     if (!(data = get_win_data(hwnd))) return FALSE;
 
     data->layered = TRUE;
+    data->ulw_layered = TRUE;
 
     rect = *window_rect;
     OffsetRect(&rect, -window_rect->left, -window_rect->top);
@@ -1271,6 +1273,7 @@ void CDECL macdrv_WindowPosChanging(HWND hwnd, HWND insert_after, UINT swp_flags
     /* create the window surface if necessary */
     if (!data->cocoa_window) goto done;
     if (swp_flags & SWP_HIDEWINDOW) goto done;
+    if (data->ulw_layered) goto done;
 
     if (*surface) window_surface_release(*surface);
     *surface = NULL;
@@ -1318,11 +1321,13 @@ void CDECL macdrv_WindowPosChanged(HWND hwnd, HWND insert_after, UINT swp_flags,
     data->window_rect = *window_rect;
     data->whole_rect  = *visible_rect;
     data->client_rect = *client_rect;
-    if (surface)
-        window_surface_add_ref(surface);
-    set_window_surface(data->cocoa_window, surface);
-    if (data->surface) window_surface_release(data->surface);
-    data->surface = surface;
+    if (!data->ulw_layered)
+    {
+        if (surface) window_surface_add_ref(surface);
+        set_window_surface(data->cocoa_window, surface);
+        if (data->surface) window_surface_release(data->surface);
+        data->surface = surface;
+    }
 
     TRACE("win %p/%p window %s whole %s client %s style %08x flags %08x surface %p\n",
            hwnd, data->cocoa_window, wine_dbgstr_rect(window_rect),




More information about the wine-cvs mailing list