fusuma-plugin-sendkey 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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: []