11# The MIT License
22#
3- # Copyright (c) 2009 the bpython authors.
3+ # Copyright (c) 2009-2010 the bpython authors.
44#
55# Permission is hereby granted, free of charge, to any person obtaining a copy
66# of this software and associated documentation files (the "Software"), to deal
@@ -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,10 @@ 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 :
450+ if event .string == chr (4 ) and not self .current_line ():
451+ self .emit ('exit-event' )
452+ return True
448453 return gtk .TextView .do_key_press_event (self , event )
449454
450455 def do_realize (self ):
@@ -575,7 +580,11 @@ def push_line(self):
575580 self .text_buffer .insert (iter_ , '\n ' )
576581 self .move_cursor (1 )
577582 self .highlight_current_line ()
578- return self .push (line + '\n ' )
583+ try :
584+ return self .push (line + '\n ' )
585+ except SystemExit :
586+ self .emit ('exit-event' )
587+ return False
579588
580589 def reprint_line (self , lineno , tokens ):
581590 """
@@ -632,16 +641,24 @@ def main(args=None):
632641
633642 interpreter = repl .Interpreter (None , getpreferredencoding ())
634643 repl_widget = ReplWidget (interpreter , config )
644+ repl_widget .connect ('exit-event' , gtk .main_quit )
635645
636- sys .stderr = repl_widget
637- sys .stdout = repl_widget
646+ gobject .idle_add (init_import_completion )
638647
639- # repl.startup()
648+ if not exec_args :
649+ sys .path .insert (0 , '' )
650+ gobject .idle_add (repl_widget .startup )
651+ else :
652+ if options .interactive :
653+ gobject .idle_add (bpython .args .exec_code , interpreter , exec_args )
654+ else :
655+ bpython .args .exec_code (interpreter , exec_args )
656+ return 0
640657
641- gobject .idle_add (init_import_completion )
658+ sys .stderr = repl_widget
659+ sys .stdout = repl_widget
642660
643661 if not options .socket_id :
644- # print options.socket_id
645662 parent = gtk .Window ()
646663 parent .connect ('delete-event' , lambda widget , event : gtk .main_quit ())
647664
@@ -666,7 +683,15 @@ def main(args=None):
666683 parent .show_all ()
667684 parent .connect ('delete-event' , lambda widget , event : gtk .main_quit ())
668685
669- gtk .main ()
686+ try :
687+ gtk .main ()
688+ except KeyboardInterrupt :
689+ pass
690+ finally :
691+ if config .hist_length :
692+ histfilename = os .path .expanduser (config .hist_file )
693+ repl_widget .rl_history .save (histfilename , getpreferredencoding ())
694+ return 0
670695
671696
672697if __name__ == '__main__' :
0 commit comments