diff --git a/include/wlr/types/wlr_output_power_management_v1.h b/include/wlr/types/wlr_output_power_management_v1.h index ef8da8e55..f093bdd3a 100644 --- a/include/wlr/types/wlr_output_power_management_v1.h +++ b/include/wlr/types/wlr_output_power_management_v1.h @@ -10,6 +10,7 @@ struct wlr_output_power_manager_v1 { struct { struct wl_signal set_mode; // struct wlr_output_power_v1_set_mode_event + struct wl_signal set_brightness; // struct wlr_output_power_v1_set_brightness_event struct wl_signal destroy; } events; @@ -39,6 +40,11 @@ struct wlr_output_power_v1_set_mode_event { enum zwlr_output_power_v1_mode mode; }; +struct wlr_output_power_v1_set_brightness_event { + struct wlr_output *output; + float value; +}; + struct wlr_output_power_manager_v1 *wlr_output_power_manager_v1_create( struct wl_display *display); diff --git a/protocol/wlr-output-power-management-unstable-v1.xml b/protocol/wlr-output-power-management-unstable-v1.xml index 20dbb7760..72b4fac39 100644 --- a/protocol/wlr-output-power-management-unstable-v1.xml +++ b/protocol/wlr-output-power-management-unstable-v1.xml @@ -42,7 +42,7 @@ interface version number is reset. - + This interface is a manager that allows creating per-output power management mode controls. @@ -65,7 +65,7 @@ - + This object offers requests to set the power management mode of an output. @@ -124,5 +124,31 @@ Destroys the output power management mode control object. + + + + + + This event advertises the output's current brightness value. + + The brightness is an integer between 0 and UINT32_MAX. 0 indicates + lowest light level (while still being powered on) and UINT32_MAX + indicates highest light level. + + The brightness event is sent immediately when the object is created if + the output supports brightness. This event is also sent when the + brightness changes. + + + + + + + Set an output's brightness to the given value. The brightness change + is effective immediately. If the output does not support setting + brightness, a failed event is sent. + + + diff --git a/types/wlr_output_power_management_v1.c b/types/wlr_output_power_management_v1.c index 2a9948393..b1fa70e21 100644 --- a/types/wlr_output_power_management_v1.c +++ b/types/wlr_output_power_management_v1.c @@ -9,7 +9,7 @@ #include #include "wlr-output-power-management-unstable-v1-protocol.h" -#define OUTPUT_POWER_MANAGER_V1_VERSION 1 +#define OUTPUT_POWER_MANAGER_V1_VERSION 2 static void output_power_handle_destroy(struct wl_client *client, struct wl_resource *resource) { @@ -58,6 +58,11 @@ static void output_power_v1_send_mode(struct wlr_output_power_v1 *output_power) zwlr_output_power_v1_send_mode(output_power->resource, mode); } +static void output_power_v1_send_brightness(struct wlr_output_power_v1 *output_power) { + zwlr_output_power_v1_send_brightness(output_power->resource, + round((double)output_power->output->brightness * UINT32_MAX)); +} + static void output_power_handle_output_commit(struct wl_listener *listener, void *data) { struct wlr_output_power_v1 *output_power = @@ -66,6 +71,9 @@ static void output_power_handle_output_commit(struct wl_listener *listener, if (event->state->committed & WLR_OUTPUT_STATE_ENABLED) { output_power_v1_send_mode(output_power); } + if (event->state->committed & WLR_OUTPUT_STATE_BRIGHTNESS) { + output_power_v1_send_brightness(output_power); + } } static void output_power_handle_set_mode(struct wl_client *client, @@ -93,9 +101,31 @@ static void output_power_handle_set_mode(struct wl_client *client, wl_signal_emit_mutable(&output_power->manager->events.set_mode, &event); } +static void output_power_handle_set_brightness(struct wl_client *client, + struct wl_resource *output_power_resource, + uint32_t value_u32) { + struct wlr_output_power_v1 *output_power = + output_power_from_resource(output_power_resource); + if (output_power == NULL) { + return; + } + + if (!output_power->output->brightness_supported) { + zwlr_output_power_v1_send_failed(output_power->resource); + return; + } + + struct wlr_output_power_v1_set_brightness_event event = { + .output = output_power->output, + .value = (double)value_u32 / UINT32_MAX, + }; + wl_signal_emit_mutable(&output_power->manager->events.set_brightness, &event); +} + static const struct zwlr_output_power_v1_interface output_power_impl = { .destroy = output_power_handle_destroy, .set_mode = output_power_handle_set_mode, + .set_brightness = output_power_handle_set_brightness, }; static const struct zwlr_output_power_manager_v1_interface @@ -162,6 +192,9 @@ static void output_power_manager_get_output_power(struct wl_client *client, wl_list_insert(&manager->output_powers, &output_power->link); output_power_v1_send_mode(output_power); + if (output->brightness_supported) { + output_power_v1_send_brightness(output_power); + } } static void output_power_manager_destroy(struct wl_client *client, @@ -195,6 +228,7 @@ static void handle_display_destroy(struct wl_listener *listener, void *data) { wl_signal_emit_mutable(&manager->events.destroy, manager); assert(wl_list_empty(&manager->events.set_mode.listener_list)); + assert(wl_list_empty(&manager->events.set_brightness.listener_list)); assert(wl_list_empty(&manager->events.destroy.listener_list)); wl_global_destroy(manager->global); @@ -217,6 +251,7 @@ struct wlr_output_power_manager_v1 *wlr_output_power_manager_v1_create( } wl_signal_init(&manager->events.set_mode); + wl_signal_init(&manager->events.set_brightness); wl_signal_init(&manager->events.destroy); wl_list_init(&manager->output_powers);