aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/tree/view.h1
-rw-r--r--sway/desktop/xwayland.c25
2 files changed, 26 insertions, 0 deletions
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
index 665c516f..a32f5907 100644
--- a/include/sway/tree/view.h
+++ b/include/sway/tree/view.h
@@ -147,6 +147,7 @@ struct sway_xwayland_view {
struct wl_listener request_move;
struct wl_listener request_resize;
struct wl_listener request_maximize;
+ struct wl_listener request_minimize;
struct wl_listener request_configure;
struct wl_listener request_fullscreen;
struct wl_listener request_activate;
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index c972fd3a..db21dc78 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -222,6 +222,11 @@ static void set_activated(struct sway_view *view, bool activated) {
return;
}
struct wlr_xwayland_surface *surface = view->wlr_xwayland_surface;
+
+ if (activated && surface->minimized) {
+ wlr_xwayland_surface_set_minimized(surface, false);
+ }
+
wlr_xwayland_surface_activate(surface, activated);
}
@@ -406,6 +411,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
wl_list_remove(&xwayland_view->destroy.link);
wl_list_remove(&xwayland_view->request_configure.link);
wl_list_remove(&xwayland_view->request_fullscreen.link);
+ wl_list_remove(&xwayland_view->request_minimize.link);
wl_list_remove(&xwayland_view->request_move.link);
wl_list_remove(&xwayland_view->request_resize.link);
wl_list_remove(&xwayland_view->request_activate.link);
@@ -508,6 +514,21 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data)
transaction_commit_dirty();
}
+static void handle_request_minimize(struct wl_listener *listener, void *data) {
+ struct sway_xwayland_view *xwayland_view =
+ wl_container_of(listener, xwayland_view, request_minimize);
+ struct sway_view *view = &xwayland_view->view;
+ struct wlr_xwayland_surface *xsurface = view->wlr_xwayland_surface;
+ if (!xsurface->mapped) {
+ return;
+ }
+
+ struct wlr_xwayland_minimize_event *e = data;
+ struct sway_seat *seat = input_manager_current_seat();
+ bool focused = seat_get_focus(seat) == &view->container->node;
+ wlr_xwayland_surface_set_minimized(xsurface, !focused && e->minimize);
+}
+
static void handle_request_move(struct wl_listener *listener, void *data) {
struct sway_xwayland_view *xwayland_view =
wl_container_of(listener, xwayland_view, request_move);
@@ -653,6 +674,10 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
&xwayland_view->request_fullscreen);
xwayland_view->request_fullscreen.notify = handle_request_fullscreen;
+ wl_signal_add(&xsurface->events.request_minimize,
+ &xwayland_view->request_minimize);
+ xwayland_view->request_minimize.notify = handle_request_minimize;
+
wl_signal_add(&xsurface->events.request_activate,
&xwayland_view->request_activate);
xwayland_view->request_activate.notify = handle_request_activate;