diff options
| author | Leonardo Hernández Hernández <leohdz172@protonmail.com> | 2022-03-21 13:52:33 -0600 | 
|---|---|---|
| committer | Leonardo Hernández Hernández <leohdz172@protonmail.com> | 2022-03-21 14:21:31 -0600 | 
| commit | c50f187c1f784c010b1261848fade72b9401b28f (patch) | |
| tree | 1b81687c19f997b07fa3dc5f4f1c99ad8b90ce80 | |
| parent | 0dea553428c8c534ea8bbb914b1ec775cf36e4d5 (diff) | |
improve floating detection
mostly copied from sway
| -rw-r--r-- | client.h | 35 | 
1 files changed, 28 insertions, 7 deletions
| @@ -91,16 +91,37 @@ client_get_title(Client *c)  static inline int  client_is_float_type(Client *c)  { +	struct wlr_xdg_toplevel *toplevel; +	struct wlr_xdg_toplevel_state state; +  #ifdef XWAYLAND -	if (client_is_x11(c)) -		for (size_t i = 0; i < c->surface.xwayland->window_type_len; i++) -			if (c->surface.xwayland->window_type[i] == netatom[NetWMWindowTypeDialog] || -					c->surface.xwayland->window_type[i] == netatom[NetWMWindowTypeSplash] || -					c->surface.xwayland->window_type[i] == netatom[NetWMWindowTypeToolbar] || -					c->surface.xwayland->window_type[i] == netatom[NetWMWindowTypeUtility]) +	if (client_is_x11(c)) { +		struct wlr_xwayland_surface *surface = c->surface.xwayland; +		struct wlr_xwayland_surface_size_hints *size_hints; +		if (surface->modal) +			return 1; + +		for (size_t i = 0; i < surface->window_type_len; i++) +			if (surface->window_type[i] == netatom[NetWMWindowTypeDialog] || +					surface->window_type[i] == netatom[NetWMWindowTypeSplash] || +					surface->window_type[i] == netatom[NetWMWindowTypeToolbar] || +					surface->window_type[i] == netatom[NetWMWindowTypeUtility])  				return 1; + +		size_hints = surface->size_hints; +		if (size_hints && size_hints->min_width > 0 && size_hints->min_height > 0 +				&& (size_hints->max_width == size_hints->min_width || +				size_hints->max_height == size_hints->min_height)) +			return 1; +	}  #endif -	return 0; + +	toplevel = c->surface.xdg->toplevel; +	state = toplevel->current; +	return (state.min_width != 0 && state.min_height != 0 +		&& (state.min_width == state.max_width +		|| state.min_height == state.max_height)) +		|| toplevel->parent;  }  static inline int | 
