diff options
| author | Ryan Dwyer <RyanDwyer@users.noreply.github.com> | 2018-05-30 11:53:20 +1000 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-05-30 11:53:20 +1000 | 
| commit | 536773e3a1dab6662d371f0f7ee462a4802ae6df (patch) | |
| tree | 62668d1e573c2b7a898b39abf8c8f6cacf2d4367 | |
| parent | 86b8d036d41f20d6c5e4bf4cb686e917701c72b6 (diff) | |
| parent | 64225b1137f1dccb196de404105aeb45616ea988 (diff) | |
| download | sway-536773e3a1dab6662d371f0f7ee462a4802ae6df.tar.xz | |
Merge pull request #2065 from RedSoxFan/fix-2018
Fix #2018 - Moving containers out of tabs/stacks
| -rw-r--r-- | sway/ipc-json.c | 5 | ||||
| -rw-r--r-- | sway/tree/layout.c | 44 | 
2 files changed, 43 insertions, 6 deletions
diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 0233a36e..03582950 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -160,11 +160,8 @@ static void ipc_json_describe_view(struct sway_container *c, json_object *object  	json_object_object_add(object, "type", json_object_new_string("con"));  	if (c->parent) { -		enum sway_container_layout layout = (c->parent->type == C_CONTAINER) ? -			c->parent->layout : c->layout; -  		json_object_object_add(object, "layout", -			json_object_new_string(ipc_json_layout_description(layout))); +			json_object_new_string(ipc_json_layout_description(c->layout)));  	}  } diff --git a/sway/tree/layout.c b/sway/tree/layout.c index 1507eba9..9594b75a 100644 --- a/sway/tree/layout.c +++ b/sway/tree/layout.c @@ -309,6 +309,31 @@ static void workspace_rejigger(struct sway_container *ws,  	arrange_workspace(ws);  } +static void move_out_of_tabs_stacks(struct sway_container *container, +		struct sway_container *current, enum movement_direction move_dir, +		int offs) { +	wlr_log(L_DEBUG, "Moving out of tab/stack into a split"); +	bool is_workspace = current->parent->type == C_WORKSPACE; +	struct sway_container *old_parent = current->parent->parent; +	struct sway_container *new_parent = container_split(current->parent, +		move_dir == MOVE_LEFT || move_dir == MOVE_RIGHT ? L_HORIZ : L_VERT); +	if (is_workspace) { +		container_insert_child(new_parent->parent, container, offs < 0 ? 0 : 1); +	} else { +		container_insert_child(new_parent, container, offs < 0 ? 0 : 1); +		container_reap_empty_recursive(new_parent->parent); +		container_flatten(new_parent->parent); +	} +	wl_signal_emit(&container->events.reparent, old_parent); +	container_create_notify(new_parent); +	if (is_workspace) { +		arrange_workspace(new_parent->parent); +	} else { +		arrange_children_of(new_parent); +	} +	container_notify_subtree_changed(new_parent); +} +  void container_move(struct sway_container *container,  		enum movement_direction move_dir, int move_amt) {  	if (!sway_assert( @@ -390,6 +415,10 @@ void container_move(struct sway_container *container,  					arrange_workspace(current);  				}  				return; +			} else if (current->layout == L_TABBED +					|| current->layout == L_STACKED) { +				wlr_log(L_DEBUG, "Rejiggering out of tabs/stacks"); +				workspace_rejigger(current, container, move_dir);  			} else {  				wlr_log(L_DEBUG, "Selecting output");  				current = current->parent; @@ -401,8 +430,15 @@ void container_move(struct sway_container *container,  				if ((index == parent->children->length - 1 && offs > 0)  						|| (index == 0 && offs < 0)) {  					if (current->parent == container->parent) { -						wlr_log(L_DEBUG, "Hit limit, selecting parent"); -						current = current->parent; +						if (parent->layout == L_TABBED +								|| parent->layout == L_STACKED) { +							move_out_of_tabs_stacks(container, current, +									move_dir, offs); +							return; +						} else { +							wlr_log(L_DEBUG, "Hit limit, selecting parent"); +							current = current->parent; +						}  					} else {  						wlr_log(L_DEBUG, "Hit limit, "  								"promoting descendant to sibling"); @@ -419,6 +455,10 @@ void container_move(struct sway_container *container,  					sibling = parent->children->items[index + offs];  					wlr_log(L_DEBUG, "Selecting sibling id:%zd", sibling->id);  				} +			} else if (parent->layout == L_TABBED +					|| parent->layout == L_STACKED) { +				move_out_of_tabs_stacks(container, current, move_dir, offs); +				return;  			} else {  				wlr_log(L_DEBUG, "Moving up to find a parallel container");  				current = current->parent;  | 
