mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	xwayland: constrain view to top/left edge
This commit is contained in:
		
							parent
							
								
									35ff6e5bb0
								
							
						
					
					
						commit
						b46fa5e006
					
				
					 4 changed files with 31 additions and 15 deletions
				
			
		| 
						 | 
					@ -234,7 +234,8 @@ void keyboard_new(struct server *server, struct wlr_input_device *device);
 | 
				
			||||||
void output_frame(struct wl_listener *listener, void *data);
 | 
					void output_frame(struct wl_listener *listener, void *data);
 | 
				
			||||||
void output_new(struct wl_listener *listener, void *data);
 | 
					void output_new(struct wl_listener *listener, void *data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct border deco_max_extents(struct view *view);
 | 
					struct border deco_thickness(struct view *view);
 | 
				
			||||||
 | 
					struct wlr_box deco_max_extents(struct view *view);
 | 
				
			||||||
struct wlr_box deco_box(struct view *view, enum deco_part deco_part);
 | 
					struct wlr_box deco_box(struct view *view, enum deco_part deco_part);
 | 
				
			||||||
enum deco_part deco_at(struct view *view, double lx, double ly);
 | 
					enum deco_part deco_at(struct view *view, double lx, double ly);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										18
									
								
								src/deco.c
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								src/deco.c
									
										
									
									
									
								
							| 
						 | 
					@ -12,7 +12,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BORDER_WIDTH (2)
 | 
					#define BORDER_WIDTH (2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct border deco_max_extents(struct view *view)
 | 
					struct border deco_thickness(struct view *view)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct border border = {
 | 
						struct border border = {
 | 
				
			||||||
		.top = rc.title_height + BORDER_WIDTH,
 | 
							.top = rc.title_height + BORDER_WIDTH,
 | 
				
			||||||
| 
						 | 
					@ -23,16 +23,24 @@ struct border deco_max_extents(struct view *view)
 | 
				
			||||||
	return border;
 | 
						return border;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct wlr_box deco_max_extents(struct view *view)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct border border = deco_thickness(view);
 | 
				
			||||||
 | 
						struct wlr_box box = {
 | 
				
			||||||
 | 
							.x = view->x - border.left,
 | 
				
			||||||
 | 
							.y = view->y - border.top,
 | 
				
			||||||
 | 
							.width = view->w + border.left + border.right,
 | 
				
			||||||
 | 
							.height = view->h + border.top + border.bottom,
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						return box;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_box deco_box(struct view *view, enum deco_part deco_part)
 | 
					struct wlr_box deco_box(struct view *view, enum deco_part deco_part)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int margin;
 | 
						int margin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct wlr_box box = { .x = 0, .y = 0, .width = 0, .height = 0 };
 | 
						struct wlr_box box = { .x = 0, .y = 0, .width = 0, .height = 0 };
 | 
				
			||||||
	BUG_ON(!view);
 | 
						BUG_ON(!view);
 | 
				
			||||||
	if ((view->w < 1) || (view->h < 1)) {
 | 
					 | 
				
			||||||
		warn("view (%p) has no width/height", view);
 | 
					 | 
				
			||||||
		return box;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	switch (deco_part) {
 | 
						switch (deco_part) {
 | 
				
			||||||
	case LAB_DECO_BUTTON_CLOSE:
 | 
						case LAB_DECO_BUTTON_CLOSE:
 | 
				
			||||||
		wlr_texture_get_size(theme.xbm_close_active_unpressed,
 | 
							wlr_texture_get_size(theme.xbm_close_active_unpressed,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -149,7 +149,7 @@ static void xdg_toplevel_view_map(struct view *view)
 | 
				
			||||||
	if (!view->been_mapped) {
 | 
						if (!view->been_mapped) {
 | 
				
			||||||
		view->server_side_deco = has_ssd(view);
 | 
							view->server_side_deco = has_ssd(view);
 | 
				
			||||||
		if (view->server_side_deco) {
 | 
							if (view->server_side_deco) {
 | 
				
			||||||
			view->margin = deco_max_extents(view);
 | 
								view->margin = deco_thickness(view);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			view->margin = xdg_shell_border(view);
 | 
								view->margin = xdg_shell_border(view);
 | 
				
			||||||
			view->xdg_grab_offset = -view->margin.left;
 | 
								view->xdg_grab_offset = -view->margin.left;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,6 +61,19 @@ static bool want_deco(struct view *view)
 | 
				
			||||||
	       WLR_XWAYLAND_SURFACE_DECORATIONS_ALL;
 | 
						       WLR_XWAYLAND_SURFACE_DECORATIONS_ALL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void top_left_edge_boundary_check(struct view *view)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct wlr_box deco = deco_max_extents(view);
 | 
				
			||||||
 | 
						if (deco.x < 0)
 | 
				
			||||||
 | 
							view->x -= deco.x;
 | 
				
			||||||
 | 
						if (deco.y < 0)
 | 
				
			||||||
 | 
							view->y -= deco.y;
 | 
				
			||||||
 | 
						struct wlr_box box = {
 | 
				
			||||||
 | 
							.x = view->x, .y = view->y, .width = view->w, .height = view->h
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						view->impl->configure(view, box);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void map(struct view *view)
 | 
					static void map(struct view *view)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	view->mapped = true;
 | 
						view->mapped = true;
 | 
				
			||||||
| 
						 | 
					@ -71,15 +84,9 @@ static void map(struct view *view)
 | 
				
			||||||
	view->surface = view->xwayland_surface->surface;
 | 
						view->surface = view->xwayland_surface->surface;
 | 
				
			||||||
	view->server_side_deco = want_deco(view);
 | 
						view->server_side_deco = want_deco(view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	view->margin = deco_max_extents(view);
 | 
						view->margin = deco_thickness(view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* ensure we're inside screen */
 | 
						top_left_edge_boundary_check(view);
 | 
				
			||||||
	view->x += view->margin.left;
 | 
					 | 
				
			||||||
	view->y += view->margin.top;
 | 
					 | 
				
			||||||
	struct wlr_box box = {
 | 
					 | 
				
			||||||
		.x = view->x, .y = view->y, .width = view->w, .height = view->h
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
	view->impl->configure(view, box);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Add commit here, as xwayland map/unmap can change the wlr_surface */
 | 
						/* Add commit here, as xwayland map/unmap can change the wlr_surface */
 | 
				
			||||||
	wl_signal_add(&view->xwayland_surface->surface->events.commit,
 | 
						wl_signal_add(&view->xwayland_surface->surface->events.commit,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue