mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-24 16:00:05 +01:00
RANDR 1.2: Fix initial mode aspect ratio match in a corner case.
Actually more like in the mainline case, where the ideal mode happens to
be the very first aspect match on the first monitor. But let's not
split hairs.
(cherry picked from commit 8248537722)
This commit is contained in:
parent
92cffb8cc2
commit
43739b9a32
1 changed files with 29 additions and 26 deletions
|
|
@ -1674,14 +1674,19 @@ aspectMatch(float a, float b)
|
|||
}
|
||||
|
||||
static DisplayModePtr
|
||||
nextAspectMode(DisplayModePtr start, float aspect)
|
||||
nextAspectMode(xf86OutputPtr o, DisplayModePtr last, float aspect)
|
||||
{
|
||||
DisplayModePtr m = start;
|
||||
DisplayModePtr m = NULL;
|
||||
|
||||
if (!m)
|
||||
if (!o)
|
||||
return NULL;
|
||||
|
||||
for (m = m->next; m; m = m->next)
|
||||
if (!last)
|
||||
m = o->probed_modes;
|
||||
else
|
||||
m = last->next;
|
||||
|
||||
for (; m; m = m->next)
|
||||
if (aspectMatch(aspect, (float)m->HDisplay / (float)m->VDisplay))
|
||||
return m;
|
||||
|
||||
|
|
@ -1691,31 +1696,29 @@ nextAspectMode(DisplayModePtr start, float aspect)
|
|||
static DisplayModePtr
|
||||
bestModeForAspect(xf86CrtcConfigPtr config, Bool *enabled, float aspect)
|
||||
{
|
||||
int o, p;
|
||||
DisplayModePtr mode, test = NULL, match = NULL;
|
||||
int o = -1, p;
|
||||
DisplayModePtr mode = NULL, test = NULL, match = NULL;
|
||||
|
||||
for (o = -1; nextEnabledOutput(config, enabled, &o); ) {
|
||||
mode = config->output[o]->probed_modes;
|
||||
while ((mode = nextAspectMode(mode, aspect))) {
|
||||
for (p = o; nextEnabledOutput(config, enabled, &p); ) {
|
||||
test = xf86OutputFindClosestMode(config->output[p], mode);
|
||||
if (!test)
|
||||
break;
|
||||
if (test->HDisplay != mode->HDisplay ||
|
||||
test->VDisplay != mode->VDisplay) {
|
||||
test = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* if we didn't match it on all outputs, try the next one */
|
||||
nextEnabledOutput(config, enabled, &o);
|
||||
while ((mode = nextAspectMode(config->output[o], mode, aspect))) {
|
||||
for (p = o; nextEnabledOutput(config, enabled, &p); ) {
|
||||
test = xf86OutputFindClosestMode(config->output[p], mode);
|
||||
if (!test)
|
||||
continue;
|
||||
|
||||
/* if it's bigger than the last one, save it */
|
||||
if (!match || (test->HDisplay > match->HDisplay))
|
||||
match = test;
|
||||
break;
|
||||
if (test->HDisplay != mode->HDisplay ||
|
||||
test->VDisplay != mode->VDisplay) {
|
||||
test = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* if we didn't match it on all outputs, try the next one */
|
||||
if (!test)
|
||||
continue;
|
||||
|
||||
/* if it's bigger than the last one, save it */
|
||||
if (!match || (test->HDisplay > match->HDisplay))
|
||||
match = test;
|
||||
}
|
||||
|
||||
/* return the biggest one found */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue