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
-     next unless c
+     c = begin
+       Ncurses.nonblocking_getch
+     rescue Interrupt => e
+       raise if BufferManager.ask_yes_or_no "Die ungracefully now?"
+       BufferManager.draw_screen
+       nil
+     end
+ 
+     if c.nil?
+       if BufferManager.sigwinch_happened?
 -        Redwood::log "redrawing screen on sigwinch"
++        debug "redrawing screen on sigwinch"
+         BufferManager.completely_redraw_screen
+       end
+       next
+     end
+ 
+     if c == 410
+       ## this is ncurses's way of telling us it's detected a refresh.
+       ## since we have our own sigwinch handler, we don't do anything.
+       next
+     end
+ 
      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
 
      @flash = nil
      @shelled = @asking = false
      @in_x = ENV["TERM"] =~ /(xterm|rxvt|screen)/
 -
 -    self.class.i_am_the_instance self
+     @sigwinch_happened = false
+     @sigwinch_mutex = Mutex.new
    end
  
+   def sigwinch_happened!; @sigwinch_mutex.synchronize { @sigwinch_happened = true } end
+   def sigwinch_happened?; @sigwinch_mutex.synchronize { @sigwinch_happened } end
+ 
    def buffers; @name_map.to_a; end
  
    def focus_on buf
    def completely_redraw_screen
      return if @shelled
  
 -    Redwood::log "new screen size is #{Ncurses.rows} x #{Ncurses.cols}"
+     ## this magic makes Ncurses get the new size of the screen
+     Ncurses.endwin
+     Ncurses.stdscr.keypad 1
+     Ncurses.curs_set 0
+     Ncurses.refresh
+     @sigwinch_mutex.synchronize { @sigwinch_happened = false }
++    debug "new screen size is #{Ncurses.rows} x #{Ncurses.cols}"
+ 
      status, title = get_status_and_title(@focus_buf) # must be called outside of the ncurses lock
  
      Ncurses.sync do