From 64648de067968375d7f727b96a2ed9aa53659f39 Mon Sep 17 00:00:00 2001 From: "Anna (navi) Figueiredo Gomes" Date: Mon, 19 May 2025 00:56:58 +0200 Subject: [PATCH] ext-foreign-toplevel-request-v1: new protocol Signed-off-by: Anna (navi) Figueiredo Gomes --- include/sway/server.h | 5 +++++ include/sway/tree/view.h | 6 ++++++ sway/server.c | 16 ++++++++++++++-- sway/tree/view.c | 16 ++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/include/sway/server.h b/include/sway/server.h index e7d7094f1..f584c0892 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -103,6 +103,11 @@ struct sway_server { struct wlr_input_method_manager_v2 *input_method; struct wlr_text_input_manager_v3 *text_input; struct wlr_ext_foreign_toplevel_list_v1 *foreign_toplevel_list; + struct wlr_ext_foreign_toplevel_request_manager_v1 *foreign_toplevel_request_manager; + struct wl_listener foreign_toplevel_request; + struct wlr_ext_foreign_toplevel_request_source_v1 *foreign_toplevel_request_source; + struct wl_listener foreign_toplevel_response_toplevel; + struct wl_listener foreign_toplevel_response_cancel; struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager; struct wlr_content_type_manager_v1 *content_type_manager_v1; struct wlr_data_control_manager_v1 *wlr_data_control_manager_v1; diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 9f084eeb4..635a66970 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -351,4 +351,10 @@ void view_send_frame_done(struct sway_view *view); bool view_can_tear(struct sway_view *view); +void handle_foreign_toplevel_response_toplevel(struct wl_listener *listener, void *data); + +void handle_foreign_toplevel_response_cancel(struct wl_listener *listener, void *data); + +void handle_foreign_toplevel_request(struct wl_listener *listener, void *data); + #endif diff --git a/sway/server.c b/sway/server.c index 979761486..1f07892a2 100644 --- a/sway/server.c +++ b/sway/server.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -72,6 +73,7 @@ #define SWAY_XDG_SHELL_VERSION 5 #define SWAY_LAYER_SHELL_VERSION 4 #define SWAY_FOREIGN_TOPLEVEL_LIST_VERSION 1 +#define SWAY_FOREIGN_TOPLEVEL_REQUEST_VERSION 1 #define SWAY_PRESENTATION_VERSION 2 bool allow_unsupported_gpu = false; @@ -107,6 +109,7 @@ static bool is_privileged(const struct wl_global *global) { global == server.output_power_manager_v1->global || global == server.input_method->global || global == server.foreign_toplevel_list->global || + global == server.foreign_toplevel_request_source->global || global == server.foreign_toplevel_manager->global || global == server.wlr_data_control_manager_v1->global || global == server.ext_data_control_manager_v1->global || @@ -364,8 +367,17 @@ bool server_init(struct sway_server *server) { server->text_input = wlr_text_input_manager_v3_create(server->wl_display); server->foreign_toplevel_list = wlr_ext_foreign_toplevel_list_v1_create(server->wl_display, SWAY_FOREIGN_TOPLEVEL_LIST_VERSION); - server->foreign_toplevel_manager = - wlr_foreign_toplevel_manager_v1_create(server->wl_display); + server->foreign_toplevel_manager = wlr_foreign_toplevel_manager_v1_create(server->wl_display); + server->foreign_toplevel_request_manager = + wlr_ext_foreign_toplevel_request_manager_v1_create(server->wl_display, SWAY_FOREIGN_TOPLEVEL_REQUEST_VERSION); + server->foreign_toplevel_request.notify = handle_foreign_toplevel_request; + wl_signal_add(&server->foreign_toplevel_request_manager->events.request, &server->foreign_toplevel_request); + server->foreign_toplevel_request_source = + wlr_ext_foreign_toplevel_request_source_v1_create(server->wl_display, SWAY_FOREIGN_TOPLEVEL_REQUEST_VERSION); + server->foreign_toplevel_response_toplevel.notify = handle_foreign_toplevel_response_toplevel; + wl_signal_add(&server->foreign_toplevel_request_source->events.toplevel, &server->foreign_toplevel_response_toplevel); + server->foreign_toplevel_response_cancel.notify = handle_foreign_toplevel_response_cancel; + wl_signal_add(&server->foreign_toplevel_request_source->events.cancel, &server->foreign_toplevel_response_cancel); sway_session_lock_init(); diff --git a/sway/tree/view.c b/sway/tree/view.c index a8b83e3eb..289383302 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -669,6 +670,21 @@ static bool should_focus(struct sway_view *view) { return len == 0; } +void handle_foreign_toplevel_response_toplevel(struct wl_listener *listener, void *data) { + struct wlr_ext_foreign_toplevel_request_pending_v1 *response = data; + wlr_ext_foreign_toplevel_request_v1_send_toplevel(response->request, response->handle); +} + +void handle_foreign_toplevel_response_cancel(struct wl_listener *listener, void *data) { + struct wlr_ext_foreign_toplevel_request_pending_v1 *response = data; + wlr_ext_foreign_toplevel_request_v1_cancel(response->request); +} + +void handle_foreign_toplevel_request(struct wl_listener *listener, void *data) { + struct sway_server *server = wl_container_of(listener, server, foreign_toplevel_request); + wlr_ext_foreign_toplevel_request_source_v1_request(server->foreign_toplevel_request_source, data); +} + static void handle_foreign_activate_request( struct wl_listener *listener, void *data) { struct sway_view *view = wl_container_of(