aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/output.h3
-rw-r--r--include/sway/server.h4
-rw-r--r--protocols/meson.build1
-rw-r--r--protocols/wlr-output-power-management-unstable-v1.xml128
-rw-r--r--sway/desktop/output.c18
-rw-r--r--sway/server.c7
6 files changed, 161 insertions, 0 deletions
diff --git a/include/sway/output.h b/include/sway/output.h
index 01c32e0b..9117f350 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 2e8e4633..65bd6429 100644
--- a/include/sway/server.h
+++ b/include/sway/server.h
@@ -9,6 +9,7 @@
#include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_layer_shell_v1.h>
#include <wlr/types/wlr_output_management_v1.h>
+#include <wlr/types/wlr_output_power_management_v1.h>
#include <wlr/types/wlr_presentation_time.h>
#include <wlr/types/wlr_relative_pointer_v1.h>
#include <wlr/types/wlr_server_decoration.h>
@@ -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 f2f90dad..124e9777 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 00000000..a9778399
--- /dev/null
+++ b/protocols/wlr-output-power-management-unstable-v1.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<protocol name="wlr_output_power_management_unstable_v1">
+ <copyright>
+ 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.
+ </copyright>
+
+ <description summary="Control power management modes of outputs">
+ 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.
+ </description>
+
+ <interface name="zwlr_output_power_manager_v1" version="1">
+ <description summary="manager to create per-output power management">
+ This interface is a manager that allows creating per-output power
+ management mode controls.
+ </description>
+
+ <request name="get_output_power">
+ <description summary="get a power management for an output">
+ Create a output power management mode control that can be used to
+ adjust the power management mode for a given output.
+ </description>
+ <arg name="id" type="new_id" interface="zwlr_output_power_v1"/>
+ <arg name="output" type="object" interface="wl_output"/>
+ </request>
+
+ <request name="destroy" type="destructor">
+ <description summary="destroy the manager">
+ All objects created by the manager will still remain valid, until their
+ appropriate destroy request has been called.
+ </description>
+ </request>
+ </interface>
+
+ <interface name="zwlr_output_power_v1" version="1">
+ <description summary="adjust power management mode for an output">
+ This object offers requests to set the power management mode of
+ an output.
+ </description>
+
+ <enum name="mode">
+ <entry name="off" value="0"
+ summary="Output is turned off."/>
+ <entry name="on" value="1"
+ summary="Output is turned on, no power saving"/>
+ </enum>
+
+ <enum name="error">
+ <entry name="invalid_mode" value="1" summary="inexistent power save mode"/>
+ </enum>
+
+ <request name="set_mode">
+ <description summary="Set an outputs power save mode">
+ 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.
+ </description>
+ <arg name="mode" type="uint" enum="mode" summary="the power save mode to set"/>
+ </request>
+
+ <event name="mode">
+ <description summary="Report a power management mode change">
+ 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.
+ </description>
+ <arg name="mode" type="uint" enum="mode"
+ summary="the output's new power management mode"/>
+ </event>
+
+ <event name="failed">
+ <description summary="object no longer valid">
+ 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.
+ </description>
+ </event>
+
+ <request name="destroy" type="destructor">
+ <description summary="destroy this power management">
+ Destroys the output power management mode control object.
+ </description>
+ </request>
+ </interface>
+</protocol>
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index ec662a8c..f5c84d96 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 c97d098a..9be073a0 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);