Don't track damage for views on inactive tabs
This commit is contained in:
parent
bd79584f65
commit
efc07fb3d4
|
@ -94,6 +94,12 @@ struct sway_container *seat_get_focus_inactive(struct sway_seat *seat,
|
||||||
struct sway_container *seat_get_focus_inactive_view(struct sway_seat *seat,
|
struct sway_container *seat_get_focus_inactive_view(struct sway_seat *seat,
|
||||||
struct sway_container *container);
|
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
|
* Iterate over the focus-inactive children of the container calling the
|
||||||
* function on each.
|
* function on each.
|
||||||
|
|
|
@ -274,4 +274,10 @@ bool view_has_mark(struct sway_view *view, char *mark);
|
||||||
|
|
||||||
void view_update_marks_textures(struct sway_view *view);
|
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
|
#endif
|
||||||
|
|
|
@ -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_seat *seat = input_manager_current_seat(input_manager);
|
||||||
struct sway_container *focus = seat_get_focus(seat);
|
struct sway_container *focus = seat_get_focus(seat);
|
||||||
struct sway_container *current = seat_get_focus_inactive(seat, con);
|
struct sway_container *current = seat_get_active_child(seat, con);
|
||||||
while (current->parent != con) {
|
|
||||||
current = current->parent;
|
|
||||||
}
|
|
||||||
struct border_colors *current_colors = NULL;
|
struct border_colors *current_colors = NULL;
|
||||||
|
|
||||||
// Render tabs
|
// Render tabs
|
||||||
|
@ -1082,9 +1079,7 @@ static void output_damage_view(struct sway_output *output,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sway_container *workspace = container_parent(view->swayc,
|
if (!view_is_visible(view)) {
|
||||||
C_WORKSPACE);
|
|
||||||
if (workspace->sway_workspace->fullscreen && !view->is_fullscreen) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
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) {
|
struct sway_container *sway_seat_get_focus(struct sway_seat *seat) {
|
||||||
if (!seat->has_focus) {
|
if (!seat->has_focus) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -522,10 +522,7 @@ static struct sway_container *container_at_tabbed(struct sway_container *parent,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Surfaces
|
// Surfaces
|
||||||
struct sway_container *current = seat_get_focus_inactive(seat, parent);
|
struct sway_container *current = seat_get_active_child(seat, parent);
|
||||||
while (current->parent != parent) {
|
|
||||||
current = current->parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
return container_at(current, ox, oy, surface, sx, sy);
|
return container_at(current, ox, oy, surface, sx, sy);
|
||||||
}
|
}
|
||||||
|
|
|
@ -865,3 +865,28 @@ void view_update_marks_textures(struct sway_view *view) {
|
||||||
&config->border_colors.urgent);
|
&config->border_colors.urgent);
|
||||||
container_damage_whole(view->swayc);
|
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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue