diff options
author | slatchurie <slatchurie@gmail.com> | 2018-11-01 02:00:03 +0100 |
---|---|---|
committer | wm4 <1387750+wm4@users.noreply.github.com> | 2019-09-21 15:36:16 +0200 |
commit | 1591ccfff5871ef581d1d2992e9c517f29aaf301 (patch) | |
tree | d1da41ba2aad3d01aafb6eeea7300bf83c6f2937 | |
parent | ffe89415fec9ccfee5647dc473ae570591fa4c57 (diff) | |
download | mpv-1591ccfff5871ef581d1d2992e9c517f29aaf301.tar.bz2 mpv-1591ccfff5871ef581d1d2992e9c517f29aaf301.tar.xz |
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.
-rw-r--r-- | video/out/x11_common.c | 23 | ||||
-rw-r--r-- | 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 { |