handle minimize request for xwayland clients

This commit is contained in:
korei999 2024-04-01 15:13:11 +03:00 committed by Alex Denes
parent d1df6217b1
commit e80135c9f1
Signed by: caskd
GPG Key ID: F92BA85F61F4C173
2 changed files with 25 additions and 3 deletions

View File

@ -94,9 +94,12 @@ client_activate_surface(struct wlr_surface *s, int activated)
{
struct wlr_xdg_toplevel *toplevel;
#ifdef XWAYLAND
struct wlr_xwayland_surface *xsurface;
if ((xsurface = wlr_xwayland_surface_try_from_wlr_surface(s))) {
wlr_xwayland_surface_activate(xsurface, activated);
struct wlr_xwayland_surface *surface;
if ((surface = wlr_xwayland_surface_try_from_wlr_surface(s))) {
if (activated && surface->minimized)
wlr_xwayland_surface_set_minimized(surface, false);
wlr_xwayland_surface_activate(surface, activated);
return;
}
#endif

19
dwl.c
View File

@ -136,6 +136,7 @@ typedef struct {
#ifdef XWAYLAND
struct wl_listener activate;
struct wl_listener associate;
struct wl_listener minimize;
struct wl_listener dissociate;
struct wl_listener configure;
struct wl_listener set_hints;
@ -441,6 +442,7 @@ static void configurex11(struct wl_listener *listener, void *data);
static void createnotifyx11(struct wl_listener *listener, void *data);
static void dissociatex11(struct wl_listener *listener, void *data);
static xcb_atom_t getatom(xcb_connection_t *xc, const char *name);
static void minimizenotify(struct wl_listener *listener, void *data);
static void sethints(struct wl_listener *listener, void *data);
static void xwaylandready(struct wl_listener *listener, void *data);
static struct wlr_xwayland *xwayland;
@ -1292,6 +1294,7 @@ destroynotify(struct wl_listener *listener, void *data)
wl_list_remove(&c->activate.link);
wl_list_remove(&c->associate.link);
wl_list_remove(&c->configure.link);
wl_list_remove(&c->minimize.link);
wl_list_remove(&c->dissociate.link);
wl_list_remove(&c->set_hints.link);
} else
@ -3271,6 +3274,7 @@ createnotifyx11(struct wl_listener *listener, void *data)
LISTEN(&xsurface->events.destroy, &c->destroy, destroynotify);
LISTEN(&xsurface->events.dissociate, &c->dissociate, dissociatex11);
LISTEN(&xsurface->events.request_activate, &c->activate, activatex11);
LISTEN(&xsurface->events.request_minimize, &c->minimize, minimizenotify);
LISTEN(&xsurface->events.request_configure, &c->configure, configurex11);
LISTEN(&xsurface->events.request_fullscreen, &c->fullscreen, fullscreennotify);
LISTEN(&xsurface->events.set_hints, &c->set_hints, sethints);
@ -3298,6 +3302,21 @@ getatom(xcb_connection_t *xc, const char *name)
return atom;
}
void
minimizenotify(struct wl_listener *listener, void *data)
{
Client *c = wl_container_of(listener, c, minimize);
struct wlr_xwayland_surface *xsurface = c->surface.xwayland;
struct wlr_xwayland_minimize_event *e = data;
int focused;
if (xsurface->surface == NULL || !xsurface->surface->mapped)
return;
focused = seat->keyboard_state.focused_surface == xsurface->surface;
wlr_xwayland_surface_set_minimized(xsurface, !focused && e->minimize);
}
void
sethints(struct wl_listener *listener, void *data)
{