I think this dates from a time where every window had its own window surface, and unless I'm missing something this isn't needed anymore. My intention is to refactor the client surfaces, so that they can be manipulated directly from win32u, and unify GL/VK client surfaces. This would make the code simpler, in preparation for that.
From: Rémi Bernon rbernon@codeweavers.com
They look unnecessary, we are drawing entire window surfaces now, or to individual client views when GL/VK is involved. --- dlls/winemac.drv/macdrv.h | 1 - dlls/winemac.drv/window.c | 255 ++++++-------------------------------- 2 files changed, 40 insertions(+), 216 deletions(-)
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 9c76fe78c38..ce34a231cf4 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -178,7 +178,6 @@ extern BOOL macdrv_SystemParametersInfo(UINT action, UINT int_param, void *ptr_p { HWND hwnd; /* hwnd that this private data belongs to */ macdrv_window cocoa_window; - macdrv_view cocoa_view; macdrv_view client_cocoa_view; struct window_rects rects; /* window rects in monitor DPI, relative to parent client area */ int pixel_format; /* pixel format for GL */ diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index c9a4fcd5060..93dc5fb3cbb 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -231,21 +231,6 @@ macdrv_window macdrv_get_cocoa_window(HWND hwnd, BOOL require_on_screen) }
-/*********************************************************************** - * macdrv_get_cocoa_view - * - * Return the Cocoa view associated with a window - */ -macdrv_view macdrv_get_cocoa_view(HWND hwnd) -{ - struct macdrv_win_data *data = get_win_data(hwnd); - macdrv_view ret = data ? data->cocoa_view : NULL; - - release_win_data(data); - return ret; -} - - /*********************************************************************** * macdrv_get_client_cocoa_view * @@ -491,7 +476,7 @@ static void create_client_cocoa_view(struct macdrv_win_data *data) data->client_cocoa_view = macdrv_create_view(cgrect_from_rect(rect)); macdrv_set_view_hidden(data->client_cocoa_view, FALSE); } - macdrv_set_view_superview(data->client_cocoa_view, data->cocoa_view, data->cocoa_window, NULL, NULL); + macdrv_set_view_superview(data->client_cocoa_view, NULL, data->cocoa_window, NULL, NULL); }
@@ -572,71 +557,6 @@ static void destroy_cocoa_window(struct macdrv_win_data *data) }
-/********************************************************************** - * create_cocoa_view - * - * Create the Cocoa view for a given Windows child window - */ -static void create_cocoa_view(struct macdrv_win_data *data) -{ - BOOL equal = EqualRect(&data->rects.window, &data->rects.client); - CGRect frame = cgrect_from_rect(data->rects.window); - - data->shaped = FALSE; - data->rects.visible = data->rects.window; - - TRACE("creating %p window %s whole %s client %s\n", data->hwnd, wine_dbgstr_rect(&data->rects.window), - wine_dbgstr_rect(&data->rects.visible), wine_dbgstr_rect(&data->rects.client)); - - 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); - } -} - - -/********************************************************************** - * destroy_cocoa_view - * - * Destroy the Cocoa view for a given window. - */ -static void destroy_cocoa_view(struct macdrv_win_data *data) -{ - if (!data->cocoa_view) return; - - TRACE("win %p Cocoa view %p\n", data->hwnd, 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; -} - - -/*********************************************************************** - * set_cocoa_view_parent - */ -static void set_cocoa_view_parent(struct macdrv_win_data *data, HWND parent) -{ - struct macdrv_win_data *parent_data = get_win_data(parent); - macdrv_window cocoa_window = parent_data ? parent_data->cocoa_window : NULL; - macdrv_view superview = parent_data ? parent_data->client_cocoa_view : NULL; - - TRACE("win %p/%p parent %p/%p\n", data->hwnd, data->cocoa_view, parent, cocoa_window ? (void*)cocoa_window : (void*)superview); - - if (!cocoa_window && !superview) - WARN("hwnd %p new parent %p has no Cocoa window or view in this process\n", data->hwnd, parent); - - macdrv_set_view_superview(data->cocoa_view, superview, cocoa_window, NULL, NULL); - release_win_data(parent_data); -} - - /*********************************************************************** * macdrv_create_win_data * @@ -668,16 +588,10 @@ static struct macdrv_win_data *macdrv_create_win_data(HWND hwnd, const struct wi hwnd, data->cocoa_window, wine_dbgstr_rect(&data->rects.window), wine_dbgstr_rect(&data->rects.visible), wine_dbgstr_rect(&data->rects.client)); } - else - { - create_cocoa_view(data); - TRACE("win %p/%p window %s whole %s client %s\n", - hwnd, data->cocoa_view, wine_dbgstr_rect(&data->rects.window), - wine_dbgstr_rect(&data->rects.visible), wine_dbgstr_rect(&data->rects.client)); - - set_cocoa_view_parent(data, parent); - }
+ TRACE("win %p/%p window %s whole %s client %s\n", + hwnd, data->cocoa_window, wine_dbgstr_rect(&data->rects.window), + wine_dbgstr_rect(&data->rects.visible), wine_dbgstr_rect(&data->rects.client)); return data; }
@@ -753,51 +667,41 @@ static void set_focus(HWND hwnd, BOOL raise) */ static void show_window(struct macdrv_win_data *data) { - if (data->cocoa_window) - { - HWND prev = NULL; - HWND next = NULL; - macdrv_window prev_window = NULL; - macdrv_window next_window = NULL; - BOOL activate = FALSE; - GUITHREADINFO info; - - /* find window that this one must be after */ - prev = NtUserGetWindowRelative(data->hwnd, GW_HWNDPREV); - while (prev && !((NtUserGetWindowLongW(prev, GWL_STYLE) & (WS_VISIBLE | WS_MINIMIZE)) == WS_VISIBLE && - (prev_window = macdrv_get_cocoa_window(prev, TRUE)))) - prev = NtUserGetWindowRelative(prev, GW_HWNDPREV); - if (!prev_window) - { - /* find window that this one must be before */ - next = NtUserGetWindowRelative(data->hwnd, GW_HWNDNEXT); - while (next && !((NtUserGetWindowLongW(next, GWL_STYLE) & (WS_VISIBLE | WS_MINIMIZE)) == WS_VISIBLE && - (next_window = macdrv_get_cocoa_window(next, TRUE)))) - next = NtUserGetWindowRelative(next, GW_HWNDNEXT); - } + HWND prev = NULL; + HWND next = NULL; + macdrv_window prev_window = NULL; + macdrv_window next_window = NULL; + BOOL activate = FALSE; + GUITHREADINFO info;
- TRACE("win %p/%p below %p/%p above %p/%p\n", - data->hwnd, data->cocoa_window, prev, prev_window, next, next_window); + /* find window that this one must be after */ + prev = NtUserGetWindowRelative(data->hwnd, GW_HWNDPREV); + while (prev && !((NtUserGetWindowLongW(prev, GWL_STYLE) & (WS_VISIBLE | WS_MINIMIZE)) == WS_VISIBLE && + (prev_window = macdrv_get_cocoa_window(prev, TRUE)))) + prev = NtUserGetWindowRelative(prev, GW_HWNDPREV); + if (!prev_window) + { + /* find window that this one must be before */ + next = NtUserGetWindowRelative(data->hwnd, GW_HWNDNEXT); + while (next && !((NtUserGetWindowLongW(next, GWL_STYLE) & (WS_VISIBLE | WS_MINIMIZE)) == WS_VISIBLE && + (next_window = macdrv_get_cocoa_window(next, TRUE)))) + next = NtUserGetWindowRelative(next, GW_HWNDNEXT); + }
- if (!prev_window) - activate = activate_on_focus_time && (NtGetTickCount() - activate_on_focus_time < 2000); - macdrv_order_cocoa_window(data->cocoa_window, prev_window, next_window, activate); - data->on_screen = TRUE; + TRACE("win %p/%p below %p/%p above %p/%p\n", + data->hwnd, data->cocoa_window, prev, prev_window, next, next_window);
- info.cbSize = sizeof(info); - if (NtUserGetGUIThreadInfo(NtUserGetWindowThread(data->hwnd, NULL), &info) && info.hwndFocus && - (data->hwnd == info.hwndFocus || NtUserIsChild(data->hwnd, info.hwndFocus))) - set_focus(info.hwndFocus, FALSE); - if (activate) - activate_on_focus_time = 0; - } - else - { - TRACE("win %p/%p showing view\n", data->hwnd, data->cocoa_view); + if (!prev_window) + activate = activate_on_focus_time && (NtGetTickCount() - activate_on_focus_time < 2000); + macdrv_order_cocoa_window(data->cocoa_window, prev_window, next_window, activate); + data->on_screen = TRUE;
- macdrv_set_view_hidden(data->cocoa_view, FALSE); - data->on_screen = TRUE; - } + info.cbSize = sizeof(info); + if (NtUserGetGUIThreadInfo(NtUserGetWindowThread(data->hwnd, NULL), &info) && info.hwndFocus && + (data->hwnd == info.hwndFocus || NtUserIsChild(data->hwnd, info.hwndFocus))) + set_focus(info.hwndFocus, FALSE); + if (activate) + activate_on_focus_time = 0; }
@@ -810,56 +714,10 @@ static void hide_window(struct macdrv_win_data *data)
if (data->cocoa_window) macdrv_hide_cocoa_window(data->cocoa_window); - else - macdrv_set_view_hidden(data->cocoa_view, TRUE); data->on_screen = FALSE; }
-/*********************************************************************** - * sync_window_z_order - */ -static void sync_window_z_order(struct macdrv_win_data *data) -{ - if (data->cocoa_view) - { - HWND parent = NtUserGetAncestor(data->hwnd, GA_PARENT); - macdrv_view superview = macdrv_get_client_cocoa_view(parent); - macdrv_window window = NULL; - HWND prev; - HWND next = NULL; - macdrv_view prev_view = NULL; - macdrv_view next_view = NULL; - - if (!superview) - { - window = macdrv_get_cocoa_window(parent, FALSE); - if (!window) - WARN("hwnd %p/%p parent %p has no Cocoa window or view in this process\n", data->hwnd, data->cocoa_view, parent); - } - - /* find window that this one must be after */ - prev = NtUserGetWindowRelative(data->hwnd, GW_HWNDPREV); - while (prev && !(prev_view = macdrv_get_cocoa_view(prev))) - prev = NtUserGetWindowRelative(prev, GW_HWNDPREV); - if (!prev_view) - { - /* find window that this one must be before */ - next = NtUserGetWindowRelative(data->hwnd, GW_HWNDNEXT); - while (next && !(next_view = macdrv_get_cocoa_view(next))) - next = NtUserGetWindowRelative(next, GW_HWNDNEXT); - } - - TRACE("win %p/%p below %p/%p above %p/%p\n", - data->hwnd, data->cocoa_view, prev, prev_view, next, next_view); - - macdrv_set_view_superview(data->cocoa_view, superview, window, prev_view, next_view); - } - else if (data->on_screen) - show_window(data); -} - - /*********************************************************************** * get_region_data * @@ -932,7 +790,7 @@ RGNDATA *get_region_data(HRGN hrgn, HDC hdc_lptodp) */ static void sync_client_view_position(struct macdrv_win_data *data) { - if (data->cocoa_view != data->client_cocoa_view) + if (data->client_cocoa_view) { RECT rect = data->rects.client; OffsetRect(&rect, -data->rects.visible.left, -data->rects.visible.top); @@ -950,7 +808,6 @@ static void sync_client_view_position(struct macdrv_win_data *data) static void sync_window_position(struct macdrv_win_data *data, UINT swp_flags, const struct window_rects *old_rects) { CGRect frame = cgrect_from_rect(data->rects.visible); - BOOL force_z_order = FALSE;
if (data->cocoa_window) { @@ -962,30 +819,6 @@ static void sync_window_position(struct macdrv_win_data *data, UINT swp_flags, c
macdrv_set_cocoa_window_frame(data->cocoa_window, &frame); } - else - { - BOOL were_equal = (data->cocoa_view == data->client_cocoa_view); - BOOL now_equal = EqualRect(&data->rects.visible, &data->rects.client); - - 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 if (!EqualRect(&data->rects.visible, &old_rects->visible)) - macdrv_set_view_frame(data->cocoa_view, frame); - }
sync_client_view_position(data);
@@ -995,12 +828,11 @@ static void sync_window_position(struct macdrv_win_data *data, UINT swp_flags, c old_rects->window.top - old_rects->visible.top != data->rects.window.top - data->rects.visible.top)) sync_window_region(data, (HRGN)1);
- TRACE("win %p/%p whole_rect %s frame %s\n", data->hwnd, - data->cocoa_window ? (void*)data->cocoa_window : (void*)data->cocoa_view, + TRACE("win %p/%p whole_rect %s frame %s\n", data->hwnd, data->cocoa_window, wine_dbgstr_rect(&data->rects.visible), wine_dbgstr_cgrect(frame));
- if (force_z_order || !(swp_flags & SWP_NOZORDER) || (swp_flags & SWP_SHOWWINDOW)) - sync_window_z_order(data); + if (data->cocoa_window && data->on_screen && (!(swp_flags & SWP_NOZORDER) || (swp_flags & SWP_SHOWWINDOW))) + show_window(data); }
@@ -1377,7 +1209,6 @@ void macdrv_DestroyWindow(HWND hwnd) if (data->drag_event) NtSetEvent(data->drag_event, NULL);
destroy_cocoa_window(data); - destroy_cocoa_view(data); if (data->client_cocoa_view) macdrv_dispose_view(data->client_cocoa_view);
CFDictionaryRemoveValue(win_datas, hwnd); @@ -1450,14 +1281,10 @@ void macdrv_SetParent(HWND hwnd, HWND parent, HWND old_parent) { /* destroy the old Mac window */ destroy_cocoa_window(data); - create_cocoa_view(data); } - - set_cocoa_view_parent(data, parent); } else /* new top level window */ { - destroy_cocoa_view(data); create_cocoa_window(data); } release_win_data(data); @@ -1736,7 +1563,7 @@ void macdrv_WindowPosChanged(HWND hwnd, HWND insert_after, HWND owner_hint, UINT TRACE("win %p/%p new_rects %s style %08x flags %08x surface %p\n", hwnd, data->cocoa_window, debugstr_window_rects(new_rects), new_style, swp_flags, surface);
- if (!data->cocoa_window && !data->cocoa_view) goto done; + if (!data->cocoa_window) goto done;
if (data->on_screen) { @@ -1772,8 +1599,6 @@ void macdrv_WindowPosChanged(HWND hwnd, HWND insert_after, HWND owner_hint, UINT (data->layered || !(NtUserGetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_LAYERED))) show_window(data); } - else if (!data->on_screen) - show_window(data); }
done: