[PATCH 0/6] MR6319: winemac: Use window rects to convert window to visible rects.
Doing this before https://gitlab.winehq.org/wine/wine/-/merge_requests/6310 as there's other gdi_driver.h changes pending. Will do something similar to winex11 after https://gitlab.winehq.org/wine/wine/-/merge_requests/6286 is merged to avoid conflicts. The idea is that once we've computed the visible rect, we can compute visible <-> window rect conversions by using the current offsets only. If the decorations need to be changed, and different window/visible offsets, they will only be changed when window position is updated. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/6319
From: Alexandros Frantzis <alexandros.frantzis(a)collabora.com> This allows wayland_win_data_update_wayland_surface() to be called outside of WAYLAND_WindowPosChange, which will be needed in upcoming commits. --- dlls/winewayland.drv/waylanddrv.h | 6 ++---- dlls/winewayland.drv/window.c | 26 ++++++++++++-------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index 1a2eeeecb93..4e3841d8cf9 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -289,10 +289,8 @@ struct wayland_win_data struct wayland_surface *wayland_surface; /* wine window_surface backing this window */ struct window_surface *window_surface; - /* USER window rectangle relative to win32 parent window client area */ - RECT window_rect; - /* USER client rectangle relative to win32 parent window client area */ - RECT client_rect; + /* window rects, relative to parent client area */ + struct window_rects rects; BOOL managed; }; diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index e8d6b770496..355894f6137 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -76,9 +76,7 @@ static struct rb_tree win_data_rb = { wayland_win_data_cmp_rb }; * * Create a data window structure for an existing window. */ -static struct wayland_win_data *wayland_win_data_create(HWND hwnd, - const RECT *window_rect, - const RECT *client_rect) +static struct wayland_win_data *wayland_win_data_create(HWND hwnd, const struct window_rects *rects) { struct wayland_win_data *data; struct rb_entry *rb_entry; @@ -92,8 +90,7 @@ static struct wayland_win_data *wayland_win_data_create(HWND hwnd, if (!(data = calloc(1, sizeof(*data)))) return NULL; data->hwnd = hwnd; - data->window_rect = *window_rect; - data->client_rect = *client_rect; + data->rects = *rects; pthread_mutex_lock(&win_data_mutex); @@ -167,8 +164,8 @@ static void wayland_win_data_get_config(struct wayland_win_data *data, enum wayland_surface_config_state window_state = 0; DWORD style; - conf->rect = data->window_rect; - conf->client_rect = data->client_rect; + conf->rect = data->rects.window; + conf->client_rect = data->rects.client; style = NtUserGetWindowLongW(data->hwnd, GWL_STYLE); TRACE("window=%s style=%#lx\n", wine_dbgstr_rect(&conf->rect), (long)style); @@ -200,14 +197,14 @@ static void reapply_cursor_clipping(void) NtUserSetThreadDpiAwarenessContext(context); } -static void wayland_win_data_update_wayland_surface(struct wayland_win_data *data, const RECT *visible_rect) +static void wayland_win_data_update_wayland_surface(struct wayland_win_data *data) { struct wayland_surface *surface = data->wayland_surface; HWND parent = NtUserGetAncestor(data->hwnd, GA_PARENT); BOOL visible, xdg_visible; WCHAR text[1024]; - TRACE("hwnd=%p, rect=%s\n", data->hwnd, wine_dbgstr_rect(visible_rect)); + TRACE("hwnd=%p\n", data->hwnd); /* We don't want wayland surfaces for child windows. */ if (parent != NtUserGetDesktopWindow() && parent != 0) @@ -251,7 +248,8 @@ static void wayland_win_data_update_wayland_surface(struct wayland_win_data *dat pthread_mutex_unlock(&surface->mutex); if (data->window_surface) - wayland_window_surface_update_wayland_surface(data->window_surface, visible_rect, surface); + wayland_window_surface_update_wayland_surface(data->window_surface, + &data->rects.visible, surface); /* Size/position changes affect the effective pointer constraint, so update * it as needed. */ @@ -433,7 +431,8 @@ BOOL WAYLAND_WindowPosChanging(HWND hwnd, UINT swp_flags, BOOL shaped, struct wi TRACE("hwnd %p, swp_flags %04x, shaped %u, rects %s\n", hwnd, swp_flags, shaped, debugstr_window_rects(rects)); - if (!data && !(data = wayland_win_data_create(hwnd, &rects->window, &rects->client))) return FALSE; /* use default surface */ + if (!data && !(data = wayland_win_data_create(hwnd, rects))) return FALSE; + wayland_win_data_release(data); return TRUE; @@ -458,15 +457,14 @@ void WAYLAND_WindowPosChanged(HWND hwnd, HWND insert_after, UINT swp_flags, cons if (!(data = wayland_win_data_get(hwnd))) return; - data->window_rect = new_rects->window; - data->client_rect = new_rects->client; + data->rects = *new_rects; data->managed = managed; if (surface) window_surface_add_ref(surface); if (data->window_surface) window_surface_release(data->window_surface); data->window_surface = surface; - wayland_win_data_update_wayland_surface(data, &new_rects->visible); + wayland_win_data_update_wayland_surface(data); if (data->wayland_surface) wayland_win_data_update_wayland_state(data); wayland_win_data_release(data); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6319
From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/wineandroid.drv/android.h | 5 ++--- dlls/wineandroid.drv/device.c | 10 +++++----- dlls/wineandroid.drv/window.c | 20 ++++++-------------- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index 616bd5beffe..f438deb714e 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -69,9 +69,8 @@ extern struct ANativeWindow *create_ioctl_window( HWND hwnd, BOOL opengl, float extern struct ANativeWindow *grab_ioctl_window( struct ANativeWindow *window ); extern void release_ioctl_window( struct ANativeWindow *window ); extern void destroy_ioctl_window( HWND hwnd, BOOL opengl ); -extern int ioctl_window_pos_changed( HWND hwnd, const RECT *window_rect, const RECT *client_rect, - const RECT *visible_rect, UINT style, UINT flags, - HWND after, HWND owner ); +extern int ioctl_window_pos_changed( HWND hwnd, const struct window_rects *rects, + UINT style, UINT flags, HWND after, HWND owner ); extern int ioctl_set_window_parent( HWND hwnd, HWND parent, float scale ); extern int ioctl_set_capture( HWND hwnd ); extern int ioctl_set_cursor( int id, int width, int height, diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c index 140ae82fe26..d00ea5da8e8 100644 --- a/dlls/wineandroid.drv/device.c +++ b/dlls/wineandroid.drv/device.c @@ -1591,16 +1591,16 @@ void destroy_ioctl_window( HWND hwnd, BOOL opengl ) android_ioctl( IOCTL_DESTROY_WINDOW, &req, sizeof(req), NULL, NULL ); } -int ioctl_window_pos_changed( HWND hwnd, const RECT *window_rect, const RECT *client_rect, - const RECT *visible_rect, UINT style, UINT flags, HWND after, HWND owner ) +int ioctl_window_pos_changed( HWND hwnd, const struct window_rects *rects, + UINT style, UINT flags, HWND after, HWND owner ) { struct ioctl_android_window_pos_changed req; req.hdr.hwnd = HandleToLong( hwnd ); req.hdr.opengl = FALSE; - req.window_rect = *window_rect; - req.client_rect = *client_rect; - req.visible_rect = *visible_rect; + req.window_rect = rects->window; + req.client_rect = rects->client; + req.visible_rect = rects->visible; req.style = style; req.flags = flags; req.after = HandleToLong( after ); diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c index bb169054370..8018ee1a567 100644 --- a/dlls/wineandroid.drv/window.c +++ b/dlls/wineandroid.drv/window.c @@ -52,9 +52,7 @@ struct android_win_data { HWND hwnd; /* hwnd that this private data belongs to */ HWND parent; /* parent hwnd for child windows */ - RECT window_rect; /* USER window rectangle relative to parent */ - RECT whole_rect; /* X 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 */ ANativeWindow *window; /* native window wrapper that forwards calls to the desktop process */ }; @@ -1007,8 +1005,7 @@ void ANDROID_DestroyWindow( HWND hwnd ) * * Create a data window structure for an existing window. */ -static struct android_win_data *create_win_data( HWND hwnd, const RECT *window_rect, - const RECT *client_rect ) +static struct android_win_data *create_win_data( HWND hwnd, const struct window_rects *rects ) { struct android_win_data *data; HWND parent; @@ -1018,8 +1015,7 @@ static struct android_win_data *create_win_data( HWND hwnd, const RECT *window_r if (!(data = alloc_win_data( hwnd ))) return NULL; data->parent = (parent == NtUserGetDesktopWindow()) ? 0 : parent; - data->whole_rect = data->window_rect = *window_rect; - data->client_rect = *client_rect; + data->rects = *rects; return data; } @@ -1033,7 +1029,7 @@ BOOL ANDROID_WindowPosChanging( HWND hwnd, UINT swp_flags, BOOL shaped, struct w TRACE( "hwnd %p, swp_flags %#x, shaped %u, rects %s\n", hwnd, swp_flags, shaped, debugstr_window_rects( rects ) ); - if (!data && !(data = create_win_data( hwnd, &rects->window, &rects->client ))) return FALSE; /* use default surface */ + if (!data && !(data = create_win_data( hwnd, rects ))) return FALSE; /* use default surface */ release_win_data(data); return TRUE; @@ -1072,10 +1068,7 @@ void ANDROID_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags, con HWND owner = 0; if (!(data = get_win_data( hwnd ))) return; - - data->window_rect = new_rects->window; - data->whole_rect = new_rects->visible; - data->client_rect = new_rects->client; + data->rects = *new_rects; if (!data->parent) owner = NtUserGetWindowRelative( hwnd, GW_OWNER ); release_win_data( data ); @@ -1085,8 +1078,7 @@ void ANDROID_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags, con TRACE( "win %p new_rects %s style %08x owner %p after %p flags %08x\n", hwnd, debugstr_window_rects(new_rects), new_style, owner, insert_after, swp_flags ); - ioctl_window_pos_changed( hwnd, &new_rects->window, &new_rects->client, &new_rects->visible, - new_style, swp_flags, insert_after, owner ); + ioctl_window_pos_changed( hwnd, new_rects, new_style, swp_flags, insert_after, owner ); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6319
From: Rémi Bernon <rbernon(a)codeweavers.com> They are already initialized in macdrv_create_win_data and updated in macdrv_WindowPosChanged. --- dlls/winemac.drv/window.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index f7d9dfd76ea..9aa92b29974 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -625,9 +625,6 @@ static void create_cocoa_window(struct macdrv_win_data *data) style = NtUserGetWindowLongW(data->hwnd, GWL_STYLE); ex_style = NtUserGetWindowLongW(data->hwnd, GWL_EXSTYLE); - data->whole_rect = data->window_rect; - macdrv_window_to_mac_rect(data, style, &data->whole_rect, &data->window_rect, &data->client_rect); - get_cocoa_window_features(data, style, ex_style, &wf, &data->window_rect, &data->client_rect); frame = cgrect_from_rect(data->whole_rect); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6319
From: Rémi Bernon <rbernon(a)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; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6319
From: Rémi Bernon <rbernon(a)codeweavers.com> Instead of computing the rect adjustments every time. --- dlls/winemac.drv/window.c | 37 +++++++------------------------------ include/wine/gdi_driver.h | 13 +++++++++++++ 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index ad3b33540fc..8cf1c3281ca 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -155,7 +155,7 @@ static void get_cocoa_window_state(struct macdrv_win_data *data, /*********************************************************************** * get_mac_rect_offset * - * Helper for macdrv_window_to_mac_rect and macdrv_mac_to_window_rect. + * Helper for macdrv_window_to_mac_rect. */ static void get_mac_rect_offset(struct macdrv_win_data *data, unsigned int style, RECT *rect, const RECT *window_rect, const RECT *client_rect) @@ -215,30 +215,6 @@ static void macdrv_window_to_mac_rect(struct macdrv_win_data *data, DWORD style, } -/*********************************************************************** - * macdrv_mac_to_window_rect - * - * Opposite of macdrv_window_to_mac_rect - */ -static void macdrv_mac_to_window_rect(struct macdrv_win_data *data, RECT *rect) -{ - RECT rc; - DWORD style = NtUserGetWindowLongW(data->hwnd, GWL_STYLE); - - if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return; - if (IsRectEmpty(rect)) return; - - get_mac_rect_offset(data, style, &rc, &data->rects.window, &data->rects.client); - - rect->left += rc.left; - rect->right += rc.right; - rect->top += rc.top; - rect->bottom += rc.bottom; - if (rect->top >= rect->bottom) rect->bottom = rect->top + 1; - if (rect->left >= rect->right) rect->right = rect->left + 1; -} - - /*********************************************************************** * constrain_window_frame * @@ -1724,7 +1700,7 @@ UINT macdrv_ShowWindow(HWND hwnd, INT cmd, RECT *rect, UINT swp) macdrv_get_cocoa_window_frame(data->cocoa_window, &frame); *rect = rect_from_cgrect(frame); - macdrv_mac_to_window_rect(data, rect); + *rect = window_rect_from_visible(&data->rects, *rect); TRACE("rect %s -> %s\n", wine_dbgstr_cgrect(frame), wine_dbgstr_rect(rect)); swp &= ~(SWP_NOMOVE | SWP_NOCLIENTMOVE | SWP_NOSIZE | SWP_NOCLIENTSIZE); @@ -2008,7 +1984,7 @@ void macdrv_window_frame_changed(HWND hwnd, const macdrv_event *event) event->window_frame_changed.fullscreen, event->window_frame_changed.in_resize); rect = rect_from_cgrect(event->window_frame_changed.frame); - macdrv_mac_to_window_rect(data, &rect); + rect = window_rect_from_visible(&data->rects, rect); NtUserMapWindowPoints(0, parent, (POINT *)&rect, 2, 0 /* per-monitor DPI */); width = rect.right - rect.left; @@ -2243,7 +2219,7 @@ void macdrv_window_restore_requested(HWND hwnd, const macdrv_event *event) HWND parent = NtUserGetAncestor(hwnd, GA_PARENT); rect = rect_from_cgrect(event->window_restore_requested.frame); - macdrv_mac_to_window_rect(data, &rect); + rect = window_rect_from_visible(&data->rects, rect); NtUserMapWindowPoints(0, parent, (POINT *)&rect, 2, 0 /* per-monitor DPI */); release_win_data(data); @@ -2401,13 +2377,14 @@ void macdrv_app_quit_requested(const macdrv_event *event) BOOL query_resize_size(HWND hwnd, macdrv_query *query) { struct macdrv_win_data *data = get_win_data(hwnd); - RECT rect = rect_from_cgrect(query->resize_size.rect); + RECT rect; int corner; BOOL ret = FALSE; if (!data) return FALSE; - macdrv_mac_to_window_rect(data, &rect); + rect = rect_from_cgrect(query->resize_size.rect); + rect = window_rect_from_visible(&data->rects, rect); if (query->resize_size.from_left) { diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index feda5594234..d77479299ce 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -58,6 +58,19 @@ static inline const char *debugstr_window_rects( const struct window_rects *rect wine_dbgstr_rect( &rects->client ), wine_dbgstr_rect( &rects->visible ) ); } +/* convert a visible rect to the corresponding window rect, using the window_rects offsets */ +static inline RECT window_rect_from_visible( struct window_rects *rects, RECT visible_rect ) +{ + RECT rect = visible_rect; + + rect.left += rects->window.left - rects->visible.left; + rect.top += rects->window.top - rects->visible.top; + rect.right += rects->window.right - rects->visible.right; + rect.bottom += rects->window.bottom - rects->visible.bottom; + + return rect; +} + typedef struct gdi_physdev { const struct gdi_dc_funcs *funcs; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6319
From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/winemac.drv/window.c | 7 +++---- include/wine/gdi_driver.h | 13 +++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index 8cf1c3281ca..d3959a005f8 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -529,7 +529,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->rects.window, &data->rects.client); + min_rect = visible_rect_from_window(&data->rects, min_rect); min_size = CGSizeMake(min_rect.right - min_rect.left, min_rect.bottom - min_rect.top); if (minmax.ptMaxTrackSize.x == NtUserGetSystemMetrics(SM_CXMAXTRACK) && @@ -538,7 +538,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->rects.window, &data->rects.client); + max_rect = visible_rect_from_window(&data->rects, max_rect); max_size = CGSizeMake(max_rect.right - max_rect.left, max_rect.bottom - max_rect.top); } @@ -2400,8 +2400,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->rects.window, &data->rects.client); + rect = visible_rect_from_window(&data->rects, rect); query->resize_size.rect = cgrect_from_rect(rect); ret = TRUE; } diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index d77479299ce..e9274da5d62 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -71,6 +71,19 @@ static inline RECT window_rect_from_visible( struct window_rects *rects, RECT vi return rect; } +/* convert a window rect to the corresponding visible rect, using the window_rects offsets */ +static inline RECT visible_rect_from_window( struct window_rects *rects, RECT window_rect ) +{ + RECT rect = window_rect; + + rect.left += rects->visible.left - rects->window.left; + rect.top += rects->visible.top - rects->window.top; + rect.right += rects->visible.right - rects->window.right; + rect.bottom += rects->visible.bottom - rects->window.bottom; + + return rect; +} + typedef struct gdi_physdev { const struct gdi_dc_funcs *funcs; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6319
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=147856 Your paranoid android. === debian11 (build log) === error: patch failed: dlls/wineandroid.drv/android.h:69 error: patch failed: dlls/wineandroid.drv/device.c:1591 error: patch failed: dlls/wineandroid.drv/window.c:52 error: patch failed: dlls/winemac.drv/window.c:625 error: patch failed: dlls/winemac.drv/event.c:238 error: patch failed: dlls/winemac.drv/macdrv.h:180 error: patch failed: dlls/winemac.drv/opengl.c:1625 error: patch failed: dlls/winemac.drv/window.c:144 error: patch failed: dlls/winemac.drv/window.c:155 error: patch failed: include/wine/gdi_driver.h:58 error: patch failed: dlls/winemac.drv/window.c:529 error: patch failed: include/wine/gdi_driver.h:71 Task: Patch failed to apply === debian11b (build log) === error: patch failed: dlls/wineandroid.drv/android.h:69 error: patch failed: dlls/wineandroid.drv/device.c:1591 error: patch failed: dlls/wineandroid.drv/window.c:52 error: patch failed: dlls/winemac.drv/window.c:625 error: patch failed: dlls/winemac.drv/event.c:238 error: patch failed: dlls/winemac.drv/macdrv.h:180 error: patch failed: dlls/winemac.drv/opengl.c:1625 error: patch failed: dlls/winemac.drv/window.c:144 error: patch failed: dlls/winemac.drv/window.c:155 error: patch failed: include/wine/gdi_driver.h:58 error: patch failed: dlls/winemac.drv/window.c:529 error: patch failed: include/wine/gdi_driver.h:71 Task: Patch failed to apply
This merge request was approved by Rémi Bernon. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/6319
participants (3)
-
Alexandros Frantzis -
Marvin -
Rémi Bernon