Skip to content

Commit 29d2a17

Browse files
committed
Make C-d and exit() work in bpython-gtk.
This closes issue #81.
1 parent 06714d7 commit 29d2a17

File tree

3 files changed

+25
-9
lines changed

3 files changed

+25
-9
lines changed

bpython/cli.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,10 @@ def push(self, s, insert_into_history=True):
896896
curses.raw(False)
897897
try:
898898
return Repl.push(self, s, insert_into_history)
899+
except SystemExit:
900+
# Avoid a traceback on e.g. quit()
901+
self.do_exit = True
902+
return False
899903
finally:
900904
curses.raw(True)
901905

bpython/gtk_.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ class ReplWidget(gtk.TextView, repl.Repl):
251251
__gsignals__ = dict(button_press_event=None,
252252
focus_in_event=None,
253253
focus_out_event=None,
254-
realize=None)
254+
realize=None,
255+
exit_event=(gobject.SIGNAL_RUN_LAST, None, ()))
255256

256257
def __init__(self, interpreter, config):
257258
gtk.TextView.__init__(self)
@@ -445,6 +446,9 @@ def do_key_press_event(self, event):
445446
self.list_win_visible):
446447
self.list_win.back()
447448
return True
449+
elif state & gtk.gdk.CONTROL_MASK and event.string == chr(4):
450+
self.emit('exit-event')
451+
return True
448452
return gtk.TextView.do_key_press_event(self, event)
449453

450454
def do_realize(self):
@@ -575,7 +579,11 @@ def push_line(self):
575579
self.text_buffer.insert(iter_, '\n')
576580
self.move_cursor(1)
577581
self.highlight_current_line()
578-
return self.push(line + '\n')
582+
try:
583+
return self.push(line + '\n')
584+
except SystemExit:
585+
self.emit('exit-event')
586+
return False
579587

580588
def reprint_line(self, lineno, tokens):
581589
"""
@@ -632,6 +640,7 @@ def main(args=None):
632640

633641
interpreter = repl.Interpreter(None, getpreferredencoding())
634642
repl_widget = ReplWidget(interpreter, config)
643+
repl_widget.connect('exit-event', gtk.main_quit)
635644

636645
gobject.idle_add(init_import_completion)
637646

@@ -673,7 +682,15 @@ def main(args=None):
673682
parent.show_all()
674683
parent.connect('delete-event', lambda widget, event: gtk.main_quit())
675684

676-
gtk.main()
685+
try:
686+
gtk.main()
687+
except KeyboardInterrupt:
688+
pass
689+
finally:
690+
if config.hist_length:
691+
histfilename = os.path.expanduser(config.hist_file)
692+
repl_widget.rl_history.save(histfilename, getpreferredencoding())
693+
return 0
677694

678695

679696
if __name__ == '__main__':

bpython/repl.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -650,12 +650,7 @@ def push(self, s, insert_into_history=True):
650650
if insert_into_history:
651651
self.rl_history.append(s)
652652

653-
try:
654-
more = self.interp.runsource('\n'.join(self.buffer))
655-
except SystemExit:
656-
# Avoid a traceback on e.g. quit()
657-
self.do_exit = True
658-
return False
653+
more = self.interp.runsource('\n'.join(self.buffer))
659654

660655
if not more:
661656
self.buffer = []

0 commit comments

Comments
 (0)