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.
From: Alexandros Frantzis alexandros.frantzis@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);
From: Rémi Bernon rbernon@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 ); }
From: Rémi Bernon rbernon@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);
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; }
From: Rémi Bernon rbernon@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;
From: Rémi Bernon rbernon@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;
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.