From 74ac8d0ec28c57f4f0871e6f4af0473d1f70192f Mon Sep 17 00:00:00 2001 From: Josef Gajdusek Date: Fri, 24 May 2019 21:23:36 +0200 Subject: 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). --- sway/desktop/output.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) 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, -- cgit v1.2.3-54-g00ecf