X Tutup
Skip to content

Commit 402bb33

Browse files
save and pastebin both work well
--HG-- branch : scroll-frontend
1 parent 2e54cbb commit 402bb33

File tree

2 files changed

+32
-17
lines changed

2 files changed

+32
-17
lines changed

bpython/curtsiesfrontend/interaction.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import greenlet
22
import time
3+
import curtsies.events as events
34

45
from 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

bpython/curtsiesfrontend/repl.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,20 @@ def __init__(self, locals_=None, config=None, stuff_a_refresh_request=lambda: No
140140
if config.cli_suggestion_width <= 0 or config.cli_suggestion_width > 1:
141141
config.cli_suggestion_width = 1
142142

143+
self.reevaluating = False
144+
self.fake_refresh_request = False
145+
def request_refresh():
146+
if self.reevaluating:
147+
self.fake_refresh_request = True
148+
else:
149+
stuff_a_refresh_request()
150+
self.stuff_a_refresh_request = request_refresh
151+
143152
self.status_bar = StatusBar(banner if config.curtsies_fill_terminal else '', _(
144153
" <%s> Rewind <%s> Save <%s> Pastebin <%s> Editor"
145-
) % (config.undo_key, config.save_key, config.pastebin_key, config.external_editor_key))
154+
) % (config.undo_key, config.save_key, config.pastebin_key, config.external_editor_key),
155+
stuff_a_refresh_request=self.stuff_a_refresh_request
156+
)
146157
self.rl_char_sequences = get_updated_char_sequences(key_dispatch, config)
147158
logging.debug("starting parent init")
148159
super(Repl, self).__init__(interp, config)
@@ -165,14 +176,6 @@ def __init__(self, locals_=None, config=None, stuff_a_refresh_request=lambda: No
165176
self.cursor_offset_in_line = 0 # from the left, 0 means first char
166177
self.done = True
167178

168-
self.reevaluating = False
169-
self.fake_refresh_request = False
170-
def request_refresh():
171-
if self.reevaluating:
172-
self.fake_refresh_request = True
173-
else:
174-
stuff_a_refresh_request()
175-
self.stuff_a_refresh_request = request_refresh
176179
self.coderunner = CodeRunner(self.interp, request_refresh)
177180
self.stdout = FakeOutput(self.coderunner, self.send_to_stdout)
178181
self.stderr = FakeOutput(self.coderunner, self.send_to_stderr)
@@ -231,8 +234,11 @@ def process_event(self, e):
231234
result = None
232235
logging.debug("processing event %r", e)
233236
if isinstance(e, events.RefreshRequestEvent):
234-
assert self.coderunner.code_is_waiting
235-
self.run_code_and_maybe_finish()
237+
if self.status_bar.has_focus:
238+
self.status_bar.process_event(e)
239+
else:
240+
assert self.coderunner.code_is_waiting
241+
self.run_code_and_maybe_finish()
236242
elif isinstance(e, events.WindowChangeEvent):
237243
logging.debug('window change to %d %d', e.width, e.height)
238244
self.width, self.height = e.width, e.height

0 commit comments

Comments
 (0)
X Tutup