diff options
Diffstat (limited to 'sway')
| -rw-r--r-- | sway/container.c | 13 | ||||
| -rw-r--r-- | sway/focus.c | 2 | ||||
| -rw-r--r-- | sway/handlers.c | 6 | ||||
| -rw-r--r-- | sway/layout.c | 9 | 
4 files changed, 18 insertions, 12 deletions
diff --git a/sway/container.c b/sway/container.c index 67132a48..2b9f7554 100644 --- a/sway/container.c +++ b/sway/container.c @@ -27,10 +27,7 @@ static void free_swayc(swayc_t *c) {  		list_free(c->children);  	}  	if (c->parent) { -		if (c->parent->focused == c) { -			c->parent->focused = NULL; -		} -		remove_child(c->parent, c); +		remove_child(c);  	}  	if (c->name) {  		free(c->name); @@ -118,6 +115,11 @@ swayc_t *new_container(swayc_t *child, enum swayc_layouts layout) {  		//reorder focus  		cont->focused = workspace->focused;  		workspace->focused = cont; +		//set all children focu to container +		int i; +		for (i = 0; i < workspace->children->length; ++i) { +			((swayc_t *)workspace->children->items[i])->parent = cont; +		}  		//Swap children  		list_t  *tmp_list  = workspace->children;  		workspace->children = cont->children; @@ -204,7 +206,7 @@ swayc_t *destroy_output(swayc_t *output) {  	if (output->children->length == 0) {  		//TODO move workspaces to other outputs  	} -	sway_log(L_DEBUG, "OUTPUT: Destroying output '%u'", (unsigned int)output->handle); +	sway_log(L_DEBUG, "OUTPUT: Destroying output '%lu'", output->handle);  	free_swayc(output);  	return &root_container;  } @@ -246,7 +248,6 @@ swayc_t *destroy_view(swayc_t *view) {  	if (parent->type == C_CONTAINER) {  		return destroy_container(parent);  	} -  	return parent;  } diff --git a/sway/focus.c b/sway/focus.c index 2999c6d0..4f57f252 100644 --- a/sway/focus.c +++ b/sway/focus.c @@ -135,7 +135,7 @@ void set_focused_container(swayc_t *c) {  	if (!locked_view_focus) {  		p = get_focused_view(c);  		//Set focus to p -		if (p && p != prev_view && !(wlc_view_get_type(p->handle) & WLC_BIT_POPUP)) { +		if (p && !(wlc_view_get_type(p->handle) & WLC_BIT_POPUP)) {  			if (prev_view) {  				wlc_view_set_state(prev_view->handle, WLC_BIT_ACTIVATED, false);  			} diff --git a/sway/handlers.c b/sway/handlers.c index 2a5113cc..24e8e014 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -38,6 +38,9 @@ static bool pointer_test(swayc_t *view, void *_origin) {  swayc_t *container_under_pointer(void) {  	//root.output->workspace +	if (!root_container.focused || !root_container.focused->focused) { +		return NULL; +	}  	swayc_t *lookup = root_container.focused->focused;  	//Case of empty workspace  	if (lookup->children == 0) { @@ -174,9 +177,6 @@ static void handle_view_destroyed(wlc_handle handle) {  		if (view) {  			swayc_t *parent = destroy_view(view);  			arrange_windows(parent, -1, -1); -			if (!focused || focused == view) { -				set_focused_container(container_under_pointer()); -			}  		}  		break;  	//takes keyboard focus diff --git a/sway/layout.c b/sway/layout.c index de7ef370..8ff5c4b7 100644 --- a/sway/layout.c +++ b/sway/layout.c @@ -60,8 +60,9 @@ swayc_t *replace_child(swayc_t *child, swayc_t *new_child) {  	return parent;  } -swayc_t *remove_child(swayc_t *parent, swayc_t *child) { +swayc_t *remove_child(swayc_t *child) {  	int i; +	swayc_t *parent = child->parent;  	// Special case for floating views  	if (child->is_floating) {  		for (i = 0; i < parent->floating->length; ++i) { @@ -79,7 +80,11 @@ swayc_t *remove_child(swayc_t *parent, swayc_t *child) {  		}  	}  	if (parent->focused == child) { -		parent->focused = NULL; +		if (parent->children->length > 0) { +			parent->focused = parent->children->items[i?i-1:0]; +		} else { +			parent->focused = NULL; +		}  	}  	return parent;  }  | 
