mirror of
https://github.com/labwc/labwc.git
synced 2026-02-05 04:06:33 -05:00
box: factor out box_center()
This commit is contained in:
parent
9f5ff391cc
commit
5ea617a393
3 changed files with 31 additions and 17 deletions
|
|
@ -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,
|
void box_union(struct wlr_box *box_dest, struct wlr_box *box_a,
|
||||||
struct wlr_box *box_b);
|
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.
|
* Fits and centers a content box (width & height) within a bounding box.
|
||||||
* The content box is downscaled if necessary (preserving aspect ratio) but
|
* The content box is downscaled if necessary (preserving aspect ratio) but
|
||||||
|
|
|
||||||
|
|
@ -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;
|
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
|
struct wlr_box
|
||||||
box_fit_within(int width, int height, struct wlr_box *bound)
|
box_fit_within(int width, int height, struct wlr_box *bound)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
18
src/view.c
18
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;
|
int height = h + margin.top + margin.bottom;
|
||||||
|
|
||||||
/* If reference box is NULL then center to usable area */
|
/* If reference box is NULL then center to usable area */
|
||||||
if (!ref) {
|
box_center(width, height, ref ? ref : &usable, &usable, x, y);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
*x += margin.left;
|
*x += margin.left;
|
||||||
*y += margin.top;
|
*y += margin.top;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue