From 5ed01c861a2e720d53b42f707872dbfb36b2fce7 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 27 Jan 2020 18:39:29 +0100 Subject: [PATCH] Add support for wlr-output-power-management-unstable-v1 --- include/sway/output.h | 3 + include/sway/server.h | 4 + protocols/meson.build | 1 + ...lr-output-power-management-unstable-v1.xml | 128 ++++++++++++++++++ sway/desktop/output.c | 18 +++ sway/server.c | 7 + 6 files changed, 161 insertions(+) create mode 100644 protocols/wlr-output-power-management-unstable-v1.xml diff --git a/include/sway/output.h b/include/sway/output.h index 01c32e0b8..9117f3505 100644 --- a/include/sway/output.h +++ b/include/sway/output.h @@ -171,4 +171,7 @@ void handle_output_manager_apply(struct wl_listener *listener, void *data); void handle_output_manager_test(struct wl_listener *listener, void *data); +void handle_output_power_manager_set_mode(struct wl_listener *listener, + void *data); + #endif diff --git a/include/sway/server.h b/include/sway/server.h index 2e8e46339..65bd6429f 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -73,6 +74,9 @@ struct sway_server { struct wl_listener output_manager_apply; struct wl_listener output_manager_test; + struct wlr_output_power_manager_v1 *output_power_manager_v1; + struct wl_listener output_power_manager_set_mode; + size_t txn_timeout_ms; list_t *transactions; list_t *dirty_nodes; diff --git a/protocols/meson.build b/protocols/meson.build index f2f90dadc..124e97777 100644 --- a/protocols/meson.build +++ b/protocols/meson.build @@ -18,6 +18,7 @@ protocols = [ ['wlr-layer-shell-unstable-v1.xml'], ['idle.xml'], ['wlr-input-inhibitor-unstable-v1.xml'], + ['wlr-output-power-management-unstable-v1.xml'], ] client_protocols = [ diff --git a/protocols/wlr-output-power-management-unstable-v1.xml b/protocols/wlr-output-power-management-unstable-v1.xml new file mode 100644 index 000000000..a97783991 --- /dev/null +++ b/protocols/wlr-output-power-management-unstable-v1.xml @@ -0,0 +1,128 @@ + + + + Copyright © 2019 Purism SPC + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice (including the next + paragraph) shall be included in all copies or substantial portions of the + Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + + + This protocol allows clients to control power management modes + of outputs that are currently part of the compositor space. The + intent is to allow special clients like desktop shells to power + down outputs when the system is idle. + + To modify outputs not currently part of the compositor space see + wlr-output-management. + + Warning! The protocol described in this file is experimental and + backward incompatible changes may be made. Backward compatible changes + may be added together with the corresponding interface version bump. + Backward incompatible changes are done by bumping the version number in + the protocol and interface names and resetting the interface version. + Once the protocol is to be declared stable, the 'z' prefix and the + version number in the protocol and interface names are removed and the + interface version number is reset. + + + + + This interface is a manager that allows creating per-output power + management mode controls. + + + + + Create a output power management mode control that can be used to + adjust the power management mode for a given output. + + + + + + + + All objects created by the manager will still remain valid, until their + appropriate destroy request has been called. + + + + + + + This object offers requests to set the power management mode of + an output. + + + + + + + + + + + + + + Set an output's power save mode to the given mode. The mode change + is effective immediately. If the output does not support the given + mode a failed event is sent. + + + + + + + Report the power management mode change of an output. + + The mode event is sent after an output changed its power + management mode. The reason can be a client using set_mode or the + compositor deciding to change an output's mode. + This event is also sent immediately when the object is created + so the client is informed about the current power management mode. + + + + + + + This event indicates that the output power management mode control + is no longer valid. This can happen for a number of reasons, + including: + - The output doesn't support power management + - Another client already has exclusive power management mode control + for this output + - The output disappeared + + Upon receiving this event, the client should destroy this object. + + + + + + Destroys the output power management mode control object. + + + + diff --git a/sway/desktop/output.c b/sway/desktop/output.c index ec662a8c5..f5c84d96b 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -977,3 +977,21 @@ void handle_output_manager_test(struct wl_listener *listener, void *data) { wlr_output_configuration_v1_send_succeeded(config); wlr_output_configuration_v1_destroy(config); } + +void handle_output_power_manager_set_mode(struct wl_listener *listener, + void *data) { + struct wlr_output_power_v1_set_mode_event *event = data; + struct sway_output *output = event->output->data; + + struct output_config *oc = new_output_config(output->wlr_output->name); + switch (event->mode) { + case ZWLR_OUTPUT_POWER_V1_MODE_OFF: + oc->dpms_state = DPMS_OFF; + break; + case ZWLR_OUTPUT_POWER_V1_MODE_ON: + oc->dpms_state = DPMS_ON; + break; + } + oc = store_output_config(oc); + apply_output_config(oc, output); +} diff --git a/sway/server.c b/sway/server.c index c97d098a5..9be073a06 100644 --- a/sway/server.c +++ b/sway/server.c @@ -132,6 +132,13 @@ bool server_init(struct sway_server *server) { wl_signal_add(&server->output_manager_v1->events.test, &server->output_manager_test); + server->output_power_manager_v1 = + wlr_output_power_manager_v1_create(server->wl_display); + server->output_power_manager_set_mode.notify = + handle_output_power_manager_set_mode; + wl_signal_add(&server->output_power_manager_v1->events.set_mode, + &server->output_power_manager_set_mode); + wlr_export_dmabuf_manager_v1_create(server->wl_display); wlr_screencopy_manager_v1_create(server->wl_display); wlr_data_control_manager_v1_create(server->wl_display);