From d312c60d0600c31c1ae2585f6d25cec8dd844e1d Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 20 Jan 2014 10:38:23 +0000 Subject: [PATCH] intel-virtual-output: Clone modes onto remote display If the user adds a mode to the VIRTUAL display and then attempts to use it, add that mode to the remote display. Reported-by: Christoph Bessei Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73816 Signed-off-by: Chris Wilson --- tools/virtual.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/tools/virtual.c b/tools/virtual.c index f0915a4..cf01c2c 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]; + int id; + + /* XXX User names must be unique! */ + m = src->mode; + m.nameLength = snprintf(buf, sizeof(buf), + "%s.%ld-%s", clone->src.name, (long)src->mode.id, src->mode.name); + m.name = buf; + + id = XRRCreateMode(clone->dst.dpy, clone->dst.window, &m); + if (id) { + DBG(("%s(%s-%s): adding mode %ld: %s\n", __func__, + DisplayString(clone->dst.dpy), clone->dst.name, id, mode->name)); + XRRAddOutputMode(clone->dst.dpy, clone->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; -- 1.8.5.3