fusuma-plugin-sendkey 0.3.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d27660bea09b33620ab905e3b112cf0f9884b3617097daadd6d8ca03d2d5c14b
4
- data.tar.gz: 70b1f7ddffaa8d874a44feaec361c60d0bca6744f30ec6a5c6f3c3efb1fe2a9f
3
+ metadata.gz: 23d68a2efd5f41fe72149b824d2ccb15d9153b70e177e0c6547c6fdc531d7015
4
+ data.tar.gz: 206d32b21db53813a0213aa6efa7f4005132332ad06f5d360bb57aed291bd61c
5
5
  SHA512:
6
- metadata.gz: 0257fa54b43876536bb7729c74f05ff06d0a12e57885b5d544b9bdd209815780811496296339efca5353102f14fb811c1be7b82839b51542463c3cbbc90ad6b4
7
- data.tar.gz: '049d2d9cf06c538800189db3addb7508e4c98a4390c3da8eb1a41dae2eb007fe11246fbfb86fe2ac76c131a81c7fa7255d2f7951f23d37fea92780920761617a'
6
+ metadata.gz: d8565fdb87ae1ed53a903587c45fc529b780983e845be2f81601e72160244de3852fdc63d8d1f9960cb20c30b82e86713a4c56c393064cf67e04548f1c187323
7
+ data.tar.gz: 84f81cc005e1cfe105844f0108241a8e4c2c99f454a2ae5dbfa52023c4c094efb534f87f7c6f6705647b5f4fd556387c8d3ef6def58a6141c39cc94faa6dd6a2
data/.travis.yml CHANGED
@@ -6,4 +6,4 @@ rvm:
6
6
  - 2.6.1
7
7
  before_install:
8
8
  - gem install bundler -v 2.0.1
9
- - sudo apt-get -y install evemu-tools libevdev-dev
9
+ - sudo apt-get -y install libevdev-dev
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Fusuma::Plugin::Sendkey [![Gem Version](https://badge.fury.io/rb/fusuma-plugin-sendkey.svg)](https://badge.fury.io/rb/fusuma-plugin-sendkey) [![Build Status](https://travis-ci.com/iberianpig/fusuma-plugin-sendkey.svg?branch=master)](https://travis-ci.com/iberianpig/fusuma-plugin-sendkey)
2
2
 
3
- [Fusuma](https://github.com/iberianpig/fusuma) plugin that sending virtual keyboard events
3
+ [Fusuma](https://github.com/iberianpig/fusuma) plugin to send keyboard events
4
4
 
5
- * Send keyboard events with writing event /dev/input/eventN
5
+ * Emulate keyboard events with evdev
6
6
  * This plugin is wayland compatible and alternative to xdotool
7
7
 
8
8
  ## Installation
@@ -12,7 +12,7 @@ Run the following code in your terminal.
12
12
  ### Install dependencies
13
13
 
14
14
  ```sh
15
- $ sudo apt-get install libevdev-dev ruby-ffi
15
+ $ sudo apt-get install libevdev-dev
16
16
  ```
17
17
 
18
18
  ### Install fusuma-plugin-sendkey
data/exe/fusuma-sendkey CHANGED
@@ -20,7 +20,7 @@ end
20
20
  opt.parse!(ARGV)
21
21
 
22
22
  if option[:list]
23
- puts Fusuma::Plugin::Sendkey::Keyboard.new.search_codes
23
+ puts Fusuma::Plugin::Sendkey::Keyboard.new(name_pattern: nil).search_codes
24
24
  return
25
25
  end
26
26
 
@@ -10,8 +10,8 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ['iberianpig']
11
11
  spec.email = ['yhkyky@gmail.com']
12
12
 
13
- spec.summary = 'Fusuma plugin that sending virtual keyboard events'
14
- spec.description = 'Fusuma::Plugin::Sendkey emulate keyboard events with evemu-event'
13
+ spec.summary = 'Fusuma plugin to send keyboard events'
14
+ spec.description = 'Fusuma::Plugin::Sendkey emulate keyboard events with evdev'
15
15
  spec.homepage = 'https://github.com/iberianpig/fusuma-plugin-sendkey'
16
16
  spec.license = 'MIT'
17
17
 
@@ -24,9 +24,8 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ['lib']
26
26
 
27
- spec.add_dependency 'evdev', '~> 1.0'
28
- spec.add_dependency 'fusuma', '~> 1.5'
29
- spec.add_dependency 'linux_input', '~> 1.1'
27
+ spec.add_dependency 'fusuma', '~> 1.7'
28
+ spec.add_dependency 'revdev'
30
29
 
31
30
  spec.add_development_dependency 'bundler'
32
31
  spec.add_development_dependency 'github_changelog_generator', '~> 1.14'
@@ -9,7 +9,7 @@ module Fusuma
9
9
  class SendkeyExecutor < Executor
10
10
  def config_param_types
11
11
  {
12
- 'device_path': String
12
+ 'device_name': String
13
13
  }
14
14
  end
15
15
 
@@ -39,8 +39,8 @@ module Fusuma
39
39
 
40
40
  def keyboard
41
41
  @keyboard ||= begin
42
- device = Sendkey::Device.new(path: config_params(:device_path))
43
- Sendkey::Keyboard.new(device: device)
42
+ name_pattren = config_params(:device_name)
43
+ Sendkey::Keyboard.new(name_pattern: name_pattren)
44
44
  end
45
45
  end
46
46
 
@@ -1,23 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'evdev'
4
-
5
3
  module Fusuma
6
4
  module Plugin
7
5
  module Sendkey
8
6
  # handle Evdev device
9
7
  class Device
10
- def initialize(path: nil)
11
- return if path && (@evdev = Evdev.new(path))
12
-
13
- (0..99).lazy.find do |i|
14
- evdev = Evdev.new("/dev/input/event#{i}")
15
- # NOTE: find keyboard device
16
- @evdev = evdev if evdev.supports_event?('KEY_LEFTALT')
17
- rescue Errno::ENOENT # No such file or directory
18
- false
19
- # TODO: rescue Errno::EACCES
20
- end
8
+ def initialize(path:)
9
+ @evdev = Revdev::EventDevice.new(path)
21
10
  end
22
11
 
23
12
  def path
@@ -26,10 +15,8 @@ module Fusuma
26
15
  @path ||= @evdev.file.path
27
16
  end
28
17
 
29
- def support?(keycode)
30
- @evdev.supports_event?(keycode)
31
- rescue NameError
32
- false
18
+ def write_event(event)
19
+ @evdev.write_input_event(event)
33
20
  end
34
21
  end
35
22
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'linux_input'
4
- require 'fcntl'
3
+ require 'revdev'
4
+ require 'fusuma/device'
5
+
5
6
  require_relative './device.rb'
6
7
 
7
8
  module Fusuma
@@ -9,10 +10,20 @@ module Fusuma
9
10
  module Sendkey
10
11
  # Emulate Keyboard
11
12
  class Keyboard
12
- def initialize(device: nil)
13
- @device = device || Device.new
13
+ def initialize(name_pattern: nil)
14
+ name_pattern ||= 'keyboard'
15
+ device = find_device(name_pattern: name_pattern)
16
+
17
+ if device.nil?
18
+ warn "sendkey: Keyboard /#{name_pattern}/ is not found"
19
+ exit(1)
20
+ end
21
+
22
+ @device = Device.new(path: "/dev/input/#{device.id}")
14
23
  end
15
24
 
25
+ attr_writer :device
26
+
16
27
  # @param param [String]
17
28
  def type(param:)
18
29
  return unless param.is_a?(String)
@@ -24,7 +35,6 @@ module Fusuma
24
35
  key_sync(press: true)
25
36
  keycodes.reverse.map { |keycode| key_event(keycode: keycode, press: false) }
26
37
  key_sync(press: false)
27
- device_file.close
28
38
  end
29
39
 
30
40
  # @param param [String]
@@ -35,55 +45,54 @@ module Fusuma
35
45
  keycodes.all? { |keycode| support?(keycode) }
36
46
  end
37
47
 
38
- def device_file
39
- return @device_file if @device_file && !@device_file.closed?
40
-
41
- @device_file = File.open(@device.path, Fcntl::O_WRONLY | Fcntl::O_NDELAY)
42
- end
43
-
44
48
  def key_event(keycode:, press: true)
45
- event = LinuxInput::InputEvent.new
46
- event[:time] = LinuxInput::Timeval.new
47
- event[:time][:tv_sec] = Time.now.to_i
48
- event[:type] = LinuxInput::EV_KEY
49
- event[:code] = keycode_const(keycode)
50
- event[:value] = press ? 1 : 0
51
- device_file.syswrite(event.pointer.read_bytes(event.size))
49
+ event = Revdev::InputEvent.new(
50
+ nil,
51
+ Revdev.const_get(:EV_KEY),
52
+ Revdev.const_get(keycode),
53
+ press ? 1 : 0
54
+ )
55
+ @device.write_event(event)
52
56
  end
53
57
 
54
58
  def key_sync(press: true)
55
- event = LinuxInput::InputEvent.new
56
- event[:time] = LinuxInput::Timeval.new
57
- event[:time][:tv_sec] = Time.now.to_i
58
- event[:type] = LinuxInput::EV_SYN
59
- event[:code] = LinuxInput::SYN_REPORT
60
- event[:value] = press ? 1 : 0
61
- device_file.syswrite(event.pointer.read_bytes(event.size))
59
+ event = Revdev::InputEvent.new(
60
+ nil,
61
+ Revdev.const_get(:EV_SYN),
62
+ Revdev.const_get(:SYN_REPORT),
63
+ press ? 1 : 0
64
+ )
65
+ @device.write_event(event)
62
66
  end
63
67
 
64
68
  def support?(keycode)
65
69
  @supported_code ||= {}
66
- @supported_code[keycode] ||= if @device.support?(keycode)
70
+ @supported_code[keycode] ||= if find_code(keycode: keycode)
67
71
  true
68
72
  else
69
73
  search_candidates(keycode: keycode)
70
- exit(1)
71
74
  end
72
75
  end
73
76
 
74
77
  def search_candidates(keycode:)
75
- candidates = search_codes(keycode: keycode)
78
+ query = keycode&.upcase&.gsub('KEY_', '')
79
+
80
+ candidates = search_codes(query: query)
76
81
 
77
82
  warn "Did you mean? #{candidates.join(' / ')}" unless candidates.empty?
78
83
  warn "sendkey: #{remove_prefix(keycode)} is unsupported."
79
84
  end
80
85
 
81
- def search_codes(keycode: nil)
86
+ def search_codes(query: nil)
87
+ Revdev.constants
88
+ .select { |c| c[/KEY_.*#{query}.*/] }
89
+ .map { |c| c.to_s.gsub('KEY_', '') }
90
+ end
91
+
92
+ def find_code(keycode: nil)
82
93
  query = keycode&.upcase&.gsub('KEY_', '')
83
- LinuxInput.constants
84
- .select { |c| c[/KEY_.*#{query}.*/] }
85
- .select { |c| @device.support?(c) }
86
- .map { |c| c.to_s.gsub('KEY_', '') }
94
+
95
+ Revdev.constants.find { |c| c == "KEY_#{query}".to_sym }
87
96
  end
88
97
 
89
98
  def keycode_const(keycode)
@@ -98,6 +107,10 @@ module Fusuma
98
107
 
99
108
  private
100
109
 
110
+ def find_device(name_pattern:)
111
+ Fusuma::Device.all.find { |d| d.name.match(/#{name_pattern}/) }
112
+ end
113
+
101
114
  def split_param(param)
102
115
  param.split('+').map { |code| key_prefix(code) }
103
116
  end
@@ -3,7 +3,7 @@
3
3
  module Fusuma
4
4
  module Plugin
5
5
  module Sendkey
6
- VERSION = '0.3.0'
6
+ VERSION = '0.4.0'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,57 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fusuma-plugin-sendkey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - iberianpig
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-24 00:00:00.000000000 Z
11
+ date: 2020-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: evdev
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: fusuma
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '1.5'
19
+ version: '1.7'
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '1.5'
26
+ version: '1.7'
41
27
  - !ruby/object:Gem::Dependency
42
- name: linux_input
28
+ name: revdev
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
- - - "~>"
31
+ - - ">="
46
32
  - !ruby/object:Gem::Version
47
- version: '1.1'
33
+ version: '0'
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
- - - "~>"
38
+ - - ">="
53
39
  - !ruby/object:Gem::Version
54
- version: '1.1'
40
+ version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: bundler
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -192,7 +178,7 @@ dependencies:
192
178
  - - ">="
193
179
  - !ruby/object:Gem::Version
194
180
  version: '0'
195
- description: Fusuma::Plugin::Sendkey emulate keyboard events with evemu-event
181
+ description: Fusuma::Plugin::Sendkey emulate keyboard events with evdev
196
182
  email:
197
183
  - yhkyky@gmail.com
198
184
  executables:
@@ -241,5 +227,5 @@ requirements: []
241
227
  rubygems_version: 3.0.3
242
228
  signing_key:
243
229
  specification_version: 4
244
- summary: Fusuma plugin that sending virtual keyboard events
230
+ summary: Fusuma plugin to send keyboard events
245
231
  test_files: []