diff --git a/include/sway/output.h b/include/sway/output.h index ae2e50d36..9ff340e00 100644 --- a/include/sway/output.h +++ b/include/sway/output.h @@ -72,6 +72,9 @@ struct sway_output { bool allow_tearing; bool hdr; + + bool brightness_changed; + float brightness; }; struct sway_output_non_desktop { @@ -145,6 +148,8 @@ void handle_output_manager_test(struct wl_listener *listener, void *data); void handle_output_power_manager_set_mode(struct wl_listener *listener, void *data); +void handle_output_power_manager_set_brightness(struct wl_listener *listener, + void *data); struct sway_output_non_desktop *output_non_desktop_create(struct wlr_output *wlr_output); diff --git a/include/sway/server.h b/include/sway/server.h index 8c8114882..69c497c02 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -100,6 +100,7 @@ struct sway_server { struct wlr_output_power_manager_v1 *output_power_manager_v1; struct wl_listener output_power_manager_set_mode; + struct wl_listener output_power_manager_set_brightness; 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; diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 12dc9cc7a..703a8d21e 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -303,6 +303,11 @@ static int output_repaint_timer_handler(void *data) { } } + if (output->brightness_changed) { + wlr_output_state_set_brightness(&pending, output->brightness); + output->brightness_changed = false; + } + if (!wlr_output_commit_state(output->wlr_output, &pending)) { sway_log(SWAY_ERROR, "Page-flip failed on output %s", output->wlr_output->name); } @@ -725,3 +730,13 @@ void handle_output_power_manager_set_mode(struct wl_listener *listener, store_output_config(oc); request_modeset(); } + +void handle_output_power_manager_set_brightness(struct wl_listener *listener, + void *data) { + struct wlr_output_power_v1_set_brightness_event *event = data; + struct sway_output *output = event->output->data; + + output->brightness_changed = true; + output->brightness = event->value; + wlr_output_schedule_frame(output->wlr_output); +} diff --git a/sway/server.c b/sway/server.c index ed3468b53..a1cf5ed10 100644 --- a/sway/server.c +++ b/sway/server.c @@ -458,6 +458,10 @@ bool server_init(struct sway_server *server) { handle_output_power_manager_set_mode; wl_signal_add(&server->output_power_manager_v1->events.set_mode, &server->output_power_manager_set_mode); + server->output_power_manager_set_brightness.notify = + handle_output_power_manager_set_brightness; + wl_signal_add(&server->output_power_manager_v1->events.set_brightness, + &server->output_power_manager_set_brightness); server->input_method = wlr_input_method_manager_v2_create(server->wl_display); if (!server->input_method) { sway_log(SWAY_ERROR, "Failed to create input method manager");