mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	view: Use wlr_box for current/pending geometry
This commit is contained in:
		
							parent
							
								
									3941991505
								
							
						
					
					
						commit
						b75dbd5b38
					
				
					 15 changed files with 169 additions and 186 deletions
				
			
		| 
						 | 
				
			
			@ -214,8 +214,8 @@ show_menu(struct server *server, struct view *view, const char *menu_name)
 | 
			
		|||
 | 
			
		||||
	int x, y;
 | 
			
		||||
	if (force_menu_top_left) {
 | 
			
		||||
		x = view->x;
 | 
			
		||||
		y = view->y;
 | 
			
		||||
		x = view->current.x;
 | 
			
		||||
		y = view->current.y;
 | 
			
		||||
	} else {
 | 
			
		||||
		x = server->seat.cursor->x;
 | 
			
		||||
		y = server->seat.cursor->y;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										13
									
								
								src/cursor.c
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								src/cursor.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -210,9 +210,7 @@ process_cursor_resize(struct server *server, uint32_t time)
 | 
			
		|||
	double dy = server->seat.cursor->y - server->grab_y;
 | 
			
		||||
 | 
			
		||||
	struct view *view = server->grabbed_view;
 | 
			
		||||
	struct wlr_box new_view_geo = {
 | 
			
		||||
		.x = view->x, .y = view->y, .width = view->w, .height = view->h
 | 
			
		||||
	};
 | 
			
		||||
	struct wlr_box new_view_geo = view->current;
 | 
			
		||||
 | 
			
		||||
	if (server->resize_edges & WLR_EDGE_TOP) {
 | 
			
		||||
		new_view_geo.height = server->grab_box.height - dy;
 | 
			
		||||
| 
						 | 
				
			
			@ -320,8 +318,8 @@ process_cursor_motion_out_of_surface(struct server *server, uint32_t time)
 | 
			
		|||
	int lx, ly;
 | 
			
		||||
 | 
			
		||||
	if (view) {
 | 
			
		||||
		lx = view->x;
 | 
			
		||||
		ly = view->y;
 | 
			
		||||
		lx = view->current.x;
 | 
			
		||||
		ly = view->current.y;
 | 
			
		||||
	} else if (node && wlr_surface_is_layer_surface(surface)) {
 | 
			
		||||
		wlr_scene_node_coords(node, &lx, &ly);
 | 
			
		||||
#if HAVE_XWAYLAND
 | 
			
		||||
| 
						 | 
				
			
			@ -435,11 +433,12 @@ cursor_get_resize_edges(struct wlr_cursor *cursor, struct cursor_context *ctx)
 | 
			
		|||
{
 | 
			
		||||
	uint32_t resize_edges = ssd_resize_edges(ctx->type);
 | 
			
		||||
	if (ctx->view && !resize_edges) {
 | 
			
		||||
		struct wlr_box box = ctx->view->current;
 | 
			
		||||
		resize_edges |=
 | 
			
		||||
			(int)cursor->x < ctx->view->x + ctx->view->w / 2 ?
 | 
			
		||||
			(int)cursor->x < box.x + box.width / 2 ?
 | 
			
		||||
				WLR_EDGE_LEFT : WLR_EDGE_RIGHT;
 | 
			
		||||
		resize_edges |=
 | 
			
		||||
			(int)cursor->y < ctx->view->y + ctx->view->h / 2 ?
 | 
			
		||||
			(int)cursor->y < box.y + box.height / 2 ?
 | 
			
		||||
				WLR_EDGE_TOP : WLR_EDGE_BOTTOM;
 | 
			
		||||
	}
 | 
			
		||||
	return resize_edges;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ foreign_toplevel_update_outputs(struct view *view)
 | 
			
		|||
{
 | 
			
		||||
	assert(view->toplevel.handle);
 | 
			
		||||
 | 
			
		||||
	struct wlr_box view_geo = { view->x, view->y, view->w, view->h };
 | 
			
		||||
	struct wlr_box view_geo = view->current;
 | 
			
		||||
	struct wlr_output_layout *layout = view->server->output_layout;
 | 
			
		||||
 | 
			
		||||
	struct output *output;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,12 +26,7 @@ interactive_begin(struct view *view, enum input_mode mode, uint32_t edges)
 | 
			
		|||
	 */
 | 
			
		||||
	struct server *server = view->server;
 | 
			
		||||
	struct seat *seat = &server->seat;
 | 
			
		||||
	struct wlr_box geometry = {
 | 
			
		||||
		.x = view->x,
 | 
			
		||||
		.y = view->y,
 | 
			
		||||
		.width = view->w,
 | 
			
		||||
		.height = view->h
 | 
			
		||||
	};
 | 
			
		||||
	struct wlr_box geometry = view->current;
 | 
			
		||||
 | 
			
		||||
	switch (mode) {
 | 
			
		||||
	case LAB_INPUT_STATE_MOVE:
 | 
			
		||||
| 
						 | 
				
			
			@ -52,10 +47,12 @@ interactive_begin(struct view *view, enum input_mode mode, uint32_t edges)
 | 
			
		|||
			 * to keep it (in the snap-to-maximize case).
 | 
			
		||||
			 */
 | 
			
		||||
			geometry = view->natural_geometry;
 | 
			
		||||
			geometry.x = max_move_scale(seat->cursor->x, view->x,
 | 
			
		||||
				view->w, geometry.width);
 | 
			
		||||
			geometry.y = max_move_scale(seat->cursor->y, view->y,
 | 
			
		||||
				view->h, geometry.height);
 | 
			
		||||
			geometry.x = max_move_scale(seat->cursor->x,
 | 
			
		||||
				view->current.x, view->current.width,
 | 
			
		||||
				geometry.width);
 | 
			
		||||
			geometry.y = max_move_scale(seat->cursor->y,
 | 
			
		||||
				view->current.y, view->current.height,
 | 
			
		||||
				geometry.height);
 | 
			
		||||
			view_restore_to(view, geometry);
 | 
			
		||||
		} else {
 | 
			
		||||
			/* Store natural geometry at start of move */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,10 +37,9 @@ resistance_move_apply(struct view *view, double *x, double *y)
 | 
			
		|||
{
 | 
			
		||||
	struct server *server = view->server;
 | 
			
		||||
	struct wlr_box mgeom, intersection;
 | 
			
		||||
	struct wlr_box vgeom = {.x = view->x, .y = view->y, .width = view->w,
 | 
			
		||||
		.height = view->h};
 | 
			
		||||
	struct wlr_box tgeom = {.x = *x, .y = *y, .width = view->w,
 | 
			
		||||
		.height = view->h};
 | 
			
		||||
	struct wlr_box vgeom = view->current;
 | 
			
		||||
	struct wlr_box tgeom = {.x = *x, .y = *y, .width = vgeom.width,
 | 
			
		||||
		.height = vgeom.height};
 | 
			
		||||
	struct output *output;
 | 
			
		||||
	struct border border = ssd_get_margin(view->ssd);
 | 
			
		||||
	struct edges view_edges; /* The edges of the current view */
 | 
			
		||||
| 
						 | 
				
			
			@ -48,15 +47,15 @@ resistance_move_apply(struct view *view, double *x, double *y)
 | 
			
		|||
	struct edges other_edges; /* The edges of the monitor/other view */
 | 
			
		||||
	struct edges flags = { 0 };
 | 
			
		||||
 | 
			
		||||
	view_edges.left = view->x - border.left + 1;
 | 
			
		||||
	view_edges.top = view->y - border.top + 1;
 | 
			
		||||
	view_edges.right = view->x + view->w + border.right;
 | 
			
		||||
	view_edges.bottom = view->y + view->h + border.bottom;
 | 
			
		||||
	view_edges.left = vgeom.x - border.left + 1;
 | 
			
		||||
	view_edges.top = vgeom.y - border.top + 1;
 | 
			
		||||
	view_edges.right = vgeom.x + vgeom.width + border.right;
 | 
			
		||||
	view_edges.bottom = vgeom.y + vgeom.height + border.bottom;
 | 
			
		||||
 | 
			
		||||
	target_edges.left = *x - border.left;
 | 
			
		||||
	target_edges.top = *y - border.top;
 | 
			
		||||
	target_edges.right = *x + view->w + border.right;
 | 
			
		||||
	target_edges.bottom = *y + view->h + border.bottom;
 | 
			
		||||
	target_edges.right = *x + vgeom.width + border.right;
 | 
			
		||||
	target_edges.bottom = *y + vgeom.height + border.bottom;
 | 
			
		||||
 | 
			
		||||
	if (!rc.screen_edge_strength) {
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			@ -86,13 +85,13 @@ resistance_move_apply(struct view *view, double *x, double *y)
 | 
			
		|||
		if (flags.left == 1) {
 | 
			
		||||
			*x = other_edges.left + border.left;
 | 
			
		||||
		} else if (flags.right == 1) {
 | 
			
		||||
			*x = other_edges.right - view->w - border.right;
 | 
			
		||||
			*x = other_edges.right - vgeom.width - border.right;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (flags.top == 1) {
 | 
			
		||||
			*y = other_edges.top + border.top;
 | 
			
		||||
		} else if (flags.bottom == 1) {
 | 
			
		||||
			*y = other_edges.bottom - view->h - border.bottom;
 | 
			
		||||
			*y = other_edges.bottom - vgeom.height - border.bottom;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* reset the flags */
 | 
			
		||||
| 
						 | 
				
			
			@ -109,20 +108,18 @@ resistance_resize_apply(struct view *view, struct wlr_box *new_view_geo)
 | 
			
		|||
	struct server *server = view->server;
 | 
			
		||||
	struct output *output;
 | 
			
		||||
	struct wlr_box mgeom, intersection;
 | 
			
		||||
	struct wlr_box vgeom = {.x = view->x, .y = view->y, .width = view->w,
 | 
			
		||||
		.height = view->h};
 | 
			
		||||
	struct wlr_box tgeom = {.x = new_view_geo->x, .y = new_view_geo->y,
 | 
			
		||||
		.width = new_view_geo->width, .height = new_view_geo->height};
 | 
			
		||||
	struct wlr_box vgeom = view->current;
 | 
			
		||||
	struct wlr_box tgeom = *new_view_geo;
 | 
			
		||||
	struct border border = ssd_get_margin(view->ssd);
 | 
			
		||||
	struct edges view_edges; /* The edges of the current view */
 | 
			
		||||
	struct edges target_edges; /* The desired edges */
 | 
			
		||||
	struct edges other_edges; /* The edges of the monitor/other view */
 | 
			
		||||
	struct edges flags = { 0 };
 | 
			
		||||
 | 
			
		||||
	view_edges.left = view->x - border.left;
 | 
			
		||||
	view_edges.top = view->y - border.top;
 | 
			
		||||
	view_edges.right = view->x + view->w + border.right;
 | 
			
		||||
	view_edges.bottom = view->y + view->h + border.bottom;
 | 
			
		||||
	view_edges.left = vgeom.x - border.left;
 | 
			
		||||
	view_edges.top = vgeom.y - border.top;
 | 
			
		||||
	view_edges.right = vgeom.x + vgeom.width + border.right;
 | 
			
		||||
	view_edges.bottom = vgeom.y + vgeom.height + border.bottom;
 | 
			
		||||
 | 
			
		||||
	target_edges.left = new_view_geo->x - border.left;
 | 
			
		||||
	target_edges.top = new_view_geo->y - border.top;
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +156,7 @@ resistance_resize_apply(struct view *view, struct wlr_box *new_view_geo)
 | 
			
		|||
			if (flags.left == 1) {
 | 
			
		||||
				new_view_geo->x = other_edges.left
 | 
			
		||||
					+ border.left;
 | 
			
		||||
				new_view_geo->width = view->w;
 | 
			
		||||
				new_view_geo->width = vgeom.width;
 | 
			
		||||
			}
 | 
			
		||||
		} else if (server->resize_edges & WLR_EDGE_RIGHT) {
 | 
			
		||||
			if (flags.right == 1) {
 | 
			
		||||
| 
						 | 
				
			
			@ -172,7 +169,7 @@ resistance_resize_apply(struct view *view, struct wlr_box *new_view_geo)
 | 
			
		|||
		if (server->resize_edges & WLR_EDGE_TOP) {
 | 
			
		||||
			if (flags.top == 1) {
 | 
			
		||||
				new_view_geo->y = other_edges.top + border.top;
 | 
			
		||||
				new_view_geo->height = view->h;
 | 
			
		||||
				new_view_geo->height = vgeom.height;
 | 
			
		||||
			}
 | 
			
		||||
		} else if (server->resize_edges & WLR_EDGE_BOTTOM) {
 | 
			
		||||
			if (flags.bottom == 1) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,10 +40,10 @@ ssd_max_extents(struct view *view)
 | 
			
		|||
	assert(view);
 | 
			
		||||
	struct border border = ssd_thickness(view);
 | 
			
		||||
	return (struct wlr_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,
 | 
			
		||||
		.x = view->current.x - border.left,
 | 
			
		||||
		.y = view->current.y - border.top,
 | 
			
		||||
		.width = view->current.width + border.left + border.right,
 | 
			
		||||
		.height = view->current.height + border.top + border.bottom,
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -163,11 +163,7 @@ ssd_create(struct view *view, bool active)
 | 
			
		|||
	ssd_titlebar_create(ssd);
 | 
			
		||||
	ssd->margin = ssd_thickness(view);
 | 
			
		||||
	ssd_set_active(ssd, active);
 | 
			
		||||
 | 
			
		||||
	ssd->state.width = view->w;
 | 
			
		||||
	ssd->state.height = view->h;
 | 
			
		||||
	ssd->state.x = view->x;
 | 
			
		||||
	ssd->state.y = view->y;
 | 
			
		||||
	ssd->state.geometry = view->current;
 | 
			
		||||
 | 
			
		||||
	return ssd;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -185,24 +181,20 @@ ssd_update_geometry(struct ssd *ssd)
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	struct view *view = ssd->view;
 | 
			
		||||
	if (view->w == ssd->state.width && view->h == ssd->state.height) {
 | 
			
		||||
		if (view->x != ssd->state.x || view->y != ssd->state.y) {
 | 
			
		||||
	struct wlr_box cached = ssd->state.geometry;
 | 
			
		||||
	struct wlr_box current = ssd->view->current;
 | 
			
		||||
	if (current.width == cached.width && current.height == cached.height) {
 | 
			
		||||
		if (current.x != cached.x || current.y != cached.y) {
 | 
			
		||||
			/* Dynamically resize extents based on position and usable_area */
 | 
			
		||||
			ssd_extents_update(ssd);
 | 
			
		||||
			ssd->state.x = view->x;
 | 
			
		||||
			ssd->state.y = view->y;
 | 
			
		||||
			ssd->state.geometry = current;
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	ssd_extents_update(ssd);
 | 
			
		||||
	ssd_border_update(ssd);
 | 
			
		||||
	ssd_titlebar_update(ssd);
 | 
			
		||||
 | 
			
		||||
	ssd->state.width = view->w;
 | 
			
		||||
	ssd->state.height = view->h;
 | 
			
		||||
	ssd->state.x = view->x;
 | 
			
		||||
	ssd->state.y = view->y;
 | 
			
		||||
	ssd->state.geometry = current;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,8 +15,8 @@ ssd_border_create(struct ssd *ssd)
 | 
			
		|||
{
 | 
			
		||||
	struct view *view = ssd->view;
 | 
			
		||||
	struct theme *theme = view->server->theme;
 | 
			
		||||
	int width = view->w;
 | 
			
		||||
	int height = view->h;
 | 
			
		||||
	int width = view->current.width;
 | 
			
		||||
	int height = view->current.height;
 | 
			
		||||
	int full_width = width + 2 * theme->border_width;
 | 
			
		||||
 | 
			
		||||
	float *color;
 | 
			
		||||
| 
						 | 
				
			
			@ -54,8 +54,8 @@ ssd_border_update(struct ssd *ssd)
 | 
			
		|||
	struct view *view = ssd->view;
 | 
			
		||||
	struct theme *theme = view->server->theme;
 | 
			
		||||
 | 
			
		||||
	int width = view->w;
 | 
			
		||||
	int height = view->h;
 | 
			
		||||
	int width = view->current.width;
 | 
			
		||||
	int height = view->current.height;
 | 
			
		||||
	int full_width = width + 2 * theme->border_width;
 | 
			
		||||
 | 
			
		||||
	struct ssd_part *part;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,8 +113,8 @@ ssd_extents_update(struct ssd *ssd)
 | 
			
		|||
 | 
			
		||||
	struct theme *theme = view->server->theme;
 | 
			
		||||
 | 
			
		||||
	int width = view->w;
 | 
			
		||||
	int height = view->h;
 | 
			
		||||
	int width = view->current.width;
 | 
			
		||||
	int height = view->current.height;
 | 
			
		||||
	int full_height = height + theme->border_width * 2 + theme->title_height;
 | 
			
		||||
	int full_width = width + 2 * theme->border_width;
 | 
			
		||||
	int extended_area = SSD_EXTENDED_AREA;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ ssd_titlebar_create(struct ssd *ssd)
 | 
			
		|||
{
 | 
			
		||||
	struct view *view = ssd->view;
 | 
			
		||||
	struct theme *theme = view->server->theme;
 | 
			
		||||
	int width = view->w;
 | 
			
		||||
	int width = view->current.width;
 | 
			
		||||
 | 
			
		||||
	float *color;
 | 
			
		||||
	struct wlr_scene_tree *parent;
 | 
			
		||||
| 
						 | 
				
			
			@ -91,8 +91,8 @@ void
 | 
			
		|||
ssd_titlebar_update(struct ssd *ssd)
 | 
			
		||||
{
 | 
			
		||||
	struct view *view = ssd->view;
 | 
			
		||||
	int width = view->w;
 | 
			
		||||
	if (width == ssd->state.width) {
 | 
			
		||||
	int width = view->current.width;
 | 
			
		||||
	if (width == ssd->state.geometry.width) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	struct theme *theme = view->server->theme;
 | 
			
		||||
| 
						 | 
				
			
			@ -171,7 +171,7 @@ ssd_update_title_positions(struct ssd *ssd)
 | 
			
		|||
{
 | 
			
		||||
	struct view *view = ssd->view;
 | 
			
		||||
	struct theme *theme = view->server->theme;
 | 
			
		||||
	int width = view->w;
 | 
			
		||||
	int width = view->current.width;
 | 
			
		||||
	int title_bg_width = width - SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT;
 | 
			
		||||
 | 
			
		||||
	int x, y;
 | 
			
		||||
| 
						 | 
				
			
			@ -239,7 +239,8 @@ ssd_update_title(struct ssd *ssd)
 | 
			
		|||
	struct ssd_part *part;
 | 
			
		||||
	struct ssd_sub_tree *subtree;
 | 
			
		||||
	struct ssd_state_title_width *dstate;
 | 
			
		||||
	int title_bg_width = view->w - SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT;
 | 
			
		||||
	int title_bg_width = view->current.width
 | 
			
		||||
		- SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT;
 | 
			
		||||
 | 
			
		||||
	FOR_EACH_STATE(ssd, subtree) {
 | 
			
		||||
		if (subtree == &ssd->titlebar.active) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										44
									
								
								src/view.c
									
										
									
									
									
								
							
							
						
						
									
										44
									
								
								src/view.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -152,7 +152,8 @@ void
 | 
			
		|||
view_moved(struct view *view)
 | 
			
		||||
{
 | 
			
		||||
	assert(view);
 | 
			
		||||
	wlr_scene_node_set_position(&view->scene_tree->node, view->x, view->y);
 | 
			
		||||
	wlr_scene_node_set_position(&view->scene_tree->node,
 | 
			
		||||
		view->current.x, view->current.y);
 | 
			
		||||
	view_discover_output(view);
 | 
			
		||||
	ssd_update_geometry(view->ssd);
 | 
			
		||||
	cursor_update_focus(view->server);
 | 
			
		||||
| 
						 | 
				
			
			@ -227,8 +228,9 @@ view_wlr_output(struct view *view)
 | 
			
		|||
	double closest_x, closest_y;
 | 
			
		||||
	struct wlr_output *wlr_output = NULL;
 | 
			
		||||
	wlr_output_layout_closest_point(view->server->output_layout, wlr_output,
 | 
			
		||||
		view->x + view->w / 2, view->y + view->h / 2, &closest_x,
 | 
			
		||||
		&closest_y);
 | 
			
		||||
		view->current.x + view->current.width / 2,
 | 
			
		||||
		view->current.y + view->current.height / 2,
 | 
			
		||||
		&closest_x, &closest_y);
 | 
			
		||||
	wlr_output = wlr_output_layout_output_at(view->server->output_layout,
 | 
			
		||||
		closest_x, closest_y);
 | 
			
		||||
	return wlr_output;
 | 
			
		||||
| 
						 | 
				
			
			@ -308,13 +310,10 @@ view_store_natural_geometry(struct view *view)
 | 
			
		|||
	 * natural_geometry width/height may still be zero in which case we set
 | 
			
		||||
	 * some fallback values. This is the case with foot and Qt applications.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!view->w || !view->h) {
 | 
			
		||||
	if (wlr_box_empty(&view->current)) {
 | 
			
		||||
		set_fallback_geometry(view);
 | 
			
		||||
	} else {
 | 
			
		||||
		view->natural_geometry.x = view->x;
 | 
			
		||||
		view->natural_geometry.y = view->y;
 | 
			
		||||
		view->natural_geometry.width = view->w;
 | 
			
		||||
		view->natural_geometry.height = view->h;
 | 
			
		||||
		view->natural_geometry = view->current;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -323,7 +322,8 @@ view_center(struct view *view)
 | 
			
		|||
{
 | 
			
		||||
	assert(view);
 | 
			
		||||
	int x, y;
 | 
			
		||||
	if (view_compute_centered_position(view, view->w, view->h, &x, &y)) {
 | 
			
		||||
	if (view_compute_centered_position(view, view->current.width,
 | 
			
		||||
			view->current.height, &x, &y)) {
 | 
			
		||||
		view_move(view, x, y);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -417,7 +417,8 @@ view_apply_region_geometry(struct view *view)
 | 
			
		|||
	geo.width -= margin.left + margin.right;
 | 
			
		||||
	geo.height -= margin.top + margin.bottom;
 | 
			
		||||
 | 
			
		||||
	if (view->w == geo.width && view->h == geo.height) {
 | 
			
		||||
	if (view->current.width == geo.width
 | 
			
		||||
			&& view->current.height == geo.height) {
 | 
			
		||||
		/* move horizontally/vertically without changing size */
 | 
			
		||||
		view_move(view, geo.x, geo.y);
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -438,7 +439,8 @@ view_apply_tiled_geometry(struct view *view, struct output *output)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	struct wlr_box dst = view_get_edge_snap_box(view, output, view->tiled);
 | 
			
		||||
	if (view->w == dst.width && view->h == dst.height) {
 | 
			
		||||
	if (view->current.width == dst.width
 | 
			
		||||
			&& view->current.height == dst.height) {
 | 
			
		||||
		/* move horizontally/vertically without changing size */
 | 
			
		||||
		view_move(view, dst.x, dst.y);
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -752,8 +754,8 @@ view_adjust_for_layout_change(struct view *view)
 | 
			
		|||
		}
 | 
			
		||||
	} else if (!view_apply_special_geometry(view)) {
 | 
			
		||||
		/* reposition view if it's offscreen */
 | 
			
		||||
		struct wlr_box box = { view->x, view->y, view->w, view->h };
 | 
			
		||||
		if (!wlr_output_layout_intersects(layout, NULL, &box)) {
 | 
			
		||||
		if (!wlr_output_layout_intersects(layout, NULL,
 | 
			
		||||
				&view->current)) {
 | 
			
		||||
			view_center(view);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -809,18 +811,18 @@ view_move_to_edge(struct view *view, const char *direction)
 | 
			
		|||
	int x = 0, y = 0;
 | 
			
		||||
	if (!strcasecmp(direction, "left")) {
 | 
			
		||||
		x = usable.x + margin.left + rc.gap;
 | 
			
		||||
		y = view->y;
 | 
			
		||||
		y = view->current.y;
 | 
			
		||||
	} else if (!strcasecmp(direction, "up")) {
 | 
			
		||||
		x = view->x;
 | 
			
		||||
		x = view->current.x;
 | 
			
		||||
		y = usable.y + margin.top + rc.gap;
 | 
			
		||||
	} else if (!strcasecmp(direction, "right")) {
 | 
			
		||||
		x = usable.x + usable.width - view->w - margin.right
 | 
			
		||||
			- rc.gap;
 | 
			
		||||
		y = view->y;
 | 
			
		||||
		x = usable.x + usable.width - view->current.width
 | 
			
		||||
			- margin.right - rc.gap;
 | 
			
		||||
		y = view->current.y;
 | 
			
		||||
	} else if (!strcasecmp(direction, "down")) {
 | 
			
		||||
		x = view->x;
 | 
			
		||||
		y = usable.y + usable.height - view->h - margin.bottom
 | 
			
		||||
			- rc.gap;
 | 
			
		||||
		x = view->current.x;
 | 
			
		||||
		y = usable.y + usable.height - view->current.height
 | 
			
		||||
			- margin.bottom - rc.gap;
 | 
			
		||||
	} else {
 | 
			
		||||
		wlr_log(WLR_ERROR, "invalid edge");
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,14 +27,15 @@ popup_unconstrain(struct view *view, struct wlr_xdg_popup *popup)
 | 
			
		|||
	struct wlr_box *popup_box = &popup->current.geometry;
 | 
			
		||||
	struct wlr_output_layout *output_layout = server->output_layout;
 | 
			
		||||
	struct wlr_output *wlr_output = wlr_output_layout_output_at(
 | 
			
		||||
		output_layout, view->x + popup_box->x, view->y + popup_box->y);
 | 
			
		||||
		output_layout, view->current.x + popup_box->x,
 | 
			
		||||
		view->current.y + popup_box->y);
 | 
			
		||||
 | 
			
		||||
	struct wlr_box output_box;
 | 
			
		||||
	wlr_output_layout_get_box(output_layout, wlr_output, &output_box);
 | 
			
		||||
 | 
			
		||||
	struct wlr_box output_toplevel_box = {
 | 
			
		||||
		.x = output_box.x - view->x,
 | 
			
		||||
		.y = output_box.y - view->y,
 | 
			
		||||
		.x = output_box.x - view->current.x,
 | 
			
		||||
		.y = output_box.y - view->current.y,
 | 
			
		||||
		.width = output_box.width,
 | 
			
		||||
		.height = output_box.height,
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										62
									
								
								src/xdg.c
									
										
									
									
									
								
							
							
						
						
									
										62
									
								
								src/xdg.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -66,28 +66,28 @@ handle_commit(struct wl_listener *listener, void *data)
 | 
			
		|||
	struct wlr_box size;
 | 
			
		||||
	wlr_xdg_surface_get_geometry(xdg_surface, &size);
 | 
			
		||||
 | 
			
		||||
	struct wlr_box *current = &view->current;
 | 
			
		||||
	struct wlr_box *pending = &view->pending;
 | 
			
		||||
	bool update_required = false;
 | 
			
		||||
 | 
			
		||||
	if (view->w != size.width || view->h != size.height) {
 | 
			
		||||
	if (current->width != size.width || current->height != size.height) {
 | 
			
		||||
		update_required = true;
 | 
			
		||||
		view->w = size.width;
 | 
			
		||||
		view->h = size.height;
 | 
			
		||||
		current->width = size.width;
 | 
			
		||||
		current->height = size.height;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	uint32_t serial = view->pending_move_resize.configure_serial;
 | 
			
		||||
	uint32_t serial = view->pending_configure_serial;
 | 
			
		||||
	if (serial > 0 && serial >= xdg_surface->current.configure_serial) {
 | 
			
		||||
		if (view->x != view->pending_move_resize.x) {
 | 
			
		||||
		if (current->x != pending->x) {
 | 
			
		||||
			update_required = true;
 | 
			
		||||
			view->x = view->pending_move_resize.x +
 | 
			
		||||
				view->pending_move_resize.width - size.width;
 | 
			
		||||
			current->x = pending->x + pending->width - size.width;
 | 
			
		||||
		}
 | 
			
		||||
		if (view->y != view->pending_move_resize.y) {
 | 
			
		||||
		if (current->y != pending->y) {
 | 
			
		||||
			update_required = true;
 | 
			
		||||
			view->y = view->pending_move_resize.y +
 | 
			
		||||
				view->pending_move_resize.height - size.height;
 | 
			
		||||
			current->y = pending->y + pending->height - size.height;
 | 
			
		||||
		}
 | 
			
		||||
		if (serial == xdg_surface->current.configure_serial) {
 | 
			
		||||
			view->pending_move_resize.configure_serial = 0;
 | 
			
		||||
			view->pending_configure_serial = 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (update_required) {
 | 
			
		||||
| 
						 | 
				
			
			@ -204,20 +204,16 @@ static void
 | 
			
		|||
xdg_toplevel_view_configure(struct view *view, struct wlr_box geo)
 | 
			
		||||
{
 | 
			
		||||
	view_adjust_size(view, &geo.width, &geo.height);
 | 
			
		||||
 | 
			
		||||
	view->pending_move_resize.x = geo.x;
 | 
			
		||||
	view->pending_move_resize.y = geo.y;
 | 
			
		||||
	view->pending_move_resize.width = geo.width;
 | 
			
		||||
	view->pending_move_resize.height = geo.height;
 | 
			
		||||
	view->pending = geo;
 | 
			
		||||
 | 
			
		||||
	struct wlr_xdg_toplevel *xdg_toplevel = xdg_toplevel_from_view(view);
 | 
			
		||||
	uint32_t serial = wlr_xdg_toplevel_set_size(xdg_toplevel,
 | 
			
		||||
		(uint32_t)geo.width, (uint32_t)geo.height);
 | 
			
		||||
	if (serial > 0) {
 | 
			
		||||
		view->pending_move_resize.configure_serial = serial;
 | 
			
		||||
	} else if (view->pending_move_resize.configure_serial == 0) {
 | 
			
		||||
		view->x = geo.x;
 | 
			
		||||
		view->y = geo.y;
 | 
			
		||||
		view->pending_configure_serial = serial;
 | 
			
		||||
	} else if (view->pending_configure_serial == 0) {
 | 
			
		||||
		view->current.x = geo.x;
 | 
			
		||||
		view->current.y = geo.y;
 | 
			
		||||
		view_moved(view);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -225,12 +221,12 @@ xdg_toplevel_view_configure(struct view *view, struct wlr_box geo)
 | 
			
		|||
static void
 | 
			
		||||
xdg_toplevel_view_move(struct view *view, int x, int y)
 | 
			
		||||
{
 | 
			
		||||
	view->x = x;
 | 
			
		||||
	view->y = y;
 | 
			
		||||
	view->current.x = x;
 | 
			
		||||
	view->current.y = y;
 | 
			
		||||
 | 
			
		||||
	/* override any previous pending move */
 | 
			
		||||
	view->pending_move_resize.x = x;
 | 
			
		||||
	view->pending_move_resize.y = y;
 | 
			
		||||
	view->pending.x = x;
 | 
			
		||||
	view->pending.y = y;
 | 
			
		||||
 | 
			
		||||
	view_moved(view);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -286,8 +282,8 @@ position_xdg_toplevel_view(struct view *view)
 | 
			
		|||
	if (!parent_xdg_toplevel) {
 | 
			
		||||
		struct wlr_box box =
 | 
			
		||||
			output_usable_area_from_cursor_coords(view->server);
 | 
			
		||||
		view->x = box.x;
 | 
			
		||||
		view->y = box.y;
 | 
			
		||||
		view->current.x = box.x;
 | 
			
		||||
		view->current.y = box.y;
 | 
			
		||||
 | 
			
		||||
		/* Center the view without touching its w and h fields. This means we
 | 
			
		||||
		 * can't simply set w/h and call view_center().  w and h fields should
 | 
			
		||||
| 
						 | 
				
			
			@ -310,15 +306,17 @@ position_xdg_toplevel_view(struct view *view)
 | 
			
		|||
		struct view *parent = lookup_view_by_xdg_toplevel(
 | 
			
		||||
			view->server, parent_xdg_toplevel);
 | 
			
		||||
		assert(parent);
 | 
			
		||||
		int center_x = parent->x + parent->w / 2;
 | 
			
		||||
		int center_y = parent->y + parent->h / 2;
 | 
			
		||||
		view->x = center_x - xdg_surface->current.geometry.width / 2;
 | 
			
		||||
		view->y = center_y - xdg_surface->current.geometry.height / 2;
 | 
			
		||||
		int center_x = parent->current.x + parent->current.width / 2;
 | 
			
		||||
		int center_y = parent->current.y + parent->current.height / 2;
 | 
			
		||||
		view->current.x = center_x
 | 
			
		||||
			- xdg_surface->current.geometry.width / 2;
 | 
			
		||||
		view->current.y = center_y
 | 
			
		||||
			- xdg_surface->current.geometry.height / 2;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	struct border margin = ssd_get_margin(view->ssd);
 | 
			
		||||
	view->x += margin.left;
 | 
			
		||||
	view->y += margin.top;
 | 
			
		||||
	view->current.x += margin.left;
 | 
			
		||||
	view->current.y += margin.top;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,24 +109,19 @@ xwayland_surface_from_view(struct view *view)
 | 
			
		|||
static void
 | 
			
		||||
ensure_initial_geometry(struct view *view)
 | 
			
		||||
{
 | 
			
		||||
	if (!view->w || !view->h) {
 | 
			
		||||
	if (wlr_box_empty(&view->current)) {
 | 
			
		||||
		struct wlr_xwayland_surface *xwayland_surface =
 | 
			
		||||
			xwayland_surface_from_view(view);
 | 
			
		||||
		view->x = xwayland_surface->x;
 | 
			
		||||
		view->y = xwayland_surface->y;
 | 
			
		||||
		view->w = xwayland_surface->width;
 | 
			
		||||
		view->h = xwayland_surface->height;
 | 
			
		||||
		view->current.x = xwayland_surface->x;
 | 
			
		||||
		view->current.y = xwayland_surface->y;
 | 
			
		||||
		view->current.width = xwayland_surface->width;
 | 
			
		||||
		view->current.height = xwayland_surface->height;
 | 
			
		||||
		/*
 | 
			
		||||
		 * If there is no pending move/resize yet, then set
 | 
			
		||||
		 * current values (used in map()).
 | 
			
		||||
		 */
 | 
			
		||||
		struct view_pending_move_resize *pending =
 | 
			
		||||
			&view->pending_move_resize;
 | 
			
		||||
		if (!pending->width || !pending->height) {
 | 
			
		||||
			pending->x = view->x;
 | 
			
		||||
			pending->y = view->y;
 | 
			
		||||
			pending->width = view->w;
 | 
			
		||||
			pending->height = view->h;
 | 
			
		||||
		if (wlr_box_empty(&view->pending)) {
 | 
			
		||||
			view->pending = view->current;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -146,22 +141,23 @@ handle_commit(struct wl_listener *listener, void *data)
 | 
			
		|||
 | 
			
		||||
	/* Must receive commit signal before accessing surface->current* */
 | 
			
		||||
	struct wlr_surface_state *state = &view->surface->current;
 | 
			
		||||
	struct view_pending_move_resize *pending = &view->pending_move_resize;
 | 
			
		||||
	struct wlr_box *current = &view->current;
 | 
			
		||||
	struct wlr_box *pending = &view->pending;
 | 
			
		||||
 | 
			
		||||
	if (view->w == state->width && view->h == state->height) {
 | 
			
		||||
	if (current->width == state->width && current->height == state->height) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	view->w = state->width;
 | 
			
		||||
	view->h = state->height;
 | 
			
		||||
	current->width = state->width;
 | 
			
		||||
	current->height = state->height;
 | 
			
		||||
 | 
			
		||||
	if (view->x != pending->x) {
 | 
			
		||||
	if (current->x != pending->x) {
 | 
			
		||||
		/* Adjust x for queued up configure events */
 | 
			
		||||
		view->x = pending->x + pending->width - view->w;
 | 
			
		||||
		current->x = pending->x + pending->width - current->width;
 | 
			
		||||
	}
 | 
			
		||||
	if (view->y != pending->y) {
 | 
			
		||||
	if (current->y != pending->y) {
 | 
			
		||||
		/* Adjust y for queued up configure events */
 | 
			
		||||
		view->y = pending->y + pending->height - view->h;
 | 
			
		||||
		current->y = pending->y + pending->height - current->height;
 | 
			
		||||
	}
 | 
			
		||||
	view_moved(view);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -284,18 +280,15 @@ handle_destroy(struct wl_listener *listener, void *data)
 | 
			
		|||
static void
 | 
			
		||||
configure(struct view *view, struct wlr_box geo)
 | 
			
		||||
{
 | 
			
		||||
	view->pending_move_resize.x = geo.x;
 | 
			
		||||
	view->pending_move_resize.y = geo.y;
 | 
			
		||||
	view->pending_move_resize.width = geo.width;
 | 
			
		||||
	view->pending_move_resize.height = geo.height;
 | 
			
		||||
 | 
			
		||||
	view->pending = geo;
 | 
			
		||||
	wlr_xwayland_surface_configure(xwayland_surface_from_view(view),
 | 
			
		||||
		geo.x, geo.y, geo.width, geo.height);
 | 
			
		||||
 | 
			
		||||
	/* If not resizing, process the move immediately */
 | 
			
		||||
	if (view->w == geo.width && view->h == geo.height) {
 | 
			
		||||
		view->x = geo.x;
 | 
			
		||||
		view->y = geo.y;
 | 
			
		||||
	if (view->current.width == geo.width
 | 
			
		||||
			&& view->current.height == geo.height) {
 | 
			
		||||
		view->current.x = geo.x;
 | 
			
		||||
		view->current.y = geo.y;
 | 
			
		||||
		view_moved(view);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -396,12 +389,12 @@ handle_set_class(struct wl_listener *listener, void *data)
 | 
			
		|||
static void
 | 
			
		||||
move(struct view *view, int x, int y)
 | 
			
		||||
{
 | 
			
		||||
	view->x = x;
 | 
			
		||||
	view->y = y;
 | 
			
		||||
	view->current.x = x;
 | 
			
		||||
	view->current.y = y;
 | 
			
		||||
 | 
			
		||||
	/* override any previous pending move */
 | 
			
		||||
	view->pending_move_resize.x = x;
 | 
			
		||||
	view->pending_move_resize.y = y;
 | 
			
		||||
	view->pending.x = x;
 | 
			
		||||
	view->pending.y = y;
 | 
			
		||||
 | 
			
		||||
	struct wlr_xwayland_surface *s = xwayland_surface_from_view(view);
 | 
			
		||||
	wlr_xwayland_surface_configure(s, (int16_t)x, (int16_t)y,
 | 
			
		||||
| 
						 | 
				
			
			@ -479,8 +472,8 @@ set_initial_position(struct view *view,
 | 
			
		|||
	} else {
 | 
			
		||||
		struct wlr_box box =
 | 
			
		||||
			output_usable_area_from_cursor_coords(view->server);
 | 
			
		||||
		view->x = box.x;
 | 
			
		||||
		view->y = box.y;
 | 
			
		||||
		view->current.x = box.x;
 | 
			
		||||
		view->current.y = box.y;
 | 
			
		||||
		view_center(view);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -490,15 +483,12 @@ top_left_edge_boundary_check(struct view *view)
 | 
			
		|||
{
 | 
			
		||||
	struct wlr_box deco = ssd_max_extents(view);
 | 
			
		||||
	if (deco.x < 0) {
 | 
			
		||||
		view->x -= deco.x;
 | 
			
		||||
		view->current.x -= deco.x;
 | 
			
		||||
	}
 | 
			
		||||
	if (deco.y < 0) {
 | 
			
		||||
		view->y -= deco.y;
 | 
			
		||||
		view->current.y -= deco.y;
 | 
			
		||||
	}
 | 
			
		||||
	struct wlr_box box = {
 | 
			
		||||
		.x = view->x, .y = view->y, .width = view->w, .height = view->h
 | 
			
		||||
	};
 | 
			
		||||
	view->impl->configure(view, box);
 | 
			
		||||
	view->impl->configure(view, view->current);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
| 
						 | 
				
			
			@ -554,10 +544,7 @@ map(struct view *view)
 | 
			
		|||
		 * the final intended position/size rather than waiting
 | 
			
		||||
		 * for handle_commit().
 | 
			
		||||
		 */
 | 
			
		||||
		view->x = view->pending_move_resize.x;
 | 
			
		||||
		view->y = view->pending_move_resize.y;
 | 
			
		||||
		view->w = view->pending_move_resize.width;
 | 
			
		||||
		view->h = view->pending_move_resize.height;
 | 
			
		||||
		view->current = view->pending;
 | 
			
		||||
		view_moved(view);
 | 
			
		||||
		view->been_mapped = true;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue