fusuma 0.2.0 → 0.2.2

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
  SHA1:
3
- metadata.gz: 85a522e75bfcc182572f9c38a4d073c67f963319
4
- data.tar.gz: 6679c88a779acbf8c7183d42609326eb988f9cdb
3
+ metadata.gz: 46afda55ad48083da6e0d94a17a9ec3b1a009b4b
4
+ data.tar.gz: 475fabc77f03056b25f9b718c26875bc75871380
5
5
  SHA512:
6
- metadata.gz: 412eec95e91666f2839d9157d0d4a5dd1073b34b4b514e35c71ac0c69301bef3e52185d3020721543d46f701a5e4c0d71241cae0efc73dd56f66290707c2d83d
7
- data.tar.gz: 018d4103d87ffd686e586fdb8c806cdc96ddfd93046df3663c35f3eb5e4043c06053e83b299732c753e4a3582e1a5e617625bc9706b2b6f91119e9cc85b15b2c
6
+ metadata.gz: 87b72d664ca8e7891f02265030fe261f7576b7de85ef55aad28f81809d06eaf29a4d016359375b1dae05847f4c13d86a752254fe65b7da9492e09b0b7ed9fa4e
7
+ data.tar.gz: fa163ef797185c55af24204466f8bb48f80d01fcbf1571973b3e7e51c495982186df767b7114280cdba4b7cadb8061b1c7259e8d79b64213eaccddd6dfbb971b
data/.rubocop.yml ADDED
@@ -0,0 +1,7 @@
1
+ Metrics/ModuleLength:
2
+ Exclude:
3
+ - "**/*_spec.rb"
4
+
5
+ Metrics/BlockLength:
6
+ Exclude:
7
+ - "**/*_spec.rb"
data/fusuma.gemspec CHANGED
@@ -25,4 +25,5 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'rake', '~> 10.0'
26
26
  spec.add_development_dependency 'rspec', '~> 3.0'
27
27
  spec.add_development_dependency 'pry-byebug'
28
+ spec.add_development_dependency 'rubocop'
28
29
  end
@@ -5,7 +5,6 @@ module Fusuma
5
5
  super(*args)
6
6
  end
7
7
 
8
- # return { finger:, direction:, action: } or nil
9
8
  def gesture_info
10
9
  return unless enough_actions? && enough_time_passed?
11
10
  action_type = detect_action_type
@@ -25,8 +24,6 @@ module Fusuma
25
24
 
26
25
  private
27
26
 
28
- GestureInfo = Struct.new(:finger, :direction, :action_type)
29
-
30
27
  def elapsed_time
31
28
  return 0 if length.zero?
32
29
  last.time - first.time
@@ -35,39 +32,38 @@ module Fusuma
35
32
  def detect_direction(action_type)
36
33
  case action_type
37
34
  when 'swipe'
38
- detect_move
35
+ detect_swipe
39
36
  when 'pinch'
40
- detect_zoom
37
+ detect_pinch
41
38
  end
42
39
  end
43
40
 
44
- def detect_move
45
- move = avg_moves
46
- MultiLogger.debug(move: move)
47
- return unless enough_distance?(move)
48
- return move[:x] > 0 ? 'right' : 'left' if move[:x].abs > move[:y].abs
49
- move[:y] > 0 ? 'down' : 'up'
41
+ def detect_swipe
42
+ swipe = avg_swipe
43
+ return unless swipe.enough_distance?
44
+ swipe.direction
50
45
  end
51
46
 
52
- def detect_zoom
53
- diameter = avg_attrs(:zoom)
54
- MultiLogger.debug(diameter: diameter)
55
- # TODO: change threshold from config files
56
- return unless enough_diameter?(diameter)
57
- return 'in' if diameter > 1
58
- 'out'
47
+ def detect_pinch
48
+ pinch = avg_pinch
49
+ return unless pinch.enough_diameter?
50
+ pinch.direction
59
51
  end
60
52
 
61
53
  def detect_finger
62
54
  last.finger
63
55
  end
64
56
 
65
- Distance = Struct.new(:x, :y)
57
+ def avg_swipe
58
+ move_x = avg_attrs(:move_x)
59
+ move_y = avg_attrs(:move_y)
60
+ Swipe.new(move_x, move_y)
61
+ end
66
62
 
67
- def avg_moves
68
- move_x = sum_attrs(:move_x) / length
69
- move_y = sum_attrs(:move_y) / length
70
- Distance.new(move_x, move_y)
63
+ def avg_pinch
64
+ diameter = avg_attrs(:zoom)
65
+ delta_diameter = diameter - first.zoom
66
+ Pinch.new(delta_diameter)
71
67
  end
72
68
 
73
69
  def sum_attrs(attr)
@@ -89,21 +85,8 @@ module Fusuma
89
85
  last.action
90
86
  end
91
87
 
92
- def enough_distance?(move)
93
- (move[:x].abs > 20) || (move[:y].abs > 20)
94
- end
95
-
96
- def enough_diameter?(avg_diameter)
97
- delta_diameter = if avg_diameter > 1
98
- avg_diameter - first.zoom
99
- else
100
- first.zoom - avg_diameter
101
- end
102
- delta_diameter > 0.3
103
- end
104
-
105
88
  def enough_actions?
106
- (length > 1) && (elapsed_time > 0.1)
89
+ (length > 1) && (elapsed_time > 0.05)
107
90
  end
108
91
 
109
92
  def enough_time_passed?
@@ -111,7 +94,7 @@ module Fusuma
111
94
  end
112
95
 
113
96
  def last_triggerd_time
114
- @last_triggered_time || 0
97
+ @last_triggered_time ||= 0
115
98
  end
116
99
 
117
100
  def detect_action_type
@@ -0,0 +1,77 @@
1
+ # module as namespace
2
+ module Fusuma
3
+ require 'singleton'
4
+ # read keymap from yaml file
5
+ class Config
6
+ include Singleton
7
+
8
+ class << self
9
+ def shortcut(gesture_info)
10
+ instance.shortcut(gesture_info)
11
+ end
12
+
13
+ def threshold(action_type)
14
+ instance.threshold(action_type)
15
+ end
16
+
17
+ def reload
18
+ instance.reload
19
+ end
20
+ end
21
+
22
+ def initialize
23
+ reload
24
+ end
25
+ attr_accessor :keymap
26
+
27
+ def reload
28
+ @cache = nil
29
+ @keymap = YAML.load_file(file_path)
30
+ self
31
+ end
32
+
33
+ def shortcut(gesture_info)
34
+ seek_index = [*action_index(gesture_info), 'shortcut']
35
+ cache(seek_index) { search_config(keymap, seek_index) }
36
+ end
37
+
38
+ def threshold(action_type)
39
+ seek_index = ['threshold', action_type]
40
+ cache(seek_index) { search_config(keymap, seek_index) } || 1
41
+ end
42
+
43
+ private
44
+
45
+ def search_config(keymap_node, seek_index)
46
+ if seek_index == []
47
+ return nil if keymap_node.is_a? Hash
48
+ return keymap_node
49
+ end
50
+ key = seek_index[0]
51
+ child_node = keymap_node[key]
52
+ next_index = seek_index[1..-1]
53
+ return search_config(child_node, next_index) if child_node
54
+ search_config(keymap_node, next_index)
55
+ end
56
+
57
+ def file_path
58
+ filename = 'fusuma/config.yml'
59
+ original_path = File.expand_path "~/.config/#{filename}"
60
+ default_path = File.expand_path "../../#{filename}", __FILE__
61
+ File.exist?(original_path) ? original_path : default_path
62
+ end
63
+
64
+ def action_index(gesture_info)
65
+ action_type = gesture_info.action_type
66
+ finger = gesture_info.finger
67
+ direction = gesture_info.direction
68
+ [action_type, finger, direction]
69
+ end
70
+
71
+ def cache(key)
72
+ @cache ||= {}
73
+ key = key.join(',') if key.is_a? Array
74
+ @cache[key] ||= block_given? ? yield : nil
75
+ end
76
+ end
77
+ end
@@ -1,24 +1,28 @@
1
1
  swipe:
2
- 3:
3
- left:
2
+ 3:
3
+ left:
4
4
  shortcut: 'alt+Left'
5
- right:
5
+ right:
6
6
  shortcut: 'alt+Right'
7
- up:
7
+ up:
8
8
  shortcut: 'ctrl+t'
9
- down:
9
+ down:
10
10
  shortcut: 'ctrl+w'
11
11
  4:
12
- left:
12
+ left:
13
13
  shortcut: 'super+Left'
14
- right:
14
+ right:
15
15
  shortcut: 'super+Right'
16
- up:
16
+ up:
17
17
  shortcut: 'super+a'
18
- down:
18
+ down:
19
19
  shortcut: 'super+s'
20
20
  pinch:
21
21
  in:
22
22
  shortcut: 'ctrl+plus'
23
23
  out:
24
24
  shortcut: 'ctrl+minus'
25
+
26
+ threshold:
27
+ swipe: 1
28
+ pinch: 1
@@ -0,0 +1,25 @@
1
+ module Fusuma
2
+ # manage actions
3
+ class GestureInfo
4
+ def initialize(finger, direction, action_type)
5
+ @finger = finger.to_i
6
+ @direction = direction
7
+ @action_type = action_type
8
+ end
9
+ attr_reader :finger, :direction, :action_type
10
+
11
+ def trigger_keyevent
12
+ exec_xdotool(shortcut)
13
+ end
14
+
15
+ private
16
+
17
+ def exec_xdotool(keys)
18
+ `xdotool key #{keys}` unless keys.nil?
19
+ end
20
+
21
+ def shortcut
22
+ Config.shortcut(self)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ module Fusuma
2
+ # manage actions
3
+ class Pinch
4
+ BASE_THERESHOLD = 0.3
5
+
6
+ def initialize(diameter)
7
+ @diameter = diameter.to_f
8
+ end
9
+
10
+ attr_reader :diameter
11
+
12
+ def direction
13
+ return 'in' if diameter > 0
14
+ 'out'
15
+ end
16
+
17
+ def enough_diameter?
18
+ MultiLogger.debug(diameter: diameter)
19
+ diameter.abs > threshold
20
+ end
21
+
22
+ def threshold
23
+ @threshold ||= BASE_THERESHOLD * Config.threshold('pinch')
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module Fusuma
2
+ # manage actions
3
+ class Swipe
4
+ BASE_THERESHOLD = 20
5
+
6
+ def initialize(x, y)
7
+ @x = x
8
+ @y = y
9
+ end
10
+ attr_reader :x, :y
11
+
12
+ def direction
13
+ return x > 0 ? 'right' : 'left' if x.abs > y.abs
14
+ y > 0 ? 'down' : 'up'
15
+ end
16
+
17
+ def enough_distance?
18
+ MultiLogger.debug(x: x, y: y)
19
+ (x.abs > threshold) || (y.abs > threshold)
20
+ end
21
+
22
+ def threshold
23
+ @threshold ||= BASE_THERESHOLD * Config.threshold('swipe')
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module Fusuma
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.2.2'.freeze
3
3
  end
data/lib/fusuma.rb CHANGED
@@ -1,7 +1,11 @@
1
1
  require_relative 'fusuma/version'
2
2
  require_relative 'fusuma/action_stack'
3
3
  require_relative 'fusuma/gesture_action'
4
+ require_relative 'fusuma/gesture_info'
5
+ require_relative 'fusuma/swipe.rb'
6
+ require_relative 'fusuma/pinch.rb'
4
7
  require_relative 'fusuma/multi_logger'
8
+ require_relative 'fusuma/config.rb'
5
9
  require 'logger'
6
10
  require 'open3'
7
11
  require 'yaml'
@@ -34,7 +38,7 @@ module Fusuma
34
38
  @action_stack ||= ActionStack.new
35
39
  @action_stack.push gesture_action
36
40
  gesture_info = @action_stack.gesture_info
37
- trigger_keyevent(gesture_info) unless gesture_info.nil?
41
+ gesture_info.trigger_keyevent unless gesture_info.nil?
38
42
  end
39
43
  end
40
44
  end
@@ -71,35 +75,5 @@ module Fusuma
71
75
  return false if line =~ %r{n/a}
72
76
  true
73
77
  end
74
-
75
- def trigger_keyevent(gesture_info)
76
- case gesture_info.action_type
77
- when 'swipe'
78
- swipe(gesture_info.finger, gesture_info.direction)
79
- when 'pinch'
80
- pinch(gesture_info.direction)
81
- end
82
- end
83
-
84
- def swipe(finger, direction)
85
- shortcut = event_map['swipe'][finger.to_i][direction]['shortcut']
86
- `xdotool key #{shortcut}` unless shortcut.nil?
87
- end
88
-
89
- def pinch(direction)
90
- shortcut = event_map['pinch'][direction]['shortcut']
91
- `xdotool key #{shortcut}` unless shortcut.nil?
92
- end
93
-
94
- def event_map
95
- @event_map ||= YAML.load_file(config_file)
96
- end
97
-
98
- def config_file
99
- filename = 'fusuma/config.yml'
100
- original_path = File.expand_path "~/.config/#{filename}"
101
- default_path = File.expand_path "../#{filename}", __FILE__
102
- File.exist?(original_path) ? original_path : default_path
103
- end
104
78
  end
105
79
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fusuma
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - iberianpig
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-18 00:00:00.000000000 Z
11
+ date: 2016-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: Fusuma is multitouch gesture recognizer. This gem makes your linux PC
70
84
  able to recognize swipes or pinchs and assign shortcuts to them. Read installation
71
85
  on Github(https://github.com/iberianpig/fusuma#installation).
@@ -78,6 +92,7 @@ extra_rdoc_files: []
78
92
  files:
79
93
  - ".gitignore"
80
94
  - ".rspec"
95
+ - ".rubocop.yml"
81
96
  - ".travis.yml"
82
97
  - CODE_OF_CONDUCT.md
83
98
  - Gemfile
@@ -87,14 +102,17 @@ files:
87
102
  - Rakefile
88
103
  - bin/console
89
104
  - bin/setup
90
- - config.yml
91
105
  - exe/fusuma
92
106
  - fusuma.gemspec
93
107
  - lib/fusuma.rb
94
108
  - lib/fusuma/action_stack.rb
109
+ - lib/fusuma/config.rb
95
110
  - lib/fusuma/config.yml
96
111
  - lib/fusuma/gesture_action.rb
112
+ - lib/fusuma/gesture_info.rb
97
113
  - lib/fusuma/multi_logger.rb
114
+ - lib/fusuma/pinch.rb
115
+ - lib/fusuma/swipe.rb
98
116
  - lib/fusuma/version.rb
99
117
  homepage: https://github.com/iberianpig/fusuma
100
118
  licenses:
data/config.yml DELETED
@@ -1,24 +0,0 @@
1
- swipe:
2
- 3:
3
- left:
4
- shortcut: 'alt+Right'
5
- right:
6
- shortcut: 'alt+Left'
7
- up:
8
- shortcut: 'ctrl+t'
9
- down:
10
- shortcut: 'ctrl+w'
11
- 4:
12
- left:
13
- shortcut: 'super+Right'
14
- right:
15
- shortcut: 'super+Left'
16
- up:
17
- shortcut: 'super+a'
18
- down:
19
- shortcut: 'super+s'
20
- pinch:
21
- in:
22
- shortcut: 'ctrl+plus'
23
- out:
24
- shortcut: 'ctrl+minus'