Sanitize con and window rect dimensions

Make sure they're neither zero (prohibited by X11) nor overflown during
subtraction.
This commit is contained in:
Albert Safin 2020-02-19 00:48:31 +00:00 committed by Orestis Floros
parent 1f0c628cde
commit e6ca7ca06f
No known key found for this signature in database
GPG Key ID: 859B90B34AEC1728
3 changed files with 11 additions and 0 deletions

View File

@ -65,6 +65,7 @@ bool rect_contains(Rect rect, uint32_t x, uint32_t y);
Rect rect_add(Rect a, Rect b); Rect rect_add(Rect a, Rect b);
Rect rect_sub(Rect a, Rect b); Rect rect_sub(Rect a, Rect b);
bool rect_equals(Rect a, Rect b); bool rect_equals(Rect a, Rect b);
Rect rect_sanitize_dimensions(Rect rect);
/** /**
* Returns true if the name consists of only digits. * Returns true if the name consists of only digits.

View File

@ -64,6 +64,8 @@ void render_con(Con *con) {
inset->width -= (2 * con->border_width); inset->width -= (2 * con->border_width);
inset->height -= (2 * con->border_width); inset->height -= (2 * con->border_width);
*inset = rect_sanitize_dimensions(*inset);
/* NB: We used to respect resize increment size hints for tiling /* NB: We used to respect resize increment size hints for tiling
* windows up until commit 0db93d9 here. However, since all terminal * windows up until commit 0db93d9 here. However, since all terminal
* emulators cope with ignoring the size hints in a better way than we * emulators cope with ignoring the size hints in a better way than we
@ -121,6 +123,8 @@ void render_con(Con *con) {
render_con_dockarea(con, child, &params); render_con_dockarea(con, child, &params);
} }
child->rect = rect_sanitize_dimensions(child->rect);
DLOG("child at (%d, %d) with (%d x %d)\n", DLOG("child at (%d, %d) with (%d x %d)\n",
child->rect.x, child->rect.y, child->rect.width, child->rect.height); child->rect.x, child->rect.y, child->rect.width, child->rect.height);
x_raise_con(child); x_raise_con(child);

View File

@ -53,6 +53,12 @@ Rect rect_sub(Rect a, Rect b) {
a.height - b.height}; a.height - b.height};
} }
Rect rect_sanitize_dimensions(Rect rect) {
rect.width = (int32_t)rect.width <= 0 ? 1 : rect.width;
rect.height = (int32_t)rect.height <= 0 ? 1 : rect.height;
return rect;
}
bool rect_equals(Rect a, Rect b) { bool rect_equals(Rect a, Rect b) {
return a.x == b.x && a.y == b.y && a.width == b.width && a.height == b.height; return a.x == b.x && a.y == b.y && a.width == b.width && a.height == b.height;
} }