mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	xdg: try to handle slow un-maximize with empty natural geometry better
In the case of an initially-maximized view which is taking a long time to un-maximize (seen for example with Thunderbird on slow machines), we may end up in handle_configure_timeout() with an empty pending geometry. In that case we have no great options (we can't center the view since we don't know the un-maximized size yet), so set a fallback position. v2: check wlr_box_empty() before comparing pending and current Fixes: #2191
This commit is contained in:
		
							parent
							
								
									915d638f8a
								
							
						
					
					
						commit
						452f45cd3d
					
				
					 3 changed files with 41 additions and 18 deletions
				
			
		| 
						 | 
					@ -13,6 +13,16 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LAB_MIN_VIEW_HEIGHT 60
 | 
					#define LAB_MIN_VIEW_HEIGHT 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Fallback view geometry used in some cases where a better position
 | 
				
			||||||
 | 
					 * and/or size can't be determined. Try to avoid using these except as
 | 
				
			||||||
 | 
					 * a last resort.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define VIEW_FALLBACK_X 100
 | 
				
			||||||
 | 
					#define VIEW_FALLBACK_Y 100
 | 
				
			||||||
 | 
					#define VIEW_FALLBACK_WIDTH  640
 | 
				
			||||||
 | 
					#define VIEW_FALLBACK_HEIGHT 480
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * In labwc, a view is a container for surfaces which can be moved around by
 | 
					 * In labwc, a view is a container for surfaces which can be moved around by
 | 
				
			||||||
 * the user. In practice this means XDG toplevel and XWayland windows.
 | 
					 * the user. In practice this means XDG toplevel and XWayland windows.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/view.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/view.c
									
										
									
									
									
								
							| 
						 | 
					@ -29,9 +29,6 @@
 | 
				
			||||||
#include <wlr/xwayland.h>
 | 
					#include <wlr/xwayland.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LAB_FALLBACK_WIDTH  640
 | 
					 | 
				
			||||||
#define LAB_FALLBACK_HEIGHT 480
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct view *
 | 
					struct view *
 | 
				
			||||||
view_from_wlr_surface(struct wlr_surface *surface)
 | 
					view_from_wlr_surface(struct wlr_surface *surface)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -827,8 +824,8 @@ adjust_floating_geometry(struct view *view, struct wlr_box *geometry,
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
view_set_fallback_natural_geometry(struct view *view)
 | 
					view_set_fallback_natural_geometry(struct view *view)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	view->natural_geometry.width = LAB_FALLBACK_WIDTH;
 | 
						view->natural_geometry.width = VIEW_FALLBACK_WIDTH;
 | 
				
			||||||
	view->natural_geometry.height = LAB_FALLBACK_HEIGHT;
 | 
						view->natural_geometry.height = VIEW_FALLBACK_HEIGHT;
 | 
				
			||||||
	view_compute_centered_position(view, NULL,
 | 
						view_compute_centered_position(view, NULL,
 | 
				
			||||||
		view->natural_geometry.width,
 | 
							view->natural_geometry.width,
 | 
				
			||||||
		view->natural_geometry.height,
 | 
							view->natural_geometry.height,
 | 
				
			||||||
| 
						 | 
					@ -836,9 +833,6 @@ view_set_fallback_natural_geometry(struct view *view)
 | 
				
			||||||
		&view->natural_geometry.y);
 | 
							&view->natural_geometry.y);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef LAB_FALLBACK_WIDTH
 | 
					 | 
				
			||||||
#undef LAB_FALLBACK_HEIGHT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
view_store_natural_geometry(struct view *view)
 | 
					view_store_natural_geometry(struct view *view)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										31
									
								
								src/xdg.c
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								src/xdg.c
									
										
									
									
									
								
							| 
						 | 
					@ -251,16 +251,35 @@ handle_configure_timeout(void *data)
 | 
				
			||||||
	view->pending_configure_serial = 0;
 | 
						view->pending_configure_serial = 0;
 | 
				
			||||||
	view->pending_configure_timeout = NULL;
 | 
						view->pending_configure_timeout = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool empty_pending = wlr_box_empty(&view->pending);
 | 
				
			||||||
 | 
						if (empty_pending || view->pending.x != view->current.x
 | 
				
			||||||
 | 
								|| view->pending.y != view->current.y) {
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
	 * We do not use view_impl_apply_geometry() here since in the timeout
 | 
							 * This is a pending move + resize and the client is
 | 
				
			||||||
	 * case we prefer to always put the top-left corner of the view at the
 | 
							 * taking too long to respond to the resize. Apply the
 | 
				
			||||||
	 * desired position rather than anchoring some other edge or corner
 | 
							 * move now (while keeping the current size) so that the
 | 
				
			||||||
 | 
							 * desktop doesn't appear unresponsive.
 | 
				
			||||||
 | 
							 *
 | 
				
			||||||
 | 
							 * We do not use view_impl_apply_geometry() here since
 | 
				
			||||||
 | 
							 * in this case we prefer to always put the top-left
 | 
				
			||||||
 | 
							 * corner of the view at the desired position rather
 | 
				
			||||||
 | 
							 * than anchoring some other edge or corner.
 | 
				
			||||||
 | 
							 *
 | 
				
			||||||
 | 
							 * Corner case: we may get here with an empty pending
 | 
				
			||||||
 | 
							 * geometry in the case of an initially-maximized view
 | 
				
			||||||
 | 
							 * which is taking a long time to un-maximize (seen for
 | 
				
			||||||
 | 
							 * example with Thunderbird on slow machines). In that
 | 
				
			||||||
 | 
							 * case we have no great options (we can't center the
 | 
				
			||||||
 | 
							 * view since we don't know the un-maximized size yet),
 | 
				
			||||||
 | 
							 * so set a fallback position.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
	bool moved = view->current.x != view->pending.x
 | 
							if (empty_pending) {
 | 
				
			||||||
		|| view->current.y != view->pending.y;
 | 
								wlr_log(WLR_INFO, "using fallback position");
 | 
				
			||||||
 | 
								view->pending.x = VIEW_FALLBACK_X;
 | 
				
			||||||
 | 
								view->pending.y = VIEW_FALLBACK_Y;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		view->current.x = view->pending.x;
 | 
							view->current.x = view->pending.x;
 | 
				
			||||||
		view->current.y = view->pending.y;
 | 
							view->current.y = view->pending.y;
 | 
				
			||||||
	if (moved) {
 | 
					 | 
				
			||||||
		view_moved(view);
 | 
							view_moved(view);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue