summaryrefslogtreecommitdiffstats
path: root/server-client.c
diff options
context:
space:
mode:
authornicm <nicm>2021-10-11 13:27:50 +0000
committernicm <nicm>2021-10-11 13:27:50 +0000
commitb8581ec80e5339be5e2c08cfec70a77f21ba06b2 (patch)
treeaa0d8f6d2e94066431aefca55f1f8b758a8e108e /server-client.c
parent759efe1b3327a7244c03ecc7b90e0e3c49712d06 (diff)
Make positions hidden by overlays range-based rather than character-based,
from Anindya Mukherjee.
Diffstat (limited to 'server-client.c')
-rw-r--r--server-client.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/server-client.c b/server-client.c
index 51988799..dc5074e7 100644
--- a/server-client.c
+++ b/server-client.c
@@ -147,6 +147,54 @@ server_client_clear_overlay(struct client *c)
server_redraw_client(c);
}
+/*
+ * Given overlay position and dimensions, return parts of the input range which
+ * are visible.
+ */
+void
+server_client_overlay_range(u_int x, u_int y, u_int sx, u_int sy, u_int px,
+ u_int py, u_int nx, struct overlay_ranges *r)
+{
+ u_int ox, onx;
+
+ /* Return up to 2 ranges. */
+ r->px[2] = 0;
+ r->nx[2] = 0;
+
+ /* Trivial case of no overlap in the y direction. */
+ if (py < y || py > y + sy - 1) {
+ r->px[0] = px;
+ r->nx[0] = nx;
+ r->px[1] = 0;
+ r->nx[1] = 0;
+ return;
+ }
+
+ /* Visible bit to the left of the popup. */
+ if (px < x) {
+ r->px[0] = px;
+ r->nx[0] = x - px;
+ if (r->nx[0] > nx)
+ r->nx[0] = nx;
+ } else {
+ r->px[0] = 0;
+ r->nx[0] = 0;
+ }
+
+ /* Visible bit to the right of the popup. */
+ ox = x + sx;
+ if (px > ox)
+ ox = px;
+ onx = px + nx;
+ if (onx > ox) {
+ r->px[1] = ox;
+ r->nx[1] = onx - ox;
+ } else {
+ r->px[1] = 0;
+ r->nx[1] = 0;
+ }
+}
+
/* Check if this client is inside this server. */
int
server_client_check_nested(struct client *c)