summaryrefslogtreecommitdiffstats
path: root/video/out
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 /video/out
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.
Diffstat (limited to 'video/out')
-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 {