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@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d91e568635
commit
053b4a81ed
|
@ -746,14 +746,24 @@ static void destroy_cocoa_window(struct macdrv_win_data *data)
|
||||||
*/
|
*/
|
||||||
static void create_cocoa_view(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->shaped = FALSE;
|
||||||
data->whole_rect = data->window_rect;
|
data->whole_rect = data->window_rect;
|
||||||
|
|
||||||
TRACE("creating %p window %s whole %s client %s\n", data->hwnd, wine_dbgstr_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));
|
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);
|
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);
|
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->cocoa_view = NULL;
|
||||||
data->on_screen = FALSE;
|
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)
|
const RECT *old_whole_rect)
|
||||||
{
|
{
|
||||||
CGRect frame = cgrect_from_rect(data->whole_rect);
|
CGRect frame = cgrect_from_rect(data->whole_rect);
|
||||||
RECT rect;
|
BOOL force_z_order = FALSE;
|
||||||
|
|
||||||
if (data->cocoa_window)
|
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);
|
macdrv_set_cocoa_window_frame(data->cocoa_window, &frame);
|
||||||
}
|
}
|
||||||
else
|
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;
|
if (were_equal && !now_equal)
|
||||||
OffsetRect(&rect, -data->whole_rect.left, -data->whole_rect.top);
|
{
|
||||||
macdrv_set_view_frame(data->client_cocoa_view, cgrect_from_rect(rect));
|
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 &&
|
if (old_window_rect && old_whole_rect &&
|
||||||
(IsRectEmpty(old_window_rect) != IsRectEmpty(&data->window_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))
|
old_window_rect->top - old_whole_rect->top != data->window_rect.top - data->whole_rect.top))
|
||||||
sync_window_region(data, (HRGN)1);
|
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,
|
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);
|
sync_window_z_order(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue