aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/output.h3
-rw-r--r--sway/config/output.c8
-rw-r--r--sway/desktop/output.c41
3 files changed, 24 insertions, 28 deletions
diff --git a/include/sway/output.h b/include/sway/output.h
index 1dcabc25..990fa506 100644
--- a/include/sway/output.h
+++ b/include/sway/output.h
@@ -57,7 +57,6 @@ struct sway_output {
struct wl_listener layout_destroy;
struct wl_listener destroy;
- struct wl_listener commit;
struct wl_listener present;
struct wl_listener frame;
struct wl_listener request_state;
@@ -146,4 +145,6 @@ void handle_output_power_manager_set_mode(struct wl_listener *listener,
struct sway_output_non_desktop *output_non_desktop_create(struct wlr_output *wlr_output);
+void update_output_manager_config(struct sway_server *server);
+
#endif
diff --git a/sway/config/output.c b/sway/config/output.c
index d33ea11a..cc6aedb7 100644
--- a/sway/config/output.c
+++ b/sway/config/output.c
@@ -11,9 +11,12 @@
#include <wlr/types/wlr_output.h>
#include <wlr/types/wlr_output_swapchain_manager.h>
#include "sway/config.h"
+#include "sway/desktop/transaction.h"
#include "sway/input/cursor.h"
+#include "sway/layers.h"
#include "sway/output.h"
#include "sway/server.h"
+#include "sway/tree/arrange.h"
#include "sway/tree/root.h"
#include "log.h"
#include "util.h"
@@ -963,8 +966,13 @@ bool apply_output_configs(struct matched_output_config *configs,
sway_log(SWAY_DEBUG, "Finalizing config for %s",
cfg->output->wlr_output->name);
finalize_output_config(cfg->config, cfg->output);
+ arrange_layers(cfg->output);
}
+ arrange_root();
+ update_output_manager_config(&server);
+ transaction_commit_dirty();
+
out:
wlr_output_swapchain_manager_finish(&swapchain_mgr);
for (size_t idx = 0; idx < configs_len; idx++) {
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index a71430fe..f6a26b0e 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -356,7 +356,7 @@ static void handle_frame(struct wl_listener *listener, void *user_data) {
wlr_scene_output_for_each_buffer(output->scene_output, send_frame_done_iterator, &data);
}
-static void update_output_manager_config(struct sway_server *server) {
+void update_output_manager_config(struct sway_server *server) {
struct wlr_output_configuration_v1 *config =
wlr_output_configuration_v1_create();
@@ -387,9 +387,6 @@ static int timer_modeset_handle(void *data) {
server->delayed_modeset = NULL;
apply_all_output_configs();
- transaction_commit_dirty();
- update_output_manager_config(server);
-
return 0;
}
@@ -414,7 +411,6 @@ static void begin_destroy(struct sway_output *output) {
wl_list_remove(&output->layout_destroy.link);
wl_list_remove(&output->destroy.link);
- wl_list_remove(&output->commit.link);
wl_list_remove(&output->present.link);
wl_list_remove(&output->frame.link);
wl_list_remove(&output->request_state.link);
@@ -437,26 +433,6 @@ static void handle_layout_destroy(struct wl_listener *listener, void *data) {
begin_destroy(output);
}
-static void handle_commit(struct wl_listener *listener, void *data) {
- struct sway_output *output = wl_container_of(listener, output, commit);
- struct wlr_output_event_commit *event = data;
-
- if (!output->enabled) {
- return;
- }
-
- if (event->state->committed & (
- WLR_OUTPUT_STATE_MODE |
- WLR_OUTPUT_STATE_TRANSFORM |
- WLR_OUTPUT_STATE_SCALE)) {
- arrange_layers(output);
- arrange_output(output);
- transaction_commit_dirty();
-
- update_output_manager_config(output->server);
- }
-}
-
static void handle_present(struct wl_listener *listener, void *data) {
struct sway_output *output = wl_container_of(listener, output, present);
struct wlr_output_event_present *output_event = data;
@@ -473,7 +449,20 @@ static void handle_request_state(struct wl_listener *listener, void *data) {
struct sway_output *output =
wl_container_of(listener, output, request_state);
const struct wlr_output_event_request_state *event = data;
+
+ uint32_t committed = event->state->committed;
wlr_output_commit_state(output->wlr_output, event->state);
+
+ if (committed & (
+ WLR_OUTPUT_STATE_MODE |
+ WLR_OUTPUT_STATE_TRANSFORM |
+ WLR_OUTPUT_STATE_SCALE)) {
+ arrange_layers(output);
+ arrange_output(output);
+ transaction_commit_dirty();
+
+ update_output_manager_config(output->server);
+ }
}
static unsigned int last_headless_num = 0;
@@ -537,8 +526,6 @@ void handle_new_output(struct wl_listener *listener, void *data) {
output->layout_destroy.notify = handle_layout_destroy;
wl_signal_add(&wlr_output->events.destroy, &output->destroy);
output->destroy.notify = handle_destroy;
- wl_signal_add(&wlr_output->events.commit, &output->commit);
- output->commit.notify = handle_commit;
wl_signal_add(&wlr_output->events.present, &output->present);
output->present.notify = handle_present;
wl_signal_add(&wlr_output->events.frame, &output->frame);