From 5ea617a39353c5a2dd9089c76e7d2e3b9b7cd1b7 Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Tue, 25 Nov 2025 23:25:47 -0500 Subject: [PATCH] box: factor out box_center() --- include/common/box.h | 11 +++++++++++ src/common/box.c | 19 +++++++++++++++++++ src/view.c | 18 +----------------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/include/common/box.h b/include/common/box.h index 45c0fc4d..9f18b45e 100644 --- a/include/common/box.h +++ b/include/common/box.h @@ -10,6 +10,17 @@ bool box_intersects(struct wlr_box *box_a, struct wlr_box *box_b); void box_union(struct wlr_box *box_dest, struct wlr_box *box_a, struct wlr_box *box_b); +/* + * Centers a content box (width & height) within a reference box, + * limiting it (if possible) to not extend outside a bounding box. + * + * The reference box and bounding box are often the same but could be + * different (e.g. when centering a view within its parent but limiting + * to usable output area). + */ +void box_center(int width, int height, const struct wlr_box *ref, + const struct wlr_box *bound, int *x, int *y); + /* * Fits and centers a content box (width & height) within a bounding box. * The content box is downscaled if necessary (preserving aspect ratio) but diff --git a/src/common/box.c b/src/common/box.c index 2520f733..5cc91bf3 100644 --- a/src/common/box.c +++ b/src/common/box.c @@ -35,6 +35,25 @@ box_union(struct wlr_box *box_dest, struct wlr_box *box_a, struct wlr_box *box_b box_dest->height = y2 - y1; } +void +box_center(int width, int height, const struct wlr_box *ref, + const struct wlr_box *bound, int *x, int *y) +{ + *x = ref->x + (ref->width - width) / 2; + *y = ref->y + (ref->height - height) / 2; + + if (*x < bound->x) { + *x = bound->x; + } else if (*x + width > bound->x + bound->width) { + *x = bound->x + bound->width - width; + } + if (*y < bound->y) { + *y = bound->y; + } else if (*y + height > bound->y + bound->height) { + *y = bound->y + bound->height - height; + } +} + struct wlr_box box_fit_within(int width, int height, struct wlr_box *bound) { diff --git a/src/view.c b/src/view.c index cc16536f..57014b8d 100644 --- a/src/view.c +++ b/src/view.c @@ -816,23 +816,7 @@ view_compute_centered_position(struct view *view, const struct wlr_box *ref, int height = h + margin.top + margin.bottom; /* If reference box is NULL then center to usable area */ - if (!ref) { - ref = &usable; - } - *x = ref->x + (ref->width - width) / 2; - *y = ref->y + (ref->height - height) / 2; - - /* Fit the view within the usable area */ - if (*x < usable.x) { - *x = usable.x; - } else if (*x + width > usable.x + usable.width) { - *x = usable.x + usable.width - width; - } - if (*y < usable.y) { - *y = usable.y; - } else if (*y + height > usable.y + usable.height) { - *y = usable.y + usable.height - height; - } + box_center(width, height, ref ? ref : &usable, &usable, x, y); *x += margin.left; *y += margin.top;