class Uinput::Keyboard

Constants

VERSION

Attributes

keymap[RW]

Public Class Methods

keymap(names) click to toggle source
# File lib/uinput/keyboard.rb, line 10
def keymap(names)
  Xkbcommon::Context.new.keymap_from_names(names)
end
new(keymap, &block) click to toggle source
Calls superclass method
# File lib/uinput/keyboard.rb, line 15
def initialize(keymap, &block)
  @keymap = keymap
  super(&block)
end

Public Instance Methods

press(*symbols) click to toggle source
# File lib/uinput/keyboard.rb, line 22
def press(*symbols)
  symbols.flat_map do |symbol|
    symbol(symbol).keys.map do |key|
      send_event(:EV_KEY, key.scan_code, 1)
      key.code
    end.tap do
      send_event(:EV_SYN, :SYN_REPORT)
    end
  end
end
release(*symbols) click to toggle source
# File lib/uinput/keyboard.rb, line 33
def release(*symbols)
  symbols.flat_map do |symbol|
    symbol(symbol).keys.map do |key|
      send_event(:EV_KEY, key.scan_code, 0)
      key.code
    end.tap do
      send_event(:EV_SYN, :SYN_REPORT)
    end
  end
end
string_to_symbols(string) click to toggle source
# File lib/uinput/keyboard.rb, line 64
def string_to_symbols(string)
  string.chars.map{ |char| char_to_symbol(char).name }
end
symbols_to_keycodes(*names) click to toggle source
# File lib/uinput/keyboard.rb, line 60
def symbols_to_keycodes(*names)
  names.map{ |name| symbol(name).keys.map(&:code) }
end
tap(*symbols) click to toggle source
# File lib/uinput/keyboard.rb, line 44
def tap(*symbols)
  press(*symbols)
  release(*symbols)
end
type(string) click to toggle source
# File lib/uinput/keyboard.rb, line 49
def type(string)
  # prevent dropped key events (b/c of evdev buffer overflow?) by sending
  # out the event chain in chunks rather than in one piece
  keycodes = []
  string_to_symbols(string).each_slice(8) do |symbols|
    keycodes += symbols.map{ |symbol| tap(symbol) }
    sleep 0.01 # time to breath
  end
  keycodes
end

Private Instance Methods

char_to_symbol(char) click to toggle source
# File lib/uinput/keyboard.rb, line 74
def char_to_symbol(char)
  @keymap.characters[char] or raise Device::Error.new("no character '#{char}' in keymap")
end
symbol(name) click to toggle source
# File lib/uinput/keyboard.rb, line 70
def symbol(name)
  @keymap.symbols[name.to_sym] or raise Device::Error.new("no keysym '#{name}' in keymap")
end