summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Haas <git@nand.wakku.to>2015-04-29 13:51:56 +0200
committerDiogo Franco (Kovensky) <diogomfranco@gmail.com>2015-05-07 10:39:40 +0900
commit4a6fdb7361e2f03f3879268bc9e7328637fc1720 (patch)
treed14a28406998652d055437c74b6629a82d6a9d54
parentf6158c324e38ad2a0d59ec3c521b5486985289fa (diff)
downloadmpv-4a6fdb7361e2f03f3879268bc9e7328637fc1720.tar.bz2
mpv-4a6fdb7361e2f03f3879268bc9e7328637fc1720.tar.xz
x11: query ICC profile based on center of window
Right now, the default behavior is to pick the numerically lowest screen ID that overlaps the window in any way - but this means that mpv will decide to pick an ICC profile in a pretty arbitrary way even if the window only overlaps another screen by a single pixel. The new behavior is to query it based on the center of the window instead. (cherry picked from commit daf4334697145f771c5085fb183e64dc65a967bd)
-rw-r--r--common/common.c6
-rw-r--r--common/common.h1
-rw-r--r--video/out/x11_common.c4
3 files changed, 10 insertions, 1 deletions
diff --git a/common/common.c b/common/common.c
index 15be4d1b0a..d3dcb6171f 100644
--- a/common/common.c
+++ b/common/common.c
@@ -95,6 +95,12 @@ void mp_rect_union(struct mp_rect *rc, const struct mp_rect *rc2)
rc->y1 = FFMAX(rc->y1, rc2->y1);
}
+// Returns whether or not a point is contained by rc
+bool mp_rect_contains(struct mp_rect *rc, int x, int y)
+{
+ return rc->x0 <= x && x < rc->x1 && rc->y0 <= y && y < rc->y1;
+}
+
// Set rc to the intersection of rc and src.
// Return false if the result is empty.
bool mp_rect_intersection(struct mp_rect *rc, const struct mp_rect *rc2)
diff --git a/common/common.h b/common/common.h
index 2151d03cd2..cc7093a4fc 100644
--- a/common/common.h
+++ b/common/common.h
@@ -75,6 +75,7 @@ struct mp_rect {
void mp_rect_union(struct mp_rect *rc, const struct mp_rect *src);
bool mp_rect_intersection(struct mp_rect *rc, const struct mp_rect *rc2);
+bool mp_rect_contains(struct mp_rect *rc, int x, int y);
int mp_snprintf_cat(char *str, size_t size, const char *format, ...)
PRINTF_ATTRIBUTE(3, 4);
diff --git a/video/out/x11_common.c b/video/out/x11_common.c
index 36a497055a..aca492953f 100644
--- a/video/out/x11_common.c
+++ b/video/out/x11_common.c
@@ -1752,10 +1752,12 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg)
case VOCTRL_GET_ICC_PROFILE: {
if (!x11->pseudo_mapped)
return VO_NOTAVAIL;
+ int cx = x11->winrc.x0 + (x11->winrc.x1 - x11->winrc.x0)/2,
+ cy = x11->winrc.y0 + (x11->winrc.y1 - x11->winrc.y0)/2;
int screen = 0; // xinerama screen number
for (int n = 0; n < x11->num_displays; n++) {
struct xrandr_display *disp = &x11->displays[n];
- if (disp->overlaps) {
+ if (mp_rect_contains(&disp->rc, cx, cy)) {
screen = n;
break;
}