Zhiyi Zhang : wined3d: Support non-primary outputs in wined3d_output_get_desc().

Alexandre Julliard julliard at winehq.org
Wed Mar 25 17:07:29 CDT 2020


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

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Wed Mar 25 17:50:59 2020 +0800

wined3d: Support non-primary outputs in wined3d_output_get_desc().

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/directx.c         | 43 +++++++++++++++++++++---------------------
 dlls/wined3d/wined3d_private.h |  1 -
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 42cc5c8f92..a50f594854 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -916,35 +916,36 @@ HRESULT CDECL wined3d_register_software_device(struct wined3d *wined3d, void *in
     return WINED3D_OK;
 }
 
+static BOOL CALLBACK enum_monitor_proc(HMONITOR monitor, HDC hdc, RECT *rect, LPARAM lparam)
+{
+    struct wined3d_output_desc *desc = (struct wined3d_output_desc *)lparam;
+    MONITORINFOEXW monitor_info;
+
+    monitor_info.cbSize = sizeof(monitor_info);
+    if (GetMonitorInfoW(monitor, (MONITORINFO *)&monitor_info) &&
+            !lstrcmpiW(desc->device_name, monitor_info.szDevice))
+    {
+        desc->monitor = monitor;
+        desc->desktop_rect = monitor_info.rcMonitor;
+        desc->attached_to_desktop = TRUE;
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
 HRESULT CDECL wined3d_output_get_desc(const struct wined3d_output *output,
         struct wined3d_output_desc *desc)
 {
-    enum wined3d_display_rotation rotation;
-    const struct wined3d_adapter *adapter;
     struct wined3d_display_mode mode;
-    HMONITOR monitor;
-    HRESULT hr;
 
     TRACE("output %p, desc %p.\n", output, desc);
 
-    adapter = output->adapter;
-    if (!(monitor = MonitorFromPoint(adapter->monitor_position, MONITOR_DEFAULTTOPRIMARY)))
-        return WINED3DERR_INVALIDCALL;
-
-    if (FAILED(hr = wined3d_output_get_display_mode(output, &mode, &rotation)))
-        return hr;
-
+    memset(desc, 0, sizeof(*desc));
     desc->ordinal = output->ordinal;
-    memcpy(desc->device_name, adapter->device_name, sizeof(desc->device_name));
-    SetRect(&desc->desktop_rect, 0, 0, mode.width, mode.height);
-    OffsetRect(&desc->desktop_rect, adapter->monitor_position.x, adapter->monitor_position.y);
-    /* FIXME: We should get this from EnumDisplayDevices() when the adapters
-     * are created. */
-    desc->attached_to_desktop = TRUE;
-    desc->rotation = rotation;
-    desc->monitor = monitor;
-
-    return WINED3D_OK;
+    lstrcpyW(desc->device_name, output->device_name);
+    EnumDisplayMonitors(NULL, NULL, enum_monitor_proc, (LPARAM)desc);
+    return wined3d_output_get_display_mode(output, &mode, &desc->rotation);
 }
 
 /* FIXME: GetAdapterModeCount and EnumAdapterModes currently only returns modes
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 23a300a0ea..bb0551e2af 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2914,7 +2914,6 @@ struct wined3d_output
 struct wined3d_adapter
 {
     unsigned int ordinal;
-    POINT monitor_position;
 
     struct wined3d_gl_info  gl_info;
     struct wined3d_d3d_info d3d_info;




More information about the wine-cvs mailing list