diff options
| author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-05-19 23:33:36 +1000 | 
|---|---|---|
| committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-05-19 23:33:36 +1000 | 
| commit | 9fd28aea8cc78fc19bbde3ca9c25e3e7a5465f96 (patch) | |
| tree | 602dfad3130297a3fb46c8d0f1c8b13aa3b76c37 /sway | |
| parent | c2c5a3f5f6bdc061acae4e0583c4fd85c7ed21ac (diff) | |
| download | sway-9fd28aea8cc78fc19bbde3ca9c25e3e7a5465f96.tar.xz | |
Rebuild textures if needed when moving a container
When moving a container to an output which has a different scale than
the previous, rebuild the title and marks textures at the new scale.
Fixes #1999.
Diffstat (limited to 'sway')
| -rw-r--r-- | sway/tree/container.c | 41 | 
1 files changed, 41 insertions, 0 deletions
diff --git a/sway/tree/container.c b/sway/tree/container.c index e47338e7..feaf7647 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -73,6 +73,44 @@ static void container_close_notify(struct sway_container *container) {  	}  } +static void container_update_textures_recursive(struct sway_container *con) { +	container_update_title_textures(con); + +	if (con->type == C_VIEW) { +		view_update_marks_textures(con->sway_view); +	} else { +		for (int i = 0; i < con->children->length; ++i) { +			struct sway_container *child = con->children->items[i]; +			container_update_textures_recursive(child); +		} +	} +} + +static void handle_reparent(struct wl_listener *listener, +		void *data) { +	struct sway_container *container = +		wl_container_of(listener, container, reparent); +	struct sway_container *old_parent = data; + +	struct sway_container *old_output = old_parent; +	if (old_output != NULL && old_output->type != C_OUTPUT) { +		old_output = container_parent(old_output, C_OUTPUT); +	} + +	struct sway_container *new_output = container->parent; +	if (new_output != NULL && new_output->type != C_OUTPUT) { +		new_output = container_parent(new_output, C_OUTPUT); +	} + +	if (old_output && new_output) { +		float old_scale = old_output->sway_output->wlr_output->scale; +		float new_scale = new_output->sway_output->wlr_output->scale; +		if (old_scale != new_scale) { +			container_update_textures_recursive(container); +		} +	} +} +  struct sway_container *container_create(enum sway_container_type type) {  	// next id starts at 1 because 0 is assigned to root_container in layout.c  	static size_t next_id = 1; @@ -92,6 +130,9 @@ struct sway_container *container_create(enum sway_container_type type) {  	wl_signal_init(&c->events.destroy);  	wl_signal_init(&c->events.reparent); +	wl_signal_add(&c->events.reparent, &c->reparent); +	c->reparent.notify = handle_reparent; +  	return c;  }  | 
