# -*- coding:utf-8; mode:ruby; -*-

USAGE = <<__USAGE
usage: #{$0} devent_device
  create virtual device with uinput and grab the argument event device

example: #{$0} /dev/input/event2

# if key inputs is mismatch of the displayed chars,
# you should check keyboad layouts of both system default and
# your xsession settings.
__USAGE

require "rubygems"
require "revdev"
require "ruinput"

def main

  if ARGV.length != 1
    STDERR.puts USAGE
    exit false
  end

  include Revdev
  $evdev = EventDevice.new ARGV.shift
  $uinput = Ruinput::UinputDevice.new "/dev/uinput"

  destroy = lambda do
    begin
      $evdev.ungrab
      puts "ungrab"
    rescue => e
      puts e.backtrace.join "\n\t"
    end
    begin
      $uinput.destroy
      puts "destroy"
    rescue => e
      puts e.backtrace.join "\n\t"
    end
  end

  trap :INT, &destroy
  trap :TERM, &destroy

  begin
    $uinput.create "foo", $evdev.device_id
    $evdev.grab
    caps = true
    while true
      ie = $evdev.read_input_event
      len = $uinput.write_input_event ie

      # toggle capslock LED
      if ie.code == KEY_CAPSLOCK and ie.value == 1
        led_ev = InputEvent.new nil, EV_LED, LED_CAPSL, caps ? 1 : 0
        $evdev.write_input_event led_ev
        puts "## light #{caps}"
        caps = (not caps)
      end

      puts "type:#{ie.hr_type}(#{ie.type})\tcode:#{ie.hr_code}(#{ie.code})\tvalue:#{ie.value} (#{len})"
    end
  rescue => e
    puts e.backtrace.join "\n\t"
  end

end

main
