From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/window.c | 4 ++++ server/protocol.def | 1 + server/window.c | 20 ++++++++++---------- 3 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index caa3b3aa323..193e7212e02 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -1793,6 +1793,7 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, BOOL ret, needs_surface, needs_update = FALSE; RECT visible_rect = *window_rect, old_visible_rect, old_window_rect, old_client_rect, extra_rects[3]; struct window_surface *old_surface, *new_surface = NULL; + UINT monitor_dpi;
needs_surface = user_driver->pWindowPosChanging( hwnd, swp_flags, window_rect, client_rect, &visible_rect );
@@ -1834,11 +1835,14 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, valid_rects = NULL; }
+ monitor_dpi = get_monitor_dpi( monitor_from_rect( window_rect, MONITOR_DEFAULTTONEAREST, get_thread_dpi() ) ); + SERVER_START_REQ( set_window_pos ) { req->handle = wine_server_user_handle( hwnd ); req->previous = wine_server_user_handle( insert_after ); req->swp_flags = swp_flags; + req->monitor_dpi = monitor_dpi; req->window = wine_server_rectangle( *window_rect ); req->client = wine_server_rectangle( *client_rect ); if (!EqualRect( window_rect, &visible_rect ) || new_surface || valid_rects) diff --git a/server/protocol.def b/server/protocol.def index 25184641082..173368df6eb 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2526,6 +2526,7 @@ enum message_type @REQ(set_window_pos) unsigned short swp_flags; /* SWP_* flags */ unsigned short paint_flags; /* paint flags (see below) */ + unsigned int monitor_dpi; /* DPI of the window's monitor */ user_handle_t handle; /* handle to the window */ user_handle_t previous; /* previous window in Z order */ rectangle_t window; /* window rectangle (in parent coords) */ diff --git a/server/window.c b/server/window.c index 4ebfec3da12..b5e40bdd6f5 100644 --- a/server/window.c +++ b/server/window.c @@ -84,6 +84,7 @@ struct window unsigned int alpha; /* alpha value for a layered window */ unsigned int layered_flags; /* flags for a layered window */ unsigned int dpi_context; /* DPI awareness context */ + unsigned int monitor_dpi; /* DPI of the window monitor */ lparam_t user_data; /* user-specific data */ WCHAR *text; /* window caption text */ data_size_t text_len; /* length of window caption */ @@ -244,20 +245,17 @@ static inline void update_pixel_format_flags( struct window *win ) win->paint_flags |= PAINT_PIXEL_FORMAT_CHILD; }
-static unsigned int get_window_dpi( struct window *win ) +/* get the per-monitor DPI for a window */ +static unsigned int get_monitor_dpi( struct window *win ) { - unsigned int dpi; - if ((dpi = NTUSER_DPI_CONTEXT_GET_DPI( win->dpi_context ))) return dpi; - /* FIXME: return the window monitor DPI? */ - return USER_DEFAULT_SCREEN_DPI; + while (win->parent && !is_desktop_window( win->parent )) win = win->parent; + return win->monitor_dpi; }
-/* get the per-monitor DPI for a window */ -static unsigned int get_monitor_dpi( struct window *win ) +static unsigned int get_window_dpi( struct window *win ) { - /* FIXME: we return the desktop window DPI for now */ - while (!is_desktop_window( win )) win = win->parent; - return get_window_dpi( win ); + if (NTUSER_DPI_CONTEXT_IS_MONITOR_AWARE( win->dpi_context )) return get_monitor_dpi( win ); + return NTUSER_DPI_CONTEXT_GET_DPI( win->dpi_context ); }
/* link a window at the right place in the siblings list */ @@ -577,6 +575,7 @@ static struct window *create_window( struct window *parent, struct window *owner win->is_layered = 0; win->is_orphan = 0; win->dpi_context = NTUSER_DPI_PER_MONITOR_AWARE; + win->monitor_dpi = USER_DEFAULT_SCREEN_DPI; win->user_data = 0; win->text = NULL; win->text_len = 0; @@ -2475,6 +2474,7 @@ DECL_HANDLER(set_window_pos) win->paint_flags = (win->paint_flags & ~PAINT_CLIENT_FLAGS) | (req->paint_flags & PAINT_CLIENT_FLAGS); if (win->paint_flags & PAINT_HAS_PIXEL_FORMAT) update_pixel_format_flags( win );
+ win->monitor_dpi = req->monitor_dpi; set_window_pos( win, previous, flags, &window_rect, &client_rect, &visible_rect, &surface_rect, &valid_rect );