Zhiyi Zhang : winex11.drv: Check that there are connected outputs before using XRandR 1.4.

Alexandre Julliard julliard at winehq.org
Sat Jan 2 14:01:23 CST 2021


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

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Fri Jan  1 13:00:47 2021 +0800

winex11.drv: Check that there are connected outputs before using XRandR 1.4.

On headless systems, Wine can still run through a VNC connection even though no outputs are
connected. Fallback to using the Xinerama display device handler in this case to report at least
one monitor.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49500
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winex11.drv/xrandr.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c
index 78ad98acd49..fa748c2af04 100644
--- a/dlls/winex11.drv/xrandr.c
+++ b/dlls/winex11.drv/xrandr.c
@@ -1555,6 +1555,38 @@ void X11DRV_XRandR_Init(void)
 #ifdef HAVE_XRRGETPROVIDERRESOURCES
     if (ret >= 4 && (major > 1 || (major == 1 && minor >= 4)))
     {
+        XRRScreenResources *screen_resources;
+        XRROutputInfo *output_info;
+        BOOL found_output = FALSE;
+        INT i;
+
+        screen_resources = xrandr_get_screen_resources();
+        if (!screen_resources)
+            return;
+
+        for (i = 0; i < screen_resources->noutput; ++i)
+        {
+            output_info = pXRRGetOutputInfo( gdi_display, screen_resources, screen_resources->outputs[i] );
+            if (!output_info)
+                continue;
+
+            if (output_info->connection == RR_Connected)
+            {
+                pXRRFreeOutputInfo( output_info );
+                found_output = TRUE;
+                break;
+            }
+
+            pXRRFreeOutputInfo( output_info );
+        }
+        pXRRFreeScreenResources( screen_resources );
+
+        if (!found_output)
+        {
+            WARN("No connected outputs found.\n");
+            return;
+        }
+
         display_handler.name = "XRandR 1.4";
         display_handler.priority = 200;
         display_handler.get_gpus = xrandr14_get_gpus;




More information about the wine-cvs mailing list