From 982a2d0c99f4128a7cf2236ca190dd9b4e6d7828 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 16 Aug 2018 22:41:10 +1000 Subject: Fix geometry --- sway/desktop/transaction.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) (limited to 'sway/desktop/transaction.c') diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index e89f01d8..7383c455 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c @@ -170,23 +170,49 @@ static void transaction_apply(struct sway_transaction *transaction) { struct sway_container *container = instruction->container; // Damage the old and new locations - struct wlr_box old_box = { + struct wlr_box old_con_box = { .x = container->current.swayc_x, .y = container->current.swayc_y, .width = container->current.swayc_width, .height = container->current.swayc_height, }; - struct wlr_box new_box = { + struct wlr_box new_con_box = { .x = instruction->state.swayc_x, .y = instruction->state.swayc_y, .width = instruction->state.swayc_width, .height = instruction->state.swayc_height, }; + // Handle geometry, which may overflow the bounds of the container + struct wlr_box old_surface_box = {0,0,0,0}; + struct wlr_box new_surface_box = {0,0,0,0}; + if (container->type == C_VIEW) { + struct sway_view *view = container->sway_view; + if (container->sway_view->saved_buffer) { + old_surface_box.x = + container->current.view_x - view->saved_geometry.x; + old_surface_box.y = + container->current.view_y - view->saved_geometry.y; + old_surface_box.width = view->saved_buffer_width; + old_surface_box.height = view->saved_buffer_height; + } + struct wlr_surface *surface = container->sway_view->surface; + if (surface) { + struct wlr_box geometry; + view_get_geometry(view, &geometry); + new_surface_box.x = instruction->state.view_x - geometry.x; + new_surface_box.y = instruction->state.view_y - geometry.y; + new_surface_box.width = surface->current.width; + new_surface_box.height = surface->current.height; + } + } for (int j = 0; j < root_container.current.children->length; ++j) { - struct sway_container *output = root_container.current.children->items[j]; + struct sway_container *output = + root_container.current.children->items[j]; if (output->sway_output) { - output_damage_box(output->sway_output, &old_box); - output_damage_box(output->sway_output, &new_box); + output_damage_box(output->sway_output, &old_con_box); + output_damage_box(output->sway_output, &new_con_box); + output_damage_box(output->sway_output, &old_surface_box); + output_damage_box(output->sway_output, &new_surface_box); } } @@ -297,6 +323,7 @@ static void transaction_commit(struct sway_transaction *transaction) { } if (con->type == C_VIEW) { view_save_buffer(con->sway_view); + view_get_geometry(con->sway_view, &con->sway_view->saved_geometry); } con->instruction = instruction; } @@ -355,7 +382,9 @@ static void set_instruction_ready( } instruction->container->instruction = NULL; - transaction_progress_queue(); + if (!txn_debug) { + transaction_progress_queue(); + } } void transaction_notify_view_ready_by_serial(struct sway_view *view, -- cgit v1.2.3 From b0a5f3a25f52bc1d48d771cb02820042006d8d9e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 18 Aug 2018 15:10:06 +1000 Subject: Store geometry in the view and handle any floating view resizing --- sway/desktop/transaction.c | 72 +++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 45 deletions(-) (limited to 'sway/desktop/transaction.c') diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index 7383c455..c300558a 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c @@ -6,6 +6,7 @@ #include #include #include "sway/debug.h" +#include "sway/desktop.h" #include "sway/desktop/idle_inhibit_v1.h" #include "sway/desktop/transaction.h" #include "sway/output.h" @@ -169,51 +170,17 @@ static void transaction_apply(struct sway_transaction *transaction) { transaction->instructions->items[i]; struct sway_container *container = instruction->container; - // Damage the old and new locations - struct wlr_box old_con_box = { - .x = container->current.swayc_x, - .y = container->current.swayc_y, - .width = container->current.swayc_width, - .height = container->current.swayc_height, - }; - struct wlr_box new_con_box = { - .x = instruction->state.swayc_x, - .y = instruction->state.swayc_y, - .width = instruction->state.swayc_width, - .height = instruction->state.swayc_height, - }; - // Handle geometry, which may overflow the bounds of the container - struct wlr_box old_surface_box = {0,0,0,0}; - struct wlr_box new_surface_box = {0,0,0,0}; - if (container->type == C_VIEW) { + // Damage the old location + desktop_damage_whole_container(container); + if (container->type == C_VIEW && container->sway_view->saved_buffer) { struct sway_view *view = container->sway_view; - if (container->sway_view->saved_buffer) { - old_surface_box.x = - container->current.view_x - view->saved_geometry.x; - old_surface_box.y = - container->current.view_y - view->saved_geometry.y; - old_surface_box.width = view->saved_buffer_width; - old_surface_box.height = view->saved_buffer_height; - } - struct wlr_surface *surface = container->sway_view->surface; - if (surface) { - struct wlr_box geometry; - view_get_geometry(view, &geometry); - new_surface_box.x = instruction->state.view_x - geometry.x; - new_surface_box.y = instruction->state.view_y - geometry.y; - new_surface_box.width = surface->current.width; - new_surface_box.height = surface->current.height; - } - } - for (int j = 0; j < root_container.current.children->length; ++j) { - struct sway_container *output = - root_container.current.children->items[j]; - if (output->sway_output) { - output_damage_box(output->sway_output, &old_con_box); - output_damage_box(output->sway_output, &new_con_box); - output_damage_box(output->sway_output, &old_surface_box); - output_damage_box(output->sway_output, &new_surface_box); - } + struct wlr_box box = { + .x = container->current.view_x - view->saved_geometry.x, + .y = container->current.view_y - view->saved_geometry.y, + .width = view->saved_buffer_width, + .height = view->saved_buffer_height, + }; + desktop_damage_box(&box); } // There are separate children lists for each instruction state, the @@ -230,6 +197,20 @@ static void transaction_apply(struct sway_transaction *transaction) { view_remove_saved_buffer(container->sway_view); } + // Damage the new location + desktop_damage_whole_container(container); + if (container->type == C_VIEW && container->sway_view->surface) { + struct sway_view *view = container->sway_view; + struct wlr_surface *surface = view->surface; + struct wlr_box box = { + .x = container->current.view_x - view->geometry.x, + .y = container->current.view_y - view->geometry.y, + .width = surface->current.width, + .height = surface->current.height, + }; + desktop_damage_box(&box); + } + container->instruction = NULL; } } @@ -323,7 +304,8 @@ static void transaction_commit(struct sway_transaction *transaction) { } if (con->type == C_VIEW) { view_save_buffer(con->sway_view); - view_get_geometry(con->sway_view, &con->sway_view->saved_geometry); + memcpy(&con->sway_view->saved_geometry, &con->sway_view->geometry, + sizeof(struct wlr_box)); } con->instruction = instruction; } -- cgit v1.2.3