Jacek Caban : win32u: Move is_window_rect_full_screen implementation from winex11.

Alexandre Julliard julliard at winehq.org
Wed Apr 20 16:49:49 CDT 2022


Module: wine
Branch: master
Commit: ee405dd8b88683417af1e21ae6a254edadc32723
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ee405dd8b88683417af1e21ae6a254edadc32723

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr 20 16:00:23 2022 +0200

win32u: Move is_window_rect_full_screen implementation from winex11.

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/win32u/sysparams.c   | 24 ++++++++++++++++++++++++
 dlls/winex11.drv/event.c  |  2 +-
 dlls/winex11.drv/mouse.c  |  2 +-
 dlls/winex11.drv/window.c | 34 +++-------------------------------
 dlls/winex11.drv/x11drv.h |  1 -
 include/ntuser.h          |  6 ++++++
 6 files changed, 35 insertions(+), 34 deletions(-)

diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index 49f3f716b2d..1e8b0fbf489 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -1547,6 +1547,27 @@ RECT get_virtual_screen_rect( UINT dpi )
     return rect;
 }
 
+static BOOL is_window_rect_full_screen( const RECT *rect )
+{
+    struct monitor *monitor;
+    BOOL ret = FALSE;
+
+    if (!lock_display_devices()) return FALSE;
+
+    LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry )
+    {
+        if (rect->left <= monitor->rc_monitor.left && rect->right >= monitor->rc_monitor.right &&
+            rect->top <= monitor->rc_monitor.top && rect->bottom >= monitor->rc_monitor.bottom)
+        {
+            ret = TRUE;
+            break;
+        }
+    }
+
+    unlock_display_devices();
+    return ret;
+}
+
 RECT get_display_rect( const WCHAR *display )
 {
     struct monitor *monitor;
@@ -4698,6 +4719,9 @@ 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) );
 
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index 900f24c4002..e1bcd70d35a 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -1156,7 +1156,7 @@ static BOOL X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev )
                data->window_rect.bottom - data->window_rect.top, cx, cy );
 
     style = NtUserGetWindowLongW( data->hwnd, GWL_STYLE );
-    if ((style & WS_CAPTION) == WS_CAPTION || !is_window_rect_full_screen( &data->whole_rect ))
+    if ((style & WS_CAPTION) == WS_CAPTION || !NtUserIsWindowRectFullScreen( &data->whole_rect ))
     {
         read_net_wm_states( event->display, data );
         if ((data->net_wm_state & (1 << NET_WM_STATE_MAXIMIZED)))
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 82d3e17a0d1..5bebcf42fb2 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -549,7 +549,7 @@ 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 (!(data = get_win_data( hwnd ))) return FALSE;
-    fullscreen = is_window_rect_full_screen( &data->whole_rect );
+    fullscreen = NtUserIsWindowRectFullScreen( &data->whole_rect );
     release_win_data( data );
     if (!fullscreen) return FALSE;
     if (!(thread_data = x11drv_thread_data())) return FALSE;
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 4c4e47884ff..bed5081d124 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -281,35 +281,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 is_window_rect_full_screen( &data->whole_rect );
-}
-
-struct monitor_info
-{
-    const RECT *rect;
-    BOOL full_screen;
-};
-
-static BOOL CALLBACK enum_monitor_proc( HMONITOR monitor, HDC hdc, RECT *monitor_rect, LPARAM lparam )
-{
-    struct monitor_info *info = (struct monitor_info *)lparam;
-
-    if (info->rect->left <= monitor_rect->left && info->rect->right >= monitor_rect->right &&
-        info->rect->top <= monitor_rect->top && info->rect->bottom >= monitor_rect->bottom)
-    {
-        info->full_screen = TRUE;
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-BOOL is_window_rect_full_screen( const RECT *rect )
-{
-    struct monitor_info info = {rect, FALSE};
-
-    EnumDisplayMonitors( NULL, NULL, enum_monitor_proc, (LPARAM)&info );
-    return info.full_screen;
+    return NtUserIsWindowRectFullScreen( &data->whole_rect );
 }
 
 /***********************************************************************
@@ -992,7 +964,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 (is_window_rect_full_screen( &data->whole_rect ))
+    if (NtUserIsWindowRectFullScreen( &data->whole_rect ))
     {
         if ((style & WS_MAXIMIZE) && (style & WS_CAPTION) == WS_CAPTION)
             new_state |= (1 << NET_WM_STATE_MAXIMIZED);
@@ -2511,7 +2483,7 @@ void X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags,
         {
             release_win_data( data );
             unmap_window( hwnd );
-            if (is_window_rect_full_screen( &old_window_rect )) reset_clipping_window();
+            if (NtUserIsWindowRectFullScreen( &old_window_rect )) reset_clipping_window();
             if (!(data = get_win_data( hwnd ))) return;
         }
     }
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 23886936dd4..da037297745 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -694,7 +694,6 @@ typedef int (*x11drv_error_callback)( Display *display, XErrorEvent *event, void
 extern void X11DRV_expect_error( Display *display, x11drv_error_callback callback, void *arg ) DECLSPEC_HIDDEN;
 extern int X11DRV_check_error(void) DECLSPEC_HIDDEN;
 extern void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect, int x, int y, int cx, int cy ) DECLSPEC_HIDDEN;
-extern BOOL is_window_rect_full_screen( const RECT *rect ) DECLSPEC_HIDDEN;
 extern POINT virtual_screen_to_root( INT x, INT y ) DECLSPEC_HIDDEN;
 extern POINT root_to_virtual_screen( INT x, INT y ) DECLSPEC_HIDDEN;
 extern RECT get_host_primary_monitor_rect(void) DECLSPEC_HIDDEN;
diff --git a/include/ntuser.h b/include/ntuser.h
index bab4a0dc78c..b34ff3da4c1 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -642,6 +642,7 @@ enum
     NtUserCallOneParam_GetSysColorPen,
     NtUserCallOneParam_GetSystemMetrics,
     NtUserCallOneParam_GetVirtualScreenRect,
+    NtUserCallOneParam_IsWindowRectFullScreen,
     NtUserCallOneParam_MessageBeep,
     NtUserCallOneParam_RealizePalette,
     /* temporary exports */
@@ -732,6 +733,11 @@ 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 );




More information about the wine-cvs mailing list