From 96ab21b2766096bdb42d79a0169d42b9ff00e2fb Mon Sep 17 00:00:00 2001
From: Luminarys <kizunanohikari@gmail.com>
Date: Fri, 21 Aug 2015 00:49:47 -0500
Subject: [PATCH] Fixes to resizing and added in resize lock once boundaries
 are exceeded

---
 include/input_state.h |  1 +
 sway/handlers.c       | 45 +++++++++++++++++++++++++++++++------------
 sway/log.c            |  1 +
 3 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/include/input_state.h b/include/input_state.h
index 711ad633..7119c68b 100644
--- a/include/input_state.h
+++ b/include/input_state.h
@@ -36,6 +36,7 @@ extern struct pointer_state {
 	} floating;
 	struct pointer_tiling {
 		bool resize;
+		swayc_t *init_view;
 	} tiling;
 	struct pointer_lock {
 		bool left;
diff --git a/sway/handlers.c b/sway/handlers.c
index a71328e3..571dd2a6 100644
--- a/sway/handlers.c
+++ b/sway/handlers.c
@@ -348,6 +348,9 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
 	static wlc_handle prev_handle = 0;
 	mouse_origin = *origin;
 	bool changed_floating = false;
+	bool changed_tiling = false;
+	int min_sane_w = 100;
+	int min_sane_h = 60;
 	if (!active_workspace) {
 		return false;
 	}
@@ -366,8 +369,6 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
 		if (view->is_floating) {
 			int dx = mouse_origin.x - prev_pos.x;
 			int dy = mouse_origin.y - prev_pos.y;
-			int min_sane_w = 100;
-			int min_sane_h = 60;
 
 			// Move and resize the view based on the dx/dy and mouse position
 			int midway_x = view->x + view->width/2;
@@ -429,7 +430,11 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
 			}
 		}	
 	} else if (pointer_state.tiling.resize && view) {
-		if (!view->is_floating) {
+		if (view != pointer_state.tiling.init_view) {
+			// Quit out of the resize
+			pointer_state.tiling.init_view = NULL;
+		}
+		if (!view->is_floating && view == pointer_state.tiling.init_view) {
 			// Handle layout resizes -- Find the biggest parent container then apply resizes to that
 			// and its bordering siblings
 			swayc_t *parent = view;
@@ -450,8 +455,11 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
 					swayc_t *sibling = get_swayc_in_direction(parent, MOVE_DOWN);
 					if (sibling) {
 						sway_log(L_DEBUG, "Found sibling at: %p", sibling);
-						recursive_resize(parent, dy, WLC_RESIZE_EDGE_BOTTOM);
-						recursive_resize(sibling, -1 * dy, WLC_RESIZE_EDGE_TOP);
+						if ((parent->height > min_sane_h || dy > 0) && (sibling->height > min_sane_h || dy < 0)) {
+							recursive_resize(parent, dy, WLC_RESIZE_EDGE_BOTTOM);
+							recursive_resize(sibling, -1 * dy, WLC_RESIZE_EDGE_TOP);
+							changed_tiling = true;
+						}
 					}
 				}
 			} else {
@@ -467,8 +475,11 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
 					swayc_t *sibling = get_swayc_in_direction(parent, MOVE_UP);
 					if (sibling) {
 						sway_log(L_DEBUG, "Found sibling at: %p", sibling);
-						recursive_resize(parent, -1 * dy, WLC_RESIZE_EDGE_TOP);
-						recursive_resize(sibling, dy, WLC_RESIZE_EDGE_BOTTOM);
+						if ((parent->height > min_sane_h || dy < 0) && (sibling->height > min_sane_h || dy > 0)) {
+							recursive_resize(parent, -1 * dy, WLC_RESIZE_EDGE_TOP);
+							recursive_resize(sibling, dy, WLC_RESIZE_EDGE_BOTTOM);
+							changed_tiling = true;
+						}
 					}
 				}
 			}
@@ -483,14 +494,16 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
 						break;
 					}
 				}
-				sway_log(L_DEBUG, "Left is locked, found biggest valid parent at: %p", parent);
 				if (parent->parent->children->length > 1 && parent->parent->layout == L_HORIZ) {
 					sway_log(L_DEBUG, "Left is locked, found biggest valid parent at: %p", parent);
 					swayc_t *sibling = get_swayc_in_direction(parent, MOVE_RIGHT);
 					if (sibling) {
 						sway_log(L_DEBUG, "Found sibling at: %p", sibling);
-						recursive_resize(parent, dx, WLC_RESIZE_EDGE_RIGHT);
-						recursive_resize(sibling, -1 * dx, WLC_RESIZE_EDGE_LEFT);
+						if ((parent->width > min_sane_w || dx > 0) && (sibling->width > min_sane_w || dx < 0)) {
+							recursive_resize(parent, dx, WLC_RESIZE_EDGE_RIGHT);
+							recursive_resize(sibling, -1 * dx, WLC_RESIZE_EDGE_LEFT);
+							changed_tiling = true;
+						}
 					}
 				}
 			} else {
@@ -506,8 +519,11 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
 					swayc_t *sibling = get_swayc_in_direction(parent, MOVE_LEFT);
 					if (sibling) {
 						sway_log(L_DEBUG, "Found sibling at: %p", sibling);
-						recursive_resize(parent, -1 * dx, WLC_RESIZE_EDGE_LEFT);
-						recursive_resize(sibling, dx, WLC_RESIZE_EDGE_RIGHT);
+						if ((parent->width > min_sane_w || dx < 0) && (sibling->width > min_sane_w || dx > 0)) {
+							recursive_resize(parent, -1 * dx, WLC_RESIZE_EDGE_LEFT);
+							recursive_resize(sibling, dx, WLC_RESIZE_EDGE_RIGHT);
+							changed_tiling = true;
+						}
 					}
 				}
 			}
@@ -538,6 +554,9 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
 		wlc_view_set_geometry(view->handle, edge, &geometry);
 		return true;
 	}
+	if (changed_tiling) {
+		return true;
+	}
 	return false;
 }
 
@@ -587,6 +606,7 @@ static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct w
 			return (pointer_state.floating.drag || pointer_state.floating.resize);
 		} else {
 			pointer_state.tiling.resize = pointer_state.r_held;
+			pointer_state.tiling.init_view = pointer;
 		}
 		return (pointer && pointer != focused);
 	} else {
@@ -599,6 +619,7 @@ static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct w
 			pointer_state.r_held = false;
 			pointer_state.floating.resize = false;
 			pointer_state.tiling.resize = false;
+			pointer_state.tiling.init_view = NULL;
 			pointer_state.lock = (struct pointer_lock){false ,false ,false ,false};
 		}
 	}
diff --git a/sway/log.c b/sway/log.c
index eda0c88e..21aa9b8e 100644
--- a/sway/log.c
+++ b/sway/log.c
@@ -149,6 +149,7 @@ static void container_log(const swayc_t *c) {
 	fprintf(stderr, "children:%d\n",c->children?c->children->length:0);
 }
 void layout_log(const swayc_t *c, int depth) {
+	if (L_DEBUG > v) return;
 	int i, d;
 	int e = c->children ? c->children->length : 0;
 	container_log(c);