Skip to content

Commit 1bc66fc

Browse files
first refactor step
1 parent dbba924 commit 1bc66fc

File tree

1 file changed

+112
-3
lines changed

1 file changed

+112
-3
lines changed

bpython/curtsies.py

Lines changed: 112 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,114 @@
2525
logger = logging.getLogger(__name__)
2626

2727

28-
repl = None # global for `from bpython.curtsies import repl`
28+
#repl = None # global for `from bpython.curtsies import repl`
2929
# WARNING Will be a problem if more than one repl is ever instantiated this way
3030

3131

32+
class FullCurtsiesRepl(Repl):
33+
def __init__(self, config, locals_, banner, interp=None,
34+
paste=None, interactive=True):
35+
self.input_generator = curtsies.input.Input(
36+
keynames='curtsies',
37+
sigint_event=True,
38+
paste_threshold=None)
39+
self.window = curtsies.window.CursorAwareWindow(
40+
sys.stdout,
41+
sys.stdin,
42+
keep_last_line=True,
43+
hide_cursor=False,
44+
extra_bytes_callback=self.input_generator.unget_bytes)
45+
46+
self.request_refresh = self.input_generator.event_trigger(
47+
bpythonevents.RefreshRequestEvent)
48+
self.schedule_refresh = self.input_generator.scheduled_event_trigger(
49+
bpythonevents.ScheduledRefreshRequestEvent)
50+
self.request_reload = self.input_generator.threadsafe_event_trigger(
51+
bpythonevents.ReloadEvent)
52+
self.interrupting_refresh = (self.input_generator
53+
.threadsafe_event_trigger(lambda: None))
54+
self.request_undo = self.input_generator.event_trigger(
55+
bpythonevents.UndoEvent)
56+
57+
with self.input_generator:
58+
pass # temp hack to get .original_stty
59+
60+
Repl.__init__(self,
61+
config=config,
62+
locals_=locals_,
63+
request_refresh=self.request_refresh,
64+
schedule_refresh=self.schedule_refresh,
65+
request_reload=self.request_reload,
66+
request_undo=self.request_undo,
67+
get_term_hw=self.window.get_term_hw,
68+
get_cursor_vertical_diff=self.window.get_cursor_vertical_diff,
69+
banner=banner,
70+
interp=interp,
71+
interactive=interactive,
72+
orig_tcattrs=self.input_generator.original_stty,
73+
on_suspend=self.on_suspend,
74+
after_suspend=self.after_suspend)
75+
76+
77+
def on_suspend(self):
78+
self.window.__exit__(None, None, None)
79+
self.input_generator.__exit__(None, None, None)
80+
81+
def after_suspend(self):
82+
self.input_generator.__enter__()
83+
self.window.__enter__()
84+
self.interrupting_refresh()
85+
86+
def process_event(self, e):
87+
"""If None is passed in, just paint the screen"""
88+
try:
89+
if e is not None:
90+
Repl.process_event(self, e)
91+
except (SystemExitFromCodeGreenlet, SystemExit) as err:
92+
array, cursor_pos = self.paint(
93+
about_to_exit=True,
94+
user_quit=isinstance(err,
95+
SystemExitFromCodeGreenlet))
96+
scrolled = self.window.render_to_terminal(array, cursor_pos)
97+
self.scroll_offset += scrolled
98+
raise
99+
else:
100+
array, cursor_pos = self.paint()
101+
scrolled = self.window.render_to_terminal(array, cursor_pos)
102+
self.scroll_offset += scrolled
103+
104+
def mainloop(self, interactive=True, paste=None):
105+
if interactive:
106+
# Add custom help command
107+
# TODO: add methods to run the code
108+
self.coderunner.interp.locals['_repl'] = self
109+
110+
self.coderunner.interp.runsource(
111+
'from bpython.curtsiesfrontend._internal '
112+
'import _Helper')
113+
self.coderunner.interp.runsource('help = _Helper(_repl)\n')
114+
115+
del self.coderunner.interp.locals['_repl']
116+
del self.coderunner.interp.locals['_Helper']
117+
118+
# run startup file
119+
self.process_event(bpythonevents.RunStartupFileEvent())
120+
121+
# handle paste
122+
if paste:
123+
self.process_event(paste)
124+
125+
# do a display before waiting for first event
126+
self.process_event(None)
127+
inputs = combined_events(self.input_generator)
128+
for unused in find_iterator:
129+
e = inputs.send(0)
130+
if e is not None:
131+
self.process_event(e)
132+
133+
for e in inputs:
134+
self.process_event(e)
135+
32136
def main(args=None, locals_=None, banner=None, welcome_message=None):
33137
"""
34138
banner is displayed directly after the version information.
@@ -85,8 +189,13 @@ def main(args=None, locals_=None, banner=None, welcome_message=None):
85189
if banner is not None:
86190
print(banner)
87191
try:
88-
exit_value = mainloop(config, locals_, welcome_message, interp, paste,
89-
interactive=(not exec_args))
192+
r = FullCurtsiesRepl(config, locals_, welcome_message, interp, paste,
193+
interactive=(not exec_args))
194+
with r.input_generator:
195+
with r.window as win:
196+
with r:
197+
r.height, r.width = win.t.height, win.t.width
198+
exit_value = r.mainloop()
90199
except (SystemExitFromCodeGreenlet, SystemExit) as e:
91200
exit_value = e.args
92201
return extract_exit_value(exit_value)

0 commit comments

Comments
 (0)