From 666e92f15e6b90159df6a65e2a6d36777a4b0efc Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 28 Jan 2021 16:04:17 +0100 Subject: [PATCH] output: introduce request_state event This allows backends to request the compositor to change the state of an output. References: https://github.com/swaywm/wlroots/issues/2300#issuecomment-761819673 --- include/wlr/interfaces/wlr_output.h | 5 +++++ include/wlr/types/wlr_output.h | 6 ++++++ types/wlr_output.c | 10 ++++++++++ 3 files changed, 21 insertions(+) diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h index 6d8da2a5f..0f7acebfa 100644 --- a/include/wlr/interfaces/wlr_output.h +++ b/include/wlr/interfaces/wlr_output.h @@ -138,5 +138,10 @@ void wlr_output_send_frame(struct wlr_output *output); */ void wlr_output_send_present(struct wlr_output *output, struct wlr_output_event_present *event); +/** + * Request the compositor to apply new state. + */ +void wlr_output_send_request_state(struct wlr_output *output, + const struct wlr_output_state *state); #endif diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index eefddb024..f1b4ff189 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -171,6 +171,7 @@ struct wlr_output { struct wl_signal enable; struct wl_signal mode; struct wl_signal description; + struct wl_signal request_state; struct wl_signal destroy; } events; @@ -238,6 +239,11 @@ struct wlr_output_event_bind { struct wl_resource *resource; }; +struct wlr_output_event_request_state { + struct wlr_output *output; + struct wlr_output_state state; +}; + struct wlr_surface; /** diff --git a/types/wlr_output.c b/types/wlr_output.c index bfa1379eb..de4b940c1 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -344,6 +344,7 @@ void wlr_output_init(struct wlr_output *output, struct wlr_backend *backend, wl_signal_init(&output->events.enable); wl_signal_init(&output->events.mode); wl_signal_init(&output->events.description); + wl_signal_init(&output->events.request_state); wl_signal_init(&output->events.destroy); pixman_region32_init(&output->pending.damage); @@ -728,6 +729,15 @@ void wlr_output_send_present(struct wlr_output *output, wlr_signal_emit_safe(&output->events.present, event); } +void wlr_output_send_request_state(struct wlr_output *output, + const struct wlr_output_state *state) { + struct wlr_output_event_request_state event = { + .output = output, + .state = *state, + }; + wlr_signal_emit_safe(&output->events.request_state, &event); +} + void wlr_output_queue_state(struct wlr_output *output, const struct wlr_output_state *state) { assert(state != &output->pending);