diff options
author | Simon Ser <contact@emersion.fr> | 2021-01-28 16:04:17 +0100 |
---|---|---|
committer | Simon Zeni <simon@bl4ckb0ne.ca> | 2022-11-15 15:39:55 +0000 |
commit | ff55663906cb492a07f6baba446e42812618d988 (patch) | |
tree | 2983fa74676e24030e91d6e7530ce157486e3426 | |
parent | 024627e872d586acaa01153ab74b877473a2246d (diff) |
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
-rw-r--r-- | include/wlr/interfaces/wlr_output.h | 5 | ||||
-rw-r--r-- | include/wlr/types/wlr_output.h | 6 | ||||
-rw-r--r-- | types/output/output.c | 16 |
3 files changed, 27 insertions, 0 deletions
diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h index 7ef3de98..cfad8f70 100644 --- a/include/wlr/interfaces/wlr_output.h +++ b/include/wlr/interfaces/wlr_output.h @@ -146,5 +146,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 6b39cfc8..bb056b30 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -178,6 +178,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; @@ -258,6 +259,11 @@ struct wlr_output_event_bind { struct wl_resource *resource; }; +struct wlr_output_event_request_state { + struct wlr_output *output; + const struct wlr_output_state *state; +}; + struct wlr_surface; /** diff --git a/types/output/output.c b/types/output/output.c index ab10286b..405e4481 100644 --- a/types/output/output.c +++ b/types/output/output.c @@ -935,6 +935,22 @@ void wlr_output_send_present(struct wlr_output *output, wl_signal_emit_mutable(&output->events.present, event); } +void wlr_output_send_request_state(struct wlr_output *output, + const struct wlr_output_state *state) { + uint32_t unchanged = output_compare_state(output, state); + struct wlr_output_state copy = *state; + copy.committed &= ~unchanged; + if (copy.committed == 0) { + return; + } + + struct wlr_output_event_request_state event = { + .output = output, + .state = ©, + }; + wl_signal_emit_mutable(&output->events.request_state, &event); +} + void wlr_output_set_gamma(struct wlr_output *output, size_t size, const uint16_t *r, const uint16_t *g, const uint16_t *b) { uint16_t *gamma_lut = NULL; |