Jacek Caban : win32u: Introduce get_virtual_screen_rect.

Alexandre Julliard julliard at winehq.org
Thu Dec 2 15:30:17 CST 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Dec  2 01:14:12 2021 +0100

win32u: Introduce get_virtual_screen_rect.

And use it in nulldrv_GetDeviceCaps.

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/driver.c         | 20 ++++++--------------
 dlls/win32u/ntgdi_private.h  | 24 ++++++++++++++++++++++++
 dlls/win32u/sysparams.c      | 16 ++++++++++++++++
 dlls/win32u/win32u_private.h |  3 ++-
 dlls/win32u/wrappers.c       |  9 ---------
 5 files changed, 48 insertions(+), 24 deletions(-)

diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c
index 881e11116df..03594aa58d0 100644
--- a/dlls/win32u/driver.c
+++ b/dlls/win32u/driver.c
@@ -331,25 +331,17 @@ static INT CDECL nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap )
         return 1;
     }
     case DESKTOPHORZRES:
-        if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY && user_callbacks)
+        if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY)
         {
-            DPI_AWARENESS_CONTEXT context;
-            UINT ret;
-            context = user_callbacks->pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
-            ret = user_callbacks->pGetSystemMetrics( SM_CXVIRTUALSCREEN );
-            user_callbacks->pSetThreadDpiAwarenessContext( context );
-            if (ret) return ret;
+            RECT rect = get_virtual_screen_rect();
+            return rect.right - rect.left;
         }
         return NtGdiGetDeviceCaps( dev->hdc, HORZRES );
     case DESKTOPVERTRES:
-        if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY && user_callbacks)
+        if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY)
         {
-            DPI_AWARENESS_CONTEXT context;
-            UINT ret;
-            context = user_callbacks->pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
-            ret = user_callbacks->pGetSystemMetrics( SM_CYVIRTUALSCREEN );
-            user_callbacks->pSetThreadDpiAwarenessContext( context );
-            if (ret) return ret;
+            RECT rect = get_virtual_screen_rect();
+            return rect.bottom - rect.top;
         }
         return NtGdiGetDeviceCaps( dev->hdc, VERTRES );
     case BLTALIGNMENT:    return 0;
diff --git a/dlls/win32u/ntgdi_private.h b/dlls/win32u/ntgdi_private.h
index df7fb5e8f4e..8aaf8ba231d 100644
--- a/dlls/win32u/ntgdi_private.h
+++ b/dlls/win32u/ntgdi_private.h
@@ -594,6 +594,30 @@ static inline void reset_bounds( RECT *bounds )
     bounds->right = bounds->bottom = INT_MIN;
 }
 
+static inline void union_rect( RECT *dest, const RECT *src1, const RECT *src2 )
+{
+    if (is_rect_empty( src1 ))
+    {
+        if (is_rect_empty( src2 ))
+        {
+            reset_bounds( dest );
+            return;
+        }
+        else *dest = *src2;
+    }
+    else
+    {
+        if (is_rect_empty( src2 )) *dest = *src1;
+        else
+        {
+            dest->left   = min( src1->left, src2->left );
+            dest->right  = max( src1->right, src2->right );
+            dest->top    = min( src1->top, src2->top );
+            dest->bottom = max( src1->bottom, src2->bottom );
+        }
+    }
+}
+
 static inline void add_bounds_rect( RECT *bounds, const RECT *rect )
 {
     if (is_rect_empty( rect )) return;
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index 195756acea1..2da659aa3e5 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -1215,6 +1215,22 @@ static void unlock_display_devices(void)
     pthread_mutex_unlock( &display_lock );
 }
 
+RECT get_virtual_screen_rect(void)
+{
+    struct monitor *monitor;
+    RECT rect = {0};
+
+    if (!lock_display_devices()) return rect;
+
+    LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry )
+    {
+        union_rect( &rect, &rect, &monitor->rc_monitor );
+    }
+
+    unlock_display_devices();
+    return rect;
+}
+
 /**********************************************************************
  *           NtUserGetDisplayConfigBufferSizes    (win32u.@)
  */
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index bebf4b531b6..159d2a722d0 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -39,7 +39,6 @@ struct user_callbacks
     BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect );
     BOOL (WINAPI *pEnumDisplayMonitors)( HDC, LPRECT, MONITORENUMPROC, LPARAM );
     BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
-    DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)( DPI_AWARENESS_CONTEXT );
     HWND (WINAPI *pWindowFromDC)( HDC );
 };
 
@@ -242,6 +241,8 @@ struct unix_funcs
 UINT WINAPI GDIRealizePalette( HDC hdc );
 HPALETTE WINAPI GDISelectPalette( HDC hdc, HPALETTE hpal, WORD wBkg );
 
+extern RECT get_virtual_screen_rect(void) DECLSPEC_HIDDEN;
+
 extern void wrappers_init( unixlib_handle_t handle ) DECLSPEC_HIDDEN;
 extern NTSTATUS gdi_init(void) DECLSPEC_HIDDEN;
 extern NTSTATUS callbacks_init( void *args ) DECLSPEC_HIDDEN;
diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c
index ccf70190431..f51ed303b8b 100644
--- a/dlls/win32u/wrappers.c
+++ b/dlls/win32u/wrappers.c
@@ -845,14 +845,6 @@ static BOOL WINAPI call_RedrawWindow( HWND hwnd, const RECT *rect, HRGN rgn, UIN
     return pRedrawWindow && pRedrawWindow( hwnd, rect, rgn, flags );
 }
 
-static DPI_AWARENESS_CONTEXT WINAPI call_SetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT ctx )
-{
-    static DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)( DPI_AWARENESS_CONTEXT );
-    if (!pSetThreadDpiAwarenessContext)
-        pSetThreadDpiAwarenessContext = get_user_proc( "SetThreadDpiAwarenessContext", FALSE );
-    return pSetThreadDpiAwarenessContext ? pSetThreadDpiAwarenessContext( ctx ) : 0;
-}
-
 static HWND WINAPI call_WindowFromDC( HDC hdc )
 {
     static HWND (WINAPI *pWindowFromDC)( HDC );
@@ -870,7 +862,6 @@ static const struct user_callbacks user_funcs =
     call_GetWindowRect,
     call_EnumDisplayMonitors,
     call_RedrawWindow,
-    call_SetThreadDpiAwarenessContext,
     call_WindowFromDC,
 };
 




More information about the wine-cvs mailing list