From 44e640d1e2d1d990ffc182288f30722303f10a73 Mon Sep 17 00:00:00 2001 From: Arun Mani J Date: Thu, 3 Oct 2024 17:35:05 +0530 Subject: [PATCH] foreign-toplevel-management: Implement responsiveness event --- .../wlr_foreign_toplevel_management_v1.h | 8 +++++ types/wlr_foreign_toplevel_management_v1.c | 35 ++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/include/wlr/types/wlr_foreign_toplevel_management_v1.h b/include/wlr/types/wlr_foreign_toplevel_management_v1.h index d21c5fc70..d8a680a4c 100644 --- a/include/wlr/types/wlr_foreign_toplevel_management_v1.h +++ b/include/wlr/types/wlr_foreign_toplevel_management_v1.h @@ -36,6 +36,11 @@ enum wlr_foreign_toplevel_handle_v1_state { WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_FULLSCREEN = (1 << 3), }; +enum wlr_foreign_toplevel_handle_v1_responsiveness { + WLR_FOREIGN_TOPLEVEL_HANDLE_V1_RESPONSIVENESS_RESPONSIVE = (0 << 0), + WLR_FOREIGN_TOPLEVEL_HANDLE_V1_RESPONSIVENESS_UNRESPONSIVE = (1 << 0), +}; + struct wlr_foreign_toplevel_handle_v1_output { struct wl_list link; // wlr_foreign_toplevel_handle_v1.outputs struct wlr_output *output; @@ -57,6 +62,7 @@ struct wlr_foreign_toplevel_handle_v1 { char *app_id; struct wlr_foreign_toplevel_handle_v1 *parent; struct wl_list outputs; // wlr_foreign_toplevel_v1_output.link + uint32_t responsiveness; // enum wlr_foreign_toplevel_v1_responsiveness uint32_t state; // enum wlr_foreign_toplevel_v1_state struct { @@ -151,5 +157,7 @@ void wlr_foreign_toplevel_handle_v1_set_parent( struct wlr_foreign_toplevel_handle_v1 *toplevel, struct wlr_foreign_toplevel_handle_v1 *parent); +void wlr_foreign_toplevel_handle_v1_set_responsive( + struct wlr_foreign_toplevel_handle_v1 *toplevel, bool responsive); #endif diff --git a/types/wlr_foreign_toplevel_management_v1.c b/types/wlr_foreign_toplevel_management_v1.c index 23935d489..9cc851e12 100644 --- a/types/wlr_foreign_toplevel_management_v1.c +++ b/types/wlr_foreign_toplevel_management_v1.c @@ -8,7 +8,7 @@ #include #include "wlr-foreign-toplevel-management-unstable-v1-protocol.h" -#define FOREIGN_TOPLEVEL_MANAGEMENT_V1_VERSION 3 +#define FOREIGN_TOPLEVEL_MANAGEMENT_V1_VERSION 4 static const struct zwlr_foreign_toplevel_handle_v1_interface toplevel_handle_impl; @@ -486,6 +486,32 @@ void wlr_foreign_toplevel_handle_v1_set_parent( toplevel_update_idle_source(toplevel); } +void wlr_foreign_toplevel_handle_v1_set_responsive( + struct wlr_foreign_toplevel_handle_v1 *toplevel, bool responsive) { + enum wlr_foreign_toplevel_handle_v1_responsiveness responsiveness; + if (responsive) { + responsiveness = WLR_FOREIGN_TOPLEVEL_HANDLE_V1_RESPONSIVENESS_RESPONSIVE; + } else { + responsiveness = WLR_FOREIGN_TOPLEVEL_HANDLE_V1_RESPONSIVENESS_UNRESPONSIVE; + } + + if (toplevel->responsiveness == responsiveness) { + // Only inform clients if the state changed + return; + } + + struct wl_resource *resource; + wl_resource_for_each(resource, &toplevel->resources) { + if (wl_resource_get_version(resource) < + ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_RESPONSIVENESS_SINCE_VERSION) { + continue; + } + zwlr_foreign_toplevel_handle_v1_send_responsiveness(resource, responsiveness); + } + toplevel->responsiveness = responsiveness; + toplevel_update_idle_source(toplevel); +} + void wlr_foreign_toplevel_handle_v1_destroy( struct wlr_foreign_toplevel_handle_v1 *toplevel) { if (!toplevel) { @@ -569,6 +595,8 @@ wlr_foreign_toplevel_handle_v1_create( wl_list_init(&toplevel->resources); wl_list_init(&toplevel->outputs); + toplevel->responsiveness = WLR_FOREIGN_TOPLEVEL_HANDLE_V1_RESPONSIVENESS_RESPONSIVE; + wl_signal_init(&toplevel->events.request_maximize); wl_signal_init(&toplevel->events.request_minimize); wl_signal_init(&toplevel->events.request_activate); @@ -637,6 +665,11 @@ static void toplevel_send_details_to_toplevel_resource( toplevel_resource_send_parent(resource, toplevel->parent); + if (wl_resource_get_version(resource) >= + ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_RESPONSIVENESS_SINCE_VERSION) { + zwlr_foreign_toplevel_handle_v1_send_responsiveness(resource, toplevel->responsiveness); + } + zwlr_foreign_toplevel_handle_v1_send_done(resource); }