@@ -806,6 +806,10 @@ static int32_t keep_idle_inhibit(void *data);
806806static void check_keep_idle_inhibit (Client * c );
807807static 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+
10661092void 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
42324257void 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