Jacek Caban : win32u: Move WM_WINE_UPDATEWINDOWSTATE implementation from user32.
Alexandre Julliard
julliard at winehq.org
Thu Mar 10 16:10:16 CST 2022
Module: wine
Branch: master
Commit: b5ddd14448d2a780ccab7bb672e66fbfd3ec7b4f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b5ddd14448d2a780ccab7bb672e66fbfd3ec7b4f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Mar 10 14:32:56 2022 +0100
win32u: Move WM_WINE_UPDATEWINDOWSTATE implementation from user32.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/message.c | 3 ---
dlls/user32/user_main.c | 2 ++
dlls/user32/user_private.h | 1 -
dlls/user32/win.c | 2 +-
dlls/win32u/message.c | 11 +++++++++++
dlls/win32u/ntuser_private.h | 4 ++++
dlls/win32u/sysparams.c | 42 ++++++++++++++++++++++++++++++++++++++++++
dlls/win32u/win32u_private.h | 3 +++
dlls/win32u/window.c | 26 ++++++++++++++++++++++++++
9 files changed, 89 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 85b3b672cfc..577120032bf 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -1878,9 +1878,6 @@ LRESULT handle_internal_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar
case WM_WINE_SETACTIVEWINDOW:
if (!wparam && NtUserGetForegroundWindow() == hwnd) return 0;
return (LRESULT)SetActiveWindow( (HWND)wparam );
- case WM_WINE_UPDATEWINDOWSTATE:
- update_window_state( hwnd );
- return 0;
default:
{
MSG m;
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index 4103d3dc7a8..ef8b35128b4 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -136,6 +136,7 @@ static void dpiaware_init(void)
static const struct user_callbacks user_funcs =
{
CopyImage,
+ PostMessageW,
RedrawWindow,
SendMessageTimeoutW,
SendMessageW,
@@ -146,6 +147,7 @@ static const struct user_callbacks user_funcs =
register_builtin_classes,
MSG_SendInternalMessageTimeout,
(void *)__wine_set_user_driver,
+ set_window_pos,
};
static void WINAPI User32CallFreeIcon( ULONG *param, ULONG size )
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index e2e371e32c0..453eb58c30d 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -124,7 +124,6 @@ extern void move_window_bits( HWND hwnd, struct window_surface *old_surface,
const RECT *window_rect, const RECT *valid_rects ) DECLSPEC_HIDDEN;
extern void move_window_bits_parent( HWND hwnd, HWND parent, const RECT *window_rect,
const RECT *valid_rects ) DECLSPEC_HIDDEN;
-extern void update_window_state( HWND hwnd ) DECLSPEC_HIDDEN;
extern void wait_graphics_driver_ready(void) DECLSPEC_HIDDEN;
extern void *get_hook_proc( void *proc, const WCHAR *module, HMODULE *free_module ) DECLSPEC_HIDDEN;
extern RECT get_virtual_screen_rect(void) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index bb792037640..885c06c90ca 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -308,7 +308,7 @@ static void send_parent_notify( HWND hwnd, UINT msg )
*
* Trigger an update of the window's driver state and surface.
*/
-void update_window_state( HWND hwnd )
+static void update_window_state( HWND hwnd )
{
DPI_AWARENESS_CONTEXT context;
RECT window_rect, client_rect, valid_rects[2];
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c
index abfbd7d9c69..b995ee60a0e 100644
--- a/dlls/win32u/message.c
+++ b/dlls/win32u/message.c
@@ -56,6 +56,9 @@ LRESULT handle_internal_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar
return user_driver->pClipCursor( &rect );
}
return user_driver->pClipCursor( NULL );
+ case WM_WINE_UPDATEWINDOWSTATE:
+ update_window_state( hwnd );
+ return 0;
default:
if (msg >= WM_WINE_FIRST_DRIVER_MSG && msg <= WM_WINE_LAST_DRIVER_MSG)
return user_driver->pWindowMessage( hwnd, msg, wparam, lparam );
@@ -118,3 +121,11 @@ LRESULT send_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
if (!user_callbacks) return 0;
return user_callbacks->pSendMessageW( hwnd, msg, wparam, lparam );
}
+
+/* see PostMessageW */
+LRESULT post_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
+{
+ /* FIXME: move implementation from user32 */
+ if (!user_callbacks) return 0;
+ return user_callbacks->pPostMessageW( hwnd, msg, wparam, lparam );
+}
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h
index 654429b994b..52be42f61ea 100644
--- a/dlls/win32u/ntuser_private.h
+++ b/dlls/win32u/ntuser_private.h
@@ -30,6 +30,7 @@ struct dce;
struct user_callbacks
{
HANDLE (WINAPI *pCopyImage)( HANDLE, UINT, INT, INT, UINT );
+ BOOL (WINAPI *pPostMessageW)( HWND, UINT, WPARAM, LPARAM );
BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
LRESULT (WINAPI *pSendMessageTimeoutW)( HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR );
LRESULT (WINAPI *pSendMessageW)( HWND, UINT, WPARAM, LPARAM );
@@ -40,6 +41,9 @@ struct user_callbacks
void (CDECL *register_builtin_classes)(void);
LRESULT (WINAPI *send_ll_message)( DWORD, DWORD, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR );
void (CDECL *set_user_driver)( void *, UINT );
+ BOOL (CDECL *set_window_pos)( HWND hwnd, HWND insert_after, UINT swp_flags,
+ const RECT *window_rect, const RECT *client_rect,
+ const RECT *valid_rects );
};
struct user_object
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index 39f8cf53345..a342d35a947 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -1436,6 +1436,48 @@ UINT get_system_dpi(void)
return system_dpi;
}
+/* see GetAwarenessFromDpiAwarenessContext */
+static DPI_AWARENESS get_awareness_from_dpi_awareness_context( DPI_AWARENESS_CONTEXT context )
+{
+ switch ((ULONG_PTR)context)
+ {
+ case 0x10:
+ case 0x11:
+ case 0x12:
+ case 0x80000010:
+ case 0x80000011:
+ case 0x80000012:
+ return (ULONG_PTR)context & 3;
+ case (ULONG_PTR)DPI_AWARENESS_CONTEXT_UNAWARE:
+ case (ULONG_PTR)DPI_AWARENESS_CONTEXT_SYSTEM_AWARE:
+ case (ULONG_PTR)DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE:
+ return ~(ULONG_PTR)context;
+ default:
+ return DPI_AWARENESS_INVALID;
+ }
+}
+
+/* see SetThreadDpiAwarenessContext */
+DPI_AWARENESS_CONTEXT set_thread_dpi_awareness_context( DPI_AWARENESS_CONTEXT context )
+{
+ struct user_thread_info *info = get_user_thread_info();
+ DPI_AWARENESS prev, val = get_awareness_from_dpi_awareness_context( context );
+
+ if (val == DPI_AWARENESS_INVALID)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return 0;
+ }
+ if (!(prev = info->dpi_awareness))
+ {
+ prev = NtUserGetProcessDpiAwarenessContext( GetCurrentProcess() ) & 3;
+ prev |= 0x80000010; /* restore to process default */
+ }
+ if (((ULONG_PTR)context & ~(ULONG_PTR)0x13) == 0x80000000) info->dpi_awareness = 0;
+ else info->dpi_awareness = val | 0x10;
+ return ULongToHandle( prev );
+}
+
/**********************************************************************
* map_dpi_rect
*/
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index 6bdad368f70..f1e59055e02 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -284,6 +284,7 @@ extern BOOL get_cursor_pos( POINT *pt ) DECLSPEC_HIDDEN;
extern DWORD get_input_state(void) DECLSPEC_HIDDEN;
/* message.c */
+extern LRESULT post_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) DECLSPEC_HIDDEN;
extern LRESULT send_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) DECLSPEC_HIDDEN;
/* sysparams.c */
@@ -301,6 +302,7 @@ extern RECT map_dpi_rect( RECT rect, UINT dpi_from, UINT dpi_to ) DECLSPEC_HIDDE
extern HMONITOR monitor_from_point( POINT pt, DWORD flags, UINT dpi ) DECLSPEC_HIDDEN;
extern HMONITOR monitor_from_rect( const RECT *rect, DWORD flags, UINT dpi ) DECLSPEC_HIDDEN;
extern HMONITOR monitor_from_window( HWND hwnd, DWORD flags, UINT dpi ) DECLSPEC_HIDDEN;
+extern DPI_AWARENESS_CONTEXT set_thread_dpi_awareness_context( DPI_AWARENESS_CONTEXT context ) DECLSPEC_HIDDEN;
extern void user_lock(void) DECLSPEC_HIDDEN;
extern void user_unlock(void) DECLSPEC_HIDDEN;
extern void user_check_not_lock(void) DECLSPEC_HIDDEN;
@@ -316,6 +318,7 @@ extern DWORD get_window_long( HWND hwnd, INT offset ) DECLSPEC_HIDDEN;
extern BOOL get_window_rect( HWND hwnd, RECT *rect, UINT dpi ) DECLSPEC_HIDDEN;
extern void register_window_surface( struct window_surface *old,
struct window_surface *new ) DECLSPEC_HIDDEN;
+extern void update_window_state( HWND hwnd ) DECLSPEC_HIDDEN;
/* to release pointers retrieved by win_get_ptr */
static inline void release_win_ptr( struct tagWND *ptr )
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index 1e80c5d39f8..35953143f37 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -1642,6 +1642,32 @@ INT WINAPI NtUserInternalGetWindowText( HWND hwnd, WCHAR *text, INT count )
return lstrlenW(text);
}
+/*******************************************************************
+ * update_window_state
+ *
+ * Trigger an update of the window's driver state and surface.
+ */
+void update_window_state( HWND hwnd )
+{
+ DPI_AWARENESS_CONTEXT context;
+ RECT window_rect, client_rect, valid_rects[2];
+
+ if (!is_current_thread_window( hwnd ))
+ {
+ post_message( hwnd, WM_WINE_UPDATEWINDOWSTATE, 0, 0 );
+ return;
+ }
+
+ context = set_thread_dpi_awareness_context( get_window_dpi_awareness_context( hwnd ));
+ get_window_rects( hwnd, COORDS_PARENT, &window_rect, &client_rect, get_thread_dpi() );
+ valid_rects[0] = valid_rects[1] = client_rect;
+ if (user_callbacks)
+ user_callbacks->set_window_pos( hwnd, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE |
+ SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW,
+ &window_rect, &client_rect, valid_rects );
+ set_thread_dpi_awareness_context( context );
+}
+
/*******************************************************************
* NtUserFlashWindowEx (win32u.@)
*/
More information about the wine-cvs
mailing list