Module: wine Branch: master Commit: 6c8cac10ef9d6b38a7db8a23e6ce47e3a9b91bb9 URL: https://source.winehq.org/git/wine.git/?a=commit;h=6c8cac10ef9d6b38a7db8a23e...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Mar 9 15:22:07 2022 +0100
win32u: Move GetDpiForWindow from user32.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/win.c | 30 +----------------------------- dlls/win32u/sysparams.c | 9 +++++++++ dlls/win32u/win32u_private.h | 1 + dlls/win32u/window.c | 36 ++++++++++++++++++++++++++++++++++++ include/ntuser.h | 1 + 5 files changed, 48 insertions(+), 29 deletions(-)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 48541c19a66..98396293912 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -2099,35 +2099,7 @@ DPI_AWARENESS_CONTEXT WINAPI GetWindowDpiAwarenessContext( HWND hwnd ) */ UINT WINAPI GetDpiForWindow( HWND hwnd ) { - WND *win; - UINT ret = 0; - - if (!(win = WIN_GetPtr( hwnd ))) - { - SetLastError( ERROR_INVALID_WINDOW_HANDLE ); - return 0; - } - if (win == WND_DESKTOP) - { - POINT pt = { 0, 0 }; - return get_monitor_dpi( MonitorFromPoint( pt, MONITOR_DEFAULTTOPRIMARY )); - } - if (win != WND_OTHER_PROCESS) - { - ret = win->dpi; - if (!ret) ret = get_win_monitor_dpi( hwnd ); - WIN_ReleasePtr( win ); - } - else - { - SERVER_START_REQ( get_window_info ) - { - req->handle = wine_server_user_handle( hwnd ); - if (!wine_server_call_err( req )) ret = reply->dpi; - } - SERVER_END_REQ; - } - return ret; + return NtUserCallHwnd( hwnd, NtUserGetDpiForWindow ); }
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index c1a5470d9c1..3bcc2df007a 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1379,6 +1379,15 @@ UINT get_monitor_dpi( HMONITOR monitor ) return system_dpi; }
+/********************************************************************** + * get_win_monitor_dpi + */ +UINT get_win_monitor_dpi( HWND hwnd ) +{ + /* FIXME: use the monitor DPI instead */ + return system_dpi; +} + /********************************************************************** * get_thread_dpi_awareness */ diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 131e177a397..42426a512f0 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -284,6 +284,7 @@ extern LRESULT send_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) /* sysparams.c */ extern RECT get_display_rect( const WCHAR *display ) DECLSPEC_HIDDEN; extern UINT get_monitor_dpi( HMONITOR monitor ) DECLSPEC_HIDDEN; +extern UINT get_win_monitor_dpi( HWND hwnd ) DECLSPEC_HIDDEN; extern UINT get_system_dpi(void) DECLSPEC_HIDDEN; extern int get_system_metrics( int index ) DECLSPEC_HIDDEN; extern UINT get_thread_dpi(void) DECLSPEC_HIDDEN; diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index ce03df84994..8aa794421d2 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -708,6 +708,40 @@ static DPI_AWARENESS_CONTEXT get_window_dpi_awareness_context( HWND hwnd ) return ret; }
+/* see GetDpiForWindow */ +static UINT get_dpi_for_window( HWND hwnd ) +{ + WND *win; + UINT ret = 0; + + if (!(win = get_win_ptr( hwnd ))) + { + SetLastError( ERROR_INVALID_WINDOW_HANDLE ); + return 0; + } + if (win == WND_DESKTOP) + { + POINT pt = { 0, 0 }; + return get_monitor_dpi( monitor_from_point( pt, MONITOR_DEFAULTTOPRIMARY, 0 )); + } + if (win != WND_OTHER_PROCESS) + { + ret = win->dpi; + if (!ret) ret = get_win_monitor_dpi( hwnd ); + release_win_ptr( win ); + } + else + { + SERVER_START_REQ( get_window_info ) + { + req->handle = wine_server_user_handle( hwnd ); + if (!wine_server_call_err( req )) ret = reply->dpi; + } + SERVER_END_REQ; + } + return ret; +} + static LONG_PTR get_win_data( const void *ptr, UINT size ) { if (size == sizeof(WORD)) @@ -1115,6 +1149,8 @@ ULONG_PTR WINAPI NtUserCallHwnd( HWND hwnd, DWORD code ) { switch (code) { + case NtUserGetDpiForWindow: + return get_dpi_for_window( hwnd ); case NtUserGetParent: return HandleToUlong( get_parent( hwnd )); case NtUserGetWindowDpiAwarenessContext: diff --git a/include/ntuser.h b/include/ntuser.h index f45d0e8641c..20c8c2876f0 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -141,6 +141,7 @@ enum /* NtUserCallHwnd codes, not compatible with Windows */ enum { + NtUserGetDpiForWindow, NtUserGetParent, NtUserGetWindowDpiAwarenessContext, NtUserGetWindowTextLength,