Henri Verbeet : winex11: Use the first active CRTC as primary if no primary is explicitly set.

Alexandre Julliard julliard at winehq.org
Fri Sep 28 11:39:03 CDT 2012


Module: wine
Branch: master
Commit: 3ac14606aec47daaec0d838d861d560b4de026ac
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3ac14606aec47daaec0d838d861d560b4de026ac

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Sep 28 01:06:54 2012 +0200

winex11: Use the first active CRTC as primary if no primary is explicitly set.

---

 dlls/winex11.drv/xrandr.c |   43 ++++++++++++++++++++++++++++++++++---------
 1 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c
index 968ff76..1093541 100644
--- a/dlls/winex11.drv/xrandr.c
+++ b/dlls/winex11.drv/xrandr.c
@@ -57,6 +57,7 @@ MAKE_FUNCPTR(XRRGetScreenResources)
 MAKE_FUNCPTR(XRRSetCrtcConfig)
 static typeof(XRRGetScreenResources) *pXRRGetScreenResourcesCurrent;
 static RRMode *xrandr12_modes;
+static int primary_crtc;
 #endif
 
 #undef MAKE_FUNCPTR
@@ -273,14 +274,15 @@ static int xrandr12_get_current_mode(void)
         return 0;
     }
 
-    if (!resources->ncrtc || !(crtc_info = pXRRGetCrtcInfo( gdi_display, resources, resources->crtcs[0] )))
+    if (resources->ncrtc <= primary_crtc ||
+        !(crtc_info = pXRRGetCrtcInfo( gdi_display, resources, resources->crtcs[primary_crtc] )))
     {
         pXRRFreeScreenResources( resources );
         ERR("Failed to get CRTC info.\n");
         return 0;
     }
 
-    TRACE("CRTC 0: mode %#lx, %ux%u+%d+%d.\n", crtc_info->mode,
+    TRACE("CRTC %d: mode %#lx, %ux%u+%d+%d.\n", primary_crtc, crtc_info->mode,
           crtc_info->width, crtc_info->height, crtc_info->x, crtc_info->y);
 
     for (i = 0; i < xrandr_mode_count; ++i)
@@ -318,18 +320,20 @@ static LONG xrandr12_set_current_mode( int mode )
         return DISP_CHANGE_FAILED;
     }
 
-    if (!resources->ncrtc || !(crtc_info = pXRRGetCrtcInfo( gdi_display, resources, resources->crtcs[0] )))
+    if (resources->ncrtc <= primary_crtc ||
+        !(crtc_info = pXRRGetCrtcInfo( gdi_display, resources, resources->crtcs[primary_crtc] )))
     {
         pXRRFreeScreenResources( resources );
         ERR("Failed to get CRTC info.\n");
         return DISP_CHANGE_FAILED;
     }
 
-    TRACE("CRTC 0: mode %#lx, %ux%u+%d+%d.\n", crtc_info->mode,
+    TRACE("CRTC %d: mode %#lx, %ux%u+%d+%d.\n", primary_crtc, crtc_info->mode,
           crtc_info->width, crtc_info->height, crtc_info->x, crtc_info->y);
 
-    status = pXRRSetCrtcConfig( gdi_display, resources, resources->crtcs[0], CurrentTime, crtc_info->x,
-            crtc_info->y, xrandr12_modes[mode], crtc_info->rotation, crtc_info->outputs, crtc_info->noutput );
+    status = pXRRSetCrtcConfig( gdi_display, resources, resources->crtcs[primary_crtc],
+                                CurrentTime, crtc_info->x, crtc_info->y, xrandr12_modes[mode],
+                                crtc_info->rotation, crtc_info->outputs, crtc_info->noutput );
 
     pXRRFreeCrtcInfo( crtc_info );
     pXRRFreeScreenResources( resources );
@@ -344,6 +348,27 @@ static LONG xrandr12_set_current_mode( int mode )
     return DISP_CHANGE_SUCCESSFUL;
 }
 
+static XRRCrtcInfo *xrandr12_get_primary_crtc_info( XRRScreenResources *resources, int *crtc_idx )
+{
+    XRRCrtcInfo *crtc_info;
+    int i;
+
+    for (i = 0; i < resources->ncrtc; ++i)
+    {
+        crtc_info = pXRRGetCrtcInfo( gdi_display, resources, resources->crtcs[i] );
+        if (!crtc_info || crtc_info->mode == None)
+        {
+            pXRRFreeCrtcInfo( crtc_info );
+            continue;
+        }
+
+        *crtc_idx = i;
+        return crtc_info;
+    }
+
+    return NULL;
+}
+
 static int xrandr12_init_modes(void)
 {
     XRRScreenResources *resources;
@@ -368,14 +393,14 @@ static int xrandr12_init_modes(void)
         }
     }
 
-    if (!resources->ncrtc || !(crtc_info = pXRRGetCrtcInfo( gdi_display, resources, resources->crtcs[0] )))
+    if (!(crtc_info = xrandr12_get_primary_crtc_info( resources, &primary_crtc )))
     {
         pXRRFreeScreenResources( resources );
-        ERR("Failed to get CRTC info.\n");
+        ERR("Failed to get primary CRTC info.\n");
         return ret;
     }
 
-    TRACE("CRTC 0: mode %#lx, %ux%u+%d+%d.\n", crtc_info->mode,
+    TRACE("CRTC %d: mode %#lx, %ux%u+%d+%d.\n", primary_crtc, crtc_info->mode,
           crtc_info->width, crtc_info->height, crtc_info->x, crtc_info->y);
 
     if (!crtc_info->noutput || !(output_info = pXRRGetOutputInfo( gdi_display, resources, crtc_info->outputs[0] )))




More information about the wine-cvs mailing list