diff options
author | Luminarys <kizunanohikari@gmail.com> | 2015-08-21 21:22:29 -0500 |
---|---|---|
committer | Luminarys <kizunanohikari@gmail.com> | 2015-08-21 21:22:29 -0500 |
commit | ad1ca31dd5a36736176002ec7b7c9548cd63113d (patch) | |
tree | 31eb7742d4f2b5ede4cdf408d19e721c8b2fca43 | |
parent | e067913fb8a3182314f965bea24a2011dbc06f07 (diff) |
Altered resize command to prevent resizing past min h/w
-rw-r--r-- | sway/commands.c | 147 | ||||
-rw-r--r-- | sway/handlers.c | 2 |
2 files changed, 117 insertions, 32 deletions
diff --git a/sway/commands.c b/sway/commands.c index ef76c169..36299c8d 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -497,43 +497,85 @@ static bool cmd_resize(struct sway_config *config, int argc, char **argv) { } sway_log(L_DEBUG, "Found the proper parent: %p. It has %d l conts, and %d r conts", parent->parent, lnumber, rnumber); //TODO: Ensure rounding is done in such a way that there are NO pixel leaks + bool valid = true; for (i = 0; i < parent->parent->children->length; i++) { - bool valid = true; sibling = parent->parent->children->items[i]; if (sibling->x != focused->x) { if (sibling->x < parent->x) { double pixels = -1 * amount; pixels /= lnumber; if (rnumber) { - recursive_resize(sibling, pixels/2, WLC_RESIZE_EDGE_RIGHT); + if ((sibling->width + pixels/2) < min_sane_w) { + valid = false; + break; + } } else { - recursive_resize(sibling, pixels, WLC_RESIZE_EDGE_RIGHT); + if ((sibling->width + pixels) < min_sane_w) { + valid = false; + break; + } } } else if (sibling->x > parent->x) { double pixels = -1 * amount; pixels /= rnumber; if (lnumber) { - recursive_resize(sibling, pixels/2, WLC_RESIZE_EDGE_LEFT); + if ((sibling->width + pixels/2) < min_sane_w) { + valid = false; + break; + } } else { - recursive_resize(sibling, pixels, WLC_RESIZE_EDGE_LEFT); + if ((sibling->width + pixels) < min_sane_w) { + valid = false; + break; + } } } } else { - if (rnumber != 0 && lnumber != 0) { - double pixels = amount; - pixels /= 2; - recursive_resize(parent, pixels, WLC_RESIZE_EDGE_LEFT); - recursive_resize(parent, pixels, WLC_RESIZE_EDGE_RIGHT); - } else if (rnumber) { - recursive_resize(parent, amount, WLC_RESIZE_EDGE_RIGHT); - } else if (lnumber) { - recursive_resize(parent, amount, WLC_RESIZE_EDGE_LEFT); + double pixels = amount; + if (parent->width + pixels < min_sane_w) { + valid = false; + break; } } } - // Recursive resize does not handle positions, let arrange_windows - // take care of that. - arrange_windows(swayc_active_workspace(), -1, -1); + if (valid) { + for (i = 0; i < parent->parent->children->length; i++) { + sibling = parent->parent->children->items[i]; + if (sibling->x != focused->x) { + if (sibling->x < parent->x) { + double pixels = -1 * amount; + pixels /= lnumber; + if (rnumber) { + recursive_resize(sibling, pixels/2, WLC_RESIZE_EDGE_RIGHT); + } else { + recursive_resize(sibling, pixels, WLC_RESIZE_EDGE_RIGHT); + } + } else if (sibling->x > parent->x) { + double pixels = -1 * amount; + pixels /= rnumber; + if (lnumber) { + recursive_resize(sibling, pixels/2, WLC_RESIZE_EDGE_LEFT); + } else { + recursive_resize(sibling, pixels, WLC_RESIZE_EDGE_LEFT); + } + } + } else { + if (rnumber != 0 && lnumber != 0) { + double pixels = amount; + pixels /= 2; + recursive_resize(parent, pixels, WLC_RESIZE_EDGE_LEFT); + recursive_resize(parent, pixels, WLC_RESIZE_EDGE_RIGHT); + } else if (rnumber) { + recursive_resize(parent, amount, WLC_RESIZE_EDGE_RIGHT); + } else if (lnumber) { + recursive_resize(parent, amount, WLC_RESIZE_EDGE_LEFT); + } + } + } + // Recursive resize does not handle positions, let arrange_windows + // take care of that. + arrange_windows(swayc_active_workspace(), -1, -1); + } return true; } else if (strcmp(argv[1], "height") == 0) { int tnumber = 0; @@ -561,6 +603,7 @@ static bool cmd_resize(struct sway_config *config, int argc, char **argv) { } sway_log(L_DEBUG, "Found the proper parent: %p. It has %d b conts, and %d t conts", parent->parent, bnumber, tnumber); //TODO: Ensure rounding is done in such a way that there are NO pixel leaks + bool valid = true; for (i = 0; i < parent->parent->children->length; i++) { sibling = parent->parent->children->items[i]; if (sibling->y != focused->y) { @@ -568,32 +611,74 @@ static bool cmd_resize(struct sway_config *config, int argc, char **argv) { double pixels = -1 * amount; pixels /= bnumber; if (tnumber) { - recursive_resize(sibling, pixels/2, WLC_RESIZE_EDGE_BOTTOM); + if ((sibling->height + pixels/2) < min_sane_h) { + valid = false; + break; + } } else { - recursive_resize(sibling, pixels, WLC_RESIZE_EDGE_BOTTOM); + if ((sibling->height + pixels) < min_sane_h) { + valid = false; + break; + } } - } else if (sibling->x > parent->x) { + } else if (sibling->y > parent->y) { double pixels = -1 * amount; pixels /= tnumber; if (bnumber) { - recursive_resize(sibling, pixels/2, WLC_RESIZE_EDGE_TOP); + if ((sibling->height + pixels/2) < min_sane_h) { + valid = false; + break; + } } else { - recursive_resize(sibling, pixels, WLC_RESIZE_EDGE_TOP); + if ((sibling->height + pixels) < min_sane_h) { + valid = false; + break; + } } } } else { - if (bnumber != 0 && tnumber != 0) { - double pixels = amount/2; - recursive_resize(parent, pixels, WLC_RESIZE_EDGE_TOP); - recursive_resize(parent, pixels, WLC_RESIZE_EDGE_BOTTOM); - } else if (tnumber) { - recursive_resize(parent, amount, WLC_RESIZE_EDGE_TOP); - } else if (bnumber) { - recursive_resize(parent, amount, WLC_RESIZE_EDGE_BOTTOM); + double pixels = amount; + if (parent->height + pixels < min_sane_h) { + valid = false; + break; + } + } + } + if (valid) { + for (i = 0; i < parent->parent->children->length; i++) { + sibling = parent->parent->children->items[i]; + if (sibling->y != focused->y) { + if (sibling->y < parent->y) { + double pixels = -1 * amount; + pixels /= bnumber; + if (tnumber) { + recursive_resize(sibling, pixels/2, WLC_RESIZE_EDGE_BOTTOM); + } else { + recursive_resize(sibling, pixels, WLC_RESIZE_EDGE_BOTTOM); + } + } else if (sibling->x > parent->x) { + double pixels = -1 * amount; + pixels /= tnumber; + if (bnumber) { + recursive_resize(sibling, pixels/2, WLC_RESIZE_EDGE_TOP); + } else { + recursive_resize(sibling, pixels, WLC_RESIZE_EDGE_TOP); + } + } + } else { + if (bnumber != 0 && tnumber != 0) { + double pixels = amount/2; + recursive_resize(parent, pixels, WLC_RESIZE_EDGE_TOP); + recursive_resize(parent, pixels, WLC_RESIZE_EDGE_BOTTOM); + } else if (tnumber) { + recursive_resize(parent, amount, WLC_RESIZE_EDGE_TOP); + } else if (bnumber) { + recursive_resize(parent, amount, WLC_RESIZE_EDGE_BOTTOM); + } } } + arrange_windows(swayc_active_workspace(), -1, -1); } - arrange_windows(swayc_active_workspace(), -1, -1); return true; } return true; diff --git a/sway/handlers.c b/sway/handlers.c index 3756b628..d8f9e987 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -435,7 +435,7 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct } else if (get_swayc_in_direction(pointer_state.tiling.init_view, MOVE_UP) == view) { pointer_state.tiling.lock_pos.y = pointer_state.tiling.init_view->y + 20; pointer_state.lock.temp_up = true; - } else if (get_swayc_in_direction(pointer_state.tiling.init_view, MOVE_UP) == view) { + } else if (get_swayc_in_direction(pointer_state.tiling.init_view, MOVE_DOWN) == view) { pointer_state.tiling.lock_pos.y = pointer_state.tiling.init_view->y + pointer_state.tiling.init_view->height - 20; pointer_state.lock.temp_down = true; } |