11import greenlet
22import time
3+ import curtsies .events as events
34
45from bpython .repl import Interaction as BpythonInteraction
56
@@ -18,22 +19,24 @@ class StatusBar(BpythonInteraction):
1819 functionality in a evented or callback style, but trying to integrate
1920 bpython.Repl code.
2021 """
21- def __init__ (self , initial_message = '' , permanent_text = "" ):
22+ def __init__ (self , initial_message = '' , permanent_text = "" , stuff_a_refresh_request = lambda : None ):
2223 self ._current_line = ''
2324 self .cursor_offset_in_line = 0
2425 self .in_prompt = False
2526 self .in_confirm = False
27+ self .waiting_for_refresh = False
2628 self .prompt = ''
2729 self ._message = initial_message
2830 self .message_start_time = time .time ()
2931 self .message_time = 3
3032 self .permanent_text = permanent_text
3133 self .main_greenlet = greenlet .getcurrent ()
3234 self .request_greenlet = None
35+ self .stuff_a_refresh_request = stuff_a_refresh_request
3336
3437 @property
3538 def has_focus (self ):
36- return self .in_prompt or self .in_confirm
39+ return self .in_prompt or self .in_confirm or self . waiting_for_refresh
3740
3841 def message (self , msg ):
3942 self .message_start_time = time .time ()
@@ -45,8 +48,11 @@ def _check_for_expired_message(self):
4548
4649 def process_event (self , e ):
4750 """Returns True if shutting down"""
48- assert self .in_prompt or self .in_confirm
49- if e in rl_char_sequences :
51+ assert self .in_prompt or self .in_confirm or self .waiting_for_refresh
52+ if isinstance (e , events .RefreshRequestEvent ):
53+ self .waiting_for_refresh = False
54+ self .request_greenlet .switch ()
55+ elif e in rl_char_sequences :
5056 self .cursor_offset_in_line , self ._current_line = rl_char_sequences [e ](self .cursor_offset_in_line , self ._current_line )
5157 elif e == "" :
5258 raise KeyboardInterrupt ()
@@ -55,7 +61,7 @@ def process_event(self, e):
5561 elif self .in_prompt and e in ("\n " , "\r " ):
5662 line = self ._current_line
5763 self .escape ()
58- self .main_greenlet_switch (line )
64+ self .request_greenlet . switch (line )
5965 elif self .in_confirm :
6066 if e in ('y' , 'Y' ):
6167 self .request_greenlet .switch (True )
@@ -94,6 +100,8 @@ def notify(self, msg, n=3):
94100 self .request_greenlet = greenlet .getcurrent ()
95101 self .message_time = n
96102 self .message (msg )
103+ self .waiting_for_refresh = True
104+ self .stuff_a_refresh_request ()
97105 self .main_greenlet .switch (msg )
98106
99107 # below Really ought to be called from greenlets other than main because they block
@@ -108,4 +116,5 @@ def file_prompt(self, s):
108116 self .request_greenlet = greenlet .getcurrent ()
109117 self .prompt = s .replace ('Esc' , 'Tab' )
110118 self .in_prompt = True
111- return self .main_greenlet .switch (s )
119+ result = self .main_greenlet .switch (s )
120+ return result
0 commit comments