diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c index fc905df..3b0bf0a 100644 --- a/hw/xfree86/common/xf86Mode.c +++ b/hw/xfree86/common/xf86Mode.c @@ -1571,7 +1571,39 @@ #define _VIRTUALX(x) ((((x) + scrp->xInc virtX = virtualX; virtY = virtualY; scrp->virtualFrom = X_CONFIG; - } else if (!modeNames || !*modeNames) { + } + + if ((modeNames == NULL) || (*modeNames == NULL)) { + char *mode_pref = NULL; + const int types[] = { + M_T_BUILTIN | M_T_PREFERRED, + M_T_USERDEF | M_T_PREFERRED, + M_T_DRIVER | M_T_PREFERRED + }; + const int ntypes = sizeof(types) / sizeof(int); + int n, type; + DisplayModePtr modes = scrp->modePool ? scrp->modePool : availModes; + + for (n = 0; n < ntypes; n++) { + type = types[n]; + + for (p = modes; p != NULL; p = p->next) { + if ((p->type & type) == type) { + mode_pref = strdup(p->name); + break; + } + } + if (mode_pref) + break; + if (mode_pref) { + modeNames = xnfcalloc(2, sizeof(char *)); + modeNames[0] = strdup(mode_pref); + modeNames[1] = NULL; + } + } + } + + if ((virtualY <= 0) && (!modeNames || !*modeNames)) { /* No virtual size given in the config, try to infer */ /* XXX this doesn't take m{in,ax}Pitch into account; oh well */ inferred_virtual = inferVirtualSize(scrp, availModes, &virtX, &virtY);