lib/sup/buffer.rb in sup-0.0.3 vs lib/sup/buffer.rb in sup-0.0.4

- old
+ new

@@ -134,10 +134,11 @@ @name_map = {} @buffers = [] @focus_buf = nil @dirty = true @minibuf_stack = [] + @minibuf_mutex = Mutex.new @textfields = {} @flash = nil @shelled = false self.class.i_am_the_instance self @@ -364,16 +365,23 @@ else false end end - def minibuf_lines; [(@flash ? 1 : 0) + @minibuf_stack.compact.size, 1].max; end + def minibuf_lines + @minibuf_mutex.synchronize do + [(@flash ? 1 : 0) + @minibuf_stack.compact.size, 1].max + end + end def draw_minibuf opts={} - m = @minibuf_stack.compact - m << @flash if @flash - m << "" if m.empty? + m = nil + @minibuf_mutex.synchronize do + m = @minibuf_stack.compact + m << @flash if @flash + m << "" if m.empty? + end Ncurses.mutex.lock unless opts[:sync] == false Ncurses.attrset Colormap.color_for(:none) m.each_with_index do |s, i| Ncurses.mvaddstr Ncurses.rows - i - 1, 0, s + (" " * [Ncurses.cols - s.length, 0].max) @@ -381,13 +389,17 @@ Ncurses.refresh if opts[:refresh] Ncurses.mutex.unlock unless opts[:sync] == false end def say s, id=nil - new_id = id.nil? - id ||= @minibuf_stack.length - @minibuf_stack[id] = s + new_id = nil + @minibuf_mutex.synchronize do + new_id = id.nil? + id ||= @minibuf_stack.length + @minibuf_stack[id] = s + end + if new_id draw_screen :refresh => true else draw_minibuf :refresh => true end @@ -410,14 +422,16 @@ end ## a little tricky because we can't just delete_at id because ids ## are relative (they're positions into the array). def clear id - @minibuf_stack[id] = nil - if id == @minibuf_stack.length - 1 - id.downto(0) do |i| - break if @minibuf_stack[i] - @minibuf_stack.delete_at i + @minibuf_mutex.synchronize do + @minibuf_stack[id] = nil + if id == @minibuf_stack.length - 1 + id.downto(0) do |i| + break if @minibuf_stack[i] + @minibuf_stack.delete_at i + end end end draw_screen :refresh => true end