Ken Thomases : winemac: When a child window' s client area is equal to its whole area, use a single Cocoa view for both.

Alexandre Julliard julliard at wine.codeweavers.com
Sat May 14 10:07:28 CDT 2016


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

Author: Ken Thomases <ken at codeweavers.com>
Date:   Thu May 12 18:50:47 2016 -0500

winemac: When a child window's client area is equal to its whole area, use a single Cocoa view for both.

This should be a common case and will reduce the number of Cocoa views.

Signed-off-by: Ken Thomases <ken at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winemac.drv/window.c | 57 ++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 47 insertions(+), 10 deletions(-)

diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c
index 59d7763..0d507f4 100644
--- a/dlls/winemac.drv/window.c
+++ b/dlls/winemac.drv/window.c
@@ -746,14 +746,24 @@ static void destroy_cocoa_window(struct macdrv_win_data *data)
  */
 static void create_cocoa_view(struct macdrv_win_data *data)
 {
+    BOOL equal = !memcmp(&data->window_rect, &data->client_rect, sizeof(data->whole_rect));
+    CGRect frame = cgrect_from_rect(data->window_rect);
+
     data->shaped = FALSE;
     data->whole_rect = data->window_rect;
 
     TRACE("creating %p window %s whole %s client %s\n", data->hwnd, wine_dbgstr_rect(&data->window_rect),
           wine_dbgstr_rect(&data->whole_rect), wine_dbgstr_rect(&data->client_rect));
 
-    data->cocoa_view = macdrv_create_view(cgrect_from_rect(data->whole_rect));
+    if (!equal)
+        data->cocoa_view = macdrv_create_view(frame);
     create_client_cocoa_view(data);
+    if (equal)
+    {
+        data->cocoa_view = data->client_cocoa_view;
+        macdrv_set_view_hidden(data->cocoa_view, TRUE);
+        macdrv_set_view_frame(data->cocoa_view, frame);
+    }
 }
 
 
@@ -768,7 +778,8 @@ static void destroy_cocoa_view(struct macdrv_win_data *data)
 
     TRACE("win %p Cocoa view %p\n", data->hwnd, data->cocoa_view);
 
-    macdrv_dispose_view(data->cocoa_view);
+    if (data->cocoa_view != data->client_cocoa_view)
+        macdrv_dispose_view(data->cocoa_view);
     data->cocoa_view = NULL;
     data->on_screen = FALSE;
 }
@@ -1007,7 +1018,7 @@ static void sync_window_position(struct macdrv_win_data *data, UINT swp_flags, c
                                  const RECT *old_whole_rect)
 {
     CGRect frame = cgrect_from_rect(data->whole_rect);
-    RECT rect;
+    BOOL force_z_order = FALSE;
 
     if (data->cocoa_window)
     {
@@ -1020,11 +1031,37 @@ static void sync_window_position(struct macdrv_win_data *data, UINT swp_flags, c
         macdrv_set_cocoa_window_frame(data->cocoa_window, &frame);
     }
     else
-        macdrv_set_view_frame(data->cocoa_view, frame);
+    {
+        BOOL were_equal = (data->cocoa_view == data->client_cocoa_view);
+        BOOL now_equal = !memcmp(&data->whole_rect, &data->client_rect, sizeof(data->whole_rect));
 
-    rect = data->client_rect;
-    OffsetRect(&rect, -data->whole_rect.left, -data->whole_rect.top);
-    macdrv_set_view_frame(data->client_cocoa_view, cgrect_from_rect(rect));
+        if (were_equal && !now_equal)
+        {
+            data->cocoa_view = macdrv_create_view(frame);
+            macdrv_set_view_hidden(data->cocoa_view, !data->on_screen);
+            macdrv_set_view_superview(data->client_cocoa_view, data->cocoa_view, NULL, NULL, NULL);
+            macdrv_set_view_hidden(data->client_cocoa_view, FALSE);
+            force_z_order = TRUE;
+        }
+        else if (!were_equal && now_equal)
+        {
+            macdrv_dispose_view(data->cocoa_view);
+            data->cocoa_view = data->client_cocoa_view;
+            macdrv_set_view_hidden(data->cocoa_view, !data->on_screen);
+            macdrv_set_view_frame(data->cocoa_view, frame);
+            force_z_order = TRUE;
+        }
+        else
+            macdrv_set_view_frame(data->cocoa_view, frame);
+    }
+
+    if (data->cocoa_view != data->client_cocoa_view)
+    {
+        RECT rect = data->client_rect;
+        OffsetRect(&rect, -data->whole_rect.left, -data->whole_rect.top);
+        macdrv_set_view_frame(data->client_cocoa_view, cgrect_from_rect(rect));
+        TRACE("win %p/%p client %s\n", data->hwnd, data->client_cocoa_view, wine_dbgstr_rect(&rect));
+    }
 
     if (old_window_rect && old_whole_rect &&
         (IsRectEmpty(old_window_rect) != IsRectEmpty(&data->window_rect) ||
@@ -1032,11 +1069,11 @@ static void sync_window_position(struct macdrv_win_data *data, UINT swp_flags, c
          old_window_rect->top - old_whole_rect->top != data->window_rect.top - data->whole_rect.top))
         sync_window_region(data, (HRGN)1);
 
-    TRACE("win %p/%p whole_rect %s frame %s client %s\n", data->hwnd,
+    TRACE("win %p/%p whole_rect %s frame %s\n", data->hwnd,
           data->cocoa_window ? (void*)data->cocoa_window : (void*)data->cocoa_view,
-          wine_dbgstr_rect(&data->whole_rect), wine_dbgstr_cgrect(frame), wine_dbgstr_rect(&rect));
+          wine_dbgstr_rect(&data->whole_rect), wine_dbgstr_cgrect(frame));
 
-    if (!(swp_flags & SWP_NOZORDER) || (swp_flags & SWP_SHOWWINDOW))
+    if (force_z_order || !(swp_flags & SWP_NOZORDER) || (swp_flags & SWP_SHOWWINDOW))
         sync_window_z_order(data);
 }
 




More information about the wine-cvs mailing list