From 1591ccfff5871ef581d1d2992e9c517f29aaf301 Mon Sep 17 00:00:00 2001 From: slatchurie Date: Thu, 1 Nov 2018 02:00:03 +0100 Subject: [PATCH] x11: fix ICC profiling for multiple monitors To find the correct ICC profile X atom, the screen number was calculated directly from the xrandr order of the screens. But if a primary screen is set, it should be the first Xinerama screen, even if it is not the first xrandr screen. Calculate the the proper atom id for each screen. --- video/out/x11_common.c | 23 +++++++++++++++++++++-- video/out/x11_common.h | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/video/out/x11_common.c b/video/out/x11_common.c index 467fa827ac..190b70fc1f 100644 --- a/video/out/x11_common.c +++ b/video/out/x11_common.c @@ -395,6 +395,8 @@ static void xrandr_read(struct vo_x11_state *x11) return; } + int primary_id = -1; + RROutput primary = XRRGetOutputPrimary(x11->display, x11->rootwin); for (int o = 0; o < r->noutput; o++) { RROutput output = r->outputs[o]; XRRCrtcInfo *crtc = NULL; @@ -427,6 +429,8 @@ static void xrandr_read(struct vo_x11_state *x11) MP_VERBOSE(x11, "Display %d (%s): [%d, %d, %d, %d] @ %f FPS\n", num, d.name, d.rc.x0, d.rc.y0, d.rc.x1, d.rc.y1, d.fps); x11->displays[num] = d; + if (output == primary) + primary_id = num; } } next: @@ -436,6 +440,20 @@ static void xrandr_read(struct vo_x11_state *x11) XRRFreeOutputInfo(out); } + for (int i = 0; i < x11->num_displays; i++) { + struct xrandr_display *d = &(x11->displays[i]); + + if (i == primary_id) { + d->atom_id = 0; + continue; + } + if (primary_id > 0 && i < primary_id) { + d->atom_id = i+1; + continue; + } + d->atom_id = i; + } + XRRFreeScreenResources(r); } @@ -1851,10 +1869,11 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg) if (!x11->pseudo_mapped) return VO_NOTAVAIL; int screen = get_icc_screen(vo); + int atom_id = x11->displays[screen].atom_id; char prop[80]; snprintf(prop, sizeof(prop), "_ICC_PROFILE"); - if (screen > 0) - mp_snprintf_cat(prop, sizeof(prop), "_%d", screen); + if (atom_id > 0) + mp_snprintf_cat(prop, sizeof(prop), "_%d", atom_id); x11->icc_profile_property = XAs(x11, prop); int len; MP_VERBOSE(x11, "Retrieving ICC profile for display: %d\n", screen); diff --git a/video/out/x11_common.h b/video/out/x11_common.h index ca01f61b0c..730b83ace8 100644 --- a/video/out/x11_common.h +++ b/video/out/x11_common.h @@ -44,6 +44,7 @@ struct xrandr_display { double fps; char *name; bool overlaps; + int atom_id; }; struct vo_x11_state {