summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/virtual.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/tools/virtual.c b/tools/virtual.c
index f0915a4d..25571c41 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -533,6 +533,8 @@ static int clone_update_modes__randr(struct clone *clone)
old = &to_res->modes[j];
if (mode_equal(mode, old)) {
id = old->id;
+ DBG(("%s(%s-%s): reusing mode %ld: %s\n", __func__,
+ DisplayString(clone->src.dpy), clone->src.name, id, mode->name));
break;
}
}
@@ -1120,9 +1122,27 @@ err:
}
}
if (dst->mode.id == 0) {
- DBG(("%s: failed to find suitable mode for %s\n",
- DisplayString(dst->dpy), dst->name));
- goto err;
+ XRRModeInfo m;
+ char buf[256];
+ RRMode id;
+
+ /* XXX User names must be unique! */
+ m = src->mode;
+ m.nameLength = snprintf(buf, sizeof(buf),
+ "%s.%ld-%s", src->name, (long)src->mode.id, src->mode.name);
+ m.name = buf;
+
+ id = XRRCreateMode(dst->dpy, dst->window, &m);
+ if (id) {
+ DBG(("%s(%s-%s): adding mode %ld: %s\n", __func__,
+ DisplayString(dst->dpy), dst->name, (long)id, src->mode.name));
+ XRRAddOutputMode(dst->dpy, dst->rr_output, id);
+ dst->mode.id = id;
+ } else {
+ DBG(("%s: failed to find suitable mode for %s\n",
+ DisplayString(dst->dpy), dst->name));
+ goto err;
+ }
}
rr_crtc = dst->rr_crtc;
@@ -1161,10 +1181,10 @@ err:
goto err;
}
- DBG(("%s: enabling output '%s' (%d,%d)x(%d,%d), rotation %d, on CRTC:%ld\n",
+ DBG(("%s: enabling output '%s' (%d,%d)x(%d,%d), rotation %d, on CRTC:%ld, using mode %ld\n",
DisplayString(dst->dpy), dst->name,
dst->x, dst->y, dst->mode.width, dst->mode.height,
- dst->rotation, (long)rr_crtc));
+ dst->rotation, (long)rr_crtc, dst->mode.id));
ret = XRRSetCrtcConfig(dst->dpy, res, rr_crtc, CurrentTime,
dst->x, dst->y, dst->mode.id, dst->rotation,