[PATCH 1/9] winex11.drv: EnumDisplayDevices implementation

Donat Enikeev donat at enikeev.net
Mon Apr 24 15:47:37 CDT 2017


Based on Ken Thomases <ken at codeweavers.com> staging patches

Signed-off-by: Donat Enikeev <donat at enikeev.net>
---
 dlls/winex11.drv/winex11.drv.spec |  1 +
 dlls/winex11.drv/xinerama.c       | 69 +++++++++++++++++++++++++++++++++++++--
 include/wingdi.h                  |  6 +++-
 3 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec
index 614f0b9..89a5ece 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -21,6 +21,7 @@
 @ cdecl ClipCursor(ptr) X11DRV_ClipCursor
 @ cdecl ChangeDisplaySettingsEx(ptr ptr long long long) X11DRV_ChangeDisplaySettingsEx
 @ cdecl EnumDisplayMonitors(long ptr ptr long) X11DRV_EnumDisplayMonitors
+@ cdecl EnumDisplayDevices(ptr long ptr long) X11DRV_EnumDisplayDevices
 @ cdecl EnumDisplaySettingsEx(ptr long ptr long) X11DRV_EnumDisplaySettingsEx
 @ cdecl GetMonitorInfo(long ptr) X11DRV_GetMonitorInfo
 @ cdecl CreateDesktopWindow(long) X11DRV_CreateDesktopWindow
diff --git a/dlls/winex11.drv/xinerama.c b/dlls/winex11.drv/xinerama.c
index 0419535..c6fa9c2 100644
--- a/dlls/winex11.drv/xinerama.c
+++ b/dlls/winex11.drv/xinerama.c
@@ -28,6 +28,7 @@
 #include <X11/extensions/Xinerama.h>
 #endif
 #include "wine/library.h"
+#include "wine/unicode.h"
 #include "x11drv.h"
 #include "wine/debug.h"
 
@@ -35,6 +36,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
 
 static RECT virtual_screen_rect;
 
+static const WCHAR display_name[] = { '%','s','\\','M','o','n','i','t','o','r','0',0};
+static const WCHAR display_string[] = {'W','i','n','e',' ','D','i','s','p','l','a','y',0};
+static const WCHAR display_deviceid[] = {'M','O','N','I','T','O','R','\\','W','I','N','E','%','0','4','d',0};
+
+static const WCHAR adapter_name[] = { '\\','\\','.','\\','D','I','S','P','L','A','Y','%','d',0 };
+static const WCHAR adapter_string[] = {'W','i','n','e',' ','X','1','1',' ','A','d','a','p','t','e','r',0};
+static const WCHAR adapter_deviceid[] = {'P','C','I','\\','V','E','N','_','0','0','0','0','&',
+                                                'D','E','V','_','0','0','0','0',0};
+
 static MONITORINFOEXW default_monitor =
 {
     sizeof(default_monitor),    /* cbSize */
@@ -152,8 +162,8 @@ static int query_screens(void)
             monitors[i].dwFlags          = 0;
             if (!IntersectRect( &monitors[i].rcWork, &rc_work, &monitors[i].rcMonitor ))
                 monitors[i].rcWork = monitors[i].rcMonitor;
-            /* FIXME: using the same device name for all monitors for now */
-            lstrcpyW( monitors[i].szDevice, default_monitor.szDevice );
+
+            sprintfW( monitors[i].szDevice, adapter_name, i + 1);
         }
 
         get_primary()->dwFlags |= MONITORINFOF_PRIMARY;
@@ -298,3 +308,58 @@ BOOL CDECL X11DRV_EnumDisplayMonitors( HDC hdc, LPRECT rect, MONITORENUMPROC pro
     }
     return TRUE;
 }
+
+
+/***********************************************************************
+ *      X11DRV_EnumDisplayDevices  (X11DRV.@)
+ */
+BOOL CDECL X11DRV_EnumDisplayDevices( LPCWSTR lpDevice, DWORD iDevNum, LPDISPLAY_DEVICEW lpDisplayDevice,
+                                 DWORD dwFlags )
+{
+    int i;
+    BOOL ret = FALSE;
+
+    TRACE("(%s, %d, %p, 0x%08x)\n",debugstr_w(lpDevice),iDevNum,lpDisplayDevice,dwFlags);
+
+    if (iDevNum >= nb_monitors || (lpDevice && iDevNum))
+        return FALSE;
+
+    if (lpDevice)
+    {
+        for (i=0; i<nb_monitors; i++)
+        {
+            if (!strcmpW(lpDevice, monitors[i].szDevice))
+            {
+                lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ACTIVE | DISPLAY_DEVICE_ATTACHED;
+
+                sprintfW(lpDisplayDevice->DeviceName, display_name, lpDevice);
+                memcpy(lpDisplayDevice->DeviceString, display_string, sizeof(display_string));
+
+                if(lpDisplayDevice->cb >= offsetof(DISPLAY_DEVICEW, DeviceID) + sizeof(lpDisplayDevice->DeviceID))
+                    sprintfW(lpDisplayDevice->DeviceID, display_deviceid, i);
+                ret = TRUE;
+                break;
+            }
+        }
+    } else
+    {
+        lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_VGA_COMPATIBLE;
+        if (monitors[iDevNum].dwFlags & MONITORINFOF_PRIMARY)
+            lpDisplayDevice->StateFlags |= DISPLAY_DEVICE_PRIMARY_DEVICE;
+
+        memcpy(lpDisplayDevice->DeviceName, monitors[iDevNum].szDevice, sizeof(monitors[iDevNum].szDevice));
+
+        sprintfW(lpDisplayDevice->DeviceName, adapter_name, iDevNum+1);
+        memcpy(lpDisplayDevice->DeviceString, adapter_string, sizeof(adapter_string));
+
+        if(lpDisplayDevice->cb >= offsetof(DISPLAY_DEVICEW, DeviceID) + sizeof(lpDisplayDevice->DeviceID))
+            memcpy(lpDisplayDevice->DeviceID, adapter_deviceid, sizeof(adapter_deviceid));
+
+        ret = TRUE;
+    }
+
+    if(lpDisplayDevice->cb >= offsetof(DISPLAY_DEVICEW, DeviceKey) + sizeof(lpDisplayDevice->DeviceKey))
+        lpDisplayDevice->DeviceKey[0] = 0;
+
+    return ret;
+}
\ No newline at end of file
diff --git a/include/wingdi.h b/include/wingdi.h
index 1851654..5296e2b 100644
--- a/include/wingdi.h
+++ b/include/wingdi.h
@@ -3318,13 +3318,17 @@ DECL_WINELIB_TYPE_AW(DISPLAY_DEVICE)
 DECL_WINELIB_TYPE_AW(PDISPLAY_DEVICE)
 DECL_WINELIB_TYPE_AW(LPDISPLAY_DEVICE)
 
-/* DISPLAY_DEVICE.StateFlags (?)*/
+/* DISPLAY_DEVICE.StateFlags Displays (?) */
 #define	DISPLAY_DEVICE_ATTACHED_TO_DESKTOP	0x00000001
 #define	DISPLAY_DEVICE_MULTI_DRIVER		0x00000002
 #define	DISPLAY_DEVICE_PRIMARY_DEVICE		0x00000004
 #define	DISPLAY_DEVICE_MIRRORING_DRIVER		0x00000008
 #define	DISPLAY_DEVICE_VGA_COMPATIBLE		0x00000010
 
+/* DISPLAY_DEVICE.StateFlags Display Monitors (?) */
+#define	DISPLAY_DEVICE_ACTIVE			0x00000001
+#define	DISPLAY_DEVICE_ATTACHED			0x00000002
+
 typedef struct DISPLAYCONFIG_DESKTOP_IMAGE_INFO
 {
     POINTL PathSourceSize;
-- 
2.7.4




More information about the wine-patches mailing list