diff options
| author | Leonardo Hernández Hernández <leohdz172@protonmail.com> | 2022-07-19 20:13:56 -0500 | 
|---|---|---|
| committer | Leonardo Hernández Hernández <leohdz172@protonmail.com> | 2022-07-19 20:13:56 -0500 | 
| commit | 90a12c90a0aa0ac16327b0816de4d9dff69b357e (patch) | |
| tree | 475cc52b6ce103f1ab04d9122dc73c65e47df9b7 | |
| parent | e0822926068e84b0fc391e0306f66ea0ec16cf47 (diff) | |
always set the same monitor and tags for child clients of a client
fixes #272
Diffstat (limited to '')
| -rw-r--r-- | client.h | 52 | ||||
| -rw-r--r-- | dwl.c | 11 | 
2 files changed, 42 insertions, 21 deletions
| @@ -26,6 +26,25 @@ client_surface(Client *c)  	return c->surface.xdg->surface;  } +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; + +	return NULL; +} +  /* The others */  static inline void  client_activate_surface(struct wlr_surface *s, int activated) @@ -117,6 +136,20 @@ client_get_title(Client *c)  	return c->surface.xdg->toplevel->title;  } +static inline Client * +client_get_parent(Client *c) +{ +	Client *p; +#ifdef XWAYLAND +	if (client_is_x11(c) && c->surface.xwayland->parent) +		return client_from_wlr_surface(c->surface.xwayland->parent->surface); +#endif +	if (c->surface.xdg->toplevel->parent) +		return client_from_wlr_surface(c->surface.xdg->toplevel->parent->surface); + +	return NULL; +} +  static inline int  client_is_float_type(Client *c)  { @@ -235,25 +268,6 @@ client_restack_surface(Client *c)  	return;  } -static inline Client * -client_from_wlr_surface(struct wlr_surface *s) -{ -	struct wlr_xdg_surface *surface; - -#ifdef XWAYLAND -	struct wlr_xwayland_surface *xsurface; -	if (wlr_surface_is_xwayland_surface(s) -			&& (xsurface = wlr_xwayland_surface_from_wlr_surface(s))) -		return xsurface->data; -#endif -	if (wlr_surface_is_xdg_surface(s) -			&& (surface = wlr_xdg_surface_from_wlr_surface(s)) -			&& surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) -		return surface->data; - -	return NULL; -} -  static inline void *  toplevel_from_popup(struct wlr_xdg_popup *popup)  { @@ -1388,7 +1388,7 @@ void  mapnotify(struct wl_listener *listener, void *data)  {  	/* Called when the surface is mapped, or ready to display on-screen. */ -	Client *c = wl_container_of(listener, c, map); +	Client *p, *c = wl_container_of(listener, c, map);  	int i;  	/* Create scene tree for this client and its border */ @@ -1432,7 +1432,14 @@ mapnotify(struct wl_listener *listener, void *data)  	wl_list_insert(&fstack, &c->flink);  	/* Set initial monitor, tags, floating status, and focus */ -	applyrules(c); +	if ((p = client_get_parent(c))) { +		/* Set the same monitor and tags than its parent */ +		c->isfloating = 1; +		wlr_scene_node_reparent(c->scene, layers[LyrFloat]); +		setmon(c, p->mon, p->tags); +	} else { +		applyrules(c); +	}  	printstatus();  	if (c->isfullscreen) | 
