mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Fix unfullscreening a floating view
This commit is contained in:
		
							parent
							
								
									754cb7944c
								
							
						
					
					
						commit
						13a4b0512e
					
				
					 3 changed files with 31 additions and 18 deletions
				
			
		| 
						 | 
					@ -84,6 +84,7 @@ struct sway_container {
 | 
				
			||||||
	// Includes borders
 | 
						// Includes borders
 | 
				
			||||||
	double x, y;
 | 
						double x, y;
 | 
				
			||||||
	double width, height;
 | 
						double width, height;
 | 
				
			||||||
 | 
						double saved_x, saved_y;
 | 
				
			||||||
	double saved_width, saved_height;
 | 
						double saved_width, saved_height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	list_t *children;
 | 
						list_t *children;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -906,23 +906,6 @@ size_t container_titlebar_height() {
 | 
				
			||||||
	return config->font_height + TITLEBAR_V_PADDING * 2;
 | 
						return config->font_height + TITLEBAR_V_PADDING * 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void configure_floating_view(struct sway_view *view) {
 | 
					 | 
				
			||||||
	struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE);
 | 
					 | 
				
			||||||
	int max_width = ws->width * 0.6666;
 | 
					 | 
				
			||||||
	int max_height = ws->height * 0.6666;
 | 
					 | 
				
			||||||
	int width =
 | 
					 | 
				
			||||||
		view->natural_width > max_width ? max_width : view->natural_width;
 | 
					 | 
				
			||||||
	int height =
 | 
					 | 
				
			||||||
		view->natural_height > max_height ? max_height : view->natural_height;
 | 
					 | 
				
			||||||
	struct sway_container *output = ws->parent;
 | 
					 | 
				
			||||||
	int lx = output->x + (ws->width - width) / 2;
 | 
					 | 
				
			||||||
	int ly = output->y + (ws->height - height) / 2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	view->border_left = view->border_right = view->border_bottom = true;
 | 
					 | 
				
			||||||
	view_set_maximized(view, false);
 | 
					 | 
				
			||||||
	view_configure(view, lx, ly, width, height);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void container_set_floating(struct sway_container *container, bool enable) {
 | 
					void container_set_floating(struct sway_container *container, bool enable) {
 | 
				
			||||||
	if (container_is_floating(container) == enable) {
 | 
						if (container_is_floating(container) == enable) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -936,7 +919,7 @@ void container_set_floating(struct sway_container *container, bool enable) {
 | 
				
			||||||
		container_remove_child(container);
 | 
							container_remove_child(container);
 | 
				
			||||||
		container_add_child(workspace->sway_workspace->floating, container);
 | 
							container_add_child(workspace->sway_workspace->floating, container);
 | 
				
			||||||
		if (container->type == C_VIEW) {
 | 
							if (container->type == C_VIEW) {
 | 
				
			||||||
			configure_floating_view(container->sway_view);
 | 
								view_autoconfigure(container->sway_view);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		seat_set_focus(seat, seat_get_focus_inactive(seat, container));
 | 
							seat_set_focus(seat, seat_get_focus_inactive(seat, container));
 | 
				
			||||||
		container_reap_empty_recursive(workspace);
 | 
							container_reap_empty_recursive(workspace);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,6 +126,23 @@ void view_configure(struct sway_view *view, double ox, double oy, int width,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void view_autoconfigure_floating(struct sway_view *view) {
 | 
				
			||||||
 | 
						struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE);
 | 
				
			||||||
 | 
						int max_width = ws->width * 0.6666;
 | 
				
			||||||
 | 
						int max_height = ws->height * 0.6666;
 | 
				
			||||||
 | 
						int width =
 | 
				
			||||||
 | 
							view->natural_width > max_width ? max_width : view->natural_width;
 | 
				
			||||||
 | 
						int height =
 | 
				
			||||||
 | 
							view->natural_height > max_height ? max_height : view->natural_height;
 | 
				
			||||||
 | 
						struct sway_container *output = ws->parent;
 | 
				
			||||||
 | 
						int lx = output->x + (ws->width - width) / 2;
 | 
				
			||||||
 | 
						int ly = output->y + (ws->height - height) / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						view->border_left = view->border_right = view->border_bottom = true;
 | 
				
			||||||
 | 
						view_set_maximized(view, false);
 | 
				
			||||||
 | 
						view_configure(view, lx, ly, width, height);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void view_autoconfigure(struct sway_view *view) {
 | 
					void view_autoconfigure(struct sway_view *view) {
 | 
				
			||||||
	if (!sway_assert(view->swayc,
 | 
						if (!sway_assert(view->swayc,
 | 
				
			||||||
				"Called view_autoconfigure() on a view without a swayc")) {
 | 
									"Called view_autoconfigure() on a view without a swayc")) {
 | 
				
			||||||
| 
						 | 
					@ -140,6 +157,11 @@ void view_autoconfigure(struct sway_view *view) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (container_is_floating(view->swayc)) {
 | 
				
			||||||
 | 
							view_autoconfigure_floating(view);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE);
 | 
						struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int other_views = 0;
 | 
						int other_views = 0;
 | 
				
			||||||
| 
						 | 
					@ -261,6 +283,8 @@ void view_set_fullscreen_raw(struct sway_view *view, bool fullscreen) {
 | 
				
			||||||
			view_set_fullscreen(workspace->sway_workspace->fullscreen, false);
 | 
								view_set_fullscreen(workspace->sway_workspace->fullscreen, false);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		workspace->sway_workspace->fullscreen = view;
 | 
							workspace->sway_workspace->fullscreen = view;
 | 
				
			||||||
 | 
							view->swayc->saved_x = view->swayc->x;
 | 
				
			||||||
 | 
							view->swayc->saved_y = view->swayc->y;
 | 
				
			||||||
		view->swayc->saved_width = view->swayc->width;
 | 
							view->swayc->saved_width = view->swayc->width;
 | 
				
			||||||
		view->swayc->saved_height = view->swayc->height;
 | 
							view->swayc->saved_height = view->swayc->height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -283,6 +307,11 @@ void view_set_fullscreen_raw(struct sway_view *view, bool fullscreen) {
 | 
				
			||||||
		workspace->sway_workspace->fullscreen = NULL;
 | 
							workspace->sway_workspace->fullscreen = NULL;
 | 
				
			||||||
		view->swayc->width = view->swayc->saved_width;
 | 
							view->swayc->width = view->swayc->saved_width;
 | 
				
			||||||
		view->swayc->height = view->swayc->saved_height;
 | 
							view->swayc->height = view->swayc->saved_height;
 | 
				
			||||||
 | 
							if (container_is_floating(view->swayc)) {
 | 
				
			||||||
 | 
								view->swayc->x = view->swayc->saved_x;
 | 
				
			||||||
 | 
								view->swayc->y = view->swayc->saved_y;
 | 
				
			||||||
 | 
								view_autoconfigure(view);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue