Redwood::start
Index.load
- trap("TERM") { |x| raise "so speaking as i think, i die, i die!" }
-
if(s = Redwood::SourceManager.source_for DraftManager.source_name)
DraftManager.source = s
else
end
until Redwood::exceptions.nonempty? || SuicideManager.die?
- c = begin
- Ncurses.nonblocking_getch
- rescue Interrupt => e
- raise if BufferManager.ask_yes_or_no "Die ungracefully now?"
- BufferManager.draw_screen
- nil
- end
-
+ 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
next unless c
bm.erase_flash
- action = begin
- if bm.handle_input c
+ action =
+ begin
+ if bm.handle_input c
+ :nothing
+ else
+ bm.resolve_input_with_keymap c, global_keymap
+ end
+ rescue InputSequenceAborted
: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
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
- ## 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
+ if IO.select([$stdin], nil, nil, 1)
+ Ncurses.getch
+ else
+ nil
+ end
end
module_function :rows, :cols, :curx, :nonblocking_getch, :mutex, :sync
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