From bec80f15519f686c64485685289155568c9bfa9e Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Sat, 5 May 2018 19:43:12 +0100
Subject: Damage borders when damaging view

---
 sway/desktop/output.c       | 17 +++++++++++++----
 sway/desktop/wl_shell.c     |  2 +-
 sway/desktop/xdg_shell_v6.c |  2 +-
 sway/desktop/xwayland.c     |  2 +-
 sway/tree/container.c       | 11 ++++++-----
 sway/tree/view.c            | 26 +++++++++++++++-----------
 6 files changed, 37 insertions(+), 23 deletions(-)

(limited to 'sway')

diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 47461736..907ad6c9 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -784,8 +784,8 @@ void output_damage_surface(struct sway_output *output, double ox, double oy,
 		damage_surface_iterator, &data);
 }
 
-void output_damage_view(struct sway_output *output, struct sway_view *view,
-		bool whole) {
+static void output_damage_view(struct sway_output *output,
+		struct sway_view *view, bool whole) {
 	if (!sway_assert(view->swayc != NULL, "expected a view in the tree")) {
 		return;
 	}
@@ -805,6 +805,11 @@ void output_damage_view(struct sway_output *output, struct sway_view *view,
 		damage_surface_iterator, &data);
 }
 
+void output_damage_from_view(struct sway_output *output,
+		struct sway_view *view) {
+	output_damage_view(output, view, false);
+}
+
 static void output_damage_whole_container_iterator(struct sway_container *con,
 		void *data) {
 	struct sway_output *output = data;
@@ -827,8 +832,12 @@ void output_damage_whole_container(struct sway_output *output,
 	};
 	wlr_output_damage_add_box(output->damage, &box);
 
-	container_descendants(con, C_VIEW, output_damage_whole_container_iterator,
-		output);
+	if (con->type == C_VIEW) {
+		output_damage_whole_container_iterator(con, output);
+	} else {
+		container_descendants(con, C_VIEW,
+			output_damage_whole_container_iterator, output);
+	}
 }
 
 static void damage_handle_destroy(struct wl_listener *listener, void *data) {
diff --git a/sway/desktop/wl_shell.c b/sway/desktop/wl_shell.c
index e97a898e..99e8947b 100644
--- a/sway/desktop/wl_shell.c
+++ b/sway/desktop/wl_shell.c
@@ -85,7 +85,7 @@ static void handle_commit(struct wl_listener *listener, void *data) {
 	// TODO: Let floating views do whatever
 	view_update_size(view, wl_shell_view->pending_width,
 		wl_shell_view->pending_height);
-	view_damage(view, false);
+	view_damage_from(view);
 }
 
 static void handle_destroy(struct wl_listener *listener, void *data) {
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c
index fcee8ce9..8ecb330d 100644
--- a/sway/desktop/xdg_shell_v6.c
+++ b/sway/desktop/xdg_shell_v6.c
@@ -177,7 +177,7 @@ static void handle_commit(struct wl_listener *listener, void *data) {
 	view_update_size(view, xdg_shell_v6_view->pending_width,
 		xdg_shell_v6_view->pending_height);
 	view_update_title(view, false);
-	view_damage(view, false);
+	view_damage_from(view);
 }
 
 static void handle_new_popup(struct wl_listener *listener, void *data) {
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index b4eda71f..8f935760 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -222,7 +222,7 @@ static void handle_commit(struct wl_listener *listener, void *data) {
 	// TODO: Let floating views do whatever
 	view_update_size(view, xwayland_view->pending_width,
 		xwayland_view->pending_height);
-	view_damage(view, false);
+	view_damage_from(view);
 	view_update_title(view, false);
 }
 
diff --git a/sway/tree/container.c b/sway/tree/container.c
index 38db29c2..cc3bde0a 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -547,12 +547,13 @@ bool container_has_child(struct sway_container *con,
 	return container_find(con, find_child_func, child);
 }
 
-void container_damage_whole(struct sway_container *con) {
-	struct sway_container *output = con;
-	if (output->type != C_OUTPUT) {
-		output = container_parent(output, C_OUTPUT);
+void container_damage_whole(struct sway_container *container) {
+	for (int i = 0; i < root_container.children->length; ++i) {
+		struct sway_container *cont = root_container.children->items[i];
+		if (cont->type == C_OUTPUT) {
+			output_damage_whole_container(cont->sway_output, container);
+		}
 	}
-	output_damage_whole_container(output->sway_output, con);
 }
 
 static void update_title_texture(struct sway_container *con,
diff --git a/sway/tree/view.c b/sway/tree/view.c
index fe944466..afd7eade 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -199,11 +199,11 @@ void view_close(struct sway_view *view) {
 	}
 }
 
-void view_damage(struct sway_view *view, bool whole) {
+void view_damage_from(struct sway_view *view) {
 	for (int i = 0; i < root_container.children->length; ++i) {
 		struct sway_container *cont = root_container.children->items[i];
 		if (cont->type == C_OUTPUT) {
-			output_damage_view(cont->sway_output, view, whole);
+			output_damage_from_view(cont->sway_output, view);
 		}
 	}
 }
@@ -333,7 +333,7 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) {
 	arrange_children_of(cont->parent);
 	input_manager_set_focus(input_manager, cont);
 
-	view_damage(view, true);
+	container_damage_whole(cont);
 	view_handle_container_reparent(&view->container_reparent, NULL);
 
 	view_execute_criteria(view);
@@ -351,7 +351,7 @@ void view_unmap(struct sway_view *view) {
 		ws->sway_workspace->fullscreen = NULL;
 	}
 
-	view_damage(view, true);
+	container_damage_whole(view->swayc);
 
 	wl_list_remove(&view->surface_new_subsurface.link);
 	wl_list_remove(&view->container_reparent.link);
@@ -380,10 +380,10 @@ void view_update_position(struct sway_view *view, double ox, double oy) {
 
 	// TODO: Only allow this if the view is floating (this function will only be
 	// called in response to wayland clients wanting to reposition themselves).
-	view_damage(view, true);
+	container_damage_whole(view->swayc);
 	view->swayc->x = ox;
 	view->swayc->y = oy;
-	view_damage(view, true);
+	container_damage_whole(view->swayc);
 }
 
 void view_update_size(struct sway_view *view, int width, int height) {
@@ -391,11 +391,11 @@ void view_update_size(struct sway_view *view, int width, int height) {
 		return;
 	}
 
-	view_damage(view, true);
+	container_damage_whole(view->swayc);
 	// Should we update the swayc width/height here too?
 	view->width = width;
 	view->height = height;
-	view_damage(view, true);
+	container_damage_whole(view->swayc);
 }
 
 
@@ -414,7 +414,7 @@ static void view_child_handle_surface_commit(struct wl_listener *listener,
 	struct sway_view_child *child =
 		wl_container_of(listener, child, surface_commit);
 	// TODO: only accumulate damage from the child
-	view_damage(child->view, false);
+	view_damage_from(child->view);
 }
 
 static void view_child_handle_surface_new_subsurface(
@@ -476,12 +476,16 @@ void view_child_init(struct sway_view_child *child,
 	view_init_subsurfaces(child->view, surface);
 
 	// TODO: only damage the whole child
-	view_damage(child->view, true);
+	if (child->view->swayc) {
+		container_damage_whole(child->view->swayc);
+	}
 }
 
 void view_child_destroy(struct sway_view_child *child) {
 	// TODO: only damage the whole child
-	view_damage(child->view, true);
+	if (child->view->swayc) {
+		container_damage_whole(child->view->swayc);
+	}
 
 	wl_list_remove(&child->surface_commit.link);
 	wl_list_remove(&child->surface_destroy.link);
-- 
cgit v1.2.3