class Ncurses::CharCode

Helper class for storing keycodes and multibyte characters.

Attributes

status[R]

Status code allows us to detect printable characters and control codes.

Public Class Methods

character(c) click to toggle source

Creates new instance of CharCode that keeps a printable character.

# File lib/sup/util/ncurses.rb, line 42
def self.character(c)
  generate c, Ncurses::OK
end
dumb!() click to toggle source

Enables dumb mode for any new instance.

# File lib/sup/util/ncurses.rb, line 70
def self.dumb!
  @dumb = true
end
dumb?() click to toggle source

Asks if dumb mode was set

# File lib/sup/util/ncurses.rb, line 75
def self.dumb?
  defined?(@dumb) && @dumb
end
empty() click to toggle source

Returns empty singleton.

# File lib/sup/util/ncurses.rb, line 30
def self.empty
  Empty.instance
end
generate(c = nil, status = Ncurses::OK) click to toggle source

Generates new object like new but for empty or erroneous objects it returns empty singleton.

# File lib/sup/util/ncurses.rb, line 49
def self.generate(c = nil, status = Ncurses::OK)
  if status == Ncurses::ERR || c.nil? || c === Ncurses::ERR
    empty
  else
    new(c, status)
  end
end
get(handle_interrupt=true) click to toggle source

Gets character from input. Pretends ctrl-c's are ctrl-g's.

# File lib/sup/util/ncurses.rb, line 59
def self.get handle_interrupt=true
  begin
    status, code = nonblocking_getwch
    generate code, status
  rescue Interrupt => e
    raise e unless handle_interrupt
    keycode Ncurses::KEY_CANCEL
  end
end
keycode(c) click to toggle source

Creates new instance of CharCode that keeps a given keycode.

# File lib/sup/util/ncurses.rb, line 36
def self.keycode(c)
  generate c, Ncurses::KEY_CODE_YES
end
new(c = "", status = Ncurses::OK) click to toggle source
Calls superclass method
# File lib/sup/util/ncurses.rb, line 79
def initialize(c = "", status = Ncurses::OK)
  @status = status
  c = "" if c.nil?
  return super("") if status == Ncurses::ERR
  c = enc_char(c) if c.is_a?(Fixnum)
  super c.length > 1 ? c[0,1] : c
end
nonblocking_getwch() click to toggle source

Reads character from user input.

# File lib/sup/util/ncurses.rb, line 19
def self.nonblocking_getwch
  # If we get input while we're shelled, we'll ignore it for the
  # moment and use Ncurses.sync to wait until the shell_out is done.
  begin
    s, c = Redwood::BufferManager.shelled? ? Ncurses.sync { nil } : Ncurses.get_wch
    break if s != Ncurses::ERR
  end until IO.select([$stdin], nil, nil, 2)
  [s, c]
end

Public Instance Methods

character() click to toggle source
# File lib/sup/util/ncurses.rb, line 110
def character       ; try_character                             end
character!() click to toggle source
# File lib/sup/util/ncurses.rb, line 112
def character!      ; @status  = Ncurses::OK ; self             end
character?() click to toggle source
# File lib/sup/util/ncurses.rb, line 111
def character?      ; dumb? || @status == Ncurses::OK           end
code() click to toggle source
# File lib/sup/util/ncurses.rb, line 104
def code            ; ord                                       end
dumb?() click to toggle source
# File lib/sup/util/ncurses.rb, line 118
def dumb?           ; self.class.dumb?                          end
is_character?(c) click to toggle source
# File lib/sup/util/ncurses.rb, line 106
def is_character?(c); character? &&  self == c                  end
is_keycode?(c) click to toggle source
# File lib/sup/util/ncurses.rb, line 105
def is_keycode?(c)  ; keycode?   &&  code == c                  end
keycode() click to toggle source
# File lib/sup/util/ncurses.rb, line 109
def keycode         ; try_keycode                               end
keycode!() click to toggle source
# File lib/sup/util/ncurses.rb, line 114
def keycode!        ; @status  = Ncurses::KEY_CODE_YES ; self   end
keycode=(c) click to toggle source
# File lib/sup/util/ncurses.rb, line 115
def keycode=(c)     ; replace(c); keycode! ; self               end
keycode?() click to toggle source
# File lib/sup/util/ncurses.rb, line 113
def keycode?        ; dumb? || @status == Ncurses::KEY_CODE_YES end
present?() click to toggle source
# File lib/sup/util/ncurses.rb, line 116
def present?        ; not empty?                                end
printable?() click to toggle source
# File lib/sup/util/ncurses.rb, line 117
def printable?      ; character?                                end
replace(c) click to toggle source

Proxy method for String's replace

Calls superclass method
# File lib/sup/util/ncurses.rb, line 88
def replace(c)
  return self if c.object_id == object_id
  if c.is_a?(self.class)
    @status = c.status
    super(c)
  else
    @status = Ncurses::OK
    c = "" if c.nil?
    c = enc_char(c) if c.is_a?(Fixnum)
    super c.length > 1 ? c[0,1] : c
  end
end
to_character() click to toggle source
# File lib/sup/util/ncurses.rb, line 101
def to_character    ; character? ? self : "<#{code}>"           end
to_keycode() click to toggle source
# File lib/sup/util/ncurses.rb, line 102
def to_keycode      ; keycode?   ? code : Ncurses::ERR          end
to_sequence() click to toggle source
# File lib/sup/util/ncurses.rb, line 103
def to_sequence     ; bytes.to_a                                end
try_character() click to toggle source
# File lib/sup/util/ncurses.rb, line 108
def try_character   ; character? ? self : nil                   end
try_keycode() click to toggle source
# File lib/sup/util/ncurses.rb, line 107
def try_keycode     ; keycode?   ? code : nil                   end

Private Instance Methods

enc_char(c) click to toggle source

Tries to make external character right.

# File lib/sup/util/ncurses.rb, line 161
def enc_char(c)
  begin
    character = c.chr($encoding)
  rescue RangeError, ArgumentError
    begin
      character = [c].pack('U')
    rescue RangeError
      begin
        character = c.chr
      rescue
        begin
          character = [c].pack('C')
        rescue
          character = ""
          @status = Ncurses::ERR
        end
      end
    end
    character.fix_encoding!
  end
end