commit 75d9f5e3db04f92fba387d56f83a81d0c5b496f6
parent b63005a0ca90eddf1b045db47cb4a177045fb1b5
Author: William Morgan <wmorgan-sup@masanjin.net>
Date: Wed, 5 Aug 2009 15:40:02 -0400
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.
Diffstat:
2 files changed, 22 insertions(+), 26 deletions(-)
diff --git 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
@@ -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