class Redwood::Colormap

Constants

DEFAULT_COLORS

Public Class Methods

color_for(*a;) click to toggle source

Performance shortcut

# File lib/sup/colormap.rb, line 239
def self.color_for *a; @@instance.color_for *a; end
instance() click to toggle source
# File lib/sup/colormap.rb, line 233
def self.instance; @@instance; end
method_missing(meth, *a) click to toggle source
# File lib/sup/colormap.rb, line 234
def self.method_missing meth, *a
  Colormap.new unless @@instance
  @@instance.send meth, *a
end
new() { |self| ... } click to toggle source
# File lib/sup/colormap.rb, line 75
def initialize
  raise "only one instance can be created" if @@instance
  @@instance = self
  @color_pairs = {[Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK] => 0}
  @users = []
  @next_id = 0
  reset
  yield self if block_given?
end

Public Instance Methods

add(sym, fg, bg, attr=nil, highlight=nil) click to toggle source
# File lib/sup/colormap.rb, line 93
def add sym, fg, bg, attr=nil, highlight=nil
  raise ArgumentError, "color for #{sym} already defined" if @entries.member? sym
  raise ArgumentError, "color '#{fg}' unknown" unless (-1...Ncurses::NUM_COLORS).include? fg
  raise ArgumentError, "color '#{bg}' unknown" unless (-1...Ncurses::NUM_COLORS).include? bg
  attrs = [attr].flatten.compact

  @entries[sym] = [fg, bg, attrs, nil]

  if not highlight
    highlight = highlight_sym(sym)
    @entries[highlight] = highlight_for(fg, bg, attrs) + [nil]
  end

  @highlights[sym] = highlight
end
color_for(sym, highlight=false) click to toggle source
# File lib/sup/colormap.rb, line 148
def color_for sym, highlight=false
  sym = @highlights[sym] if highlight
  return Ncurses::COLOR_BLACK if sym == :none
  raise ArgumentError, "undefined color #{sym}" unless @entries.member? sym

  ## if this color is cached, return it
  fg, bg, attrs, color = @entries[sym]
  return color if color

  if(cp = @color_pairs[[fg, bg]])
    ## nothing
  else ## need to get a new colorpair
    @next_id = (@next_id + 1) % Ncurses::MAX_PAIRS
    @next_id += 1 if @next_id == 0 # 0 is always white on black
    id = @next_id
    debug "colormap: for color #{sym}, using id #{id} -> #{fg}, #{bg}"
    Ncurses.init_pair id, fg, bg or raise ArgumentError,
      "couldn't initialize curses color pair #{fg}, #{bg} (key #{id})"

    cp = @color_pairs[[fg, bg]] = Ncurses.COLOR_PAIR(id)
    ## delete the old mapping, if it exists
    if @users[cp]
      @users[cp].each do |usym|
        warn "dropping color #{usym} (#{id})"
        @entries[usym][3] = nil
      end
      @users[cp] = []
    end
  end

  ## by now we have a color pair
  color = attrs.inject(cp) { |color, attr| color | attr }
  @entries[sym][3] = color # fill the cache
  (@users[cp] ||= []) << sym # record entry as a user of that color pair
  color
end
highlight_for(fg, bg, attrs) click to toggle source
# File lib/sup/colormap.rb, line 113
def highlight_for fg, bg, attrs
  hfg =
    case fg
    when Ncurses::COLOR_BLUE
      Ncurses::COLOR_WHITE
    when Ncurses::COLOR_YELLOW, Ncurses::COLOR_GREEN
      fg
    else
      Ncurses::COLOR_BLACK
    end

  hbg =
    case bg
    when Ncurses::COLOR_CYAN
      Ncurses::COLOR_YELLOW
    when Ncurses::COLOR_YELLOW
      Ncurses::COLOR_BLUE
    else
      Ncurses::COLOR_CYAN
    end

  attrs =
    if fg == Ncurses::COLOR_WHITE && attrs.include?(Ncurses::A_BOLD)
      [Ncurses::A_BOLD]
    else
      case hfg
      when Ncurses::COLOR_BLACK
        []
      else
        [Ncurses::A_BOLD]
      end
    end
  [hfg, hbg, attrs]
end
highlight_sym(sym) click to toggle source
# File lib/sup/colormap.rb, line 109
def highlight_sym sym
  "#{sym}_highlight".intern
end
populate_colormap() click to toggle source

Try to use the user defined colors, in case of an error fall back to the default ones.

# File lib/sup/colormap.rb, line 191
def populate_colormap
  user_colors = if File.exist? Redwood::COLOR_FN
    debug "loading user colors from #{Redwood::COLOR_FN}"
    Redwood::load_yaml_obj Redwood::COLOR_FN
  end

  ## Set attachment sybmol to sane default for existing colorschemes
  if user_colors and user_colors.has_key? :to_me
    user_colors[:with_attachment] = user_colors[:to_me] unless user_colors.has_key? :with_attachment
  end

  Colormap::DEFAULT_COLORS.merge(user_colors||{}).each_pair do |k, v|
    fg = begin
      Ncurses.const_get "COLOR_#{v[:fg].to_s.upcase}"
    rescue NameError
      warn "there is no color named \"#{v[:fg]}\""
      Ncurses::COLOR_GREEN
    end

    bg = begin
      Ncurses.const_get "COLOR_#{v[:bg].to_s.upcase}"
    rescue NameError
      warn "there is no color named \"#{v[:bg]}\""
      Ncurses::COLOR_RED
    end

    attrs = (v[:attrs]||[]).map do |a|
      begin
        Ncurses.const_get "A_#{a.upcase}"
      rescue NameError
        warn "there is no attribute named \"#{a}\", using fallback."
        nil
      end
    end.compact

    highlight_symbol = v[:highlight] ? :"#{v[:highlight]}_color" : nil

    symbol = (k.to_s + "_color").to_sym
    add symbol, fg, bg, attrs, highlight_symbol
  end
end
reset() click to toggle source
# File lib/sup/colormap.rb, line 85
def reset
  @entries = {}
  @highlights = { :none => highlight_sym(:none)}
  @entries[highlight_sym(:none)] = highlight_for(Ncurses::COLOR_WHITE,
                                                 Ncurses::COLOR_BLACK,
                                                 []) + [nil]
end
sym_is_defined(sym) click to toggle source
# File lib/sup/colormap.rb, line 185
def sym_is_defined sym
    return sym if @entries.member? sym
end