lib/sup/buffer.rb in sup-0.0.1 vs lib/sup/buffer.rb in sup-0.0.2

- old
+ new

@@ -130,11 +130,11 @@ @focus_buf = nil @dirty = true @minibuf_stack = [] @textfields = {} @flash = nil - @shelled_out = false + @freeze = false self.class.i_am_the_instance self end def buffers; @name_map.to_a; end @@ -176,26 +176,26 @@ raise ArgumentError, "duplicate buffer name" if b && @name_map.member?(n) @name_map[n] = b end def completely_redraw_screen - return if @shelled_out + return if @freeze Ncurses.clear @dirty = true draw_screen end def handle_resize - return if @shelled_out + return if @freeze rows, cols = Ncurses.rows, Ncurses.cols @buffers.each { |b| b.resize rows - 1, cols } completely_redraw_screen flash "resized to #{rows}x#{cols}" end def draw_screen skip_minibuf=false - return if @shelled_out + return if @freeze ## disabling this for the time being, to help with debugging ## (currently we only have one buffer visible at a time). ## TODO: reenable this if we allow multiple buffers false && @buffers.inject(@dirty) do |dirty, buf| @@ -214,11 +214,11 @@ ## doesn't already exist. this is useful in the case that generating ## the mode is expensive, as it often is. def spawn_unless_exists title, opts={} if @name_map.member? title Redwood::log "buffer '#{title}' already exists, raising to front" - raise_to_front @name_map[title] + raise_to_front @name_map[title] unless opts[:hidden] else mode = yield spawn title, mode, opts end @name_map[title] @@ -289,15 +289,17 @@ ## entire screen not disappear and have the cursor in the right ## place is TOO FUCKING COMPLICATED. tf.activate question, default @dirty = true draw_screen true - tf.position_cursor - Ncurses.refresh ret = nil + @freeze = true + tf.position_cursor + Ncurses.refresh while tf.handle_input(Ncurses.nonblocking_getch); end + @freeze = false ret = tf.value tf.deactivate @dirty = true @@ -313,30 +315,39 @@ Ncurses.move Ncurses.rows - 1, question.length + 1 Ncurses.refresh ret = nil done = false + @freeze = true until done key = Ncurses.nonblocking_getch if key == Ncurses::KEY_CANCEL done = true elsif (accept && accept.member?(key)) || !accept ret = key done = true end end - + @freeze = false Ncurses.curs_set 0 erase_flash draw_screen Ncurses.curs_set 0 ret end def ask_yes_or_no question - [?y, ?Y].member? ask_getch(question, "ynYN") + r = ask_getch(question, "ynYN") + case r + when ?y, ?Y + true + when nil + nil + else + false + end end def draw_minibuf s = @flash || @minibuf_stack.reverse.find { |x| x } || "" @@ -346,23 +357,23 @@ end def say s, id=nil id ||= @minibuf_stack.length @minibuf_stack[id] = s - unless @shelled_out - draw_minibuf + unless @freeze + draw_screen Ncurses.refresh end id end def erase_flash; @flash = nil; end def flash s @flash = s - unless @shelled_out - draw_minibuf + unless @freeze + draw_screen Ncurses.refresh end end def clear id @@ -371,21 +382,21 @@ id.downto(0) do |i| break unless @minibuf_stack[i].nil? @minibuf_stack.delete_at i end end - unless @shelled_out - draw_minibuf + unless @freeze + draw_screen Ncurses.refresh end end def shell_out command - @shelled_out = true + @freeze = true Ncurses.endwin system command Ncurses.refresh Ncurses.curs_set 0 - @shelled_out = false + @freeze = false end end end