mirror of
				https://codeberg.org/dwl/dwl.git
				synced 2025-11-03 09:01:45 -05:00 
			
		
		
		
	merge toplevel_from_{wlr_layer_surface,popup} into client_from_wlr_surface
now it is a big function called toplevel_from_wlr_surface
This commit is contained in:
		
							parent
							
								
									c56bc42eb5
								
							
						
					
					
						commit
						38bd00351a
					
				
					 2 changed files with 52 additions and 66 deletions
				
			
		
							
								
								
									
										108
									
								
								client.h
									
										
									
									
									
								
							
							
						
						
									
										108
									
								
								client.h
									
										
									
									
									
								
							| 
						 | 
					@ -16,27 +16,6 @@ client_is_x11(Client *c)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline Client *
 | 
					 | 
				
			||||||
client_from_wlr_surface(struct wlr_surface *s)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct wlr_xdg_surface *surface;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef XWAYLAND
 | 
					 | 
				
			||||||
	struct wlr_xwayland_surface *xsurface;
 | 
					 | 
				
			||||||
	if (s && wlr_surface_is_xwayland_surface(s)
 | 
					 | 
				
			||||||
			&& (xsurface = wlr_xwayland_surface_from_wlr_surface(s)))
 | 
					 | 
				
			||||||
		return xsurface->data;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	if (s && wlr_surface_is_xdg_surface(s)
 | 
					 | 
				
			||||||
			&& (surface = wlr_xdg_surface_from_wlr_surface(s))
 | 
					 | 
				
			||||||
			&& surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL)
 | 
					 | 
				
			||||||
		return surface->data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (s && wlr_surface_is_subsurface(s))
 | 
					 | 
				
			||||||
		return client_from_wlr_surface(wlr_surface_get_root_surface(s));
 | 
					 | 
				
			||||||
	return NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline void
 | 
					static inline void
 | 
				
			||||||
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
 | 
					client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -72,6 +51,53 @@ client_surface(Client *c)
 | 
				
			||||||
	return c->surface.xdg->surface;
 | 
						return c->surface.xdg->surface;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void *
 | 
				
			||||||
 | 
					toplevel_from_wlr_surface(struct wlr_surface *s)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct wlr_xdg_surface *xdg_surface;
 | 
				
			||||||
 | 
						struct wlr_surface *root_surface;
 | 
				
			||||||
 | 
						struct wlr_layer_surface_v1 *layer_surface;
 | 
				
			||||||
 | 
					#ifdef XWAYLAND
 | 
				
			||||||
 | 
						struct wlr_xwayland_surface *xsurface;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!s)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						root_surface = wlr_surface_get_root_surface(s);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef XWAYLAND
 | 
				
			||||||
 | 
						if (wlr_surface_is_xwayland_surface(root_surface)
 | 
				
			||||||
 | 
								&& (xsurface = wlr_xwayland_surface_from_wlr_surface(root_surface)))
 | 
				
			||||||
 | 
							return xsurface->data;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (wlr_surface_is_layer_surface(root_surface)
 | 
				
			||||||
 | 
								&& (layer_surface = wlr_layer_surface_v1_from_wlr_surface(root_surface)))
 | 
				
			||||||
 | 
							return layer_surface->data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (wlr_surface_is_xdg_surface(root_surface)
 | 
				
			||||||
 | 
								&& (xdg_surface = wlr_xdg_surface_from_wlr_surface(root_surface))) {
 | 
				
			||||||
 | 
							while (1) {
 | 
				
			||||||
 | 
								switch (xdg_surface->role) {
 | 
				
			||||||
 | 
								case WLR_XDG_SURFACE_ROLE_POPUP:
 | 
				
			||||||
 | 
									if (!xdg_surface->popup->parent)
 | 
				
			||||||
 | 
										return NULL;
 | 
				
			||||||
 | 
									else if (!wlr_surface_is_xdg_surface(xdg_surface->popup->parent))
 | 
				
			||||||
 | 
										return toplevel_from_wlr_surface(xdg_surface->popup->parent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									xdg_surface = wlr_xdg_surface_from_wlr_surface(xdg_surface->popup->parent);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
 | 
				
			||||||
 | 
										return xdg_surface->data;
 | 
				
			||||||
 | 
								case WLR_XDG_SURFACE_ROLE_NONE:
 | 
				
			||||||
 | 
									return NULL;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* The others */
 | 
					/* The others */
 | 
				
			||||||
static inline void
 | 
					static inline void
 | 
				
			||||||
client_activate_surface(struct wlr_surface *s, int activated)
 | 
					client_activate_surface(struct wlr_surface *s, int activated)
 | 
				
			||||||
| 
						 | 
					@ -320,43 +346,3 @@ client_wants_fullscreen(Client *c)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	return c->surface.xdg->toplevel->requested.fullscreen;
 | 
						return c->surface.xdg->toplevel->requested.fullscreen;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline void *
 | 
					 | 
				
			||||||
toplevel_from_popup(struct wlr_xdg_popup *popup)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct wlr_xdg_surface *surface = popup->base;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	while (1) {
 | 
					 | 
				
			||||||
		switch (surface->role) {
 | 
					 | 
				
			||||||
		case WLR_XDG_SURFACE_ROLE_POPUP:
 | 
					 | 
				
			||||||
			if (!surface->popup->parent)
 | 
					 | 
				
			||||||
				return NULL;
 | 
					 | 
				
			||||||
			else if (wlr_surface_is_layer_surface(surface->popup->parent))
 | 
					 | 
				
			||||||
				return wlr_layer_surface_v1_from_wlr_surface(surface->popup->parent)->data;
 | 
					 | 
				
			||||||
			else if (!wlr_surface_is_xdg_surface(surface->popup->parent))
 | 
					 | 
				
			||||||
				return NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			surface = wlr_xdg_surface_from_wlr_surface(surface->popup->parent);
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
 | 
					 | 
				
			||||||
				return surface->data;
 | 
					 | 
				
			||||||
		case WLR_XDG_SURFACE_ROLE_NONE:
 | 
					 | 
				
			||||||
			return NULL;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline void *
 | 
					 | 
				
			||||||
toplevel_from_wlr_layer_surface(struct wlr_surface *s)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	Client *c;
 | 
					 | 
				
			||||||
	struct wlr_layer_surface_v1 *wlr_layer_surface;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ((c = client_from_wlr_surface(s)))
 | 
					 | 
				
			||||||
		return c;
 | 
					 | 
				
			||||||
	else if (s && wlr_surface_is_layer_surface(s)
 | 
					 | 
				
			||||||
			&& (wlr_layer_surface = wlr_layer_surface_v1_from_wlr_surface(s)))
 | 
					 | 
				
			||||||
		return wlr_layer_surface->data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								dwl.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								dwl.c
									
										
									
									
									
								
							| 
						 | 
					@ -908,7 +908,7 @@ createnotify(struct wl_listener *listener, void *data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
 | 
						if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
 | 
				
			||||||
		struct wlr_box box;
 | 
							struct wlr_box box;
 | 
				
			||||||
		LayerSurface *l = toplevel_from_popup(xdg_surface->popup);
 | 
							LayerSurface *l = toplevel_from_wlr_surface(xdg_surface->surface);
 | 
				
			||||||
		if (!xdg_surface->popup->parent)
 | 
							if (!xdg_surface->popup->parent)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		xdg_surface->surface->data = wlr_scene_xdg_surface_create(
 | 
							xdg_surface->surface->data = wlr_scene_xdg_surface_create(
 | 
				
			||||||
| 
						 | 
					@ -1096,7 +1096,7 @@ focusclient(Client *c, int lift)
 | 
				
			||||||
		/* If an overlay is focused, don't focus or activate the client,
 | 
							/* If an overlay is focused, don't focus or activate the client,
 | 
				
			||||||
		 * but only update its position in fstack to render its border with focuscolor
 | 
							 * but only update its position in fstack to render its border with focuscolor
 | 
				
			||||||
		 * and focus it after the overlay is closed. */
 | 
							 * and focus it after the overlay is closed. */
 | 
				
			||||||
		Client *w = client_from_wlr_surface(old);
 | 
							Client *w = toplevel_from_wlr_surface(old);
 | 
				
			||||||
		if (wlr_surface_is_layer_surface(old)) {
 | 
							if (wlr_surface_is_layer_surface(old)) {
 | 
				
			||||||
			struct wlr_layer_surface_v1 *wlr_layer_surface =
 | 
								struct wlr_layer_surface_v1 *wlr_layer_surface =
 | 
				
			||||||
				wlr_layer_surface_v1_from_wlr_surface(old);
 | 
									wlr_layer_surface_v1_from_wlr_surface(old);
 | 
				
			||||||
| 
						 | 
					@ -1472,7 +1472,7 @@ motionnotify(uint32_t time)
 | 
				
			||||||
	xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy);
 | 
						xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (cursor_mode == CurPressed && !seat->drag) {
 | 
						if (cursor_mode == CurPressed && !seat->drag) {
 | 
				
			||||||
		if ((l = toplevel_from_wlr_layer_surface(
 | 
							if ((l = toplevel_from_wlr_surface(
 | 
				
			||||||
				 seat->pointer_state.focused_surface))) {
 | 
									 seat->pointer_state.focused_surface))) {
 | 
				
			||||||
			surface = seat->pointer_state.focused_surface;
 | 
								surface = seat->pointer_state.focused_surface;
 | 
				
			||||||
			sx = cursor->x - l->geom.x;
 | 
								sx = cursor->x - l->geom.x;
 | 
				
			||||||
| 
						 | 
					@ -2357,8 +2357,8 @@ void
 | 
				
			||||||
urgent(struct wl_listener *listener, void *data)
 | 
					urgent(struct wl_listener *listener, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct wlr_xdg_activation_v1_request_activate_event *event = data;
 | 
						struct wlr_xdg_activation_v1_request_activate_event *event = data;
 | 
				
			||||||
	Client *c = client_from_wlr_surface(event->surface);
 | 
						Client *c = toplevel_from_wlr_surface(event->surface);
 | 
				
			||||||
	if (c && c != selclient()) {
 | 
						if (c && c->type != LayerShell && c != selclient()) {
 | 
				
			||||||
		c->isurgent = 1;
 | 
							c->isurgent = 1;
 | 
				
			||||||
		printstatus();
 | 
							printstatus();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue