]> git.cworth.org Git - sup/commitdiff
protect getch from ctrl-c's outside of the main event loop
authorWilliam Morgan <wmorgan-sup@masanjin.net>
Wed, 9 Sep 2009 14:03:08 +0000 (10:03 -0400)
committerWilliam Morgan <wmorgan-sup@masanjin.net>
Wed, 9 Sep 2009 14:03:08 +0000 (10:03 -0400)
The main event loop was interpreting ctrl-c's correctly, but other getch
callers (like asking for input) were not. This change will treat ctrl-c as
ctrl-g in those cases.

bin/sup
lib/sup/buffer.rb

diff --git a/bin/sup b/bin/sup
index e72dba5fefaaace93a3706f2904168168bb7dd9a..6a35cfdaa95d6da360c400e47086ccc2868d2b53 100755 (executable)
--- a/bin/sup
+++ b/bin/sup
@@ -210,7 +210,7 @@ begin
   until Redwood::exceptions.nonempty? || $die
     c = begin
       Ncurses.nonblocking_getch
-    rescue Interrupt => e
+    rescue Interrupt
       raise if BufferManager.ask_yes_or_no "Die ungracefully now?"
       BufferManager.draw_screen
       nil
index d85090a6db57eab56a8e230a6aeb8e3a925e6339..df5d23c455fbaeb9fa53a5d9d66305249d9d6f17 100644 (file)
@@ -35,7 +35,14 @@ module Ncurses
     end
   end
 
-  module_function :rows, :cols, :curx, :nonblocking_getch, :mutex, :sync
+  ## pretends ctrl-c's are ctrl-g's
+  def safe_nonblocking_getch
+    nonblocking_getch
+  rescue Interrupt
+    KEY_CANCEL
+  end
+
+  module_function :rows, :cols, :curx, :nonblocking_getch, :safe_nonblocking_getch, :mutex, :sync
 
   remove_const :KEY_ENTER
   remove_const :KEY_CANCEL
@@ -383,7 +390,7 @@ EOS
     draw_screen
 
     until mode.done?
-      c = Ncurses.nonblocking_getch
+      c = Ncurses.safe_nonblocking_getch
       next unless c # getch timeout
       break if c == Ncurses::KEY_CANCEL
       begin
@@ -559,7 +566,7 @@ EOS
     end
 
     while true
-      c = Ncurses.nonblocking_getch
+      c = Ncurses.safe_nonblocking_getch
       next unless c # getch timeout
       break unless tf.handle_input c # process keystroke
 
@@ -612,7 +619,7 @@ EOS
     ret = nil
     done = false
     until done
-      key = Ncurses.nonblocking_getch or next
+      key = Ncurses.safe_nonblocking_getch or next
       if key == Ncurses::KEY_CANCEL
         done = true
       elsif accept.nil? || accept.empty? || accept.member?(key)