opt: optimize foreign toplevel state sync

This commit is contained in:
DreamMaoMao 2026-03-30 18:11:10 +08:00
parent 254eb8a4d4
commit 52676492fe
2 changed files with 47 additions and 32 deletions

View file

@ -552,7 +552,7 @@ int32_t restore_minimized(const Arg *arg) {
if (selmon && selmon->sel && selmon->sel->is_in_scratchpad && if (selmon && selmon->sel && selmon->sel->is_in_scratchpad &&
selmon->sel->is_scratchpad_show) { selmon->sel->is_scratchpad_show) {
selmon->sel->isminimized = 0; client_pending_minimized_state(selmon->sel, 0);
selmon->sel->is_scratchpad_show = 0; selmon->sel->is_scratchpad_show = 0;
selmon->sel->is_in_scratchpad = 0; selmon->sel->is_in_scratchpad = 0;
selmon->sel->isnamedscratchpad = 0; selmon->sel->isnamedscratchpad = 0;

View file

@ -806,6 +806,10 @@ static int32_t keep_idle_inhibit(void *data);
static void check_keep_idle_inhibit(Client *c); static void check_keep_idle_inhibit(Client *c);
static void pre_caculate_before_arrange(Monitor *m, bool want_animation, static void pre_caculate_before_arrange(Monitor *m, bool want_animation,
bool from_view, bool only_caculate); bool from_view, bool only_caculate);
static void client_pending_fullscreen_state(Client *c, int32_t isfullscreen);
static void client_pending_maximized_state(Client *c, int32_t ismaximized);
static void client_pending_minimized_state(Client *c, int32_t isminimized);
#include "data/static_keymap.h" #include "data/static_keymap.h"
#include "dispatch/bind_declare.h" #include "dispatch/bind_declare.h"
#include "layout/layout.h" #include "layout/layout.h"
@ -1063,11 +1067,33 @@ void clear_fullscreen_flag(Client *c) {
} }
} }
void client_pending_fullscreen_state(Client *c, int32_t isfullscreen) {
c->isfullscreen = isfullscreen;
if (c->foreign_toplevel && !c->iskilling)
wlr_foreign_toplevel_handle_v1_set_fullscreen(c->foreign_toplevel,
isfullscreen);
}
void client_pending_maximized_state(Client *c, int32_t ismaximized) {
c->ismaximizescreen = ismaximized;
if (c->foreign_toplevel && !c->iskilling)
wlr_foreign_toplevel_handle_v1_set_maximized(c->foreign_toplevel,
ismaximized);
}
void client_pending_minimized_state(Client *c, int32_t isminimized) {
c->isminimized = isminimized;
if (c->foreign_toplevel && !c->iskilling)
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel,
isminimized);
}
void show_scratchpad(Client *c) { void show_scratchpad(Client *c) {
c->is_scratchpad_show = 1; c->is_scratchpad_show = 1;
if (c->isfullscreen || c->ismaximizescreen) { if (c->isfullscreen || c->ismaximizescreen) {
c->isfullscreen = 0; // 清除窗口全屏标志 client_pending_fullscreen_state(c, 0);
c->ismaximizescreen = 0; client_pending_maximized_state(c, 0);
c->bw = c->isnoborder ? 0 : config.borderpx; c->bw = c->isnoborder ? 0 : config.borderpx;
} }
@ -1106,9 +1132,6 @@ void swallow(Client *c, Client *w) {
c->bw = w->bw; c->bw = w->bw;
c->isfloating = w->isfloating; c->isfloating = w->isfloating;
c->isurgent = w->isurgent; c->isurgent = w->isurgent;
c->isfullscreen = w->isfullscreen;
c->ismaximizescreen = w->ismaximizescreen;
c->isminimized = w->isminimized;
c->is_in_scratchpad = w->is_in_scratchpad; c->is_in_scratchpad = w->is_in_scratchpad;
c->is_scratchpad_show = w->is_scratchpad_show; c->is_scratchpad_show = w->is_scratchpad_show;
c->tags = w->tags; c->tags = w->tags;
@ -1120,6 +1143,7 @@ void swallow(Client *c, Client *w) {
c->scroller_proportion = w->scroller_proportion; c->scroller_proportion = w->scroller_proportion;
c->next_in_stack = w->next_in_stack; c->next_in_stack = w->next_in_stack;
c->prev_in_stack = w->prev_in_stack; c->prev_in_stack = w->prev_in_stack;
if (w->next_in_stack) if (w->next_in_stack)
w->next_in_stack->prev_in_stack = c; w->next_in_stack->prev_in_stack = c;
if (w->prev_in_stack) if (w->prev_in_stack)
@ -1138,11 +1162,9 @@ void swallow(Client *c, Client *w) {
if (!c->foreign_toplevel && c->mon) if (!c->foreign_toplevel && c->mon)
add_foreign_toplevel(c); add_foreign_toplevel(c);
if (c->isminimized && c->foreign_toplevel) { client_pending_fullscreen_state(c, w->isfullscreen);
wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, client_pending_maximized_state(c, w->ismaximizescreen);
false); client_pending_minimized_state(c, w->isminimized);
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel, true);
}
} }
bool switch_scratchpad_client_state(Client *c) { bool switch_scratchpad_client_state(Client *c) {
@ -4231,7 +4253,7 @@ void maximizenotify(struct wl_listener *listener, void *data) {
void unminimize(Client *c) { void unminimize(Client *c) {
if (c && c->is_in_scratchpad && c->is_scratchpad_show) { if (c && c->is_in_scratchpad && c->is_scratchpad_show) {
c->isminimized = 0; client_pending_minimized_state(c, 0);
c->is_scratchpad_show = 0; c->is_scratchpad_show = 0;
c->is_in_scratchpad = 0; c->is_in_scratchpad = 0;
c->isnamedscratchpad = 0; c->isnamedscratchpad = 0;
@ -4259,13 +4281,12 @@ void set_minimized(Client *c) {
c->oldtags = c->mon->tagset[c->mon->seltags]; c->oldtags = c->mon->tagset[c->mon->seltags];
c->mini_restore_tag = c->tags; c->mini_restore_tag = c->tags;
c->tags = 0; c->tags = 0;
c->isminimized = 1; client_pending_minimized_state(c, 1);
c->is_in_scratchpad = 1; c->is_in_scratchpad = 1;
c->is_scratchpad_show = 0; c->is_scratchpad_show = 0;
focusclient(focustop(selmon), 1); focusclient(focustop(selmon), 1);
arrange(c->mon, false, false); arrange(c->mon, false, false);
wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, false); wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, false);
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel, true);
wl_list_remove(&c->link); // 从原来位置移除 wl_list_remove(&c->link); // 从原来位置移除
wl_list_insert(clients.prev, &c->link); // 插入尾部 wl_list_insert(clients.prev, &c->link); // 插入尾部
} }
@ -5042,11 +5063,11 @@ setfloating(Client *c, int32_t floating) {
if (floating == 1 && c != grabc) { if (floating == 1 && c != grabc) {
if (c->isfullscreen) { if (c->isfullscreen) {
c->isfullscreen = 0; client_pending_fullscreen_state(c, 0);
client_set_fullscreen(c, 0); client_set_fullscreen(c, 0);
} }
c->ismaximizescreen = 0; client_pending_maximized_state(c, 0);
exit_scroller_stack(c); exit_scroller_stack(c);
// 重新计算居中的坐标 // 重新计算居中的坐标
@ -5171,12 +5192,12 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) {
return; return;
int32_t old_maximizescreen_state = c->ismaximizescreen; int32_t old_maximizescreen_state = c->ismaximizescreen;
c->ismaximizescreen = maximizescreen; client_pending_maximized_state(c, maximizescreen);
if (maximizescreen) { if (maximizescreen) {
if (c->isfullscreen) { if (c->isfullscreen) {
c->isfullscreen = 0; client_pending_fullscreen_state(c, 0);
client_set_fullscreen(c, 0); client_set_fullscreen(c, 0);
} }
@ -5189,10 +5210,8 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) {
wlr_scene_node_raise_to_top(&c->scene->node); wlr_scene_node_raise_to_top(&c->scene->node);
if (!is_scroller_layout(c->mon) || c->isfloating) if (!is_scroller_layout(c->mon) || c->isfloating)
resize(c, maximizescreen_box, 0); resize(c, maximizescreen_box, 0);
c->ismaximizescreen = 1;
} else { } else {
c->bw = c->isnoborder ? 0 : config.borderpx; c->bw = c->isnoborder ? 0 : config.borderpx;
c->ismaximizescreen = 0;
if (c->isfloating) if (c->isfloating)
setfloating(c, 1); setfloating(c, 1);
} }
@ -5240,6 +5259,7 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自
c->isfullscreen = fullscreen; c->isfullscreen = fullscreen;
client_set_fullscreen(c, fullscreen); client_set_fullscreen(c, fullscreen);
client_pending_fullscreen_state(c, fullscreen);
if (fullscreen) { if (fullscreen) {
@ -5247,7 +5267,7 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自
client_set_maximized(c, false); client_set_maximized(c, false);
} }
c->ismaximizescreen = 0; client_pending_maximized_state(c, 0);
exit_scroller_stack(c); exit_scroller_stack(c);
c->isfakefullscreen = 0; c->isfakefullscreen = 0;
@ -5256,10 +5276,8 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自
wlr_scene_node_raise_to_top(&c->scene->node); // 将视图提升到顶层 wlr_scene_node_raise_to_top(&c->scene->node); // 将视图提升到顶层
if (!is_scroller_layout(c->mon) || c->isfloating) if (!is_scroller_layout(c->mon) || c->isfloating)
resize(c, c->mon->m, 1); resize(c, c->mon->m, 1);
c->isfullscreen = 1;
} else { } else {
c->bw = c->isnoborder ? 0 : config.borderpx; c->bw = c->isnoborder ? 0 : config.borderpx;
c->isfullscreen = 0;
if (c->isfloating) if (c->isfloating)
setfloating(c, 1); setfloating(c, 1);
} }
@ -5451,8 +5469,7 @@ void show_hide_client(Client *c) {
c->tags = c->oldtags; c->tags = c->oldtags;
arrange(c->mon, false, false); arrange(c->mon, false, false);
} }
c->isminimized = 0; client_pending_minimized_state(c, 0);
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel, false);
focusclient(c, 1); focusclient(c, 1);
wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, true); wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, true);
} }
@ -5876,8 +5893,8 @@ void overview_backup(Client *c) {
c->isfloating = 0; c->isfloating = 0;
} }
if (c->isfullscreen || c->ismaximizescreen) { if (c->isfullscreen || c->ismaximizescreen) {
c->isfullscreen = 0; // 清除窗口全屏标志 client_pending_fullscreen_state(c, 0); // 清除窗口全屏标志
c->ismaximizescreen = 0; client_pending_maximized_state(c, 0);
} }
c->bw = c->isnoborder ? 0 : config.borderpx; c->bw = c->isnoborder ? 0 : config.borderpx;
@ -5907,8 +5924,8 @@ void overview_restore(Client *c, const Arg *arg) {
} else if (want_restore_fullscreen(c) && c->isfullscreen) { } else if (want_restore_fullscreen(c) && c->isfullscreen) {
setfullscreen(c, 1); setfullscreen(c, 1);
} else { } else {
c->isfullscreen = 0; client_pending_fullscreen_state(c, 0);
c->ismaximizescreen = 0; client_pending_maximized_state(c, 0);
setfullscreen(c, false); setfullscreen(c, false);
} }
} else { } else {
@ -6481,13 +6498,11 @@ void activatex11(struct wl_listener *listener, void *data) {
return; return;
if (c->isminimized) { if (c->isminimized) {
c->isminimized = 0; client_pending_minimized_state(c, 0);
c->tags = c->mini_restore_tag; c->tags = c->mini_restore_tag;
c->is_scratchpad_show = 0; c->is_scratchpad_show = 0;
c->is_in_scratchpad = 0; c->is_in_scratchpad = 0;
c->isnamedscratchpad = 0; c->isnamedscratchpad = 0;
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel,
false);
setborder_color(c); setborder_color(c);
if (VISIBLEON(c, c->mon)) { if (VISIBLEON(c, c->mon)) {
need_arrange = true; need_arrange = true;