fusuma 2.4.1 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -0
  3. data/fusuma.gemspec +17 -18
  4. data/lib/fusuma/config/index.rb +17 -17
  5. data/lib/fusuma/config/searcher.rb +1 -1
  6. data/lib/fusuma/config/yaml_duplication_checker.rb +7 -7
  7. data/lib/fusuma/config.rb +17 -13
  8. data/lib/fusuma/device.rb +12 -12
  9. data/lib/fusuma/environment.rb +10 -10
  10. data/lib/fusuma/hash_support.rb +1 -1
  11. data/lib/fusuma/libinput_command.rb +18 -19
  12. data/lib/fusuma/multi_logger.rb +4 -4
  13. data/lib/fusuma/plugin/base.rb +6 -6
  14. data/lib/fusuma/plugin/buffers/buffer.rb +5 -4
  15. data/lib/fusuma/plugin/buffers/gesture_buffer.rb +6 -6
  16. data/lib/fusuma/plugin/buffers/timer_buffer.rb +2 -2
  17. data/lib/fusuma/plugin/detectors/detector.rb +5 -5
  18. data/lib/fusuma/plugin/detectors/hold_detector.rb +29 -29
  19. data/lib/fusuma/plugin/detectors/pinch_detector.rb +47 -47
  20. data/lib/fusuma/plugin/detectors/rotate_detector.rb +40 -40
  21. data/lib/fusuma/plugin/detectors/swipe_detector.rb +43 -43
  22. data/lib/fusuma/plugin/events/event.rb +11 -11
  23. data/lib/fusuma/plugin/events/records/gesture_record.rb +5 -5
  24. data/lib/fusuma/plugin/events/records/index_record.rb +5 -5
  25. data/lib/fusuma/plugin/events/records/record.rb +2 -2
  26. data/lib/fusuma/plugin/events/records/text_record.rb +1 -1
  27. data/lib/fusuma/plugin/executors/command_executor.rb +4 -4
  28. data/lib/fusuma/plugin/executors/executor.rb +3 -3
  29. data/lib/fusuma/plugin/filters/filter.rb +3 -3
  30. data/lib/fusuma/plugin/filters/libinput_device_filter.rb +12 -12
  31. data/lib/fusuma/plugin/inputs/input.rb +8 -8
  32. data/lib/fusuma/plugin/inputs/libinput_command_input.rb +13 -13
  33. data/lib/fusuma/plugin/inputs/timer_input.rb +3 -3
  34. data/lib/fusuma/plugin/manager.rb +27 -21
  35. data/lib/fusuma/plugin/parsers/libinput_gesture_parser.rb +10 -10
  36. data/lib/fusuma/plugin/parsers/parser.rb +3 -3
  37. data/lib/fusuma/string_support.rb +3 -3
  38. data/lib/fusuma/version.rb +1 -1
  39. data/lib/fusuma.rb +10 -10
  40. metadata +3 -79
  41. data/spec/helpers/config_helper.rb +0 -20
  42. data/spec/lib/config/searcher_spec.rb +0 -179
  43. data/spec/lib/config_spec.rb +0 -104
  44. data/spec/lib/custom_process_spec.rb +0 -29
  45. data/spec/lib/device_spec.rb +0 -96
  46. data/spec/lib/dummy_config.yml +0 -31
  47. data/spec/lib/fusuma_spec.rb +0 -103
  48. data/spec/lib/libinput-list-devices_iberianpig-XPS-9360.txt +0 -181
  49. data/spec/lib/libinput-list-devices_magic_trackpad.txt +0 -51
  50. data/spec/lib/libinput-list-devices_razer_razer_blade.txt +0 -252
  51. data/spec/lib/libinput-list-devices_thejinx0r.txt +0 -361
  52. data/spec/lib/libinput-list-devices_unavailable.txt +0 -36
  53. data/spec/lib/libinput_command_spec.rb +0 -164
  54. data/spec/lib/plugin/base_spec.rb +0 -74
  55. data/spec/lib/plugin/buffers/buffer_spec.rb +0 -80
  56. data/spec/lib/plugin/buffers/dummy_buffer.rb +0 -20
  57. data/spec/lib/plugin/buffers/gesture_buffer_spec.rb +0 -192
  58. data/spec/lib/plugin/detectors/detector_spec.rb +0 -43
  59. data/spec/lib/plugin/detectors/dummy_detector.rb +0 -24
  60. data/spec/lib/plugin/detectors/hold_detector_spec.rb +0 -145
  61. data/spec/lib/plugin/detectors/pinch_detector_spec.rb +0 -119
  62. data/spec/lib/plugin/detectors/rotate_detector_spec.rb +0 -125
  63. data/spec/lib/plugin/detectors/swipe_detector_spec.rb +0 -118
  64. data/spec/lib/plugin/events/event_spec.rb +0 -30
  65. data/spec/lib/plugin/events/records/gesture_record_spec.rb +0 -22
  66. data/spec/lib/plugin/events/records/record_spec.rb +0 -31
  67. data/spec/lib/plugin/events/records/text_record_spec.rb +0 -26
  68. data/spec/lib/plugin/executors/command_executor_spec.rb +0 -57
  69. data/spec/lib/plugin/executors/executor_spec.rb +0 -164
  70. data/spec/lib/plugin/filters/filter_spec.rb +0 -92
  71. data/spec/lib/plugin/filters/libinput_filter_spec.rb +0 -120
  72. data/spec/lib/plugin/inputs/input_spec.rb +0 -70
  73. data/spec/lib/plugin/inputs/libinput_command_input_spec.rb +0 -121
  74. data/spec/lib/plugin/inputs/timer_input_spec.rb +0 -40
  75. data/spec/lib/plugin/manager_spec.rb +0 -27
  76. data/spec/lib/plugin/parsers/libinput_gesture_parser_spec.rb +0 -76
  77. data/spec/lib/plugin/parsers/parser_spec.rb +0 -45
  78. data/spec/spec_helper.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 134ea9e98557e1475809d32c0fff6a636721118b6923eec3a74d69ac94659126
4
- data.tar.gz: 40c33331caa554239fd5c56187c5273bd5abe0c9b83f1498a4cb8e4ff821d2d5
3
+ metadata.gz: 8c6f872a195572cd05d5cbf86ff5a55e3b7419b9ddc3a2e1b1b09bd395adde36
4
+ data.tar.gz: 51c32b562df304b04a0b607b9e4404bfb7fb031fee73388a2902b56a6a94c4a5
5
5
  SHA512:
6
- metadata.gz: eb7e3ee14cce7f5efa087fa48ded433068e2b5ab3c4e083e282ac0cc5d837bef84c43c755d8c2b3d70d931883076856579797d104e414c89360478eb71ec9134
7
- data.tar.gz: 61dc019f239f4bcd0e9398c0791cf2e16def41f82a458b20cb76a34aa36e414f3fea6e287eca731c7537d30fc4352f8c172dc95e1b23763f352085d2446a0d09
6
+ metadata.gz: 90da79d6210fc47324fda9d3b5e4f9ed1f4e820ccead8c2dc0341d2bb69e3bd691c34db39bdb83cd94529f9e69efe478d02c1cca43f4b953bddd4b0eb46f8888
7
+ data.tar.gz: adbd22a0b5a1d8213d96994e33a38c4cf2c6f667d33d16019cf1e4f90dee7d114301fee0c544e18e1e532fa7f10c5aa13c09963d5694072c63721bbc8f5ab065
data/README.md CHANGED
@@ -99,6 +99,38 @@ For sending shortcuts:
99
99
  sudo pacman -S xdotool
100
100
  ```
101
101
 
102
+ ### For Fedora
103
+
104
+ #### 1. Install libinput-tools
105
+
106
+ You need `libinput` release 1.0 or later.
107
+
108
+ ```bash
109
+ sudo dnf install libinput
110
+ ```
111
+
112
+ #### 2. Install Ruby
113
+
114
+ Fusuma runs in Ruby, so you must install it first.
115
+
116
+ ```bash
117
+ sudo dnf install ruby
118
+ ```
119
+
120
+ #### 3. Install Fusuma
121
+
122
+ ```bash
123
+ sudo gem install fusuma
124
+ ```
125
+
126
+ #### 4. Install xdotool (optional)
127
+
128
+ For sending shortcuts:
129
+
130
+ ```bash
131
+ sudo dnf install xdotool
132
+ ```
133
+
102
134
  ### Touchpad not working in GNOME
103
135
 
104
136
  Ensure the touchpad events are being sent to the GNOME desktop by running the following command:
data/fusuma.gemspec CHANGED
@@ -1,30 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path('lib', __dir__)
3
+ lib = File.expand_path("lib", __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'fusuma/version'
5
+ require "fusuma/version"
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = 'fusuma'
9
- spec.version = Fusuma::VERSION
10
- spec.authors = ['iberianpig']
11
- spec.email = ['yhkyky@gmail.com']
8
+ spec.name = "fusuma"
9
+ spec.version = Fusuma::VERSION
10
+ spec.authors = ["iberianpig"]
11
+ spec.email = ["yhkyky@gmail.com"]
12
12
 
13
- spec.summary = 'Multitouch gestures with libinput driver, Linux'
14
- spec.description = 'Fusuma is multitouch gesture recognizer. This gem makes your touchpad on Linux able to recognize swipes or pinchs and assign command to them. Read installation on Github(https://github.com/iberianpig/fusuma#installation).'
15
- spec.homepage = 'https://github.com/iberianpig/fusuma'
16
- spec.license = 'MIT'
13
+ spec.summary = "Multitouch gestures with libinput driver, Linux"
14
+ spec.description = "Fusuma is multitouch gesture recognizer. This gem makes your touchpad on Linux able to recognize swipes or pinchs and assign command to them. Read installation on Github(https://github.com/iberianpig/fusuma#installation)."
15
+ spec.homepage = "https://github.com/iberianpig/fusuma"
16
+ spec.license = "MIT"
17
17
 
18
- spec.files = Dir['{bin,lib,exe}/**/*', 'LICENSE*', 'README*', '*.gemspec']
19
- spec.test_files = Dir['{test,spec,features}/**/*']
20
- spec.bindir = 'exe'
21
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
- spec.require_paths = ['lib']
18
+ spec.files = Dir["{bin,lib,exe}/**/*", "LICENSE*", "README*", "*.gemspec"]
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
23
22
  spec.metadata = {
24
- 'rubygems_mfa_required' => 'true',
25
- 'yard.run' => 'yri' # use "yard" to build full HTML docs.
23
+ "rubygems_mfa_required" => "true",
24
+ "yard.run" => "yri" # use "yard" to build full HTML docs.
26
25
  }
27
26
 
28
- spec.required_ruby_version = '>= 2.5.1' # https://packages.ubuntu.com/search?keywords=ruby&searchon=names&exact=1&suite=all&section=main
27
+ spec.required_ruby_version = ">= 2.5.1" # https://packages.ubuntu.com/search?keywords=ruby&searchon=names&exact=1&suite=all&section=main
29
28
  # support bionic (18.04LTS) 2.5.1
30
29
  end
@@ -7,17 +7,17 @@ module Fusuma
7
7
  class Index
8
8
  def initialize(keys)
9
9
  @keys = case keys
10
- when Array
11
- keys.map do |key|
12
- if key.is_a? Key
13
- key
14
- else
15
- Key.new(key)
16
- end
17
- end
18
- else
19
- [Key.new(keys)]
20
- end
10
+ when Array
11
+ keys.map do |key|
12
+ if key.is_a? Key
13
+ key
14
+ else
15
+ Key.new(key)
16
+ end
17
+ end
18
+ else
19
+ [Key.new(keys)]
20
+ end
21
21
  end
22
22
 
23
23
  def inspect
@@ -29,11 +29,11 @@ module Fusuma
29
29
  def cache_key
30
30
  case @keys
31
31
  when Array
32
- @keys.map(&:symbol).join(',')
32
+ @keys.map(&:symbol).join(",")
33
33
  when Key
34
34
  @keys.symbol
35
35
  else
36
- raise 'invalid keys'
36
+ raise "invalid keys"
37
37
  end
38
38
  end
39
39
 
@@ -56,7 +56,7 @@ module Fusuma
56
56
  def initialize(symbol_word, skippable: false, fallback: nil)
57
57
  @symbol = begin
58
58
  symbol_word.to_sym
59
- rescue StandardError
59
+ rescue
60
60
  symbol_word
61
61
  end
62
62
 
@@ -64,14 +64,14 @@ module Fusuma
64
64
 
65
65
  @fallback = begin
66
66
  fallback.to_sym
67
- rescue StandardError
67
+ rescue
68
68
  fallback
69
69
  end
70
70
  end
71
71
 
72
72
  def inspect
73
- skip_marker = @skippable && Searcher.skip? ? '(skip)' : ''
74
- fallback_marker = @fallback && Searcher.fallback? ? '(fallback)' : ''
73
+ skip_marker = @skippable && Searcher.skip? ? "(skip)" : ""
74
+ fallback_marker = @fallback && Searcher.fallback? ? "(fallback)" : ""
75
75
  "#{@symbol}#{skip_marker}#{fallback_marker}"
76
76
  end
77
77
 
@@ -55,7 +55,7 @@ module Fusuma
55
55
 
56
56
  def cache(key)
57
57
  @cache ||= {}
58
- key = key.join(',') if key.is_a? Array
58
+ key = key.join(",") if key.is_a? Array
59
59
  if @cache.key?(key)
60
60
  @cache[key]
61
61
  else
@@ -7,13 +7,13 @@ module Fusuma
7
7
  module YAMLDuplicationChecker
8
8
  def self.check(yaml_string, filename, &on_duplicated)
9
9
  # Ruby 2.6+
10
- tree = if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0')
11
- # Specify filename to display helpful message when it raises
12
- # an error.
13
- YAML.parse(yaml_string, filename: filename)
14
- else
15
- YAML.parse(yaml_string, filename)
16
- end
10
+ tree = if Gem::Version.new(Psych::VERSION) >= Gem::Version.new("3.1.0")
11
+ # Specify filename to display helpful message when it raises
12
+ # an error.
13
+ YAML.parse(yaml_string, filename: filename)
14
+ else
15
+ YAML.parse(yaml_string, filename)
16
+ end
17
17
  return unless tree
18
18
 
19
19
  traverse(tree, &on_duplicated)
data/lib/fusuma/config.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './multi_logger'
4
- require_relative './config/index'
5
- require_relative './config/searcher'
6
- require_relative './config/yaml_duplication_checker'
7
- require_relative './hash_support'
8
- require 'singleton'
9
- require 'yaml'
3
+ require_relative "./multi_logger"
4
+ require_relative "./config/index"
5
+ require_relative "./config/searcher"
6
+ require_relative "./config/yaml_duplication_checker"
7
+ require_relative "./hash_support"
8
+ require "singleton"
9
+ require "yaml"
10
10
 
11
11
  # module as namespace
12
12
  module Fusuma
@@ -51,6 +51,9 @@ module Fusuma
51
51
  MultiLogger.info "reload config: #{path}"
52
52
  @keymap = validate(path)
53
53
  self
54
+ rescue InvalidFileError => e
55
+ MultiLogger.error e.message
56
+ exit 1
54
57
  end
55
58
 
56
59
  # @return [Hash] If check passes
@@ -64,10 +67,11 @@ module Fusuma
64
67
  raise InvalidFileError, "Detect duplicate keys #{duplicates}" unless duplicates.empty?
65
68
 
66
69
  yamls = YAML.load_stream(File.read(path)).compact
67
- yamls.map(&:deep_symbolize_keys)
68
- rescue StandardError => e
69
- MultiLogger.error e.message
70
- raise InvalidFileError, e.message
70
+ yamls.map do |yaml|
71
+ raise InvalidFileError, "invalid config.yml: #{path}" unless yaml.is_a? Hash
72
+
73
+ yaml.deep_symbolize_keys
74
+ end
71
75
  end
72
76
 
73
77
  # @param index [Index]
@@ -86,13 +90,13 @@ module Fusuma
86
90
  execute_params = search(index)
87
91
  return if execute_params.nil? || !execute_params.is_a?(Hash)
88
92
 
89
- @execute_keys.find { |k| execute_params.keys.include?(k) }
93
+ @execute_keys.find { |k| execute_params.key?(k) }
90
94
  end
91
95
 
92
96
  private
93
97
 
94
98
  def find_filepath
95
- filename = 'fusuma/config.yml'
99
+ filename = "fusuma/config.yml"
96
100
  if custom_path
97
101
  return expand_custom_path if File.exist?(expand_custom_path)
98
102
 
data/lib/fusuma/device.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './multi_logger'
4
- require_relative './libinput_command'
3
+ require_relative "./multi_logger"
4
+ require_relative "./libinput_command"
5
5
 
6
6
  module Fusuma
7
7
  # detect input device
@@ -46,7 +46,7 @@ module Fusuma
46
46
  def available
47
47
  @available ||= all.select(&:available).tap do |d|
48
48
  MultiLogger.debug(available_devices: d)
49
- raise 'Touchpad is not found' if d.empty?
49
+ raise "Touchpad is not found" if d.empty?
50
50
  end
51
51
  rescue RuntimeError => e
52
52
  # FIXME: should not exit without Runner class
@@ -106,40 +106,40 @@ module Fusuma
106
106
  # @return [Hash]
107
107
  def extract_attribute(line:)
108
108
  if (id = id_from(line))
109
- { id: id }
109
+ {id: id}
110
110
  elsif (name = name_from(line))
111
- { name: name }
111
+ {name: name}
112
112
  elsif (capabilities = capabilities_from(line))
113
- { capabilities: capabilities }
113
+ {capabilities: capabilities}
114
114
  elsif (available = available_from(line))
115
- { available: available }
115
+ {available: available}
116
116
  else
117
117
  {}
118
118
  end
119
119
  end
120
120
 
121
121
  def id_from(line)
122
- line.match('^Kernel:[[:space:]]*') do |m|
122
+ line.match("^Kernel:[[:space:]]*") do |m|
123
123
  m.post_match.match(/event[0-9]+/).to_s
124
124
  end
125
125
  end
126
126
 
127
127
  def name_from(line)
128
- line.match('^Device:[[:space:]]*') do |m|
128
+ line.match("^Device:[[:space:]]*") do |m|
129
129
  m.post_match.strip
130
130
  end
131
131
  end
132
132
 
133
133
  def capabilities_from(line)
134
- line.match('^Capabilities:[[:space:]]*') do |m|
134
+ line.match("^Capabilities:[[:space:]]*") do |m|
135
135
  m.post_match.strip
136
136
  end
137
137
  end
138
138
 
139
139
  def available_from(line)
140
140
  # NOTE: is natural scroll available?
141
- if line =~ /^Nat.scrolling: /
142
- return false if line =~ %r{n/a}
141
+ if /^Nat.scrolling: /.match?(line)
142
+ return false if %r{n/a}.match?(line)
143
143
 
144
144
  return true # disabled / enabled
145
145
  end
@@ -1,19 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './version'
4
- require_relative './libinput_command'
5
- require_relative './multi_logger'
3
+ require_relative "./version"
4
+ require_relative "./libinput_command"
5
+ require_relative "./multi_logger"
6
6
 
7
7
  module Fusuma
8
8
  # Output Environment information
9
9
  class Environment
10
10
  class << self
11
11
  def dump_information
12
- MultiLogger.info '---------------------------------------------'
12
+ MultiLogger.info "---------------------------------------------"
13
13
  print_version
14
- MultiLogger.info '---------------------------------------------'
14
+ MultiLogger.info "---------------------------------------------"
15
15
  print_enabled_plugins
16
- MultiLogger.info '---------------------------------------------'
16
+ MultiLogger.info "---------------------------------------------"
17
17
  end
18
18
 
19
19
  def print_version
@@ -27,11 +27,11 @@ module Fusuma
27
27
  end
28
28
 
29
29
  def print_enabled_plugins
30
- MultiLogger.info 'Enabled Plugins: '
30
+ MultiLogger.info "Enabled Plugins: "
31
31
  Plugin::Manager.plugins
32
- .reject { |k, _v| k.to_s =~ /Base/ }
33
- .map { |_base, plugins| plugins.map { |plugin| " #{plugin}" } }
34
- .flatten.sort.each { |name| MultiLogger.info(name) }
32
+ .reject { |k, _v| k.to_s =~ /Base/ }
33
+ .map { |_base, plugins| plugins.map { |plugin| " #{plugin}" } }
34
+ .flatten.sort.each { |name| MultiLogger.info(name) }
35
35
  end
36
36
 
37
37
  def print_device_list
@@ -6,7 +6,7 @@ class Hash
6
6
  def deep_symbolize_keys
7
7
  deep_transform_keys do |key|
8
8
  key.to_sym
9
- rescue StandardError
9
+ rescue
10
10
  key
11
11
  end
12
12
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'open3'
3
+ require "open3"
4
4
 
5
5
  module Fusuma
6
6
  # Execute libinput command
@@ -13,7 +13,7 @@ module Fusuma
13
13
 
14
14
  # `libinput-list-devices` and `libinput-debug-events` are deprecated,
15
15
  # use `libinput list-devices` and `libinput debug-events` from 1.8.
16
- NEW_CLI_OPTION_VERSION = '1.8'
16
+ NEW_CLI_OPTION_VERSION = "1.8"
17
17
 
18
18
  # @return [Boolean]
19
19
  def new_cli_option_available?
@@ -40,10 +40,9 @@ module Fusuma
40
40
  # @return [Integer] return a latest line libinput debug-events
41
41
  def debug_events(writer)
42
42
  @debug_events ||= begin
43
- pid = Process.spawn(debug_events_with_options, out: writer,
44
- in: '/dev/null')
45
- Process.detach(pid)
46
- pid
43
+ t = Open3.pipeline_start([debug_events_with_options], ["grep -v POINTER_ --line-buffered"],
44
+ out: writer, in: "/dev/null")
45
+ t[0].pid
47
46
  end
48
47
  end
49
48
 
@@ -52,12 +51,12 @@ module Fusuma
52
51
  def version_command
53
52
  if @debug_events_command && @list_devices_command
54
53
  "#{@list_devices_command} --version"
55
- elsif which('libinput')
56
- 'libinput --version'
57
- elsif which('libinput-list-devices')
58
- 'libinput-list-devices --version'
54
+ elsif which("libinput")
55
+ "libinput --version"
56
+ elsif which("libinput-list-devices")
57
+ "libinput-list-devices --version"
59
58
  else
60
- MultiLogger.error 'Please install libinput-tools'
59
+ MultiLogger.error "Please install libinput-tools"
61
60
  exit 1
62
61
  end
63
62
  end
@@ -66,9 +65,9 @@ module Fusuma
66
65
  if @list_devices_command
67
66
  @list_devices_command
68
67
  elsif new_cli_option_available?
69
- 'libinput list-devices'
68
+ "libinput list-devices"
70
69
  else
71
- 'libinput-list-devices'
70
+ "libinput-list-devices"
72
71
  end
73
72
  end
74
73
 
@@ -76,15 +75,15 @@ module Fusuma
76
75
  if @debug_events_command
77
76
  @debug_events_command
78
77
  elsif new_cli_option_available?
79
- 'libinput debug-events'
78
+ "libinput debug-events"
80
79
  else
81
- 'libinput-debug-events'
80
+ "libinput-debug-events"
82
81
  end
83
82
  end
84
83
 
85
84
  def debug_events_with_options
86
- prefix = 'stdbuf -oL --'
87
- "#{prefix} #{debug_events_command} #{@libinput_options.join(' ')}".strip
85
+ prefix = "stdbuf -oL --"
86
+ "#{prefix} #{debug_events_command} #{@libinput_options.join(" ")}".strip
88
87
  end
89
88
 
90
89
  private
@@ -96,8 +95,8 @@ module Fusuma
96
95
  # which('ruby') #=> /usr/bin/ruby
97
96
  # @return [String, nil]
98
97
  def which(command)
99
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
100
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
98
+ exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""]
99
+ ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
101
100
  exts.each do |ext|
102
101
  exe = File.join(path, "#{command}#{ext}")
103
102
  return exe if File.executable?(exe) && !File.directory?(exe)
@@ -2,8 +2,8 @@
2
2
 
3
3
  # module as namespace
4
4
  module Fusuma
5
- require 'logger'
6
- require 'singleton'
5
+ require "logger"
6
+ require "singleton"
7
7
  # logger separate between stdout and strerr
8
8
  class MultiLogger < Logger
9
9
  include Singleton
@@ -16,9 +16,9 @@ module Fusuma
16
16
  end
17
17
 
18
18
  def initialize
19
- filepath = self.class.instance_variable_get('@filepath')
19
+ filepath = self.class.instance_variable_get(:@filepath)
20
20
  if filepath
21
- logfile = File.new(filepath, 'a')
21
+ logfile = File.new(filepath, "a")
22
22
  logfile.sync = true
23
23
  super(logfile)
24
24
  $stderr = logfile
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './manager'
4
- require_relative '../config'
5
- require_relative '../custom_process'
3
+ require_relative "./manager"
4
+ require_relative "../config"
5
+ require_relative "../custom_process"
6
6
 
7
7
  module Fusuma
8
8
  module Plugin
@@ -44,15 +44,15 @@ module Fusuma
44
44
 
45
45
  next if param_types.any? { |klass| val.is_a?(klass) }
46
46
 
47
- MultiLogger.error('Please fix config.yml.')
47
+ MultiLogger.error("Please fix config.yml.")
48
48
  MultiLogger.error(":#{base.keys.map(&:symbol)
49
- .join(' => :')} => :#{key} should be #{param_types.join(' OR ')}.")
49
+ .join(" => :")} => :#{key} should be #{param_types.join(" OR ")}.")
50
50
  exit 1
51
51
  end
52
52
  end
53
53
 
54
54
  def config_index
55
- Config::Index.new(self.class.name.gsub('Fusuma::', '').underscore.split('/'))
55
+ Config::Index.new(self.class.name.gsub("Fusuma::", "").underscore.split("/"))
56
56
  end
57
57
  end
58
58
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../base'
3
+ require_relative "../base"
4
4
 
5
5
  module Fusuma
6
6
  module Plugin
@@ -16,7 +16,7 @@ module Fusuma
16
16
 
17
17
  # @return [String]
18
18
  def type
19
- @type ||= self.class.name.underscore.split('/').last.gsub('_buffer', '')
19
+ @type ||= self.class.name.underscore.split("/").last.gsub("_buffer", "")
20
20
  end
21
21
 
22
22
  # @param event [Event]
@@ -28,7 +28,8 @@ module Fusuma
28
28
 
29
29
  # clear old events
30
30
  # @param current_time [Time]
31
- def clear_expired(current_time: Time.now); end
31
+ def clear_expired(current_time: Time.now)
32
+ end
32
33
 
33
34
  # clear buffer
34
35
  def clear
@@ -38,7 +39,7 @@ module Fusuma
38
39
  # Set source for tag from config.yml.
39
40
  # DEFAULT_SOURCE is defined in each plugins.
40
41
  def source
41
- @source ||= config_params(:source) || self.class.const_get('DEFAULT_SOURCE')
42
+ @source ||= config_params(:source) || self.class.const_get(:DEFAULT_SOURCE)
42
43
  end
43
44
  end
44
45
  end
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './buffer'
3
+ require_relative "./buffer"
4
4
 
5
5
  module Fusuma
6
6
  module Plugin
7
7
  module Buffers
8
8
  # manage events and generate command
9
9
  class GestureBuffer < Buffer
10
- DEFAULT_SOURCE = 'libinput_gesture_parser'
10
+ DEFAULT_SOURCE = "libinput_gesture_parser"
11
11
  DEFAULT_SECONDS_TO_KEEP = 100
12
12
 
13
13
  def config_param_types
@@ -47,7 +47,7 @@ module Fusuma
47
47
  return false if empty?
48
48
 
49
49
  case @events.last.record.status
50
- when 'end', 'cancelled'
50
+ when "end", "cancelled"
51
51
  true
52
52
  else
53
53
  false
@@ -63,7 +63,7 @@ module Fusuma
63
63
  end
64
64
 
65
65
  def updating_events
66
- @events.select { |e| e.record.status == 'update' }
66
+ @events.select { |e| e.record.status == "update" }
67
67
  end
68
68
 
69
69
  # @param attr [Symbol]
@@ -90,7 +90,7 @@ module Fusuma
90
90
  end
91
91
 
92
92
  def select_by_events(&block)
93
- return enum_for(:select_by_events) unless block_given?
93
+ return enum_for(:select_by_events) unless block
94
94
 
95
95
  events = @events.select(&block)
96
96
  self.class.new events
@@ -99,7 +99,7 @@ module Fusuma
99
99
  def select_from_last_begin
100
100
  return self if empty?
101
101
 
102
- index_from_last = @events.reverse.find_index { |e| e.record.status == 'begin' }
102
+ index_from_last = @events.reverse.find_index { |e| e.record.status == "begin" }
103
103
  return GestureBuffer.new([]) if index_from_last.nil?
104
104
 
105
105
  index_last_begin = events.length - index_from_last - 1
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './buffer'
3
+ require_relative "./buffer"
4
4
 
5
5
  module Fusuma
6
6
  module Plugin
7
7
  module Buffers
8
8
  # manage events and generate command
9
9
  class TimerBuffer < Buffer
10
- DEFAULT_SOURCE = 'timer_input'
10
+ DEFAULT_SOURCE = "timer_input"
11
11
  DEFAULT_SECONDS_TO_KEEP = 3
12
12
 
13
13
  def config_param_types