diff options
author | Niklas Haas <git@nand.wakku.to> | 2015-04-29 13:51:56 +0200 |
---|---|---|
committer | Niklas Haas <git@nand.wakku.to> | 2015-04-29 14:01:27 +0200 |
commit | daf4334697145f771c5085fb183e64dc65a967bd (patch) | |
tree | 8d172e12f970b83d19c7c6d7b58ee36c6386be81 | |
parent | 0b72f5e5ad6f9fca8849fcfb5ced8c03e21ce82a (diff) | |
download | mpv-daf4334697145f771c5085fb183e64dc65a967bd.tar.bz2 mpv-daf4334697145f771c5085fb183e64dc65a967bd.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.
-rw-r--r-- | common/common.c | 6 | ||||
-rw-r--r-- | common/common.h | 1 | ||||
-rw-r--r-- | video/out/x11_common.c | 4 |
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; } |