[PATCH v2 3/5] win32u: Move get_min_max_info implementation from user32.
Huw Davies
huw at codeweavers.com
Thu Mar 17 10:29:31 CDT 2022
From: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/user32/user_main.c | 1 +
dlls/user32/winpos.c | 92 ++--------------------------------
dlls/win32u/menu.c | 6 +++
dlls/win32u/ntuser_private.h | 1 +
dlls/win32u/win32u_private.h | 3 ++
dlls/win32u/window.c | 97 ++++++++++++++++++++++++++++++++++++
include/ntuser.h | 1 +
7 files changed, 113 insertions(+), 88 deletions(-)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index bc0dec6b579..15293d76c41 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -154,6 +154,7 @@ static void CDECL free_win_ptr( WND *win )
static const struct user_callbacks user_funcs =
{
+ AdjustWindowRectEx,
CopyImage,
DestroyCaret,
DestroyMenu,
diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c
index b3e8aff3cfa..1951f887351 100644
--- a/dlls/user32/winpos.c
+++ b/dlls/user32/winpos.c
@@ -48,8 +48,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(win);
(((style) & WS_THICKFRAME) && \
!(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME))
-#define EMPTYPOINT(pt) ((pt).x == -1 && (pt).y == -1)
-
#define ON_LEFT_BORDER(hit) \
(((hit) == HTLEFT) || ((hit) == HTTOPLEFT) || ((hit) == HTBOTTOMLEFT))
#define ON_RIGHT_BORDER(hit) \
@@ -548,94 +546,12 @@ static BOOL get_work_rect( HWND hwnd, RECT *rect )
*/
MINMAXINFO WINPOS_GetMinMaxInfo( HWND hwnd )
{
- DPI_AWARENESS_CONTEXT context;
- RECT rc_work, rc_primary;
- MINMAXINFO MinMax;
- INT xinc, yinc;
- LONG style = GetWindowLongW( hwnd, GWL_STYLE );
- LONG adjustedStyle;
- LONG exstyle = GetWindowLongW( hwnd, GWL_EXSTYLE );
- RECT rc;
- WND *win;
-
- context = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( hwnd ));
-
- /* Compute default values */
-
- GetWindowRect(hwnd, &rc);
- MinMax.ptReserved.x = rc.left;
- MinMax.ptReserved.y = rc.top;
-
- if ((style & WS_CAPTION) == WS_CAPTION)
- adjustedStyle = style & ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */
- else
- adjustedStyle = style;
-
- GetClientRect(NtUserGetAncestor(hwnd,GA_PARENT), &rc);
- AdjustWindowRectEx(&rc, adjustedStyle, ((style & WS_POPUP) && GetMenu(hwnd)), exstyle);
-
- xinc = -rc.left;
- yinc = -rc.top;
-
- MinMax.ptMaxSize.x = rc.right - rc.left;
- MinMax.ptMaxSize.y = rc.bottom - rc.top;
- if (style & (WS_DLGFRAME | WS_BORDER))
- {
- MinMax.ptMinTrackSize.x = GetSystemMetrics(SM_CXMINTRACK);
- MinMax.ptMinTrackSize.y = GetSystemMetrics(SM_CYMINTRACK);
- }
- else
- {
- MinMax.ptMinTrackSize.x = 2 * xinc;
- MinMax.ptMinTrackSize.y = 2 * yinc;
- }
- MinMax.ptMaxTrackSize.x = GetSystemMetrics(SM_CXMAXTRACK);
- MinMax.ptMaxTrackSize.y = GetSystemMetrics(SM_CYMAXTRACK);
- MinMax.ptMaxPosition.x = -xinc;
- MinMax.ptMaxPosition.y = -yinc;
-
- if ((win = WIN_GetPtr( hwnd )) && win != WND_DESKTOP && win != WND_OTHER_PROCESS)
- {
- if (!EMPTYPOINT(win->max_pos)) MinMax.ptMaxPosition = win->max_pos;
- WIN_ReleasePtr( win );
- }
-
- SendMessageW( hwnd, WM_GETMINMAXINFO, 0, (LPARAM)&MinMax );
-
- /* if the app didn't change the values, adapt them for the current monitor */
-
- if (get_work_rect( hwnd, &rc_work ))
- {
- rc_primary = get_primary_monitor_rect();
- if (MinMax.ptMaxSize.x == (rc_primary.right - rc_primary.left) + 2 * xinc &&
- MinMax.ptMaxSize.y == (rc_primary.bottom - rc_primary.top) + 2 * yinc)
- {
- MinMax.ptMaxSize.x = (rc_work.right - rc_work.left) + 2 * xinc;
- MinMax.ptMaxSize.y = (rc_work.bottom - rc_work.top) + 2 * yinc;
- }
- if (MinMax.ptMaxPosition.x == -xinc && MinMax.ptMaxPosition.y == -yinc)
- {
- MinMax.ptMaxPosition.x = rc_work.left - xinc;
- MinMax.ptMaxPosition.y = rc_work.top - yinc;
- }
- }
-
- /* Some sanity checks */
-
- TRACE("%d %d / %d %d / %d %d / %d %d\n",
- MinMax.ptMaxSize.x, MinMax.ptMaxSize.y,
- MinMax.ptMaxPosition.x, MinMax.ptMaxPosition.y,
- MinMax.ptMaxTrackSize.x, MinMax.ptMaxTrackSize.y,
- MinMax.ptMinTrackSize.x, MinMax.ptMinTrackSize.y);
- MinMax.ptMaxTrackSize.x = max( MinMax.ptMaxTrackSize.x,
- MinMax.ptMinTrackSize.x );
- MinMax.ptMaxTrackSize.y = max( MinMax.ptMaxTrackSize.y,
- MinMax.ptMinTrackSize.y );
-
- SetThreadDpiAwarenessContext( context );
- return MinMax;
+ MINMAXINFO info;
+ NtUserCallHwndParam( hwnd, (UINT_PTR)&info, NtUserGetMinMaxInfo );
+ return info;
}
+
static POINT get_first_minimized_child_pos( const RECT *parent, const MINIMIZEDMETRICS *mm,
int width, int height )
{
diff --git a/dlls/win32u/menu.c b/dlls/win32u/menu.c
index 1e8410d347e..921c5752536 100644
--- a/dlls/win32u/menu.c
+++ b/dlls/win32u/menu.c
@@ -106,6 +106,12 @@ BOOL WINAPI NtUserDestroyAcceleratorTable( HACCEL handle )
return TRUE;
}
+/* see GetMenu */
+HMENU get_menu( HWND hwnd )
+{
+ return UlongToHandle( get_window_long( hwnd, GWLP_ID ));
+}
+
/**********************************************************************
* NtUserDestroyMenu (win32u.@)
*/
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h
index b3cafe791df..51f17f63de5 100644
--- a/dlls/win32u/ntuser_private.h
+++ b/dlls/win32u/ntuser_private.h
@@ -30,6 +30,7 @@ struct tagWND;
struct user_callbacks
{
+ BOOL (WINAPI *pAdjustWindowRectEx)( RECT *, DWORD, BOOL, DWORD );
HANDLE (WINAPI *pCopyImage)( HANDLE, UINT, INT, INT, UINT );
BOOL (WINAPI *pDestroyCaret)(void);
BOOL (WINAPI *pDestroyMenu)( HMENU );
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index 83b0e093a20..2e8a8e3da8e 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -316,6 +316,9 @@ extern BOOL WINAPI release_capture(void) DECLSPEC_HIDDEN;
extern BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret ) DECLSPEC_HIDDEN;
extern BOOL set_foreground_window( HWND hwnd, BOOL mouse ) DECLSPEC_HIDDEN;
+/* menu.c */
+extern HMENU get_menu( HWND hwnd ) DECLSPEC_HIDDEN;
+
/* message.c */
extern BOOL kill_system_timer( HWND hwnd, UINT_PTR id ) DECLSPEC_HIDDEN;
extern LRESULT post_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) DECLSPEC_HIDDEN;
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index f8d147b785c..1069ace0794 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -3267,6 +3267,100 @@ static void send_parent_notify( HWND hwnd, UINT msg )
}
}
+/*******************************************************************
+ * get_min_max_info
+ *
+ * Get the minimized and maximized information for a window.
+ */
+static MINMAXINFO get_min_max_info( HWND hwnd )
+{
+ LONG style = get_window_long( hwnd, GWL_STYLE );
+ LONG exstyle = get_window_long( hwnd, GWL_EXSTYLE );
+ DPI_AWARENESS_CONTEXT context;
+ RECT rc_work, rc_primary;
+ LONG adjusted_style;
+ MINMAXINFO minmax;
+ INT xinc, yinc;
+ RECT rc;
+ WND *win;
+
+ context = set_thread_dpi_awareness_context( get_window_dpi_awareness_context( hwnd ));
+
+ /* Compute default values */
+
+ get_window_rect( hwnd, &rc, get_thread_dpi() );
+ minmax.ptReserved.x = rc.left;
+ minmax.ptReserved.y = rc.top;
+
+ if ((style & WS_CAPTION) == WS_CAPTION)
+ adjusted_style = style & ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */
+ else
+ adjusted_style = style;
+
+ get_client_rect( NtUserGetAncestor( hwnd, GA_PARENT ), &rc );
+ if (user_callbacks)
+ user_callbacks->pAdjustWindowRectEx( &rc, adjusted_style,
+ (style & WS_POPUP) && get_menu( hwnd ), exstyle);
+
+ xinc = -rc.left;
+ yinc = -rc.top;
+
+ minmax.ptMaxSize.x = rc.right - rc.left;
+ minmax.ptMaxSize.y = rc.bottom - rc.top;
+ if (style & (WS_DLGFRAME | WS_BORDER))
+ {
+ minmax.ptMinTrackSize.x = get_system_metrics( SM_CXMINTRACK );
+ minmax.ptMinTrackSize.y = get_system_metrics( SM_CYMINTRACK );
+ }
+ else
+ {
+ minmax.ptMinTrackSize.x = 2 * xinc;
+ minmax.ptMinTrackSize.y = 2 * yinc;
+ }
+ minmax.ptMaxTrackSize.x = get_system_metrics( SM_CXMAXTRACK );
+ minmax.ptMaxTrackSize.y = get_system_metrics( SM_CYMAXTRACK );
+ minmax.ptMaxPosition.x = -xinc;
+ minmax.ptMaxPosition.y = -yinc;
+
+ if ((win = get_win_ptr( hwnd )) && win != WND_DESKTOP && win != WND_OTHER_PROCESS)
+ {
+ if (!empty_point( win->max_pos )) minmax.ptMaxPosition = win->max_pos;
+ release_win_ptr( win );
+ }
+
+ send_message( hwnd, WM_GETMINMAXINFO, 0, (LPARAM)&minmax );
+
+ /* if the app didn't change the values, adapt them for the current monitor */
+
+ if (get_work_rect( hwnd, &rc_work ))
+ {
+ rc_primary = get_primary_monitor_rect( get_thread_dpi() );
+ if (minmax.ptMaxSize.x == (rc_primary.right - rc_primary.left) + 2 * xinc &&
+ minmax.ptMaxSize.y == (rc_primary.bottom - rc_primary.top) + 2 * yinc)
+ {
+ minmax.ptMaxSize.x = (rc_work.right - rc_work.left) + 2 * xinc;
+ minmax.ptMaxSize.y = (rc_work.bottom - rc_work.top) + 2 * yinc;
+ }
+ if (minmax.ptMaxPosition.x == -xinc && minmax.ptMaxPosition.y == -yinc)
+ {
+ minmax.ptMaxPosition.x = rc_work.left - xinc;
+ minmax.ptMaxPosition.y = rc_work.top - yinc;
+ }
+ }
+
+ TRACE( "%d %d / %d %d / %d %d / %d %d\n",
+ minmax.ptMaxSize.x, minmax.ptMaxSize.y,
+ minmax.ptMaxPosition.x, minmax.ptMaxPosition.y,
+ minmax.ptMaxTrackSize.x, minmax.ptMaxTrackSize.y,
+ minmax.ptMinTrackSize.x, minmax.ptMinTrackSize.y );
+
+ minmax.ptMaxTrackSize.x = max( minmax.ptMaxTrackSize.x, minmax.ptMinTrackSize.x );
+ minmax.ptMaxTrackSize.y = max( minmax.ptMaxTrackSize.y, minmax.ptMinTrackSize.y );
+
+ set_thread_dpi_awareness_context( context );
+ return minmax;
+}
+
/*******************************************************************
* update_window_state
*
@@ -3671,6 +3765,9 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code )
return get_class_word( hwnd, param );
case NtUserGetClientRect:
return get_client_rect( hwnd, (RECT *)param );
+ case NtUserGetMinMaxInfo:
+ *(MINMAXINFO *)param = get_min_max_info( hwnd );
+ return 0;
case NtUserGetWindowInfo:
return get_window_info( hwnd, (WINDOWINFO *)param );
case NtUserGetWindowLongA:
diff --git a/include/ntuser.h b/include/ntuser.h
index de958caa735..274c0cf31c9 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -167,6 +167,7 @@ enum
NtUserGetClassLongPtrW,
NtUserGetClassWord,
NtUserGetClientRect,
+ NtUserGetMinMaxInfo,
NtUserGetWindowInfo,
NtUserGetWindowLongA,
NtUserGetWindowLongW,
--
2.23.0
More information about the wine-devel
mailing list