Skip to content

Commit 0d3ed31

Browse files
committed
opt: optimize foreign toplevel state sync
1 parent 254eb8a commit 0d3ed31

2 files changed

Lines changed: 43 additions & 25 deletions

File tree

src/dispatch/bind_define.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ int32_t restore_minimized(const Arg *arg) {
552552

553553
if (selmon && selmon->sel && selmon->sel->is_in_scratchpad &&
554554
selmon->sel->is_scratchpad_show) {
555-
selmon->sel->isminimized = 0;
555+
client_pending_minimized_state(selmon->sel, 0);
556556
selmon->sel->is_scratchpad_show = 0;
557557
selmon->sel->is_in_scratchpad = 0;
558558
selmon->sel->isnamedscratchpad = 0;

src/mango.c

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,10 @@ static int32_t keep_idle_inhibit(void *data);
806806
static void check_keep_idle_inhibit(Client *c);
807807
static void pre_caculate_before_arrange(Monitor *m, bool want_animation,
808808
bool from_view, bool only_caculate);
809+
static void client_pending_fullscreen_state(Client *c, int32_t isfullscreen);
810+
static void client_pending_maximized_state(Client *c, int32_t ismaximized);
811+
static void client_pending_minimized_state(Client *c, int32_t isminimized);
812+
809813
#include "data/static_keymap.h"
810814
#include "dispatch/bind_declare.h"
811815
#include "layout/layout.h"
@@ -1063,11 +1067,33 @@ void clear_fullscreen_flag(Client *c) {
10631067
}
10641068
}
10651069

1070+
void client_pending_fullscreen_state(Client *c, int32_t isfullscreen) {
1071+
c->isfullscreen = isfullscreen;
1072+
1073+
if (c->foreign_toplevel && !c->iskilling)
1074+
wlr_foreign_toplevel_handle_v1_set_fullscreen(c->foreign_toplevel,
1075+
isfullscreen);
1076+
}
1077+
1078+
void client_pending_maximized_state(Client *c, int32_t ismaximized) {
1079+
c->ismaximizescreen = ismaximized;
1080+
if (c->foreign_toplevel && !c->iskilling)
1081+
wlr_foreign_toplevel_handle_v1_set_maximized(c->foreign_toplevel,
1082+
ismaximized);
1083+
}
1084+
1085+
void client_pending_minimized_state(Client *c, int32_t isminimized) {
1086+
c->isminimized = isminimized;
1087+
if (c->foreign_toplevel && !c->iskilling)
1088+
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel,
1089+
isminimized);
1090+
}
1091+
10661092
void show_scratchpad(Client *c) {
10671093
c->is_scratchpad_show = 1;
10681094
if (c->isfullscreen || c->ismaximizescreen) {
1069-
c->isfullscreen = 0; // 清除窗口全屏标志
1070-
c->ismaximizescreen = 0;
1095+
client_pending_fullscreen_state(c, 0);
1096+
client_pending_maximized_state(c, 0);
10711097
c->bw = c->isnoborder ? 0 : config.borderpx;
10721098
}
10731099

@@ -1141,7 +1167,6 @@ void swallow(Client *c, Client *w) {
11411167
if (c->isminimized && c->foreign_toplevel) {
11421168
wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel,
11431169
false);
1144-
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel, true);
11451170
}
11461171
}
11471172

@@ -4231,7 +4256,7 @@ void maximizenotify(struct wl_listener *listener, void *data) {
42314256

42324257
void unminimize(Client *c) {
42334258
if (c && c->is_in_scratchpad && c->is_scratchpad_show) {
4234-
c->isminimized = 0;
4259+
client_pending_minimized_state(c, 0);
42354260
c->is_scratchpad_show = 0;
42364261
c->is_in_scratchpad = 0;
42374262
c->isnamedscratchpad = 0;
@@ -4259,13 +4284,12 @@ void set_minimized(Client *c) {
42594284
c->oldtags = c->mon->tagset[c->mon->seltags];
42604285
c->mini_restore_tag = c->tags;
42614286
c->tags = 0;
4262-
c->isminimized = 1;
4287+
client_pending_minimized_state(c, 1);
42634288
c->is_in_scratchpad = 1;
42644289
c->is_scratchpad_show = 0;
42654290
focusclient(focustop(selmon), 1);
42664291
arrange(c->mon, false, false);
42674292
wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, false);
4268-
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel, true);
42694293
wl_list_remove(&c->link); // 从原来位置移除
42704294
wl_list_insert(clients.prev, &c->link); // 插入尾部
42714295
}
@@ -5042,11 +5066,11 @@ setfloating(Client *c, int32_t floating) {
50425066
if (floating == 1 && c != grabc) {
50435067

50445068
if (c->isfullscreen) {
5045-
c->isfullscreen = 0;
5069+
client_pending_fullscreen_state(c, 0);
50465070
client_set_fullscreen(c, 0);
50475071
}
50485072

5049-
c->ismaximizescreen = 0;
5073+
client_pending_maximized_state(c, 0);
50505074
exit_scroller_stack(c);
50515075

50525076
// 重新计算居中的坐标
@@ -5171,12 +5195,12 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) {
51715195
return;
51725196

51735197
int32_t old_maximizescreen_state = c->ismaximizescreen;
5174-
c->ismaximizescreen = maximizescreen;
5198+
client_pending_maximized_state(c, maximizescreen);
51755199

51765200
if (maximizescreen) {
51775201

51785202
if (c->isfullscreen) {
5179-
c->isfullscreen = 0;
5203+
client_pending_fullscreen_state(c, 0);
51805204
client_set_fullscreen(c, 0);
51815205
}
51825206

@@ -5189,10 +5213,8 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) {
51895213
wlr_scene_node_raise_to_top(&c->scene->node);
51905214
if (!is_scroller_layout(c->mon) || c->isfloating)
51915215
resize(c, maximizescreen_box, 0);
5192-
c->ismaximizescreen = 1;
51935216
} else {
51945217
c->bw = c->isnoborder ? 0 : config.borderpx;
5195-
c->ismaximizescreen = 0;
51965218
if (c->isfloating)
51975219
setfloating(c, 1);
51985220
}
@@ -5240,14 +5262,15 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自
52405262
c->isfullscreen = fullscreen;
52415263

52425264
client_set_fullscreen(c, fullscreen);
5265+
client_pending_fullscreen_state(c, fullscreen);
52435266

52445267
if (fullscreen) {
52455268

52465269
if (c->ismaximizescreen && !c->force_fakemaximize) {
52475270
client_set_maximized(c, false);
52485271
}
52495272

5250-
c->ismaximizescreen = 0;
5273+
client_pending_maximized_state(c, 0);
52515274

52525275
exit_scroller_stack(c);
52535276
c->isfakefullscreen = 0;
@@ -5256,10 +5279,8 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自
52565279
wlr_scene_node_raise_to_top(&c->scene->node); // 将视图提升到顶层
52575280
if (!is_scroller_layout(c->mon) || c->isfloating)
52585281
resize(c, c->mon->m, 1);
5259-
c->isfullscreen = 1;
52605282
} else {
52615283
c->bw = c->isnoborder ? 0 : config.borderpx;
5262-
c->isfullscreen = 0;
52635284
if (c->isfloating)
52645285
setfloating(c, 1);
52655286
}
@@ -5451,8 +5472,7 @@ void show_hide_client(Client *c) {
54515472
c->tags = c->oldtags;
54525473
arrange(c->mon, false, false);
54535474
}
5454-
c->isminimized = 0;
5455-
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel, false);
5475+
client_pending_minimized_state(c, 0);
54565476
focusclient(c, 1);
54575477
wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, true);
54585478
}
@@ -5876,8 +5896,8 @@ void overview_backup(Client *c) {
58765896
c->isfloating = 0;
58775897
}
58785898
if (c->isfullscreen || c->ismaximizescreen) {
5879-
c->isfullscreen = 0; // 清除窗口全屏标志
5880-
c->ismaximizescreen = 0;
5899+
client_pending_fullscreen_state(c, 0); // 清除窗口全屏标志
5900+
client_pending_maximized_state(c, 0);
58815901
}
58825902
c->bw = c->isnoborder ? 0 : config.borderpx;
58835903

@@ -5907,8 +5927,8 @@ void overview_restore(Client *c, const Arg *arg) {
59075927
} else if (want_restore_fullscreen(c) && c->isfullscreen) {
59085928
setfullscreen(c, 1);
59095929
} else {
5910-
c->isfullscreen = 0;
5911-
c->ismaximizescreen = 0;
5930+
client_pending_fullscreen_state(c, 0);
5931+
client_pending_maximized_state(c, 0);
59125932
setfullscreen(c, false);
59135933
}
59145934
} else {
@@ -6481,13 +6501,11 @@ void activatex11(struct wl_listener *listener, void *data) {
64816501
return;
64826502

64836503
if (c->isminimized) {
6484-
c->isminimized = 0;
6504+
client_pending_minimized_state(c, 0);
64856505
c->tags = c->mini_restore_tag;
64866506
c->is_scratchpad_show = 0;
64876507
c->is_in_scratchpad = 0;
64886508
c->isnamedscratchpad = 0;
6489-
wlr_foreign_toplevel_handle_v1_set_minimized(c->foreign_toplevel,
6490-
false);
64916509
setborder_color(c);
64926510
if (VISIBLEON(c, c->mon)) {
64936511
need_arrange = true;

0 commit comments

Comments
 (0)