win32u: Pass the rect DPI to NtUserIsWindowRectFullScreen.

This commit is contained in:
Rémi Bernon 2024-06-03 11:59:24 +02:00 committed by Alexandre Julliard
parent e02685f86e
commit 979d36969c
6 changed files with 33 additions and 19 deletions

View file

@ -2500,6 +2500,7 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset )
RECT rect;
HMONITOR monitor;
DWORD style;
UINT dpi;
BOOL ret;
if (hwnd == NtUserGetDesktopWindow()) return FALSE;
@ -2511,8 +2512,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 */

View file

@ -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)
{
@ -6421,9 +6421,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) );
@ -6513,6 +6510,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 );

View file

@ -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;

View file

@ -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)))

View file

@ -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;
}
}

View file

@ -904,7 +904,6 @@ enum
NtUserCallOneParam_GetSysColorPen,
NtUserCallOneParam_GetSystemMetrics,
NtUserCallOneParam_GetVirtualScreenRect,
NtUserCallOneParam_IsWindowRectFullScreen,
NtUserCallOneParam_MessageBeep,
NtUserCallOneParam_RealizePalette,
NtUserCallOneParam_ReplyMessage,
@ -1006,11 +1005,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 );
@ -1055,6 +1049,7 @@ enum
NtUserCallTwoParam_SetIconParam,
NtUserCallTwoParam_UnhookWindowsHook,
NtUserCallTwoParam_AdjustWindowRect,
NtUserCallTwoParam_IsWindowRectFullScreen,
/* temporary exports */
NtUserAllocWinProc,
};
@ -1122,6 +1117,11 @@ static inline BOOL NtUserAdjustWindowRect( RECT *rect, DWORD style, BOOL menu, D
return NtUserCallTwoParam( (ULONG_PTR)rect, (ULONG_PTR)&params, 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
{