mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	Adjust xdg-shell view position on first map
This commit is contained in:
		
							parent
							
								
									0eb64a29aa
								
							
						
					
					
						commit
						6e0d11bff5
					
				
					 5 changed files with 50 additions and 35 deletions
				
			
		| 
						 | 
					@ -34,7 +34,7 @@
 | 
				
			||||||
#define XCURSOR_MOVE "grabbing"
 | 
					#define XCURSOR_MOVE "grabbing"
 | 
				
			||||||
#define XWL_TITLEBAR_HEIGHT (10)
 | 
					#define XWL_TITLEBAR_HEIGHT (10)
 | 
				
			||||||
#define XWL_WINDOW_BORDER (3)
 | 
					#define XWL_WINDOW_BORDER (3)
 | 
				
			||||||
#define LAB_DISABLE_CSD (1)
 | 
					#define LAB_DISABLE_CSD (0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum cursor_mode {
 | 
					enum cursor_mode {
 | 
				
			||||||
	LAB_CURSOR_PASSTHROUGH,
 | 
						LAB_CURSOR_PASSTHROUGH,
 | 
				
			||||||
| 
						 | 
					@ -137,6 +137,7 @@ void xdg_surface_new(struct wl_listener *listener, void *data);
 | 
				
			||||||
int xwl_nr_parents(struct view *view);
 | 
					int xwl_nr_parents(struct view *view);
 | 
				
			||||||
void xwl_surface_new(struct wl_listener *listener, void *data);
 | 
					void xwl_surface_new(struct wl_listener *listener, void *data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void view_init_position(struct view *view);
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * view_get_surface_geometry - geometry relative to view
 | 
					 * view_get_surface_geometry - geometry relative to view
 | 
				
			||||||
 * @view: toplevel containing the surface to process
 | 
					 * @view: toplevel containing the surface to process
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/deco.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/deco.c
									
										
									
									
									
								
							| 
						 | 
					@ -29,26 +29,28 @@ struct wlr_box deco_box(struct view *view, enum deco_part deco_part)
 | 
				
			||||||
		box.y = view->y - XWL_TITLEBAR_HEIGHT - XWL_WINDOW_BORDER;
 | 
							box.y = view->y - XWL_TITLEBAR_HEIGHT - XWL_WINDOW_BORDER;
 | 
				
			||||||
		box.width =
 | 
							box.width =
 | 
				
			||||||
			view->surface->current.width + 2 * XWL_WINDOW_BORDER;
 | 
								view->surface->current.width + 2 * XWL_WINDOW_BORDER;
 | 
				
			||||||
		box.height = + XWL_WINDOW_BORDER;
 | 
							box.height = XWL_WINDOW_BORDER;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case LAB_DECO_PART_RIGHT:
 | 
						case LAB_DECO_PART_RIGHT:
 | 
				
			||||||
		box.x = view->x + view->surface->current.width;
 | 
							box.x = view->x + view->surface->current.width;
 | 
				
			||||||
		box.y = view->y - XWL_TITLEBAR_HEIGHT;
 | 
							box.y = view->y - XWL_TITLEBAR_HEIGHT;
 | 
				
			||||||
		box.width = XWL_WINDOW_BORDER;
 | 
							box.width = XWL_WINDOW_BORDER;
 | 
				
			||||||
		box.height = view->surface->current.height + XWL_TITLEBAR_HEIGHT;
 | 
							box.height =
 | 
				
			||||||
 | 
								view->surface->current.height + XWL_TITLEBAR_HEIGHT;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case LAB_DECO_PART_BOTTOM:
 | 
						case LAB_DECO_PART_BOTTOM:
 | 
				
			||||||
		box.x = view->x - XWL_WINDOW_BORDER;
 | 
							box.x = view->x - XWL_WINDOW_BORDER;
 | 
				
			||||||
		box.y = view->y + view->surface->current.height;
 | 
							box.y = view->y + view->surface->current.height;
 | 
				
			||||||
		box.width =
 | 
							box.width =
 | 
				
			||||||
			view->surface->current.width + 2 * XWL_WINDOW_BORDER;
 | 
								view->surface->current.width + 2 * XWL_WINDOW_BORDER;
 | 
				
			||||||
		box.height = + XWL_WINDOW_BORDER;
 | 
							box.height = +XWL_WINDOW_BORDER;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case LAB_DECO_PART_LEFT:
 | 
						case LAB_DECO_PART_LEFT:
 | 
				
			||||||
		box.x = view->x - XWL_WINDOW_BORDER;
 | 
							box.x = view->x - XWL_WINDOW_BORDER;
 | 
				
			||||||
		box.y = view->y - XWL_TITLEBAR_HEIGHT;
 | 
							box.y = view->y - XWL_TITLEBAR_HEIGHT;
 | 
				
			||||||
		box.width = XWL_WINDOW_BORDER;
 | 
							box.width = XWL_WINDOW_BORDER;
 | 
				
			||||||
		box.height = view->surface->current.height + XWL_TITLEBAR_HEIGHT;
 | 
							box.height =
 | 
				
			||||||
 | 
								view->surface->current.height + XWL_TITLEBAR_HEIGHT;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										49
									
								
								src/view.c
									
										
									
									
									
								
							
							
						
						
									
										49
									
								
								src/view.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,5 +1,42 @@
 | 
				
			||||||
#include "labwc.h"
 | 
					#include "labwc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool is_toplevel(struct view *view)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch (view->type) {
 | 
				
			||||||
 | 
						case LAB_XDG_SHELL_VIEW:
 | 
				
			||||||
 | 
							return view->xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL;
 | 
				
			||||||
 | 
						case LAB_XWAYLAND_VIEW:
 | 
				
			||||||
 | 
							return xwl_nr_parents(view) > 0 ? false : true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void view_init_position(struct view *view)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* If surface already has a 'desired' position, don't touch it */
 | 
				
			||||||
 | 
						if (view->x || view->y)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						if (!is_toplevel(view))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						struct wlr_box box;
 | 
				
			||||||
 | 
						if (view->type == LAB_XDG_SHELL_VIEW && !LAB_DISABLE_CSD) {
 | 
				
			||||||
 | 
							/* CSD */
 | 
				
			||||||
 | 
							wlr_xdg_surface_get_geometry(view->xdg_surface, &box);
 | 
				
			||||||
 | 
						} else if (!view_want_deco(view)) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							/* SSD */
 | 
				
			||||||
 | 
							box = deco_max_extents(view);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						view->x -= box.x;
 | 
				
			||||||
 | 
						view->y -= box.y;
 | 
				
			||||||
 | 
						if (view->type != LAB_XWAYLAND_VIEW)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						wlr_xwayland_surface_configure(view->xwayland_surface, view->x, view->y,
 | 
				
			||||||
 | 
									       view->xwayland_surface->width,
 | 
				
			||||||
 | 
									       view->xwayland_surface->height);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_box view_get_surface_geometry(struct view *view)
 | 
					struct wlr_box view_get_surface_geometry(struct view *view)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct wlr_box box = { 0 };
 | 
						struct wlr_box box = { 0 };
 | 
				
			||||||
| 
						 | 
					@ -46,17 +83,7 @@ void view_resize(struct view *view, struct wlr_box geo)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool is_toplevel(struct view *view)
 | 
					/* Do we want _server_ side decoration? */
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	switch (view->type) {
 | 
					 | 
				
			||||||
	case LAB_XDG_SHELL_VIEW:
 | 
					 | 
				
			||||||
		return view->xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL;
 | 
					 | 
				
			||||||
	case LAB_XWAYLAND_VIEW:
 | 
					 | 
				
			||||||
		return xwl_nr_parents(view) > 0 ? false : true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool view_want_deco(struct view *view)
 | 
					bool view_want_deco(struct view *view)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!is_toplevel(view))
 | 
						if (!is_toplevel(view))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,11 +49,12 @@ void xdg_toplevel_decoration(struct wl_listener *listener, void *data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void xdg_surface_map(struct wl_listener *listener, void *data)
 | 
					void xdg_surface_map(struct wl_listener *listener, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Called when the surface is mapped, or ready to display on-screen. */
 | 
					 | 
				
			||||||
	struct view *view = wl_container_of(listener, view, map);
 | 
						struct view *view = wl_container_of(listener, view, map);
 | 
				
			||||||
	view->mapped = true;
 | 
						view->mapped = true;
 | 
				
			||||||
	view->been_mapped = true;
 | 
					 | 
				
			||||||
	view->surface = view->xdg_surface->surface;
 | 
						view->surface = view->xdg_surface->surface;
 | 
				
			||||||
 | 
						if (!view->been_mapped)
 | 
				
			||||||
 | 
							view_init_position(view);
 | 
				
			||||||
 | 
						view->been_mapped = true;
 | 
				
			||||||
	view_focus(view);
 | 
						view_focus(view);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										18
									
								
								src/xwl.c
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								src/xwl.c
									
										
									
									
									
								
							| 
						 | 
					@ -16,22 +16,6 @@ int xwl_nr_parents(struct view *view)
 | 
				
			||||||
	return i;
 | 
						return i;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void position(struct view *view)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct wlr_box box;
 | 
					 | 
				
			||||||
	if (!view_want_deco(view))
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	if (view->x || view->y)
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	box = deco_box(view, LAB_DECO_PART_TITLE);
 | 
					 | 
				
			||||||
	view->y = box.height;
 | 
					 | 
				
			||||||
	box = deco_box(view, LAB_DECO_PART_LEFT);
 | 
					 | 
				
			||||||
	view->x = box.width;
 | 
					 | 
				
			||||||
	wlr_xwayland_surface_configure(view->xwayland_surface, view->x, view->y,
 | 
					 | 
				
			||||||
				       view->xwayland_surface->width,
 | 
					 | 
				
			||||||
				       view->xwayland_surface->height);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void xwl_surface_map(struct wl_listener *listener, void *data)
 | 
					void xwl_surface_map(struct wl_listener *listener, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct view *view = wl_container_of(listener, view, map);
 | 
						struct view *view = wl_container_of(listener, view, map);
 | 
				
			||||||
| 
						 | 
					@ -40,7 +24,7 @@ void xwl_surface_map(struct wl_listener *listener, void *data)
 | 
				
			||||||
	view->y = view->xwayland_surface->y;
 | 
						view->y = view->xwayland_surface->y;
 | 
				
			||||||
	view->surface = view->xwayland_surface->surface;
 | 
						view->surface = view->xwayland_surface->surface;
 | 
				
			||||||
	if (!view->been_mapped)
 | 
						if (!view->been_mapped)
 | 
				
			||||||
		position(view);
 | 
							view_init_position(view);
 | 
				
			||||||
	view->been_mapped = true;
 | 
						view->been_mapped = true;
 | 
				
			||||||
	view_focus(view);
 | 
						view_focus(view);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue