Merge pull request #3949 from xzfc/overlap
Sanitize window dimensions and handle decoration overlap
This commit is contained in:
commit
854885ea9d
|
@ -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.
|
||||||
|
|
|
@ -361,7 +361,7 @@ int handle_button_press(xcb_button_press_event_t *event) {
|
||||||
|
|
||||||
/* Check if the click was on the decoration of a child */
|
/* Check if the click was on the decoration of a child */
|
||||||
Con *child;
|
Con *child;
|
||||||
TAILQ_FOREACH (child, &(con->nodes_head), nodes) {
|
TAILQ_FOREACH_REVERSE (child, &(con->nodes_head), nodes_head, nodes) {
|
||||||
if (!rect_contains(child->deco_rect, event->event_x, event->event_y))
|
if (!rect_contains(child->deco_rect, event->event_x, event->event_y))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -160,7 +160,7 @@ static void handle_enter_notify(xcb_enter_notify_event_t *event) {
|
||||||
layout_t layout = (enter_child ? con->parent->layout : con->layout);
|
layout_t layout = (enter_child ? con->parent->layout : con->layout);
|
||||||
if (layout == L_DEFAULT) {
|
if (layout == L_DEFAULT) {
|
||||||
Con *child;
|
Con *child;
|
||||||
TAILQ_FOREACH (child, &(con->nodes_head), nodes) {
|
TAILQ_FOREACH_REVERSE (child, &(con->nodes_head), nodes_head, nodes) {
|
||||||
if (rect_contains(child->deco_rect, event->event_x, event->event_y)) {
|
if (rect_contains(child->deco_rect, event->event_x, event->event_y)) {
|
||||||
LOG("using child %p / %s instead!\n", child, child->name);
|
LOG("using child %p / %s instead!\n", child, child->name);
|
||||||
con = child;
|
con = child;
|
||||||
|
@ -217,7 +217,7 @@ static void handle_motion_notify(xcb_motion_notify_event_t *event) {
|
||||||
|
|
||||||
/* see over which rect the user is */
|
/* see over which rect the user is */
|
||||||
Con *current;
|
Con *current;
|
||||||
TAILQ_FOREACH (current, &(con->nodes_head), nodes) {
|
TAILQ_FOREACH_REVERSE (current, &(con->nodes_head), nodes_head, nodes) {
|
||||||
if (!rect_contains(current->deco_rect, event->event_x, event->event_y))
|
if (!rect_contains(current->deco_rect, event->event_x, event->event_y))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -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, ¶ms);
|
render_con_dockarea(con, child, ¶ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue