From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/dce.c | 2 +- dlls/win32u/defwnd.c | 12 +++++----- dlls/win32u/menu.c | 2 +- dlls/win32u/scroll.c | 6 ++--- dlls/win32u/win32u_private.h | 2 ++ dlls/win32u/window.c | 44 ++++++++++++++++++++++-------------- 6 files changed, 40 insertions(+), 28 deletions(-)
diff --git a/dlls/win32u/dce.c b/dlls/win32u/dce.c index 8bbd2592cf4..d7225edc995 100644 --- a/dlls/win32u/dce.c +++ b/dlls/win32u/dce.c @@ -1963,7 +1963,7 @@ INT WINAPI NtUserScrollWindowEx( HWND hwnd, INT dx, INT dy, const RECT *rect,
for (i = 0; list[i]; i++) { - get_window_rects( list[i], COORDS_PARENT, &r, NULL, get_thread_dpi() ); + get_window_rect_rel( list[i], COORDS_PARENT, &r, get_thread_dpi() ); if (!rect || intersect_rect( &dummy, &r, rect )) NtUserSetWindowPos( list[i], 0, r.left + dx, r.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE | diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c index 003ba7c0846..b67a1a0ca8b 100644 --- a/dlls/win32u/defwnd.c +++ b/dlls/win32u/defwnd.c @@ -492,7 +492,7 @@ static void handle_window_pos_changed( HWND hwnd, const WINDOWPOS *winpos ) { RECT rect;
- get_window_rects( hwnd, COORDS_PARENT, NULL, &rect, get_thread_dpi() ); + get_client_rect_rel( hwnd, COORDS_PARENT, &rect, get_thread_dpi() ); if (!(winpos->flags & SWP_NOCLIENTMOVE)) send_message( hwnd, WM_MOVE, 0, MAKELONG( rect.left, rect.top ));
@@ -711,7 +711,7 @@ static void sys_command_size_move( HWND hwnd, WPARAM wparam )
minmax = get_min_max_info( hwnd ); dpi = get_thread_dpi(); - get_window_rects( hwnd, COORDS_PARENT, &sizing_rect, NULL, dpi ); + get_window_rect_rel( hwnd, COORDS_PARENT, &sizing_rect, dpi ); orig_rect = sizing_rect; if (style & WS_CHILD) { @@ -1029,7 +1029,7 @@ static LRESULT handle_sys_command( HWND hwnd, WPARAM wparam, LPARAM lparam ) static void get_inside_rect( HWND hwnd, enum coords_relative relative, RECT *rect, DWORD style, DWORD ex_style ) { - get_window_rects( hwnd, relative, rect, NULL, get_thread_dpi() ); + get_window_rect_rel( hwnd, relative, rect, get_thread_dpi() );
/* Remove frame from rectangle */ if (has_thick_frame( style, ex_style )) @@ -1718,7 +1718,7 @@ static void nc_paint( HWND hwnd, HRGN clip )
TRACE( "%p %d\n", hwnd, active );
- get_window_rects( hwnd, COORDS_SCREEN, NULL, &rectClient, get_thread_dpi() ); + get_client_rect_rel( hwnd, COORDS_SCREEN, &rectClient, get_thread_dpi() ); hrgn = NtGdiCreateRectRgn( rectClient.left, rectClient.top, rectClient.right, rectClient.bottom );
@@ -1738,7 +1738,7 @@ static void nc_paint( HWND hwnd, HRGN clip ) return; }
- get_window_rects( hwnd, COORDS_WINDOW, &rect, NULL, get_thread_dpi() ); + get_window_rect_rel( hwnd, COORDS_WINDOW, &rect, get_thread_dpi() ); NtGdiGetAppClipBox( hdc, &clip_rect );
NtGdiSelectPen( hdc, get_sys_color_pen( COLOR_WINDOWFRAME )); @@ -2355,7 +2355,7 @@ static LRESULT handle_nc_mouse_move( HWND hwnd, WPARAM wparam, LPARAM lparam ) if (wparam != HTHSCROLL && wparam != HTVSCROLL) return 0;
- get_window_rects( hwnd, COORDS_CLIENT, &rect, NULL, get_thread_dpi() ); + get_window_rect_rel( hwnd, COORDS_CLIENT, &rect, get_thread_dpi() );
pt.x = (short)LOWORD( lparam ); pt.y = (short)HIWORD( lparam ); diff --git a/dlls/win32u/menu.c b/dlls/win32u/menu.c index 8a3f1350004..81b5fda6176 100644 --- a/dlls/win32u/menu.c +++ b/dlls/win32u/menu.c @@ -755,7 +755,7 @@ BOOL WINAPI NtUserEnableMenuItem( HMENU handle, UINT id, UINT flags ) release_menu_ptr( parent_menu );
/* Refresh the frame to reflect the change */ - get_window_rects( hwnd, COORDS_CLIENT, &rc, NULL, get_thread_dpi() ); + get_window_rect_rel( hwnd, COORDS_CLIENT, &rc, get_thread_dpi() ); rc.bottom = 0; NtUserRedrawWindow( hwnd, &rc, 0, RDW_FRAME | RDW_INVALIDATE | RDW_NOCHILDREN ); } diff --git a/dlls/win32u/scroll.c b/dlls/win32u/scroll.c index a42a7437175..fce07980dcf 100644 --- a/dlls/win32u/scroll.c +++ b/dlls/win32u/scroll.c @@ -196,7 +196,7 @@ static BOOL get_scroll_bar_rect( HWND hwnd, int bar, RECT *rect, int *arrow_size switch(bar) { case SB_HORZ: - get_window_rects( hwnd, COORDS_WINDOW, NULL, rect, get_thread_dpi() ); + get_client_rect_rel( hwnd, COORDS_WINDOW, rect, get_thread_dpi() ); rect->top = rect->bottom; rect->bottom += get_system_metrics( SM_CYHSCROLL ); if (win->dwStyle & WS_VSCROLL) rect->right++; @@ -204,7 +204,7 @@ static BOOL get_scroll_bar_rect( HWND hwnd, int bar, RECT *rect, int *arrow_size break;
case SB_VERT: - get_window_rects( hwnd, COORDS_WINDOW, NULL, rect, get_thread_dpi() ); + get_client_rect_rel( hwnd, COORDS_WINDOW, rect, get_thread_dpi() ); if (win->dwExStyle & WS_EX_LEFTSCROLLBAR) { rect->right = rect->left; @@ -817,7 +817,7 @@ void track_scroll_bar( HWND hwnd, int scrollbar, POINT pt )
if (scrollbar != SB_CTL) { - get_window_rects( hwnd, COORDS_CLIENT, &rect, NULL, get_thread_dpi() ); + get_window_rect_rel( hwnd, COORDS_CLIENT, &rect, get_thread_dpi() ); screen_to_client( hwnd, &pt ); pt.x -= rect.left; pt.y -= rect.top; diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index fc0f0c62c93..3d7e3b41592 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -257,6 +257,8 @@ extern DWORD get_window_long( HWND hwnd, INT offset ); extern ULONG_PTR get_window_long_ptr( HWND hwnd, INT offset, BOOL ansi ); extern BOOL get_window_rect( HWND hwnd, RECT *rect, UINT dpi ); enum coords_relative; +extern BOOL get_window_rect_rel( HWND hwnd, enum coords_relative rel, RECT *rect, UINT dpi ); +extern BOOL get_client_rect_rel( HWND hwnd, enum coords_relative rel, RECT *rect, UINT dpi ); extern BOOL get_window_rects( HWND hwnd, enum coords_relative relative, RECT *window_rect, RECT *client_rect, UINT dpi ); extern HWND *list_window_children( HDESK desktop, HWND hwnd, UNICODE_STRING *class, diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index b93428707a7..39d21907ca3 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -389,7 +389,7 @@ HWND get_parent( HWND hwnd ) */ HWND WINAPI NtUserSetParent( HWND hwnd, HWND parent ) { - RECT window_rect, old_screen_rect, new_screen_rect; + RECT window_rect = {0}, old_screen_rect = {0}, new_screen_rect = {0}; UINT context; WINDOWPOS winpos; HWND full_handle; @@ -439,8 +439,8 @@ HWND WINAPI NtUserSetParent( HWND hwnd, HWND parent ) win = get_win_ptr( hwnd ); if (!win || win == WND_OTHER_PROCESS || win == WND_DESKTOP) return 0;
- get_window_rects( hwnd, COORDS_PARENT, &window_rect, NULL, get_dpi_for_window(hwnd) ); - get_window_rects( hwnd, COORDS_SCREEN, &old_screen_rect, NULL, 0 ); + get_window_rect_rel( hwnd, COORDS_PARENT, &window_rect, get_dpi_for_window(hwnd) ); + get_window_rect_rel( hwnd, COORDS_SCREEN, &old_screen_rect, 0 );
SERVER_START_REQ( set_parent ) { @@ -458,7 +458,7 @@ HWND WINAPI NtUserSetParent( HWND hwnd, HWND parent ) release_win_ptr( win ); if (!ret) return 0;
- get_window_rects( hwnd, COORDS_SCREEN, &new_screen_rect, NULL, 0 ); + get_window_rect_rel( hwnd, COORDS_SCREEN, &new_screen_rect, 0 ); context = set_thread_dpi_awareness_context( get_window_dpi_awareness_context( hwnd ));
user_driver->pSetParent( full_handle, parent, old_parent ); @@ -1682,16 +1682,26 @@ other_process: return ret; }
+BOOL get_window_rect_rel( HWND hwnd, enum coords_relative rel, RECT *rect, UINT dpi ) +{ + return get_window_rects( hwnd, rel, rect, NULL, dpi ); +} + /* see GetWindowRect */ BOOL get_window_rect( HWND hwnd, RECT *rect, UINT dpi ) { - return get_window_rects( hwnd, COORDS_SCREEN, rect, NULL, dpi ); + return get_window_rect_rel( hwnd, COORDS_SCREEN, rect, dpi ); +} + +BOOL get_client_rect_rel( HWND hwnd, enum coords_relative rel, RECT *rect, UINT dpi ) +{ + return get_window_rects( hwnd, rel, NULL, rect, dpi ); }
/* see GetClientRect */ BOOL get_client_rect( HWND hwnd, RECT *rect, UINT dpi ) { - return get_window_rects( hwnd, COORDS_CLIENT, NULL, rect, dpi ); + return get_client_rect_rel( hwnd, COORDS_CLIENT, rect, dpi ); }
/* see GetWindowInfo */ @@ -1970,8 +1980,8 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, stru needs_update = reply->needs_update; if (get_window_long( win->parent, GWL_EXSTYLE ) & WS_EX_LAYOUTRTL) { - RECT client; - get_window_rects( win->parent, COORDS_CLIENT, NULL, &client, get_thread_dpi() ); + RECT client = {0}; + get_client_rect_rel( win->parent, COORDS_CLIENT, &client, get_thread_dpi() ); mirror_rect( &client, &win->window_rect ); mirror_rect( &client, &win->client_rect ); mirror_rect( &client, &win->visible_rect ); @@ -2400,13 +2410,13 @@ HWND WINAPI NtUserChildWindowFromPointEx( HWND parent, LONG x, LONG y, UINT flag RECT rect; HWND ret;
- get_client_rect( parent, &rect, get_thread_dpi() ); + if (!get_client_rect( parent, &rect, get_thread_dpi() )) return 0; if (!PtInRect( &rect, pt )) return 0; if (!(list = list_window_children( 0, parent, NULL, 0 ))) return parent;
for (i = 0; list[i]; i++) { - if (!get_window_rects( list[i], COORDS_PARENT, &rect, NULL, get_thread_dpi() )) continue; + if (!get_window_rect_rel( list[i], COORDS_PARENT, &rect, get_thread_dpi() )) continue; if (!PtInRect( &rect, pt )) continue; if (flags & (CWP_SKIPINVISIBLE|CWP_SKIPDISABLED)) { @@ -4150,7 +4160,7 @@ static POINT get_minimized_pos( HWND hwnd, POINT pt ) if (child == hwnd) continue; if ((get_window_long( child, GWL_STYLE ) & (WS_VISIBLE|WS_MINIMIZE)) != (WS_VISIBLE|WS_MINIMIZE)) continue; - if (get_window_rects( child, COORDS_PARENT, &rect, NULL, get_thread_dpi() )) + if (get_window_rect_rel( child, COORDS_PARENT, &rect, get_thread_dpi() )) { NtGdiSetRectRgn( tmp, rect.left, rect.top, rect.right, rect.bottom ); NtGdiCombineRgn( hrgn, hrgn, tmp, RGN_OR ); @@ -4509,10 +4519,10 @@ static BOOL show_window( HWND hwnd, INT cmd ) { /* should happen only in CreateWindowEx() */ int wParam = SIZE_RESTORED; - RECT client; + RECT client = {0}; LPARAM lparam;
- get_window_rects( hwnd, COORDS_PARENT, NULL, &client, get_thread_dpi() ); + get_client_rect_rel( hwnd, COORDS_PARENT, &client, get_thread_dpi() ); lparam = MAKELONG( client.right - client.left, client.bottom - client.top ); win->flags &= ~WIN_NEED_SIZE; if (win->dwStyle & WS_MAXIMIZE) wParam = SIZE_MAXIMIZED; @@ -5435,7 +5445,7 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name,
/* send WM_NCCALCSIZE */
- if (get_window_rects( hwnd, COORDS_PARENT, &new_rects.window, NULL, win_dpi )) + if (get_window_rect_rel( hwnd, COORDS_PARENT, &new_rects.window, win_dpi )) { /* yes, even if the CBT hook was called with HWND_TOP */ HWND insert_after = (get_window_long( hwnd, GWL_STYLE ) & WS_CHILD) ? HWND_BOTTOM : HWND_TOP; @@ -5466,8 +5476,8 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name,
if (!(win_get_flags( hwnd ) & WIN_NEED_SIZE)) { - RECT rect; - get_window_rects( hwnd, COORDS_PARENT, NULL, &rect, win_dpi ); + RECT rect = {0}; + get_client_rect_rel( hwnd, COORDS_PARENT, &rect, win_dpi ); send_message( hwnd, WM_SIZE, SIZE_RESTORED, MAKELONG( rect.right - rect.left, rect.bottom - rect.top ) ); send_message( hwnd, WM_MOVE, 0, MAKELONG( rect.left, rect.top ) ); } @@ -5656,7 +5666,7 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ) return enable_window( hwnd, param );
case NtUserCallHwndParam_GetChildRect: - return get_window_rects( hwnd, COORDS_PARENT, (RECT *)param, NULL, get_thread_dpi() ); + return get_window_rect_rel( hwnd, COORDS_PARENT, (RECT *)param, get_thread_dpi() );
case NtUserCallHwndParam_GetClassLongA: return get_class_long( hwnd, param, TRUE );