From f25c6b312b2f4176a1936436e23140c791919ceb Mon Sep 17 00:00:00 2001
From: taiyu <taiyu.len@gmail.com>
Date: Sat, 5 Sep 2015 20:48:52 -0700
Subject: gap resize

---
 sway/commands.c  | 131 +++++++++++++++++++++++++++++++++++++++++++++++++------
 sway/config.c    |   1 -
 sway/container.c |  21 ++++++---
 sway/log.c       |   5 ++-
 4 files changed, 136 insertions(+), 22 deletions(-)

(limited to 'sway')

diff --git a/sway/commands.c b/sway/commands.c
index 0fc98538..ffe7faa4 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -517,9 +517,10 @@ static bool cmd_gaps(struct sway_config *config, int argc, char **argv) {
 	if (!checkarg(argc, "gaps", EXPECTED_AT_LEAST, 1)) {
 		return false;
 	}
-
-	if (argc == 1) {
-		int amount = (int)strtol(argv[0], NULL, 10);
+	const char *amount_str = argv[0];
+	// gaps amount
+	if (argc >= 1 && isdigit(*amount_str)) {
+		int amount = (int)strtol(amount_str, NULL, 10);
 		if (errno == ERANGE || amount == 0) {
 			errno = 0;
 			return false;
@@ -530,23 +531,127 @@ static bool cmd_gaps(struct sway_config *config, int argc, char **argv) {
 		if (config->gaps_outer == 0) {
 			config->gaps_outer = amount;
 		}
-	} else if (argc == 2) {
-		int amount = (int)strtol(argv[1], NULL, 10);
+		return true;
+	}
+	// gaps inner|outer n
+	else if (argc >= 2 && isdigit((amount_str = argv[1])[0])) {
+		int amount = (int)strtol(amount_str, NULL, 10);
 		if (errno == ERANGE || amount == 0) {
 			errno = 0;
 			return false;
 		}
-		if (strcasecmp(argv[0], "inner") == 0) {
+		const char *target_str = argv[0];
+		if (strcasecmp(target_str, "inner") == 0) {
 			config->gaps_inner = amount;
-		} else if (strcasecmp(argv[0], "outer") == 0) {
+		} else if (strcasecmp(target_str, "outer") == 0) {
 			config->gaps_outer = amount;
+		}
+		return true;
+	}
+	// gaps inner|outer current|all set|plus|minus n
+	if (argc < 4) {
+		return false;
+	}
+	// gaps inner|outer ...
+	const char *inout_str = argv[0];
+	enum {INNER, OUTER} inout;
+	if (strcasecmp(inout_str, "inner") == 0) {
+		inout = INNER;
+	} else if (strcasecmp(inout_str, "outer") == 0) {
+		inout = OUTER;
+	} else {
+		return false;
+	}
+
+	// gaps ... current|all ...
+	const char *target_str = argv[1];
+	enum {CURRENT, WORKSPACE, ALL} target;
+	if (strcasecmp(target_str, "current") == 0) {
+		target = CURRENT;
+	} else if (strcasecmp(target_str, "all") == 0) {
+		target = ALL;
+	} else if (strcasecmp(target_str, "workspace") == 0){
+		if (inout == OUTER) {
+			target = CURRENT;
 		} else {
-			return false;
+			// Set gap for views in workspace
+			target = WORKSPACE;
 		}
 	} else {
 		return false;
 	}
-	arrange_windows(&root_container, -1, -1);
+
+	// gaps ... n
+	amount_str = argv[3];
+	int amount = (int)strtol(amount_str, NULL, 10);
+	if (errno == ERANGE || amount == 0) {
+		errno = 0;
+		return false;
+	}
+
+	// gaps ... set|plus|minus ...
+	const char *method_str = argv[2];
+	enum {SET, ADD} method;
+	if (strcasecmp(method_str, "set") == 0) {
+		method = SET;
+	} else if (strcasecmp(method_str, "plus") == 0) {
+		method = ADD;
+	} else if (strcasecmp(method_str, "minus") == 0) {
+		method = ADD;
+		amount *= -1;
+	} else {
+		return false;
+	}
+
+	if (target == CURRENT) {
+		swayc_t *cont;
+		if (inout == OUTER) {
+			if ((cont = swayc_active_workspace()) == NULL) {
+				return false;
+			}
+		} else {
+			if ((cont = get_focused_view(&root_container))->type != C_VIEW) {
+				return false;
+			}
+		}
+		cont->gaps = swayc_gap(cont);
+		if (method == SET) {
+			cont->gaps = amount;
+		} else if ((cont->gaps += amount) < 0) {
+			cont->gaps = 0;
+		}
+		arrange_windows(cont->parent, -1, -1);
+	} else if (inout == OUTER) {
+		//resize all workspace.
+		int i,j;
+		for (i = 0; i < root_container.children->length; ++i) {
+			swayc_t *op = root_container.children->items[i];
+			for (j = 0; j < op->children->length; ++j) {
+				swayc_t *ws = op->children->items[j];
+				if (method == SET) {
+					ws->gaps = amount;
+				} else if ((ws->gaps += amount) < 0) {
+					ws->gaps = 0;
+				}
+			}
+		}
+		arrange_windows(&root_container, -1, -1);
+	} else {
+		// Resize gaps for all views in workspace
+		swayc_t *top;
+		if (target == WORKSPACE) {
+			if ((top = swayc_active_workspace()) == NULL) {
+				return false;
+			}
+		} else {
+			top = &root_container;
+		}
+		int top_gap = top->gaps;
+		container_map(top, method == SET ? set_gaps : add_gaps, &amount);
+		top->gaps = top_gap;
+		arrange_windows(top, -1, -1);
+	}
+
 	return true;
 }
 
@@ -975,10 +1080,10 @@ bool handle_command(struct sway_config *config, char *exec) {
 		char **argv = split_directive(exec + strlen(handler->command), &argc);
 		int i;
 
-		 // Perform var subs on all parts of the command
-		 for (i = 0; i < argc; ++i) {
-			 argv[i] = do_var_replacement(config, argv[i]);
-		 }
+		// Perform var subs on all parts of the command
+		for (i = 0; i < argc; ++i) {
+			argv[i] = do_var_replacement(config, argv[i]);
+		}
 
 		exec_success = handler->handle(config, argc, argv);
 		for (i = 0; i < argc; ++i) {
diff --git a/sway/config.c b/sway/config.c
index 90f6529a..c9a9cc74 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -246,7 +246,6 @@ _continue:
 
 	if (is_active) {
 		temp_config->reloading = false;
-		container_map(&root_container, reset_gaps, NULL);
 		arrange_windows(&root_container, -1, -1);
 	}
 	config = temp_config;
diff --git a/sway/container.c b/sway/container.c
index c922a6e6..ef0e6c55 100644
--- a/sway/container.c
+++ b/sway/container.c
@@ -653,15 +653,24 @@ void update_visibility(swayc_t *container) {
 	}
 }
 
-void reset_gaps(swayc_t *view, void *data) {
-	(void) data;
+void set_gaps(swayc_t *view, void *_data) {
+	int *data = _data;
 	if (!ASSERT_NONNULL(view)) {
 		return;
 	}
-	if (view->type == C_WORKSPACE) {
-		view->gaps = -1;
+	if (view->type == C_WORKSPACE || view->type == C_VIEW) {
+		view->gaps = *data;
 	}
-	if (view->type == C_VIEW) {
-		view->gaps = -1;
+}
+
+void add_gaps(swayc_t *view, void *_data) {
+	int *data = _data;
+	if (!ASSERT_NONNULL(view)) {
+		return;
+	}
+	if (view->type == C_WORKSPACE || view->type == C_VIEW) {
+		if ((view->gaps += *data) < 0) {
+			view->gaps = 0;
+		}
 	}
 }
diff --git a/sway/log.c b/sway/log.c
index fed1239c..cf5c2092 100644
--- a/sway/log.c
+++ b/sway/log.c
@@ -159,8 +159,9 @@ static void container_log(const swayc_t *c) {
 			c->layout == L_STACKED  ? "Stacked|":
 			c->layout == L_FLOATING ? "Floating|":
 			"Unknown|");
-	fprintf(stderr, "w:%f|h:%f|", c->width, c->height);
-	fprintf(stderr, "x:%f|y:%f|", c->x, c->y);
+	fprintf(stderr, "w:%.f|h:%.f|", c->width, c->height);
+	fprintf(stderr, "x:%.f|y:%.f|", c->x, c->y);
+	fprintf(stderr, "g:%d|",c->gaps);
 	fprintf(stderr, "vis:%c|", c->visible?'t':'f');
 	fprintf(stderr, "name:%.16s|", c->name);
 	fprintf(stderr, "children:%d\n",c->children?c->children->length:0);
-- 
cgit v1.2.3


From 3e9cdfd6a3bcb696ed15968c949a6f6fd7dae394 Mon Sep 17 00:00:00 2001
From: taiyu <taiyu.len@gmail.com>
Date: Sun, 6 Sep 2015 06:52:20 -0700
Subject: man page

---
 sway.5.txt      | 14 +++++++++++---
 sway/commands.c |  2 +-
 2 files changed, 12 insertions(+), 4 deletions(-)

(limited to 'sway')

diff --git a/sway.5.txt b/sway.5.txt
index ae0bb3a3..595333c4 100644
--- a/sway.5.txt
+++ b/sway.5.txt
@@ -64,11 +64,19 @@ Commands
 	Toggles fullscreen status for the focused view.
 
 **gaps** <amount>::
-	Adds _amount_ pixels between each view, and around each output.
+	Sets _amount_ pixels as the gap between each view, and around each
+	workspace.
 
 **gaps** <inner|outer> <amount>::
-	Adds _amount_ pixels as an _inner_ or _outer_ gap, where the former affects
-	spacing between views and the latter affects the space around each output.
+	Sets _amount_ pixels as the _inner_ or _outer_ gap, where the former affects
+	spacing between views and the latter affects the space around each
+	workspace.
+
+**gaps** <inner|outer> <all|workspace|current> <set|plus|minus> <amount>::
+	Changes the gaps for the _inner_ or _outer_ gap. _all_ changes the gaps for
+	all views or workspace, _workspace_ changes gaps for all views in current
+	workspace, or current workspace, and _current_ changes gaps for the current
+	view or workspace.
 
 **kill**::
 	Closes the currently focused view.
diff --git a/sway/commands.c b/sway/commands.c
index ffe7faa4..5c782e99 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -570,7 +570,7 @@ static bool cmd_gaps(struct sway_config *config, int argc, char **argv) {
 		target = CURRENT;
 	} else if (strcasecmp(target_str, "all") == 0) {
 		target = ALL;
-	} else if (strcasecmp(target_str, "workspace") == 0){
+	} else if (strcasecmp(target_str, "workspace") == 0) {
 		if (inout == OUTER) {
 			target = CURRENT;
 		} else {
-- 
cgit v1.2.3