aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosef Gajdusek <atx@atx.name>2019-05-24 21:23:36 +0200
committerDrew DeVault <sir@cmpwn.com>2019-06-03 08:30:28 -0400
commit74ac8d0ec28c57f4f0871e6f4af0473d1f70192f (patch)
treed33347450402a54b1d3da52f23c0a5e38d29a6b3
parent5c20c05acd772e00a1bc0e76cc22f055246e74ae (diff)
Update output manager config on all output events
The output manager config was not properly updated when output configuration was changed through some other means (such as a command).
-rw-r--r--sway/desktop/output.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 0cc08525..1b72fc21 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -507,6 +507,30 @@ static void damage_handle_destroy(struct wl_listener *listener, void *data) {
transaction_commit_dirty();
}
+static void update_output_manager_config(struct sway_server *server) {
+ struct wlr_output_configuration_v1 *config =
+ wlr_output_configuration_v1_create();
+
+ struct sway_output *output;
+ wl_list_for_each(output, &root->all_outputs, link) {
+ if (output == root->noop_output) {
+ continue;
+ }
+ struct wlr_output_configuration_head_v1 *config_head =
+ wlr_output_configuration_head_v1_create(config, output->wlr_output);
+ struct wlr_box *output_box = wlr_output_layout_get_box(
+ root->output_layout, output->wlr_output);
+ // We mark the output enabled even if it is switched off by DPMS
+ config_head->state.enabled = output->enabled;
+ if (output_box) {
+ config_head->state.x = output_box->x;
+ config_head->state.y = output_box->y;
+ }
+ }
+
+ wlr_output_manager_v1_set_configuration(server->output_manager_v1, config);
+}
+
static void handle_destroy(struct wl_listener *listener, void *data) {
struct sway_output *output = wl_container_of(listener, output, destroy);
wl_signal_emit(&output->events.destroy, output);
@@ -525,6 +549,8 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
wl_list_remove(&output->damage_frame.link);
transaction_commit_dirty();
+
+ update_output_manager_config(output->server);
}
static void handle_mode(struct wl_listener *listener, void *data) {
@@ -548,6 +574,8 @@ static void handle_mode(struct wl_listener *listener, void *data) {
arrange_layers(output);
arrange_output(output);
transaction_commit_dirty();
+
+ update_output_manager_config(output->server);
}
static void handle_transform(struct wl_listener *listener, void *data) {
@@ -558,6 +586,8 @@ static void handle_transform(struct wl_listener *listener, void *data) {
arrange_layers(output);
arrange_output(output);
transaction_commit_dirty();
+
+ update_output_manager_config(output->server);
}
static void update_textures(struct sway_container *con, void *data) {
@@ -574,6 +604,8 @@ static void handle_scale(struct wl_listener *listener, void *data) {
output_for_each_container(output, update_textures, NULL);
arrange_output(output);
transaction_commit_dirty();
+
+ update_output_manager_config(output->server);
}
static void send_presented_iterator(struct sway_output *output,