When removing xrandr regions, ensure clients are within the bounds of

the screen; adapted from an ancient diff from Sviatoslav Chagaev. Things
in this area will likely change, but put this in so it works now and
serves as a reminder.
This commit is contained in:
okan 2016-10-04 20:15:55 +00:00
parent 5c13775d31
commit a37606c63f
3 changed files with 25 additions and 0 deletions

View File

@ -455,6 +455,7 @@ struct geom screen_area(struct screen_ctx *, int, int, int);
void screen_init(int);
void screen_update_geometry(struct screen_ctx *);
void screen_updatestackingorder(struct screen_ctx *);
void screen_assert_clients_within(struct screen_ctx *);
void kbfunc_client_cycle(struct client_ctx *, union arg *);
void kbfunc_client_delete(struct client_ctx *, union arg *);

View File

@ -229,3 +229,26 @@ screen_apply_gap(struct screen_ctx *sc, struct geom geom)
return(geom);
}
/* Bring back clients which are beyond the screen. */
void
screen_assert_clients_within(struct screen_ctx *sc)
{
struct client_ctx *cc;
int top, left, right, bottom;
TAILQ_FOREACH(cc, &sc->clientq, entry) {
if (cc->sc != sc)
continue;
top = cc->geom.y;
left = cc->geom.x;
right = cc->geom.x + cc->geom.w + (cc->bwidth * 2) - 1;
bottom = cc->geom.y + cc->geom.h + (cc->bwidth * 2) - 1;
if ((top > sc->view.h || left > sc->view.w) ||
(bottom < 0 || right < 0)) {
cc->geom.x = sc->gap.left;
cc->geom.y = sc->gap.top;
client_move(cc);
}
}
}

View File

@ -386,6 +386,7 @@ xev_handle_randr(XEvent *ee)
if (sc->which == i) {
XRRUpdateConfiguration(ee);
screen_update_geometry(sc);
screen_assert_clients_within(sc);
}
}
}