From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/input.c | 6 ++++-- dlls/win32u/sysparams.c | 10 +++++----- dlls/winewayland.drv/window.c | 12 +++++++++++- dlls/winex11.drv/event.c | 5 +++-- dlls/winex11.drv/window.c | 7 ++++--- include/ntuser.h | 12 ++++++------ 6 files changed, 33 insertions(+), 19 deletions(-)
diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index ab3144dbb68..cf84be6ef0e 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -2501,6 +2501,7 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset ) RECT rect; HMONITOR monitor; DWORD style; + UINT dpi; BOOL ret;
if (hwnd == NtUserGetDesktopWindow()) return FALSE; @@ -2512,8 +2513,9 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset ) /* maximized windows don't count as full screen */ if ((style & WS_MAXIMIZE) && (style & WS_CAPTION) == WS_CAPTION) return FALSE;
- if (!NtUserGetWindowRect( hwnd, &rect, get_thread_dpi() )) return FALSE; - if (!NtUserIsWindowRectFullScreen( &rect )) return FALSE; + dpi = get_dpi_for_window( hwnd ); + if (!NtUserGetWindowRect( hwnd, &rect, dpi )) return FALSE; + if (!NtUserIsWindowRectFullScreen( &rect, dpi )) return FALSE; if (is_captured_by_system()) return FALSE; if (NtGetTickCount() - thread_info->clipping_reset < 1000) return FALSE; if (!reset && clipping_cursor && thread_info->clipping_cursor) return FALSE; /* already clipping */ diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 00b5e9522a3..12aaac5329f 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2295,7 +2295,7 @@ RECT get_virtual_screen_rect( UINT dpi ) return rect; }
-static BOOL is_window_rect_full_screen( const RECT *rect ) +static BOOL is_window_rect_full_screen( const RECT *rect, UINT dpi ) { struct monitor *monitor; BOOL ret = FALSE; @@ -2308,7 +2308,7 @@ static BOOL is_window_rect_full_screen( const RECT *rect )
if (!is_monitor_active( monitor ) || monitor->is_clone) continue;
- monrect = get_monitor_rect( monitor, get_thread_dpi() ); + monrect = get_monitor_rect( monitor, dpi ); if (rect->left <= monrect.left && rect->right >= monrect.right && rect->top <= monrect.top && rect->bottom >= monrect.bottom) { @@ -6393,9 +6393,6 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ) case NtUserCallOneParam_GetSysColor: return get_sys_color( arg );
- case NtUserCallOneParam_IsWindowRectFullScreen: - return is_window_rect_full_screen( (const RECT *)arg ); - case NtUserCallOneParam_RealizePalette: return realize_palette( UlongToHandle(arg) );
@@ -6482,6 +6479,9 @@ ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code return adjust_window_rect( (RECT *)arg1, params->style, params->menu, params->ex_style, params->dpi ); }
+ case NtUserCallTwoParam_IsWindowRectFullScreen: + return is_window_rect_full_screen( (const RECT *)arg1, arg2 ); + /* temporary exports */ case NtUserAllocWinProc: return (UINT_PTR)alloc_winproc( (WNDPROC)arg1, arg2 ); diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index 906dcbc42df..cd8ca76b679 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -36,6 +36,16 @@
WINE_DEFAULT_DEBUG_CHANNEL(waylanddrv);
+ +/********************************************************************** + * get_win_monitor_dpi + */ +static UINT get_win_monitor_dpi(HWND hwnd) +{ + return NtUserGetSystemDpiForProcess(NULL); /* FIXME: get monitor dpi */ +} + + /* private window data */ struct wayland_win_data { @@ -171,7 +181,7 @@ static void wayland_win_data_get_config(struct wayland_win_data *data, TRACE("window=%s style=%#lx\n", wine_dbgstr_rect(&conf->rect), (long)style);
/* The fullscreen state is implied by the window position and style. */ - if (NtUserIsWindowRectFullScreen(&conf->rect)) + if (NtUserIsWindowRectFullScreen(&conf->rect, get_win_monitor_dpi(data->hwnd))) { if ((style & WS_MAXIMIZE) && (style & WS_CAPTION) == WS_CAPTION) window_state |= WAYLAND_SURFACE_CONFIG_STATE_MAXIMIZED; diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index 7ba3be8d95e..88863e62dd1 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -1046,7 +1046,7 @@ static BOOL X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev ) struct x11drv_win_data *data; RECT rect; POINT pos; - UINT flags; + UINT flags, dpi; HWND parent; BOOL root_coords; int cx, cy, x = event->x, y = event->y; @@ -1068,6 +1068,7 @@ static BOOL X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev )
/* Get geometry */
+ dpi = get_win_monitor_dpi( data->hwnd ); parent = NtUserGetAncestor( hwnd, GA_PARENT ); root_coords = event->send_event; /* synthetic events are always in root coords */
@@ -1119,7 +1120,7 @@ static BOOL X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev ) (int)(data->window_rect.bottom - data->window_rect.top), cx, cy );
style = NtUserGetWindowLongW( data->hwnd, GWL_STYLE ); - if ((style & WS_CAPTION) == WS_CAPTION || !NtUserIsWindowRectFullScreen( &data->whole_rect )) + if ((style & WS_CAPTION) == WS_CAPTION || !NtUserIsWindowRectFullScreen( &data->whole_rect, dpi )) { read_net_wm_states( event->display, data ); if ((data->net_wm_state & (1 << NET_WM_STATE_MAXIMIZED))) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 7fbb5283629..640d7914b67 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -297,7 +297,7 @@ static inline BOOL is_window_resizable( struct x11drv_win_data *data, DWORD styl { if (style & WS_THICKFRAME) return TRUE; /* Metacity needs the window to be resizable to make it fullscreen */ - return NtUserIsWindowRectFullScreen( &data->whole_rect ); + return NtUserIsWindowRectFullScreen( &data->whole_rect, get_win_monitor_dpi( data->hwnd ) ); }
/*********************************************************************** @@ -1089,7 +1089,7 @@ void update_net_wm_states( struct x11drv_win_data *data ) style = NtUserGetWindowLongW( data->hwnd, GWL_STYLE ); if (style & WS_MINIMIZE) new_state |= data->net_wm_state & ((1 << NET_WM_STATE_FULLSCREEN)|(1 << NET_WM_STATE_MAXIMIZED)); - if (NtUserIsWindowRectFullScreen( &data->whole_rect )) + if (NtUserIsWindowRectFullScreen( &data->whole_rect, get_win_monitor_dpi( data->hwnd ) )) { if ((style & WS_MAXIMIZE) && (style & WS_CAPTION) == WS_CAPTION) new_state |= (1 << NET_WM_STATE_MAXIMIZED); @@ -2761,7 +2761,8 @@ void X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags, { release_win_data( data ); unmap_window( hwnd ); - if (NtUserIsWindowRectFullScreen( &old_window_rect )) NtUserClipCursor( NULL ); + if (NtUserIsWindowRectFullScreen( &old_window_rect, get_win_monitor_dpi( hwnd ) )) + NtUserClipCursor( NULL ); if (!(data = get_win_data( hwnd ))) return; } } diff --git a/include/ntuser.h b/include/ntuser.h index bc36e47af3f..7713f7c6886 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -904,7 +904,6 @@ enum NtUserCallOneParam_GetSysColorPen, NtUserCallOneParam_GetSystemMetrics, NtUserCallOneParam_GetVirtualScreenRect, - NtUserCallOneParam_IsWindowRectFullScreen, NtUserCallOneParam_MessageBeep, NtUserCallOneParam_RealizePalette, NtUserCallOneParam_ReplyMessage, @@ -1005,11 +1004,6 @@ static inline RECT NtUserGetVirtualScreenRect(void) return virtual; }
-static inline BOOL NtUserIsWindowRectFullScreen( const RECT *rect ) -{ - return NtUserCallOneParam( (UINT_PTR)rect, NtUserCallOneParam_IsWindowRectFullScreen ); -} - static inline BOOL NtUserMessageBeep( UINT i ) { return NtUserCallOneParam( i, NtUserCallOneParam_MessageBeep ); @@ -1047,6 +1041,7 @@ enum NtUserCallTwoParam_SetIconParam, NtUserCallTwoParam_UnhookWindowsHook, NtUserCallTwoParam_AdjustWindowRect, + NtUserCallTwoParam_IsWindowRectFullScreen, /* temporary exports */ NtUserAllocWinProc, }; @@ -1114,6 +1109,11 @@ static inline BOOL NtUserAdjustWindowRect( RECT *rect, DWORD style, BOOL menu, D return NtUserCallTwoParam( (ULONG_PTR)rect, (ULONG_PTR)¶ms, NtUserCallTwoParam_AdjustWindowRect ); }
+static inline BOOL NtUserIsWindowRectFullScreen( const RECT *rect, UINT dpi ) +{ + return NtUserCallTwoParam( (UINT_PTR)rect, dpi, NtUserCallTwoParam_IsWindowRectFullScreen ); +} + /* NtUserCallHwnd codes, not compatible with Windows */ enum {