aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Dwyer <ryandwyer1@gmail.com>2018-05-20 09:11:55 +1000
committerRyan Dwyer <ryandwyer1@gmail.com>2018-05-21 20:16:56 +1000
commitefc07fb3d45e07529e3817b4a1598f2c3256d600 (patch)
tree28a76416b5d3a50fa4db1c459e19a3f42c849d35
parentbd79584f659428df5d34f64f3b1cdb4c4388c3c6 (diff)
Don't track damage for views on inactive tabs
-rw-r--r--include/sway/input/seat.h6
-rw-r--r--include/sway/tree/view.h6
-rw-r--r--sway/desktop/output.c9
-rw-r--r--sway/input/seat.c12
-rw-r--r--sway/tree/container.c5
-rw-r--r--sway/tree/view.c25
6 files changed, 52 insertions, 11 deletions
diff --git a/include/sway/input/seat.h b/include/sway/input/seat.h
index ff76841e..2e4da438 100644
--- a/include/sway/input/seat.h
+++ b/include/sway/input/seat.h
@@ -95,6 +95,12 @@ struct sway_container *seat_get_focus_inactive_view(struct sway_seat *seat,
struct sway_container *container);
/**
+ * Return the immediate child of container which was most recently focused.
+ */
+struct sway_container *seat_get_active_child(struct sway_seat *seat,
+ struct sway_container *container);
+
+/**
* Iterate over the focus-inactive children of the container calling the
* function on each.
*/
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
index 951912d0..0fb8f1b3 100644
--- a/include/sway/tree/view.h
+++ b/include/sway/tree/view.h
@@ -274,4 +274,10 @@ bool view_has_mark(struct sway_view *view, char *mark);
void view_update_marks_textures(struct sway_view *view);
+/**
+ * Returns true if there's a possibility the view may be rendered on screen.
+ * Intended for damage tracking.
+ */
+bool view_is_visible(struct sway_view *view);
+
#endif
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index e39ef8db..6d5777f3 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -754,10 +754,7 @@ static void render_container_tabbed(struct sway_output *output,
}
struct sway_seat *seat = input_manager_current_seat(input_manager);
struct sway_container *focus = seat_get_focus(seat);
- struct sway_container *current = seat_get_focus_inactive(seat, con);
- while (current->parent != con) {
- current = current->parent;
- }
+ struct sway_container *current = seat_get_active_child(seat, con);
struct border_colors *current_colors = NULL;
// Render tabs
@@ -1082,9 +1079,7 @@ static void output_damage_view(struct sway_output *output,
return;
}
- struct sway_container *workspace = container_parent(view->swayc,
- C_WORKSPACE);
- if (workspace->sway_workspace->fullscreen && !view->is_fullscreen) {
+ if (!view_is_visible(view)) {
return;
}
diff --git a/sway/input/seat.c b/sway/input/seat.c
index 7d541f6e..7a3e928a 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -718,6 +718,18 @@ struct sway_container *seat_get_focus_inactive(struct sway_seat *seat,
return seat_get_focus_by_type(seat, container, C_TYPES);
}
+struct sway_container *seat_get_active_child(struct sway_seat *seat,
+ struct sway_container *container) {
+ struct sway_container *focus = seat_get_focus_inactive(seat, container);
+ if (!focus) {
+ return NULL;
+ }
+ while (focus->parent != container) {
+ focus = focus->parent;
+ }
+ return focus;
+}
+
struct sway_container *sway_seat_get_focus(struct sway_seat *seat) {
if (!seat->has_focus) {
return NULL;
diff --git a/sway/tree/container.c b/sway/tree/container.c
index 62dca487..5c1f42c2 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -522,10 +522,7 @@ static struct sway_container *container_at_tabbed(struct sway_container *parent,
}
// Surfaces
- struct sway_container *current = seat_get_focus_inactive(seat, parent);
- while (current->parent != parent) {
- current = current->parent;
- }
+ struct sway_container *current = seat_get_active_child(seat, parent);
return container_at(current, ox, oy, surface, sx, sy);
}
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 636abb25..51316507 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -865,3 +865,28 @@ void view_update_marks_textures(struct sway_view *view) {
&config->border_colors.urgent);
container_damage_whole(view->swayc);
}
+
+bool view_is_visible(struct sway_view *view) {
+ if (!view->swayc) {
+ return false;
+ }
+ // Check view isn't in a tabbed or stacked container on an inactive tab
+ struct sway_seat *seat = input_manager_current_seat(input_manager);
+ struct sway_container *container = view->swayc;
+ while (container->type != C_WORKSPACE) {
+ if (container->parent->layout == L_TABBED ||
+ container->parent->layout == L_STACKED) {
+ if (seat_get_active_child(seat, container->parent) != container) {
+ return false;
+ }
+ }
+ container = container->parent;
+ }
+ // Check view isn't hidden by another fullscreen view
+ struct sway_container *workspace = container;
+ if (workspace->sway_workspace->fullscreen && !view->is_fullscreen) {
+ return false;
+ }
+ // Check the workspace is visible
+ return workspace_is_visible(workspace);
+}