Module: wine Branch: master Commit: 3ac14606aec47daaec0d838d861d560b4de026ac URL: http://source.winehq.org/git/wine.git/?a=commit;h=3ac14606aec47daaec0d838d86...
Author: Henri Verbeet hverbeet@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] )))