sway

i3-compatible Wayland compositor
git clone https://git.awy.one/sway
Log | Files | Refs | README | LICENSE

commit 9755684fb0fd665a65be2a3cbabc5d502244c459
parent 92ba2290949a2105fc4ce74458a2a3c9d63f761e
Author: Simon Ser <contact@emersion.fr>
Date:   Tue, 23 Mar 2021 11:31:18 +0100

Implement xdg-activation-v1

See https://github.com/swaywm/wlroots/pull/2718.

Diffstat:
Minclude/sway/server.h | 5+++++
Msway/meson.build | 1+
Msway/server.c | 7+++++++
Asway/xdg_activation_v1.c | 20++++++++++++++++++++
4 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/include/sway/server.h b/include/sway/server.h @@ -87,6 +87,9 @@ struct sway_server { struct wlr_text_input_manager_v3 *text_input; struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager; + struct wlr_xdg_activation_v1 *xdg_activation_v1; + struct wl_listener xdg_activation_v1_request_activate; + // The timeout for transactions, after which a transaction is applied // regardless of readiness. size_t txn_timeout_ms; @@ -141,5 +144,7 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data); void handle_server_decoration(struct wl_listener *listener, void *data); void handle_xdg_decoration(struct wl_listener *listener, void *data); void handle_pointer_constraint(struct wl_listener *listener, void *data); +void xdg_activation_v1_handle_request_activate(struct wl_listener *listener, + void *data); #endif diff --git a/sway/meson.build b/sway/meson.build @@ -8,6 +8,7 @@ sway_sources = files( 'main.c', 'server.c', 'swaynag.c', + 'xdg_activation_v1.c', 'xdg_decoration.c', 'desktop/desktop.c', diff --git a/sway/server.c b/sway/server.c @@ -25,6 +25,7 @@ #include <wlr/types/wlr_tablet_v2.h> #include <wlr/types/wlr_viewporter.h> #include <wlr/types/wlr_xcursor_manager.h> +#include <wlr/types/wlr_xdg_activation_v1.h> #include <wlr/types/wlr_xdg_decoration_v1.h> #include <wlr/types/wlr_xdg_foreign_registry.h> #include <wlr/types/wlr_xdg_foreign_v1.h> @@ -159,6 +160,12 @@ bool server_init(struct sway_server *server) { wlr_xdg_foreign_v1_create(server->wl_display, foreign_registry); wlr_xdg_foreign_v2_create(server->wl_display, foreign_registry); + server->xdg_activation_v1 = wlr_xdg_activation_v1_create(server->wl_display); + server->xdg_activation_v1_request_activate.notify = + xdg_activation_v1_handle_request_activate; + wl_signal_add(&server->xdg_activation_v1->events.request_activate, + &server->xdg_activation_v1_request_activate); + // Avoid using "wayland-0" as display socket char name_candidate[16]; for (int i = 1; i <= 32; ++i) { diff --git a/sway/xdg_activation_v1.c b/sway/xdg_activation_v1.c @@ -0,0 +1,20 @@ +#include <wlr/types/wlr_xdg_activation_v1.h> +#include "sway/tree/view.h" + +void xdg_activation_v1_handle_request_activate(struct wl_listener *listener, + void *data) { + const struct wlr_xdg_activation_v1_request_activate_event *event = data; + + if (!wlr_surface_is_xdg_surface(event->surface)) { + return; + } + + struct wlr_xdg_surface *xdg_surface = + wlr_xdg_surface_from_wlr_surface(event->surface); + struct sway_view *view = xdg_surface->data; + if (!xdg_surface->mapped || view == NULL) { + return; + } + + view_request_activate(view); +}