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