@@ -789,6 +789,9 @@ def __init__(
789789 self ._resize_event : events .Resize | None = None
790790 """A pending resize event, sent on idle."""
791791
792+ self ._css_update_count : int = 0
793+ """Incremented when CSS is invalidated."""
794+
792795 if self .ENABLE_COMMAND_PALETTE :
793796 for _key , binding in self ._bindings :
794797 if binding .action in {"command_palette" , "app.command_palette" }:
@@ -1192,6 +1195,10 @@ def get_css_variables(self) -> dict[str, str]:
11921195 variables = design .generate ()
11931196 return variables
11941197
1198+ def _invalidate_css (self ) -> None :
1199+ """Invalidate CSS, so it will be refreshed."""
1200+ self ._css_update_count += 1
1201+
11951202 def watch_dark (self , dark : bool ) -> None :
11961203 """Watches the dark bool.
11971204
@@ -1201,16 +1208,19 @@ def watch_dark(self, dark: bool) -> None:
12011208 self .set_class (dark , "-dark-mode" , update = False )
12021209 self .set_class (not dark , "-light-mode" , update = False )
12031210 self ._refresh_truecolor_filter (self .ansi_theme )
1211+ self ._invalidate_css ()
12041212 self .call_next (self .refresh_css )
12051213
12061214 def watch_ansi_theme_dark (self , theme : TerminalTheme ) -> None :
12071215 if self .dark :
12081216 self ._refresh_truecolor_filter (theme )
1217+ self ._invalidate_css ()
12091218 self .call_next (self .refresh_css )
12101219
12111220 def watch_ansi_theme_light (self , theme : TerminalTheme ) -> None :
12121221 if not self .dark :
12131222 self ._refresh_truecolor_filter (theme )
1223+ self ._invalidate_css ()
12141224 self .call_next (self .refresh_css )
12151225
12161226 @property
@@ -2206,7 +2216,9 @@ def _init_mode(self, mode: str) -> AwaitMount:
22062216 screen , await_mount = self ._get_screen (new_screen )
22072217 stack .append (screen )
22082218 self ._load_screen_css (screen )
2209- self .refresh_css ()
2219+ if screen ._css_update_count != self ._css_update_count :
2220+ self .refresh_css ()
2221+
22102222 screen .post_message (events .ScreenResume ())
22112223 else :
22122224 # Mode is not defined
@@ -2251,7 +2263,8 @@ def switch_mode(self, mode: str) -> AwaitMount:
22512263 await_mount = AwaitMount (self .screen , [])
22522264
22532265 self ._current_mode = mode
2254- self .refresh_css ()
2266+ if self .screen ._css_update_count != self ._css_update_count :
2267+ self .refresh_css ()
22552268 self .screen ._screen_resized (self .size )
22562269 self .screen .post_message (events .ScreenResume ())
22572270
@@ -3368,6 +3381,7 @@ def refresh_css(self, animate: bool = True) -> None:
33683381 stylesheet .update (self .app , animate = animate )
33693382 try :
33703383 self .screen ._refresh_layout (self .size )
3384+ self .screen ._css_update_count = self ._css_update_count
33713385 except ScreenError :
33723386 pass
33733387 # The other screens in the stack will need to know about some style
@@ -3376,6 +3390,7 @@ def refresh_css(self, animate: bool = True) -> None:
33763390 for screen in self .screen_stack :
33773391 if screen != self .screen :
33783392 stylesheet .update (screen , animate = animate )
3393+ screen ._css_update_count = self ._css_update_count
33793394
33803395 def _display (self , screen : Screen , renderable : RenderableType | None ) -> None :
33813396 """Display a renderable within a sync.
0 commit comments