]> git.notmuchmail.org Git - sup/commitdiff
Merge branch 'buffer-rolling'
authorWilliam Morgan <wmorgan-sup@masanjin.net>
Tue, 25 Aug 2009 13:53:04 +0000 (09:53 -0400)
committerWilliam Morgan <wmorgan-sup@masanjin.net>
Tue, 25 Aug 2009 13:53:04 +0000 (09:53 -0400)
1  2 
lib/sup/buffer.rb

diff --combined lib/sup/buffer.rb
index 4b53fed697b037656cdec013a64da1bb5e78f59c,77a0e1e4685a2e87bb7695247ea50c3a8dd7c17a..d85090a6db57eab56a8e230a6aeb8e3a925e6339
@@@ -25,13 -25,13 +25,13 @@@ module Ncurse
    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
 +    ## INSANTIY
 +    ## it is NECESSARY to wrap Ncurses.getch in a select() otherwise all
 +    ## background threads will be BLOCKED. (except in very modern versions
 +    ## of libncurses-ruby. the current one on ubuntu seems to work well.)
 +    if IO.select([$stdin], nil, nil, 0.5)
 +      c = Ncurses.getch
      end
    end
  
@@@ -70,7 -70,7 +70,7 @@@ class Buffe
    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
@@@ -196,13 -196,10 +196,13 @@@ EO
      @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
    ## have to change this. but it's not clear that we will ever actually
    ## do that.
    def roll_buffers
-     @buffers.last.force_to_top = false
-     raise_to_front @buffers.first
+     bufs = rollable_buffers
+     bufs.last.force_to_top = false
+     raise_to_front bufs.first
    end
  
    def roll_buffers_backwards
-     return unless @buffers.length > 1
-     @buffers.last.force_to_top = false
-     raise_to_front @buffers[@buffers.length - 2]
+     bufs = rollable_buffers
+     return unless bufs.length > 1
+     bufs.last.force_to_top = false
+     raise_to_front bufs[bufs.length - 2]
+   end
+   def rollable_buffers
+     @buffers.select { |b| !b.system? || @buffers.last == b }
    end
  
    def handle_input c
    def completely_redraw_screen
      return if @shelled
  
 +    ## 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
      end
  
      if answer
 -      answer = 
 +      answer =
          if answer.empty?
            spawn_modal "file browser", FileBrowserMode.new
          elsif File.directory?(answer)
    ## returns an array of labels
    def ask_for_labels domain, question, default_labels, forbidden_labels=[]
      default_labels = default_labels - forbidden_labels - LabelManager::RESERVED_LABELS
 -    default = default_labels.join(" ")
 +    default = default_labels.to_a.join(" ")
      default += " " unless default.empty?
  
      # here I would prefer to give more control and allow all_labels instead of
  
      return unless answer
  
 -    user_labels = answer.symbolistize
 +    user_labels = answer.to_set_of_symbols
      user_labels.each do |l|
        if forbidden_labels.include?(l) || LabelManager::RESERVED_LABELS.include?(l)
          BufferManager.flash "'#{l}' is a reserved label!"
    def ask_for_contacts domain, question, default_contacts=[]
      default = default_contacts.map { |s| s.to_s }.join(" ")
      default += " " unless default.empty?
 -    
 +
      recent = Index.load_contacts(AccountManager.user_emails, :num => 10).map { |c| [c.full_address, c.email] }
      contacts = ContactManager.contacts.map { |c| [ContactManager.alias_for(c), c.full_address, c.email] }