From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winemac.drv/event.c | 8 +-- dlls/winemac.drv/macdrv.h | 6 +- dlls/winemac.drv/opengl.c | 20 +++---- dlls/winemac.drv/window.c | 114 ++++++++++++++++++-------------------- 4 files changed, 69 insertions(+), 79 deletions(-)
diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c index 1628745f2b7..d551e1b5573 100644 --- a/dlls/winemac.drv/event.c +++ b/dlls/winemac.drv/event.c @@ -238,8 +238,8 @@ static BOOL query_drag_drop(macdrv_query *query)
params.hwnd = HandleToUlong(hwnd); params.effect = drag_operations_to_dropeffects(query->drag_drop.op); - params.x = query->drag_drop.x + data->whole_rect.left; - params.y = query->drag_drop.y + data->whole_rect.top; + params.x = query->drag_drop.x + data->rects.visible.left; + params.y = query->drag_drop.y + data->rects.visible.top; params.handle = (UINT_PTR)query->drag_drop.pasteboard; release_win_data(data); if (KeUserModeCallback(client_func_dnd_query_drop, ¶ms, sizeof(params), &ret_ptr, &ret_len)) @@ -283,8 +283,8 @@ static BOOL query_drag_operation(macdrv_query *query)
params.hwnd = HandleToUlong(hwnd); params.effect = drag_operations_to_dropeffects(query->drag_operation.offered_ops); - params.x = query->drag_operation.x + data->whole_rect.left; - params.y = query->drag_operation.y + data->whole_rect.top; + params.x = query->drag_operation.x + data->rects.visible.left; + params.y = query->drag_operation.y + data->rects.visible.top; params.handle = (UINT_PTR)query->drag_operation.pasteboard; release_win_data(data);
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 40fa08605c1..b417c0e2344 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -180,9 +180,7 @@ extern BOOL macdrv_SystemParametersInfo(UINT action, UINT int_param, void *ptr_p macdrv_window cocoa_window; macdrv_view cocoa_view; macdrv_view client_cocoa_view; - RECT window_rect; /* USER window rectangle relative to parent */ - RECT whole_rect; /* Mac window rectangle for the whole window relative to parent */ - RECT client_rect; /* client area relative to parent */ + struct window_rects rects; /* window rects in monitor DPI, relative to parent client area */ int pixel_format; /* pixel format for GL */ HANDLE drag_event; /* event to signal that Cocoa-driven window dragging has ended */ unsigned int on_screen : 1; /* is window ordered in? (minimized or not) */ @@ -244,7 +242,7 @@ extern BOOL macdrv_SystemParametersInfo(UINT action, UINT int_param, void *ptr_p
extern struct opengl_funcs *macdrv_wine_get_wgl_driver(UINT version); extern UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, const struct vulkan_driver_funcs **driver_funcs); -extern void sync_gl_view(struct macdrv_win_data* data, const RECT* old_whole_rect, const RECT* old_client_rect); +extern void sync_gl_view(struct macdrv_win_data* data, const struct window_rects *old_rects);
extern CGImageRef create_cgimage_from_icon_bitmaps(HDC hdc, HANDLE icon, HBITMAP hbmColor, unsigned char *color_bits, int color_size, HBITMAP hbmMask, diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index 90e99844d4c..ac87cfc1313 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -1625,8 +1625,8 @@ static BOOL sync_context_rect(struct wgl_context *context)
if (data && data->client_cocoa_view == context->draw_view) { - RECT rect = data->client_rect; - OffsetRect(&rect, -data->whole_rect.left, -data->whole_rect.top); + RECT rect = data->rects.client; + OffsetRect(&rect, -data->rects.visible.left, -data->rects.visible.top); if (!EqualRect(&context->draw_rect, &rect)) { context->draw_rect = rect; @@ -3481,8 +3481,8 @@ static BOOL macdrv_wglMakeContextCurrentARB(HDC draw_hdc, HDC read_hdc, struct w
context->draw_hwnd = hwnd; context->draw_view = data->client_cocoa_view; - context->draw_rect = data->client_rect; - OffsetRect(&context->draw_rect, -data->whole_rect.left, -data->whole_rect.top); + context->draw_rect = data->rects.client; + OffsetRect(&context->draw_rect, -data->rects.visible.left, -data->rects.visible.top); context->draw_pbuffer = NULL; release_win_data(data); } @@ -3530,8 +3530,8 @@ static BOOL macdrv_wglMakeContextCurrentARB(HDC draw_hdc, HDC read_hdc, struct w if (data->client_cocoa_view != context->draw_view) { context->read_view = data->client_cocoa_view; - context->read_rect = data->client_rect; - OffsetRect(&context->read_rect, -data->whole_rect.left, -data->whole_rect.top); + context->read_rect = data->rects.client; + OffsetRect(&context->read_rect, -data->rects.visible.left, -data->rects.visible.top); } release_win_data(data); } @@ -4247,14 +4247,14 @@ failed: * Synchronize the Mac GL view position with the Windows child window * position. */ -void sync_gl_view(struct macdrv_win_data* data, const RECT* old_whole_rect, const RECT* old_client_rect) +void sync_gl_view(struct macdrv_win_data* data, const struct window_rects *old_rects) { if (data->client_cocoa_view && data->pixel_format) { - RECT old = *old_client_rect, new = data->client_rect; + RECT old = old_rects->client, new = data->rects.client;
- OffsetRect(&old, -old_whole_rect->left, -old_whole_rect->top); - OffsetRect(&new, -data->whole_rect.left, -data->whole_rect.top); + OffsetRect(&old, -old_rects->visible.left, -old_rects->visible.top); + OffsetRect(&new, -data->rects.visible.left, -data->rects.visible.top); if (!EqualRect(&old, &new)) { TRACE("GL view %p changed position; marking contexts\n", data->client_cocoa_view); diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index 9aa92b29974..ad3b33540fc 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -144,7 +144,7 @@ static void get_cocoa_window_state(struct macdrv_win_data *data, state->excluded_by_expose = state->excluded_by_cycle = (!(ex_style & WS_EX_APPWINDOW) && (NtUserGetWindowRelative(data->hwnd, GW_OWNER) || (ex_style & (WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE)))); - if (IsRectEmpty(&data->window_rect)) + if (IsRectEmpty(&data->rects.window)) state->excluded_by_expose = TRUE; state->minimized = (style & WS_MINIMIZE) != 0; state->minimized_valid = state->minimized != data->minimized; @@ -228,7 +228,7 @@ static void macdrv_mac_to_window_rect(struct macdrv_win_data *data, RECT *rect) if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return; if (IsRectEmpty(rect)) return;
- get_mac_rect_offset(data, style, &rc, &data->window_rect, &data->client_rect); + get_mac_rect_offset(data, style, &rc, &data->rects.window, &data->rects.client);
rect->left += rc.left; rect->right += rc.right; @@ -386,7 +386,7 @@ static void set_cocoa_window_properties(struct macdrv_win_data *data) owner_win = macdrv_get_cocoa_window(owner, TRUE); macdrv_set_cocoa_parent_window(data->cocoa_window, owner_win);
- get_cocoa_window_features(data, style, ex_style, &wf, &data->window_rect, &data->client_rect); + get_cocoa_window_features(data, style, ex_style, &wf, &data->rects.window, &data->rects.client); macdrv_set_cocoa_window_features(data->cocoa_window, &wf);
get_cocoa_window_state(data, style, ex_style, &state); @@ -405,7 +405,7 @@ static void sync_window_region(struct macdrv_win_data *data, HRGN win_region) { if (!data->cocoa_window) return;
- if (IsRectEmpty(&data->window_rect)) /* set an empty shape */ + if (IsRectEmpty(&data->rects.window)) /* set an empty shape */ { data->shaped = FALSE; TRACE("win %p/%p setting empty shape for zero-sized window\n", data->hwnd, data->cocoa_window); @@ -553,7 +553,7 @@ static void sync_window_min_max_info(HWND hwnd) CGSize min_size, max_size;
SetRect(&min_rect, 0, 0, minmax.ptMinTrackSize.x, minmax.ptMinTrackSize.y); - macdrv_window_to_mac_rect(data, style, &min_rect, &data->window_rect, &data->client_rect); + macdrv_window_to_mac_rect(data, style, &min_rect, &data->rects.window, &data->rects.client); min_size = CGSizeMake(min_rect.right - min_rect.left, min_rect.bottom - min_rect.top);
if (minmax.ptMaxTrackSize.x == NtUserGetSystemMetrics(SM_CXMAXTRACK) && @@ -562,7 +562,7 @@ static void sync_window_min_max_info(HWND hwnd) else { SetRect(&max_rect, 0, 0, minmax.ptMaxTrackSize.x, minmax.ptMaxTrackSize.y); - macdrv_window_to_mac_rect(data, style, &max_rect, &data->window_rect, &data->client_rect); + macdrv_window_to_mac_rect(data, style, &max_rect, &data->rects.window, &data->rects.client); max_size = CGSizeMake(max_rect.right - max_rect.left, max_rect.bottom - max_rect.top); }
@@ -583,8 +583,8 @@ static void sync_window_min_max_info(HWND hwnd) */ static void create_client_cocoa_view(struct macdrv_win_data *data) { - RECT rect = data->client_rect; - OffsetRect(&rect, -data->whole_rect.left, -data->whole_rect.top); + RECT rect = data->rects.client; + OffsetRect(&rect, -data->rects.visible.left, -data->rects.visible.top);
if (data->client_cocoa_view) macdrv_set_view_frame(data->client_cocoa_view, cgrect_from_rect(rect)); @@ -625,15 +625,15 @@ static void create_cocoa_window(struct macdrv_win_data *data) style = NtUserGetWindowLongW(data->hwnd, GWL_STYLE); ex_style = NtUserGetWindowLongW(data->hwnd, GWL_EXSTYLE);
- get_cocoa_window_features(data, style, ex_style, &wf, &data->window_rect, &data->client_rect); + get_cocoa_window_features(data, style, ex_style, &wf, &data->rects.window, &data->rects.client);
- frame = cgrect_from_rect(data->whole_rect); + frame = cgrect_from_rect(data->rects.visible); constrain_window_frame(&frame.origin, &frame.size); if (frame.size.width < 1 || frame.size.height < 1) frame.size.width = frame.size.height = 1;
- 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)); + 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));
data->cocoa_window = macdrv_create_cocoa_window(&wf, frame, data->hwnd, thread_data->queue); if (!data->cocoa_window) goto done; @@ -646,7 +646,7 @@ static void create_cocoa_window(struct macdrv_win_data *data) macdrv_set_cocoa_window_title(data->cocoa_window, text, wcslen(text));
/* set the window region */ - if (win_rgn || IsRectEmpty(&data->window_rect)) sync_window_region(data, win_rgn); + if (win_rgn || IsRectEmpty(&data->rects.window)) sync_window_region(data, win_rgn);
/* set the window opacity */ if (!NtUserGetLayeredWindowAttributes(data->hwnd, &key, &alpha, &layered_flags)) layered_flags = 0; @@ -681,14 +681,14 @@ static void destroy_cocoa_window(struct macdrv_win_data *data) */ static void create_cocoa_view(struct macdrv_win_data *data) { - BOOL equal = EqualRect(&data->window_rect, &data->client_rect); - CGRect frame = cgrect_from_rect(data->window_rect); + BOOL equal = EqualRect(&data->rects.window, &data->rects.client); + CGRect frame = cgrect_from_rect(data->rects.window);
data->shaped = FALSE; - data->whole_rect = data->window_rect; + data->rects.visible = data->rects.window;
- 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)); + 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); @@ -744,8 +744,7 @@ static void set_cocoa_view_parent(struct macdrv_win_data *data, HWND parent) * * Create a Mac data window structure for an existing window. */ -static struct macdrv_win_data *macdrv_create_win_data(HWND hwnd, const RECT *window_rect, - const RECT *client_rect) +static struct macdrv_win_data *macdrv_create_win_data(HWND hwnd, const struct window_rects *rects) { struct macdrv_win_data *data; HWND parent; @@ -762,23 +761,21 @@ static struct macdrv_win_data *macdrv_create_win_data(HWND hwnd, const RECT *win if (parent != NtUserGetDesktopWindow() && !NtUserGetAncestor(parent, GA_PARENT)) return NULL;
if (!(data = alloc_win_data(hwnd))) return NULL; - - data->whole_rect = data->window_rect = *window_rect; - data->client_rect = *client_rect; + data->rects = *rects;
if (parent == NtUserGetDesktopWindow()) { create_cocoa_window(data); TRACE("win %p/%p window %s whole %s client %s\n", - hwnd, data->cocoa_window, wine_dbgstr_rect(&data->window_rect), - wine_dbgstr_rect(&data->whole_rect), wine_dbgstr_rect(&data->client_rect)); + 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->window_rect), - wine_dbgstr_rect(&data->whole_rect), wine_dbgstr_rect(&data->client_rect)); + 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); } @@ -1039,8 +1036,8 @@ static void sync_client_view_position(struct macdrv_win_data *data) { if (data->cocoa_view != data->client_cocoa_view) { - RECT rect = data->client_rect; - OffsetRect(&rect, -data->whole_rect.left, -data->whole_rect.top); + RECT rect = data->rects.client; + OffsetRect(&rect, -data->rects.visible.left, -data->rects.visible.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)); } @@ -1052,10 +1049,9 @@ static void sync_client_view_position(struct macdrv_win_data *data) * * Synchronize the Mac window position with the Windows one */ -static void sync_window_position(struct macdrv_win_data *data, UINT swp_flags, const RECT *old_window_rect, - const RECT *old_whole_rect) +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->whole_rect); + CGRect frame = cgrect_from_rect(data->rects.visible); BOOL force_z_order = FALSE;
if (data->cocoa_window) @@ -1071,7 +1067,7 @@ static void sync_window_position(struct macdrv_win_data *data, UINT swp_flags, c else { BOOL were_equal = (data->cocoa_view == data->client_cocoa_view); - BOOL now_equal = EqualRect(&data->whole_rect, &data->client_rect); + BOOL now_equal = EqualRect(&data->rects.visible, &data->rects.client);
if (were_equal && !now_equal) { @@ -1089,21 +1085,21 @@ static void sync_window_position(struct macdrv_win_data *data, UINT swp_flags, c macdrv_set_view_frame(data->cocoa_view, frame); force_z_order = TRUE; } - else if (!EqualRect(&data->whole_rect, old_whole_rect)) + else if (!EqualRect(&data->rects.visible, &old_rects->visible)) macdrv_set_view_frame(data->cocoa_view, frame); }
sync_client_view_position(data);
- if (old_window_rect && old_whole_rect && - (IsRectEmpty(old_window_rect) != IsRectEmpty(&data->window_rect) || - old_window_rect->left - old_whole_rect->left != data->window_rect.left - data->whole_rect.left || - old_window_rect->top - old_whole_rect->top != data->window_rect.top - data->whole_rect.top)) + if (old_rects && + (IsRectEmpty(&old_rects->window) != IsRectEmpty(&data->rects.window) || + old_rects->window.left - old_rects->visible.left != data->rects.window.left - data->rects.visible.left || + 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, - wine_dbgstr_rect(&data->whole_rect), wine_dbgstr_cgrect(frame)); + 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); @@ -1840,7 +1836,7 @@ BOOL macdrv_WindowPosChanging(HWND hwnd, UINT swp_flags, BOOL shaped, struct win
TRACE("hwnd %p, swp_flags %04x, shaped %u, rects %s\n", hwnd, swp_flags, shaped, debugstr_window_rects(rects));
- if (!data && !(data = macdrv_create_win_data(hwnd, &rects->window, &rects->client))) return FALSE; /* use default surface */ + if (!data && !(data = macdrv_create_win_data(hwnd, rects))) return FALSE; /* use default surface */ data->shaped = shaped;
macdrv_window_to_mac_rect(data, style, &rects->visible, &rects->window, &rects->client); @@ -1862,8 +1858,8 @@ void macdrv_MoveWindowBits(HWND hwnd, const struct window_rects *new_rects, cons macdrv_window window;
if (!(data = get_win_data(hwnd))) return; - old_visible_rect = data->whole_rect; - old_client_rect = data->client_rect; + old_visible_rect = data->rects.visible; + old_client_rect = data->rects.client; window = data->cocoa_window; release_win_data(data);
@@ -1891,23 +1887,19 @@ void macdrv_WindowPosChanged(HWND hwnd, HWND insert_after, UINT swp_flags, const struct macdrv_thread_data *thread_data; struct macdrv_win_data *data; unsigned int new_style = NtUserGetWindowLongW(hwnd, GWL_STYLE); - RECT old_window_rect, old_whole_rect, old_client_rect; + struct window_rects old_rects;
if (!(data = get_win_data(hwnd))) return;
thread_data = macdrv_thread_data();
- old_window_rect = data->window_rect; - old_whole_rect = data->whole_rect; - old_client_rect = data->client_rect; - data->window_rect = new_rects->window; - data->whole_rect = new_rects->visible; - data->client_rect = new_rects->client; + old_rects = data->rects; + data->rects = *new_rects;
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);
- sync_gl_view(data, &old_whole_rect, &old_client_rect); + sync_gl_view(data, &old_rects);
if (!data->cocoa_window && !data->cocoa_view) goto done;
@@ -1928,7 +1920,7 @@ void macdrv_WindowPosChanged(HWND hwnd, HWND insert_after, UINT swp_flags, const } else { - sync_window_position(data, swp_flags, &old_window_rect, &old_whole_rect); + sync_window_position(data, swp_flags, &old_rects); if (data->cocoa_window) set_cocoa_window_properties(data); } @@ -2022,19 +2014,19 @@ void macdrv_window_frame_changed(HWND hwnd, const macdrv_event *event) width = rect.right - rect.left; height = rect.bottom - rect.top;
- if (data->window_rect.left == rect.left && data->window_rect.top == rect.top) + if (data->rects.window.left == rect.left && data->rects.window.top == rect.top) flags |= SWP_NOMOVE; else - TRACE("%p moving from (%d,%d) to (%d,%d)\n", hwnd, (int)data->window_rect.left, - (int)data->window_rect.top, (int)rect.left, (int)rect.top); + TRACE("%p moving from (%d,%d) to (%d,%d)\n", hwnd, (int)data->rects.window.left, + (int)data->rects.window.top, (int)rect.left, (int)rect.top);
- if ((data->window_rect.right - data->window_rect.left == width && - data->window_rect.bottom - data->window_rect.top == height) || - (IsRectEmpty(&data->window_rect) && width == 1 && height == 1)) + if ((data->rects.window.right - data->rects.window.left == width && + data->rects.window.bottom - data->rects.window.top == height) || + (IsRectEmpty(&data->rects.window) && width == 1 && height == 1)) flags |= SWP_NOSIZE; else - TRACE("%p resizing from (%dx%d) to (%dx%d)\n", hwnd, (int)(data->window_rect.right - data->window_rect.left), - (int)(data->window_rect.bottom - data->window_rect.top), width, height); + TRACE("%p resizing from (%dx%d) to (%dx%d)\n", hwnd, (int)(data->rects.window.right - data->rects.window.left), + (int)(data->rects.window.bottom - data->rects.window.top), width, height);
being_dragged = data->drag_event != NULL; release_win_data(data); @@ -2377,7 +2369,7 @@ void macdrv_reassert_window_position(HWND hwnd) if (data) { if (data->cocoa_window && data->on_screen) - sync_window_position(data, SWP_NOZORDER | SWP_NOACTIVATE, NULL, NULL); + sync_window_position(data, SWP_NOZORDER | SWP_NOACTIVATE, NULL); release_win_data(data); } } @@ -2432,7 +2424,7 @@ BOOL query_resize_size(HWND hwnd, macdrv_query *query) if (send_message(hwnd, WM_SIZING, corner, (LPARAM)&rect)) { macdrv_window_to_mac_rect(data, NtUserGetWindowLongW(hwnd, GWL_STYLE), &rect, - &data->window_rect, &data->client_rect); + &data->rects.window, &data->rects.client); query->resize_size.rect = cgrect_from_rect(rect); ret = TRUE; }