From: William Morgan Date: Wed, 5 Aug 2009 19:40:02 +0000 (-0400) Subject: improve ncurses key handling for sigwinch and sigint X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=75d9f5e3db04f92fba387d56f83a81d0c5b496f6;p=sup improve ncurses key handling for sigwinch and sigint see comments. adding a nodelay call before each getch means we don't need a select() call, which means that we can get sigwinch and sigint signals from ncurses. --- diff --git a/bin/sup b/bin/sup index 1febefd..b32ad75 100755 --- a/bin/sup +++ b/bin/sup @@ -218,29 +218,26 @@ begin end until Redwood::exceptions.nonempty? || SuicideManager.die? - c = - begin - Ncurses.nonblocking_getch - rescue Exception => e - if e.is_a?(Interrupt) - raise if BufferManager.ask_yes_or_no("Die ungracefully now?") - bm.draw_screen - nil - end - end + c = begin + Ncurses.nonblocking_getch + rescue Interrupt => e + raise if BufferManager.ask_yes_or_no "Die ungracefully now?" + BufferManager.draw_screen + nil + end + next unless c bm.erase_flash - action = - begin - if bm.handle_input c - :nothing - else - bm.resolve_input_with_keymap c, global_keymap - end - rescue InputSequenceAborted + action = begin + if bm.handle_input c :nothing + else + bm.resolve_input_with_keymap c, global_keymap end + rescue InputSequenceAborted + :nothing + end case action when :quit_now break if bm.kill_all_buffers_safely diff --git a/lib/sup/buffer.rb b/lib/sup/buffer.rb index 5f52d1d..7939e27 100644 --- a/lib/sup/buffer.rb +++ b/lib/sup/buffer.rb @@ -25,14 +25,13 @@ module Ncurses def mutex; @mutex ||= Mutex.new; end def sync &b; mutex.synchronize(&b); end - ## magically, this stuff seems to work now. i could swear it didn't - ## before. hm. def nonblocking_getch - if IO.select([$stdin], nil, nil, 1) - Ncurses.getch - else - nil - end + ## INSANITY + ## it is NECESSARY to call nodelay EVERY TIME otherwise a single ctrl-c + ## will turn a blocking call into a nonblocking one. hours of my life + ## wasted on this trivial bullshit: 3. + Ncurses.nodelay Ncurses.stdscr, false + Ncurses.getch end module_function :rows, :cols, :curx, :nonblocking_getch, :mutex, :sync @@ -70,7 +69,7 @@ class Buffer def content_height; @height - 1; end def content_width; @width; end - def resize rows, cols + def resize rows, cols return if cols == @width && rows == @height @width = cols @height = rows