[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