diff options
author | Kenny Levinsen <kl@kl.wtf> | 2021-02-21 18:18:35 +0100 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-02-23 19:38:05 +0100 |
commit | 35b9a41720e04bd7c74e81e0a63ee69d540f39e1 (patch) | |
tree | ad6c57aa7291ea577c1a58ec461ece8bec222648 /sway/desktop | |
parent | 66343839b146a54505b746784cd42a8efb844963 (diff) | |
download | sway-35b9a41720e04bd7c74e81e0a63ee69d540f39e1.tar.xz |
transaction: Note if instructions are server requests
On server request, we need to send configure events to inform the client
of the new intended size. If the client changes size itself, sending a
configure event will only cause problems.
Use transaction_commit_dirty_client to distinguish between the two
transaction causes.
Diffstat (limited to 'sway/desktop')
-rw-r--r-- | sway/desktop/transaction.c | 21 | ||||
-rw-r--r-- | sway/desktop/xdg_shell.c | 3 | ||||
-rw-r--r-- | sway/desktop/xwayland.c | 2 |
3 files changed, 20 insertions, 6 deletions
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index 57311fe2..21915207 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c @@ -35,6 +35,7 @@ struct sway_transaction_instruction { struct sway_container_state container_state; }; uint32_t serial; + bool server_request; bool waiting; }; @@ -165,7 +166,7 @@ static void copy_container_state(struct sway_container *container, } static void transaction_add_node(struct sway_transaction *transaction, - struct sway_node *node) { + struct sway_node *node, bool server_request) { struct sway_transaction_instruction *instruction = NULL; // Check if we have an instruction for this node already, in which case we @@ -188,9 +189,12 @@ static void transaction_add_node(struct sway_transaction *transaction, } instruction->transaction = transaction; instruction->node = node; + instruction->server_request = server_request; list_add(transaction->instructions, instruction); node->ntxnrefs++; + } else if (server_request) { + instruction->server_request = true; } switch (node->type) { @@ -364,6 +368,9 @@ static bool should_configure(struct sway_node *node, if (node->destroying) { return false; } + if (!instruction->server_request) { + return false; + } struct sway_container_state *cstate = &node->sway_container->current; struct sway_container_state *istate = &instruction->container_state; #if HAVE_XWAYLAND @@ -522,7 +529,7 @@ void transaction_notify_view_ready_immediately(struct sway_view *view) { } } -void transaction_commit_dirty(void) { +static void _transaction_commit_dirty(bool server_request) { if (!server.dirty_nodes->length) { return; } @@ -536,10 +543,18 @@ void transaction_commit_dirty(void) { for (int i = 0; i < server.dirty_nodes->length; ++i) { struct sway_node *node = server.dirty_nodes->items[i]; - transaction_add_node(server.pending_transaction, node); + transaction_add_node(server.pending_transaction, node, server_request); node->dirty = false; } server.dirty_nodes->length = 0; transaction_commit_pending(); } + +void transaction_commit_dirty(void) { + _transaction_commit_dirty(true); +} + +void transaction_commit_dirty_client(void) { + _transaction_commit_dirty(false); +} diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index 4c13f91f..0ac2c55d 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c @@ -298,8 +298,7 @@ static void handle_commit(struct wl_listener *listener, void *data) { memcpy(&view->geometry, &new_geo, sizeof(struct wlr_box)); if (container_is_floating(view->container)) { view_update_size(view); - transaction_commit_dirty(); - transaction_notify_view_ready_immediately(view); + transaction_commit_dirty_client(); } else { view_center_surface(view); } diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 3ed65083..5c3a39ea 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -413,7 +413,7 @@ static void handle_commit(struct wl_listener *listener, void *data) { memcpy(&view->geometry, &new_geo, sizeof(struct wlr_box)); if (container_is_floating(view->container)) { view_update_size(view); - transaction_commit_dirty(); + transaction_commit_dirty_client(); } else { view_center_surface(view); } |