aboutsummaryrefslogtreecommitdiff
path: root/sway/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'sway/desktop')
-rw-r--r--sway/desktop/transaction.c49
-rw-r--r--sway/desktop/xdg_shell.c10
-rw-r--r--sway/desktop/xwayland.c10
3 files changed, 31 insertions, 38 deletions
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
index bb725795..1ae6642b 100644
--- a/sway/desktop/transaction.c
+++ b/sway/desktop/transaction.c
@@ -232,21 +232,6 @@ static void apply_workspace_state(struct sway_workspace *ws,
static void apply_container_state(struct sway_container *container,
struct sway_container_state *state) {
struct sway_view *view = container->view;
- // Damage the old location
- desktop_damage_whole_container(container);
- if (view && !wl_list_empty(&view->saved_buffers)) {
- struct sway_saved_buffer *saved_buf;
- wl_list_for_each(saved_buf, &view->saved_buffers, link) {
- struct wlr_box box = {
- .x = saved_buf->x - view->saved_geometry.x,
- .y = saved_buf->y - view->saved_geometry.y,
- .width = saved_buf->width,
- .height = saved_buf->height,
- };
- desktop_damage_box(&box);
- }
- }
-
// There are separate children lists for each instruction state, the
// container's current state and the container's pending state
// (ie. con->children). The list itself needs to be freed here.
@@ -256,17 +241,19 @@ static void apply_container_state(struct sway_container *container,
memcpy(&container->current, state, sizeof(struct sway_container_state));
- if (view && !wl_list_empty(&view->saved_buffers)) {
- if (!container->node.destroying || container->node.ntxnrefs == 1) {
- view_remove_saved_buffer(view);
+ if (view) {
+ if (view->saved_surface_tree) {
+ if (!container->node.destroying || container->node.ntxnrefs == 1) {
+ view_remove_saved_buffer(view);
+ }
}
- }
- // If the view hasn't responded to the configure, center it within
- // the container. This is important for fullscreen views which
- // refuse to resize to the size of the output.
- if (view && view->surface) {
- view_center_surface(view);
+ // If the view hasn't responded to the configure, center it within
+ // the container. This is important for fullscreen views which
+ // refuse to resize to the size of the output.
+ if (view->surface) {
+ view_center_surface(view);
+ }
}
// Damage the new location
@@ -415,21 +402,11 @@ static void transaction_commit(struct sway_transaction *transaction) {
++transaction->num_waiting;
}
- // From here on we are rendering a saved buffer of the view, which
- // means we can send a frame done event to make the client redraw it
- // as soon as possible. Additionally, this is required if a view is
- // mapping and its default geometry doesn't intersect an output.
- struct timespec now;
- clock_gettime(CLOCK_MONOTONIC, &now);
- wlr_surface_send_frame_done(
- node->sway_container->view->surface, &now);
+ view_send_frame_done(node->sway_container->view);
}
if (!hidden && node_is_view(node) &&
- wl_list_empty(&node->sway_container->view->saved_buffers)) {
+ !node->sway_container->view->saved_surface_tree) {
view_save_buffer(node->sway_container->view);
- memcpy(&node->sway_container->view->saved_geometry,
- &node->sway_container->view->geometry,
- sizeof(struct wlr_box));
}
node->instruction = instruction;
}
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c
index fed820cf..95b5cb9d 100644
--- a/sway/desktop/xdg_shell.c
+++ b/sway/desktop/xdg_shell.c
@@ -332,8 +332,16 @@ static void handle_commit(struct wl_listener *listener, void *data) {
}
if (view->container->node.instruction) {
- transaction_notify_view_ready_by_serial(view,
+ bool successful = transaction_notify_view_ready_by_serial(view,
xdg_surface->current.configure_serial);
+
+ // If we saved the view and this commit isn't what we're looking for
+ // that means the user will never actually see the buffers submitted to
+ // us here. Just send frame done events to these surfaces so they can
+ // commit another time for us.
+ if (view->saved_surface_tree && !successful) {
+ view_send_frame_done(view);
+ }
}
}
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index 0967c7fc..e0c80c07 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -442,8 +442,16 @@ static void handle_commit(struct wl_listener *listener, void *data) {
}
if (view->container->node.instruction) {
- transaction_notify_view_ready_by_geometry(view,
+ bool successful = transaction_notify_view_ready_by_geometry(view,
xsurface->x, xsurface->y, state->width, state->height);
+
+ // If we saved the view and this commit isn't what we're looking for
+ // that means the user will never actually see the buffers submitted to
+ // us here. Just send frame done events to these surfaces so they can
+ // commit another time for us.
+ if (view->saved_surface_tree && !successful) {
+ view_send_frame_done(view);
+ }
}
}