@@ -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
679696if __name__ == '__main__' :
0 commit comments