diff options
Diffstat (limited to 'sway/tree')
| -rw-r--r-- | sway/tree/container.c | 34 | ||||
| -rw-r--r-- | sway/tree/view.c | 14 | ||||
| -rw-r--r-- | sway/tree/workspace.c | 65 | 
3 files changed, 80 insertions, 33 deletions
diff --git a/sway/tree/container.c b/sway/tree/container.c index 458ed7ff..3740cb53 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -1009,19 +1009,25 @@ void container_discover_outputs(struct sway_container *con) {  }  void container_remove_gaps(struct sway_container *c) { -	if (c->current_gaps == 0) { +	if (c->current_gaps.top == 0 && c->current_gaps.right == 0 && +			c->current_gaps.bottom == 0 && c->current_gaps.left == 0) {  		return;  	} -	c->width += c->current_gaps * 2; -	c->height += c->current_gaps * 2; -	c->x -= c->current_gaps; -	c->y -= c->current_gaps; -	c->current_gaps = 0; +	c->width += c->current_gaps.left + c->current_gaps.right; +	c->height += c->current_gaps.top + c->current_gaps.bottom; +	c->x -= c->current_gaps.left; +	c->y -= c->current_gaps.top; + +	c->current_gaps.top = 0; +	c->current_gaps.right = 0; +	c->current_gaps.bottom = 0; +	c->current_gaps.left = 0;  }  void container_add_gaps(struct sway_container *c) { -	if (c->current_gaps > 0) { +	if (c->current_gaps.top > 0 || c->current_gaps.right > 0 || +			c->current_gaps.bottom > 0 || c->current_gaps.left > 0) {  		return;  	}  	// Linear containers don't have gaps because it'd create double gaps @@ -1054,11 +1060,15 @@ void container_add_gaps(struct sway_container *c) {  	struct sway_workspace *ws = c->workspace; -	c->current_gaps = ws->gaps_inner; -	c->x += c->current_gaps; -	c->y += c->current_gaps; -	c->width -= 2 * c->current_gaps; -	c->height -= 2 * c->current_gaps; +	c->current_gaps.top = c->y == ws->y ? ws->gaps_inner : 0; +	c->current_gaps.right = ws->gaps_inner; +	c->current_gaps.bottom = ws->gaps_inner; +	c->current_gaps.left = c->x == ws->x ? ws->gaps_inner : 0; + +	c->x += c->current_gaps.left; +	c->y += c->current_gaps.top; +	c->width -= c->current_gaps.left + c->current_gaps.right; +	c->height -= c->current_gaps.top + c->current_gaps.bottom;  }  enum sway_container_layout container_parent_layout(struct sway_container *con) { diff --git a/sway/tree/view.c b/sway/tree/view.c index 1aa59e68..21b32649 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -185,12 +185,14 @@ bool view_is_only_visible(struct sway_view *view) {  static bool gaps_to_edge(struct sway_view *view) {  	struct sway_container *con = view->container;  	while (con) { -		if (con->current_gaps > 0) { +		if (con->current_gaps.top > 0 || con->current_gaps.right > 0 || +				con->current_gaps.bottom > 0 || con->current_gaps.left > 0) {  			return true;  		}  		con = con->parent;  	} -	return view->container->workspace->current_gaps > 0; +	struct side_gaps gaps = view->container->workspace->current_gaps; +	return gaps.top > 0 || gaps.right > 0 || gaps.bottom > 0 || gaps.left > 0;  }  void view_autoconfigure(struct sway_view *view) { @@ -222,15 +224,15 @@ void view_autoconfigure(struct sway_view *view) {  	if (config->hide_edge_borders == E_BOTH  			|| config->hide_edge_borders == E_VERTICAL  			|| (smart && !other_views && no_gaps)) { -		con->border_left = con->x - con->current_gaps != ws->x; -		int right_x = con->x + con->width + con->current_gaps; +		con->border_left = con->x - con->current_gaps.left != ws->x; +		int right_x = con->x + con->width + con->current_gaps.right;  		con->border_right = right_x != ws->x + ws->width;  	}  	if (config->hide_edge_borders == E_BOTH  			|| config->hide_edge_borders == E_HORIZONTAL  			|| (smart && !other_views && no_gaps)) { -		con->border_top = con->y - con->current_gaps != ws->y; -		int bottom_y = con->y + con->height + con->current_gaps; +		con->border_top = con->y - con->current_gaps.top != ws->y; +		int bottom_y = con->y + con->height + con->current_gaps.bottom;  		con->border_bottom = bottom_y != ws->y + ws->height;  	} diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 05cda5c0..93ce50de 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -49,6 +49,21 @@ struct sway_output *workspace_get_initial_output(const char *name) {  	return focus->output;  } +static void prevent_invalid_outer_gaps(struct sway_workspace *ws) { +	if (ws->gaps_outer.top < -ws->gaps_inner) { +		ws->gaps_outer.top = -ws->gaps_inner; +	} +	if (ws->gaps_outer.right < -ws->gaps_inner) { +		ws->gaps_outer.right = -ws->gaps_inner; +	} +	if (ws->gaps_outer.bottom < -ws->gaps_inner) { +		ws->gaps_outer.bottom = -ws->gaps_inner; +	} +	if (ws->gaps_outer.left < -ws->gaps_inner) { +		ws->gaps_outer.left = -ws->gaps_inner; +	} +} +  struct sway_workspace *workspace_create(struct sway_output *output,  		const char *name) {  	if (output == NULL) { @@ -77,12 +92,24 @@ struct sway_workspace *workspace_create(struct sway_output *output,  	if (name) {  		struct workspace_config *wsc = workspace_find_config(name);  		if (wsc) { -			if (wsc->gaps_outer != INT_MIN) { -				ws->gaps_outer = wsc->gaps_outer; +			if (wsc->gaps_outer.top != INT_MIN) { +				ws->gaps_outer.top = wsc->gaps_outer.top; +			} +			if (wsc->gaps_outer.right != INT_MIN) { +				ws->gaps_outer.right = wsc->gaps_outer.right; +			} +			if (wsc->gaps_outer.bottom != INT_MIN) { +				ws->gaps_outer.bottom = wsc->gaps_outer.bottom; +			} +			if (wsc->gaps_outer.left != INT_MIN) { +				ws->gaps_outer.left = wsc->gaps_outer.left;  			}  			if (wsc->gaps_inner != INT_MIN) {  				ws->gaps_inner = wsc->gaps_inner;  			} +			// Since default outer gaps can be smaller than the negation of +			// workspace specific inner gaps, check outer gaps again +			prevent_invalid_outer_gaps(ws);  		}  	} @@ -615,19 +642,25 @@ void workspace_insert_tiling(struct sway_workspace *workspace,  }  void workspace_remove_gaps(struct sway_workspace *ws) { -	if (ws->current_gaps == 0) { +	if (ws->current_gaps.top == 0 && ws->current_gaps.right == 0 && +			ws->current_gaps.bottom == 0 && ws->current_gaps.left == 0) {  		return;  	} -	ws->width += ws->current_gaps * 2; -	ws->height += ws->current_gaps * 2; -	ws->x -= ws->current_gaps; -	ws->y -= ws->current_gaps; -	ws->current_gaps = 0; +	ws->width += ws->current_gaps.left + ws->current_gaps.right; +	ws->height += ws->current_gaps.top + ws->current_gaps.bottom; +	ws->x -= ws->current_gaps.left; +	ws->y -= ws->current_gaps.top; + +	ws->current_gaps.top = 0; +	ws->current_gaps.right = 0; +	ws->current_gaps.bottom = 0; +	ws->current_gaps.left = 0;  }  void workspace_add_gaps(struct sway_workspace *ws) { -	if (ws->current_gaps > 0) { +	if (ws->current_gaps.top > 0 || ws->current_gaps.right > 0 || +			ws->current_gaps.bottom > 0 || ws->current_gaps.left > 0) {  		return;  	}  	if (config->smart_gaps) { @@ -643,18 +676,20 @@ void workspace_add_gaps(struct sway_workspace *ws) {  	}  	ws->current_gaps = ws->gaps_outer; -  	if (ws->layout == L_TABBED || ws->layout == L_STACKED) {  		// We have to add inner gaps for this, because children of tabbed and  		// stacked containers don't apply their own gaps - they assume the  		// tabbed/stacked container is using gaps. -		ws->current_gaps += ws->gaps_inner; +		ws->current_gaps.top += ws->gaps_inner; +		ws->current_gaps.right += ws->gaps_inner; +		ws->current_gaps.bottom += ws->gaps_inner; +		ws->current_gaps.left += ws->gaps_inner;  	} -	ws->x += ws->current_gaps; -	ws->y += ws->current_gaps; -	ws->width -= 2 * ws->current_gaps; -	ws->height -= 2 * ws->current_gaps; +	ws->x += ws->current_gaps.left; +	ws->y += ws->current_gaps.top; +	ws->width -= ws->current_gaps.left + ws->current_gaps.right; +	ws->height -= ws->current_gaps.top + ws->current_gaps.bottom;  }  struct sway_container *workspace_split(struct sway_workspace *workspace,  | 
