summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorslatchurie <slatchurie@gmail.com>2018-11-01 02:00:03 +0100
committerwm4 <1387750+wm4@users.noreply.github.com>2019-09-21 15:36:16 +0200
commit1591ccfff5871ef581d1d2992e9c517f29aaf301 (patch)
treed1da41ba2aad3d01aafb6eeea7300bf83c6f2937
parentffe89415fec9ccfee5647dc473ae570591fa4c57 (diff)
downloadmpv-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.c23
-rw-r--r--video/out/x11_common.h1
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 {