mirror of
https://github.com/swaywm/sway.git
synced 2024-12-27 07:26:55 +01:00
desktop/output: Do not use commit listener to arrange
The reasoning for using a commit handler is to ensure that all paths for output changes are correctly handled. With the centralized modeset infrastructure in place, we can move the logic there. This allows us to be smarter and avoid extraneous arranges, output manager updates and transaction commits. The side-effect is a minor duplication for the special-case request_state, but the shared path will be relied upon further in future commits to justify this duplication.
This commit is contained in:
parent
be840f730e
commit
b83e5aaa54
3 changed files with 24 additions and 28 deletions
|
@ -57,7 +57,6 @@ struct sway_output {
|
||||||
|
|
||||||
struct wl_listener layout_destroy;
|
struct wl_listener layout_destroy;
|
||||||
struct wl_listener destroy;
|
struct wl_listener destroy;
|
||||||
struct wl_listener commit;
|
|
||||||
struct wl_listener present;
|
struct wl_listener present;
|
||||||
struct wl_listener frame;
|
struct wl_listener frame;
|
||||||
struct wl_listener request_state;
|
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);
|
struct sway_output_non_desktop *output_non_desktop_create(struct wlr_output *wlr_output);
|
||||||
|
|
||||||
|
void update_output_manager_config(struct sway_server *server);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -11,9 +11,12 @@
|
||||||
#include <wlr/types/wlr_output.h>
|
#include <wlr/types/wlr_output.h>
|
||||||
#include <wlr/types/wlr_output_swapchain_manager.h>
|
#include <wlr/types/wlr_output_swapchain_manager.h>
|
||||||
#include "sway/config.h"
|
#include "sway/config.h"
|
||||||
|
#include "sway/desktop/transaction.h"
|
||||||
#include "sway/input/cursor.h"
|
#include "sway/input/cursor.h"
|
||||||
|
#include "sway/layers.h"
|
||||||
#include "sway/output.h"
|
#include "sway/output.h"
|
||||||
#include "sway/server.h"
|
#include "sway/server.h"
|
||||||
|
#include "sway/tree/arrange.h"
|
||||||
#include "sway/tree/root.h"
|
#include "sway/tree/root.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "util.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",
|
sway_log(SWAY_DEBUG, "Finalizing config for %s",
|
||||||
cfg->output->wlr_output->name);
|
cfg->output->wlr_output->name);
|
||||||
finalize_output_config(cfg->config, cfg->output);
|
finalize_output_config(cfg->config, cfg->output);
|
||||||
|
arrange_layers(cfg->output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arrange_root();
|
||||||
|
update_output_manager_config(&server);
|
||||||
|
transaction_commit_dirty();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
wlr_output_swapchain_manager_finish(&swapchain_mgr);
|
wlr_output_swapchain_manager_finish(&swapchain_mgr);
|
||||||
for (size_t idx = 0; idx < configs_len; idx++) {
|
for (size_t idx = 0; idx < configs_len; idx++) {
|
||||||
|
|
|
@ -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);
|
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 =
|
struct wlr_output_configuration_v1 *config =
|
||||||
wlr_output_configuration_v1_create();
|
wlr_output_configuration_v1_create();
|
||||||
|
|
||||||
|
@ -387,9 +387,6 @@ static int timer_modeset_handle(void *data) {
|
||||||
server->delayed_modeset = NULL;
|
server->delayed_modeset = NULL;
|
||||||
|
|
||||||
apply_all_output_configs();
|
apply_all_output_configs();
|
||||||
transaction_commit_dirty();
|
|
||||||
update_output_manager_config(server);
|
|
||||||
|
|
||||||
return 0;
|
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->layout_destroy.link);
|
||||||
wl_list_remove(&output->destroy.link);
|
wl_list_remove(&output->destroy.link);
|
||||||
wl_list_remove(&output->commit.link);
|
|
||||||
wl_list_remove(&output->present.link);
|
wl_list_remove(&output->present.link);
|
||||||
wl_list_remove(&output->frame.link);
|
wl_list_remove(&output->frame.link);
|
||||||
wl_list_remove(&output->request_state.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);
|
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) {
|
static void handle_present(struct wl_listener *listener, void *data) {
|
||||||
struct sway_output *output = wl_container_of(listener, output, present);
|
struct sway_output *output = wl_container_of(listener, output, present);
|
||||||
struct wlr_output_event_present *output_event = data;
|
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 =
|
struct sway_output *output =
|
||||||
wl_container_of(listener, output, request_state);
|
wl_container_of(listener, output, request_state);
|
||||||
const struct wlr_output_event_request_state *event = data;
|
const struct wlr_output_event_request_state *event = data;
|
||||||
|
|
||||||
|
uint32_t committed = event->state->committed;
|
||||||
wlr_output_commit_state(output->wlr_output, event->state);
|
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;
|
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;
|
output->layout_destroy.notify = handle_layout_destroy;
|
||||||
wl_signal_add(&wlr_output->events.destroy, &output->destroy);
|
wl_signal_add(&wlr_output->events.destroy, &output->destroy);
|
||||||
output->destroy.notify = handle_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);
|
wl_signal_add(&wlr_output->events.present, &output->present);
|
||||||
output->present.notify = handle_present;
|
output->present.notify = handle_present;
|
||||||
wl_signal_add(&wlr_output->events.frame, &output->frame);
|
wl_signal_add(&wlr_output->events.frame, &output->frame);
|
||||||
|
|
Loading…
Reference in a new issue