opt: avoid useless reparent actin

This commit is contained in:
DreamMaoMao 2026-02-28 12:05:56 +08:00
parent 9e3ac1ef5c
commit 7f796112c8

View file

@ -4702,43 +4702,48 @@ void requeststartdrag(struct wl_listener *listener, void *data) {
} }
void client_apply_node_layer(Client *c) { void client_apply_node_layer(Client *c) {
struct wlr_scene_tree *target = NULL;
struct wlr_scene_tree *current_parent = c->scene->node.parent;
if (!c->mon) { if (!c->mon) {
// 无 monitor 时使用全局层
if (c->isoverlay) { if (c->isoverlay) {
wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]); target = layers[LyrOverlay];
} else if (c->isfloating || c->isfullscreen) { } else if (c->isfloating || c->isfullscreen) {
wlr_scene_node_reparent(&c->scene->node, layers[LyrTop]); target = layers[LyrTop];
} else { } else {
wlr_scene_node_reparent(&c->scene->node, layers[LyrTile]); target = layers[LyrTile];
}
return;
}
if (c->animation.tagining || c->animation.tagouting) {
if (c->isoverlay) {
wlr_scene_node_reparent(&c->scene->node,
c->mon->layers_scene_tree[LyrOverlay]);
} else if (c->isfloating || c->isfullscreen) {
wlr_scene_node_reparent(&c->scene->node,
c->mon->layers_scene_tree[LyrTop]);
} else {
wlr_scene_node_reparent(&c->scene->node,
c->mon->layers_scene_tree[LyrTile]);
} }
} else { } else {
if (c->isfloating && c == grabc) { if (c->animation.tagining || c->animation.tagouting) {
wlr_scene_node_reparent(&c->scene->node, // 动画进出标签时使用 monitor 专属层
layers[c->isoverlay ? LyrOverlay : LyrTop]); if (c->isoverlay) {
} else if (c->isfullscreen || c->isfloating) { target = c->mon->layers_scene_tree[LyrOverlay];
wlr_scene_node_reparent(&c->scene->node, } else if (c->isfloating || c->isfullscreen) {
c->mon->layers_scene_tree[LyrTop]); target = c->mon->layers_scene_tree[LyrTop];
} else {
target = c->mon->layers_scene_tree[LyrTile];
}
} else { } else {
wlr_scene_node_reparent( // 非标签动画状态
&c->scene->node, if (c->isfloating && c->animation.running &&
c->mon->layers_scene_tree[c->isoverlay ? LyrOverlay : LyrTile]); c->animation.action == MOVE) {
target = layers[c->isoverlay ? LyrOverlay : LyrTop];
} else if (c->isfloating && c == grabc) {
target = layers[c->isoverlay ? LyrOverlay : LyrTop];
} else if (c->isfullscreen || c->isfloating) {
target = c->mon->layers_scene_tree[LyrTop];
} else {
target = c->mon->layers_scene_tree[c->isoverlay ? LyrOverlay
: LyrTile];
}
} }
} }
// 仅当目标层与当前父级不同时才执行 reparent
if (target && target != current_parent) {
wlr_scene_node_reparent(&c->scene->node, target);
}
} }
void setborder_color(Client *c) { void setborder_color(Client *c) {