ruinput 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,87 @@
1
+ # -*- coding:utf-8; mode:ruby; -*-
2
+
3
+ require "revdev"
4
+
5
+ module Ruinput
6
+
7
+ # a class for /dev/uinput
8
+ class UinputDevice < Revdev::EventDevice
9
+ attr_reader :is_created
10
+
11
+ DEFUALT_LOCATION = "/dev/uinput"
12
+ DEFAULT_DEVICE_NAME = "ruinput"
13
+ DEFAULT_INPUT_ID = Revdev::InputId.new({ :bustype => Revdev::BUS_VIRTUAL,
14
+ :vendor => 1,
15
+ :product => 1,
16
+ :version => 1 })
17
+
18
+ def initialize location=nil
19
+ @is_created = false
20
+ location ||= DEFUALT_LOCATION
21
+ super location
22
+ end
23
+
24
+ # create virtual event divece
25
+ # _name_ :: device name
26
+ # _id_ :: InputId ("struct input_id" on input.h)
27
+ def create name = DEFAULT_DEVICE_NAME, id = DEFAULT_INPUT_ID
28
+ if not name.kind_of? String
29
+ raise ArgumentError, "1st arg expect String"
30
+ elsif not id.kind_of? Revdev::InputId
31
+ raise ArgumentError, "2nd arg expect Revdev::InputId"
32
+ end
33
+
34
+ recognize_as_keyboard
35
+ #recognize_as_mouse
36
+
37
+ uud = UinputUserDev.new({ :name => name, :id => id,
38
+ :ff_effects_max => 0, :absmax => [20],
39
+ :absmin => [30], :absfuzz => [4],
40
+ :absflat => [5] })
41
+ @file.syswrite uud.to_byte_string
42
+
43
+ @file.ioctl UI_DEV_CREATE, nil
44
+ @is_created = true
45
+ end
46
+
47
+ def destroy
48
+ if not @is_created
49
+ raise Exception, "invalid method call: this uinput is not created"
50
+ end
51
+ @file.ioctl UI_DEV_DESTROY, nil
52
+ @file.close
53
+ end
54
+
55
+ def recognize_as_keyboard
56
+ if @is_created
57
+ raise Exception, "invalid method call: this uinput is already created"
58
+ end
59
+ @file.ioctl UI_SET_EVBIT, Revdev::EV_KEY
60
+ Revdev::KEY_CNT.times do |i|
61
+ @file.ioctl UI_SET_KEYBIT, i
62
+ end
63
+
64
+ @file.ioctl UI_SET_EVBIT, Revdev::EV_MSC
65
+ Revdev::MSC_CNT.times do |i|
66
+ @file.ioctl UI_SET_MSCBIT, i
67
+ end
68
+
69
+ @file.ioctl UI_SET_EVBIT, Revdev::EV_REP
70
+ end
71
+
72
+ def recognize_as_mouse
73
+ if @is_created
74
+ raise Exception, "invalid method call: this uinput is already created"
75
+ end
76
+ @file.ioctl UI_SET_EVBIT, Revdev::EV_KEY
77
+ Revdev::KEY_CNT.times do |i|
78
+ @file.ioctl UI_SET_KEYBIT, i
79
+ end
80
+ @file.ioctl UI_SET_EVBIT, Revdev::EV_REL
81
+ Revdev::REL_CNT.times do |i|
82
+ @file.ioctl UI_SET_RELBIT, i
83
+ end
84
+ end
85
+
86
+ end
87
+ end
@@ -1,3 +1,3 @@
1
1
  module Ruinput
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/ruinput.rb CHANGED
@@ -4,7 +4,9 @@ require "ruinput/version"
4
4
  require "ruinput/ruinput.so"
5
5
 
6
6
  require "ruinput/uinput_user_dev"
7
+ require "ruinput/uinput_device"
7
8
 
8
9
  module Ruinput
9
10
  class UinputUserDev;end
11
+ class UinputDevice;end
10
12
  end
data/sample/input_j ADDED
@@ -0,0 +1,28 @@
1
+ # -*- coding:utf-8; mode:ruby; -*-
2
+
3
+ require "rubygems"
4
+ require "revdev"
5
+ require "ruinput"
6
+
7
+ def main
8
+
9
+ include Revdev
10
+ $uinput = Ruinput::UinputDevice.new
11
+ def $uinput.send type, code, value
12
+ write_input_event InputEvent.new nil, EV_MSC, MSC_SCAN, code
13
+ write_input_event InputEvent.new nil, type, code, value
14
+ write_input_event InputEvent.new nil, EV_SYN, SYN_REPORT, 0
15
+ end
16
+
17
+ $uinput.create
18
+ sleep 0.5
19
+
20
+ $uinput.send EV_KEY, KEY_J, 1
21
+ $uinput.send EV_KEY, KEY_J, 0
22
+
23
+ sleep 0.5
24
+ $uinput.destroy
25
+
26
+ end
27
+
28
+ main
@@ -0,0 +1,71 @@
1
+ # -*- coding:utf-8; mode:ruby; -*-
2
+
3
+ USAGE = <<__USAGE
4
+ usage: #{$0} devent_device
5
+ create virtual device with uinput and grab the argument event device
6
+
7
+ example: #{$0} /dev/input/event2
8
+
9
+ # if key inputs is mismatch of the displayed chars,
10
+ # you should check keyboad layouts of both system default and
11
+ # your xsession settings.
12
+ __USAGE
13
+
14
+ require "rubygems"
15
+ require "revdev"
16
+ require "ruinput"
17
+
18
+ def main
19
+
20
+ if ARGV.length != 1
21
+ STDERR.puts USAGE
22
+ exit false
23
+ end
24
+
25
+ include Revdev
26
+ $evdev = EventDevice.new ARGV.shift
27
+ $uinput = Ruinput::UinputDevice.new "/dev/uinput"
28
+
29
+ destroy = lambda do
30
+ begin
31
+ $evdev.ungrab
32
+ puts "ungrab"
33
+ rescue => e
34
+ puts e.backtrace.join "\n\t"
35
+ end
36
+ begin
37
+ $uinput.destroy
38
+ puts "destroy"
39
+ rescue => e
40
+ puts e.backtrace.join "\n\t"
41
+ end
42
+ end
43
+
44
+ trap :INT, &destroy
45
+ trap :TERM, &destroy
46
+
47
+ begin
48
+ $uinput.create "foo", $evdev.device_id
49
+ $evdev.grab
50
+ caps = true
51
+ while true
52
+ ie = $evdev.read_input_event
53
+ len = $uinput.write_input_event ie
54
+
55
+ # toggle capslock LED
56
+ if ie.code == KEY_CAPSLOCK and ie.value == 1
57
+ ie = InputEvent.new nil, EV_LED, LED_CAPSL, caps ? 1 : 0
58
+ $evdev.write_input_event ie
59
+ puts "## light #{ie.value}"
60
+ caps = (not caps)
61
+ end
62
+
63
+ puts "type:#{ie.hr_type}(#{ie.type})\tcode:#{ie.hr_code}(#{ie.code})\tvalue:#{ie.value} (#{len})"
64
+ end
65
+ rescue => e
66
+ puts e.backtrace.join "\n\t"
67
+ end
68
+
69
+ end
70
+
71
+ main
@@ -0,0 +1,54 @@
1
+ # -*- coding:utf-8; mode:ruby; -*-
2
+
3
+ require 'test/unit'
4
+ require 'rubygems'
5
+ require 'revdev'
6
+ require 'ruinput'
7
+
8
+ class UinputDeviceTest < Test::Unit::TestCase
9
+ include Ruinput
10
+
11
+ FILE = "/tmp/foo"
12
+ FileUtils.touch FILE
13
+
14
+ def test_init
15
+ UinputDevice.new FILE
16
+ end
17
+
18
+ def test_create
19
+ $file = File.new FILE
20
+ $ioctls = []
21
+ def $file.ioctl cmd, val=nil
22
+ $ioctls << cmd
23
+ end
24
+ $syswrites = ""
25
+ def $file.syswrite arg
26
+ $syswrites << arg
27
+ end
28
+
29
+ ud = UinputDevice.new $file
30
+ assert_nothing_raised do
31
+ ud.create
32
+ end
33
+ assert_equal UI_DEV_CREATE, $ioctls.last
34
+ assert 0 < $syswrites.length
35
+ end
36
+
37
+ def test_create
38
+ $file = File.new FILE
39
+ $ioctls = []
40
+ def $file.ioctl cmd, val=nil
41
+ $ioctls << cmd
42
+ end
43
+ def $file.syswrite arg
44
+ end
45
+
46
+ ud = UinputDevice.new $file
47
+ assert_nothing_raised do
48
+ ud.create
49
+ ud.destroy
50
+ end
51
+ assert_equal UI_DEV_DESTROY, $ioctls.last
52
+ end
53
+
54
+ end
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 2
10
- version: 0.0.2
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Keiichiro Ui
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-04-15 00:00:00 Z
18
+ date: 2012-04-21 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: revdev
@@ -79,10 +79,14 @@ files:
79
79
  - ext/ruinput/extconf.rb
80
80
  - ext/ruinput/ruinput.c
81
81
  - lib/ruinput.rb
82
+ - lib/ruinput/uinput_device.rb
82
83
  - lib/ruinput/uinput_user_dev.rb
83
84
  - lib/ruinput/version.rb
84
85
  - ruinput.gemspec
86
+ - sample/input_j
87
+ - sample/through_uinput
85
88
  - test/test_ruinput.rb
89
+ - test/test_uinput_device.rb
86
90
  - test/test_uinput_user_dev.rb
87
91
  homepage: https://rubygems.org/gems/ruinput
88
92
  licenses: []
@@ -119,4 +123,5 @@ specification_version: 3
119
123
  summary: ruinput is a ruby binding for uinput.h.
120
124
  test_files:
121
125
  - test/test_ruinput.rb
126
+ - test/test_uinput_device.rb
122
127
  - test/test_uinput_user_dev.rb