diff options
| author | Zandr Martin <zandrmartin@gmail.com> | 2016-09-01 21:39:08 -0500 | 
|---|---|---|
| committer | Zandr Martin <zandrmartin@gmail.com> | 2016-09-01 21:39:08 -0500 | 
| commit | b374c35758777f98e5ddbe4b0dc43bd7c80f36d7 (patch) | |
| tree | 04bb4cfc3da7d2e0de7fbc38db42f65c66d2df4c /sway/commands/layout.c | |
| parent | 050704ab23b698b00ee2ded8dbd4df9afceb8844 (diff) | |
| download | sway-b374c35758777f98e5ddbe4b0dc43bd7c80f36d7.tar.xz | |
refactor commands.c
Diffstat (limited to 'sway/commands/layout.c')
| -rw-r--r-- | sway/commands/layout.c | 66 | 
1 files changed, 66 insertions, 0 deletions
| diff --git a/sway/commands/layout.c b/sway/commands/layout.c new file mode 100644 index 00000000..c4f5d2b5 --- /dev/null +++ b/sway/commands/layout.c @@ -0,0 +1,66 @@ +#include <string.h> +#include "commands.h" +#include "container.h" +#include "layout.h" + +struct cmd_results *cmd_layout(int argc, char **argv) { +	struct cmd_results *error = NULL; +	if (config->reading) return cmd_results_new(CMD_FAILURE, "layout", "Can't be used in config file."); +	if (!config->active) return cmd_results_new(CMD_FAILURE, "layout", "Can only be used when sway is running."); +	if ((error = checkarg(argc, "layout", EXPECTED_MORE_THAN, 0))) { +		return error; +	} +	swayc_t *parent = get_focused_container(&root_container); +	if (parent->is_floating) { +		return cmd_results_new(CMD_FAILURE, "layout", "Unable to change layout of floating windows"); +	} + +	while (parent->type == C_VIEW) { +		parent = parent->parent; +	} + +	enum swayc_layouts old_layout = parent->layout; + +	if (strcasecmp(argv[0], "default") == 0) { +		parent->layout = parent->prev_layout; +		if (parent->layout == L_NONE) { +			swayc_t *output = swayc_parent_by_type(parent, C_OUTPUT); +			parent->layout = default_layout(output); +		} +	} else { +		if (parent->layout != L_TABBED && parent->layout != L_STACKED) { +			parent->prev_layout = parent->layout; +		} + +		if (strcasecmp(argv[0], "tabbed") == 0) { +			if (parent->type != C_CONTAINER && !swayc_is_empty_workspace(parent)){ +				parent = new_container(parent, L_TABBED); +			} + +			parent->layout = L_TABBED; +		} else if (strcasecmp(argv[0], "stacking") == 0) { +			if (parent->type != C_CONTAINER && !swayc_is_empty_workspace(parent)) { +				parent = new_container(parent, L_STACKED); +			} + +			parent->layout = L_STACKED; +		} else if (strcasecmp(argv[0], "splith") == 0) { +			parent->layout = L_HORIZ; +		} else if (strcasecmp(argv[0], "splitv") == 0) { +			parent->layout = L_VERT; +		} else if (strcasecmp(argv[0], "toggle") == 0 && argc == 2 && strcasecmp(argv[1], "split") == 0) { +			if (parent->layout == L_VERT) { +				parent->layout = L_HORIZ; +			} else { +				parent->layout = L_VERT; +			} +		} +	} + +	update_layout_geometry(parent, old_layout); +	update_geometry(parent); + +	arrange_windows(parent, parent->width, parent->height); + +	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} | 
