1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
From 7277f668f19f5a7fcfbbc96e80cb2829487848ca Mon Sep 17 00:00:00 2001
From: korei999 <ju7t1xe@gmail.com>
Date: Mon, 1 Apr 2024 15:13:11 +0300
Subject: [PATCH] handle minimize request for xwayland clients
---
client.h | 9 ++++++---
dwl.c | 19 +++++++++++++++++++
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/client.h b/client.h
index 800b867..c46cfb2 100644
--- a/client.h
+++ b/client.h
@@ -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
diff --git a/dwl.c b/dwl.c
index 39ce68c..b49f57b 100644
--- a/dwl.c
+++ b/dwl.c
@@ -131,6 +131,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;
@@ -412,6 +413,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;
@@ -1177,6 +1179,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
@@ -2984,6 +2987,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);
@@ -3011,6 +3015,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)
{
--
2.44.0
|