~ruther/dwl

38bd00351a444d37184716d6124bb47817758bc9 — Leonardo Hernández Hernández 2 years ago c56bc42
merge toplevel_from_{wlr_layer_surface,popup} into client_from_wlr_surface

now it is a big function called toplevel_from_wlr_surface
2 files changed, 52 insertions(+), 66 deletions(-)

M client.h
M dwl.c
M client.h => client.h +47 -61
@@ 16,27 16,6 @@ client_is_x11(Client *c)
#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
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;
}

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 */
static inline void
client_activate_surface(struct wlr_surface *s, int activated)


@@ 320,43 346,3 @@ client_wants_fullscreen(Client *c)
#endif
	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;
}

M dwl.c => dwl.c +5 -5
@@ 908,7 908,7 @@ createnotify(struct wl_listener *listener, void *data)

	if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
		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)
			return;
		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,
		 * but only update its position in fstack to render its border with focuscolor
		 * 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)) {
			struct wlr_layer_surface_v1 *wlr_layer_surface =
				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);

	if (cursor_mode == CurPressed && !seat->drag) {
		if ((l = toplevel_from_wlr_layer_surface(
		if ((l = toplevel_from_wlr_surface(
				 seat->pointer_state.focused_surface))) {
			surface = seat->pointer_state.focused_surface;
			sx = cursor->x - l->geom.x;


@@ 2357,8 2357,8 @@ void
urgent(struct wl_listener *listener, void *data)
{
	struct wlr_xdg_activation_v1_request_activate_event *event = data;
	Client *c = client_from_wlr_surface(event->surface);
	if (c && c != selclient()) {
	Client *c = toplevel_from_wlr_surface(event->surface);
	if (c && c->type != LayerShell && c != selclient()) {
		c->isurgent = 1;
		printstatus();
	}

Do not follow this link