1
0
Fork 0
mirror of https://github.com/yshui/picom.git synced 2025-03-31 17:35:52 -04:00

wm: best effort refreshing leaders even an inconsistent tree

On second thought, it is not very nice to give up as soon as we see the
tree being inconsistent. This could results in flickering, etc.

Instead, still refresh the leaders with best effort. And only set the
flag to retry leader refresh when we actually hit an inconsistent tree
node.

Related #1336

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
Yuxuan Shui 2024-09-10 01:17:45 +01:00
parent 5f69580cc8
commit 3820c33519
No known key found for this signature in database
GPG key ID: D3A4405BE6CC17F4

View file

@ -225,6 +225,13 @@ static struct wm_tree_node *wm_find_leader(struct wm *wm, struct wm_tree_node *n
return node->leader_final;
}
leader_node = wm_tree_find_toplevel_for(&wm->tree, leader_node);
if (leader_node == NULL) {
log_debug("Cannot find toplevel for leader %#010x of window "
"%#010x. tree consistency: %d",
node->leader, node->id.x, wm_is_consistent(wm));
wm->needs_leader_refresh = true;
return node->leader_final;
}
node->visited = true;
node->leader_final = wm_find_leader(wm, leader_node);
node->visited = false;
@ -236,22 +243,7 @@ void wm_refresh_leaders(struct wm *wm) {
if (!wm->needs_leader_refresh) {
return;
}
if (!wm_is_consistent(wm)) {
// The window tree has not been fully replicated, we might be missing
// windows, so we couldn't refresh the leaders here, but also can't leave
// them NULL. So we just set them to themselves.
log_debug("Window tree is not consistent, setting all leaders to "
"themselves");
list_foreach(struct wm_tree_node, i, &wm->tree.root->children, siblings) {
if (i->is_zombie) {
// Don't change anything about a zombie window.
continue;
}
i->leader_final = i;
}
return;
}
log_debug("Refreshing window leaders");
log_debug("Refreshing window leaders, tree consistency: %d", wm_is_consistent(wm));
wm->needs_leader_refresh = false;
list_foreach(struct wm_tree_node, i, &wm->tree.root->children, siblings) {
if (i->is_zombie) {
@ -269,6 +261,9 @@ void wm_refresh_leaders(struct wm *wm) {
log_verbose("Window %#010x has leader %#010x", i->id.x,
i->leader_final->id.x);
}
if (wm->needs_leader_refresh) {
log_debug("Leaders not fully resolved, will try again later.");
}
}
/// Move window `w` so it's right above `below`, if `below` is 0, `w` is moved