[WIN32SS] Enable multidisplay driver when required
authorHervé Poussineau <hpoussin@reactos.org>
Sun, 20 Mar 2022 17:12:11 +0000 (18:12 +0100)
committerhpoussin <32227662+hpoussin@users.noreply.github.com>
Fri, 15 Apr 2022 21:09:16 +0000 (23:09 +0200)
For now, it is only a stub which returns an error.

win32ss/CMakeLists.txt
win32ss/gdi/eng/multidisp.c [new file with mode: 0644]
win32ss/gdi/eng/pdevobj.c

index a786921..a5efa7f 100644 (file)
@@ -77,6 +77,7 @@ list(APPEND SOURCE
     gdi/eng/mem.c
     gdi/eng/engmisc.c
     gdi/eng/mouse.c
+    gdi/eng/multidisp.c
     gdi/eng/paint.c
     gdi/eng/pathobj.c
     gdi/eng/pdevobj.c
diff --git a/win32ss/gdi/eng/multidisp.c b/win32ss/gdi/eng/multidisp.c
new file mode 100644 (file)
index 0000000..e815e19
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+* PROJECT:     ReactOS Win32k subsystem
+* LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+* FILE:        win32ss/gdi/eng/multidisp.c
+* PURPOSE:     Multi-Display driver
+* PROGRAMMERS:
+*/
+
+/* INCLUDES *******************************************************************/
+
+#include <win32k.h>
+#define NDEBUG
+#include <debug.h>
+
+BOOL
+APIENTRY
+MultiEnableDriver(
+    _In_ ULONG iEngineVersion,
+    _In_ ULONG cj,
+    _Inout_bytecount_(cj) PDRVENABLEDATA pded)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
index f39afd1..41c5045 100644 (file)
@@ -14,6 +14,13 @@ DBG_DEFAULT_CHANNEL(EngPDev);
 static PPDEVOBJ gppdevList = NULL;
 static HSEMAPHORE ghsemPDEV;
 
+BOOL
+APIENTRY
+MultiEnableDriver(
+    _In_ ULONG iEngineVersion,
+    _In_ ULONG cj,
+    _Inout_bytecount_(cj) PDRVENABLEDATA pded);
+
 CODE_SEG("INIT")
 NTSTATUS
 NTAPI
@@ -456,7 +463,10 @@ PDEVOBJ_Create(
     }
 
     /* Try to get a display driver */
-    pldev = LDEVOBJ_pLoadDriver(pdm->dmDeviceName, ldevtype);
+    if (ldevtype == LDEV_DEVICE_META)
+        pldev = LDEVOBJ_pLoadInternal(MultiEnableDriver, ldevtype);
+    else
+        pldev = LDEVOBJ_pLoadDriver(pdm->dmDeviceName, ldevtype);
     if (!pldev)
     {
         ERR("Could not load display driver '%S'\n",
@@ -877,10 +887,14 @@ PDEVOBJ_lChangeDisplaySettings(
         }
         else
         {
-            /* FIXME: currently, only use the first display */
-            UNIMPLEMENTED;
-            PDEVOBJ_vReference(pmdev->dev[0].ppdev);
-            pmdev->ppdevGlobal = pmdev->dev[0].ppdev;
+            /* Enable MultiDriver */
+            pmdev->ppdevGlobal = PDEVOBJ_Create(NULL, (PDEVMODEW)pmdev, 0, LDEV_DEVICE_META);
+            if (!pmdev->ppdevGlobal)
+            {
+                WARN("Failed to create meta-device. Using only first display\n");
+                PDEVOBJ_vReference(pmdev->dev[0].ppdev);
+                pmdev->ppdevGlobal = pmdev->dev[0].ppdev;
+            }
         }
 
         if (pmdevOld)