aboutsummaryrefslogtreecommitdiff
path: root/sway/desktop
diff options
context:
space:
mode:
authorRyan Dwyer <ryandwyer1@gmail.com>2018-06-24 23:01:09 +1000
committerRyan Dwyer <ryandwyer1@gmail.com>2018-06-24 23:01:09 +1000
commit1549fb719ae75a498bf319db45281464e72c759e (patch)
treee5944487928a65b1af3b7dc9a44f1b14250bc0bf /sway/desktop
parentb6a238c7b70bfb6520c55c480bf6a7e60b4f7db4 (diff)
Implement atomic layout updates for xwayland views
Diffstat (limited to 'sway/desktop')
-rw-r--r--sway/desktop/transaction.c44
-rw-r--r--sway/desktop/xwayland.c14
2 files changed, 31 insertions, 27 deletions
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
index 04142bcc..08678b5b 100644
--- a/sway/desktop/transaction.c
+++ b/sway/desktop/transaction.c
@@ -267,9 +267,7 @@ void transaction_commit(struct sway_transaction *transaction) {
instruction->state.view_y,
instruction->state.view_width,
instruction->state.view_height);
- if (instruction->serial) {
- ++transaction->num_waiting;
- }
+ ++transaction->num_waiting;
}
list_add(con->instructions, instruction);
}
@@ -307,20 +305,8 @@ void transaction_commit(struct sway_transaction *transaction) {
update_debug_tree();
}
-void transaction_notify_view_ready(struct sway_view *view, uint32_t serial) {
- // Find the instruction
- struct sway_transaction_instruction *instruction = NULL;
- for (int i = 0; i < view->swayc->instructions->length; ++i) {
- struct sway_transaction_instruction *tmp_instruction =
- view->swayc->instructions->items[i];
- if (tmp_instruction->serial == serial && !tmp_instruction->ready) {
- instruction = tmp_instruction;
- break;
- }
- }
- if (!instruction) {
- return;
- }
+static void set_instruction_ready(
+ struct sway_transaction_instruction *instruction) {
instruction->ready = true;
// If all views are ready, apply the transaction.
@@ -335,6 +321,30 @@ void transaction_notify_view_ready(struct sway_view *view, uint32_t serial) {
}
}
+void transaction_notify_view_ready(struct sway_view *view, uint32_t serial) {
+ for (int i = 0; i < view->swayc->instructions->length; ++i) {
+ struct sway_transaction_instruction *instruction =
+ view->swayc->instructions->items[i];
+ if (instruction->serial == serial && !instruction->ready) {
+ set_instruction_ready(instruction);
+ return;
+ }
+ }
+}
+
+void transaction_notify_view_ready_by_size(struct sway_view *view,
+ int width, int height) {
+ for (int i = 0; i < view->swayc->instructions->length; ++i) {
+ struct sway_transaction_instruction *instruction =
+ view->swayc->instructions->items[i];
+ if (!instruction->ready && instruction->state.view_width == width &&
+ instruction->state.view_height == height) {
+ set_instruction_ready(instruction);
+ return;
+ }
+ }
+}
+
struct wlr_texture *transaction_get_texture(struct sway_view *view) {
if (!view->swayc || !view->swayc->instructions->length) {
return view->surface->buffer->texture;
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index a1837420..7e78ef32 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -7,6 +7,7 @@
#include <wlr/xwayland.h>
#include "log.h"
#include "sway/desktop.h"
+#include "sway/desktop/transaction.h"
#include "sway/input/input-manager.h"
#include "sway/input/seat.h"
#include "sway/output.h"
@@ -243,16 +244,9 @@ static void handle_commit(struct wl_listener *listener, void *data) {
struct sway_view *view = &xwayland_view->view;
struct wlr_xwayland_surface *xsurface = view->wlr_xwayland_surface;
- // Don't allow xwayland views to do resize or reposition themselves if
- // they're involved in a transaction. Once the transaction has finished
- // they'll apply the next time a commit happens.
- if (view->swayc && view->swayc->instructions->length) {
- if (view->swayc && container_is_floating(view->swayc)) {
- view_update_size(view, xsurface->width, xsurface->height);
- } else {
- view_update_size(view, view->swayc->width, view->swayc->height);
- }
- view_update_position(view, view->x, view->y);
+ if (view->swayc->instructions->length) {
+ transaction_notify_view_ready_by_size(view,
+ xsurface->width, xsurface->height);
}
view_damage_from(view);
}