rbindkeys 0.0.1
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.
- data/.gitignore +23 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +52 -0
- data/Rakefile +11 -0
- data/bin/rbindkeys +5 -0
- data/lib/rbindkeys.rb +38 -0
- data/lib/rbindkeys/bind_resolver.rb +58 -0
- data/lib/rbindkeys/bind_set.rb +10 -0
- data/lib/rbindkeys/bind_tree.rb +148 -0
- data/lib/rbindkeys/cli.rb +103 -0
- data/lib/rbindkeys/device.rb +25 -0
- data/lib/rbindkeys/device_operator.rb +78 -0
- data/lib/rbindkeys/fix_resolver.rb +26 -0
- data/lib/rbindkeys/key_bind.rb +21 -0
- data/lib/rbindkeys/key_event_handler.rb +243 -0
- data/lib/rbindkeys/key_event_handler/configurer.rb +142 -0
- data/lib/rbindkeys/log_utils.rb +51 -0
- data/lib/rbindkeys/observer.rb +140 -0
- data/lib/rbindkeys/version.rb +3 -0
- data/lib/rbindkeys/virtual_device.rb +14 -0
- data/lib/rbindkeys/window_matcher.rb +35 -0
- data/rbindkeys.gemspec +26 -0
- data/sample/emacs.rb +100 -0
- data/sample/swap_left_ctrl_and_caps.rb +4 -0
- data/spec/bind_resolver_spec.rb +101 -0
- data/spec/bind_tree_bind_spec.rb +48 -0
- data/spec/bind_tree_resolve_for_pressed_event_spec.rb +74 -0
- data/spec/bind_tree_resolve_for_released_event_spec.rb +63 -0
- data/spec/cli_spec.rb +81 -0
- data/spec/device_operator_spec.rb +57 -0
- data/spec/fix_resolver_spec.rb +57 -0
- data/spec/key_event_handler/configurer_spec.rb +201 -0
- data/spec/key_event_handler/handle_spec.rb +222 -0
- metadata +190 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- coding:utf-8; mode:ruby; -*-
|
2
|
+
|
3
|
+
require 'rbindkeys'
|
4
|
+
|
5
|
+
include Rbindkeys
|
6
|
+
|
7
|
+
describe BindTree do
|
8
|
+
context "normal" do
|
9
|
+
describe 'BindTree#bind' do
|
10
|
+
before do
|
11
|
+
@bt = BindTree.new
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'with valid input/output' do
|
15
|
+
it "should construct expected tree" do
|
16
|
+
input = [1,2]
|
17
|
+
@bt.bind input, [2,3]
|
18
|
+
input.should == [1,2] # should not destroyable
|
19
|
+
@bt.bind [1,0], [2,3]
|
20
|
+
@bt.bind [2], [2,4]
|
21
|
+
@bt.tree[1][2].payload.output.should == [2,3]
|
22
|
+
@bt.tree[1][0].payload.output.should == [2,3]
|
23
|
+
@bt.tree[2].payload.output.should == [2,4]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
context 'with duplicate node input' do
|
27
|
+
it "should raise DuplicateNodeError" do
|
28
|
+
@bt.bind [1,2], [2,3]
|
29
|
+
begin
|
30
|
+
@bt.bind [1,2], [2,4]
|
31
|
+
violated "should raise"
|
32
|
+
rescue => e
|
33
|
+
e.class.should == BindTree::DuplicateNodeError
|
34
|
+
end
|
35
|
+
end
|
36
|
+
it "should raise DuplicateNodeError" do
|
37
|
+
@bt.bind [1,2], [2,3]
|
38
|
+
begin
|
39
|
+
@bt.bind [1,2,6], [2,4]
|
40
|
+
violated "should raise"
|
41
|
+
rescue => e
|
42
|
+
e.class.should == BindTree::DuplicateNodeError
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end # describe
|
47
|
+
end # context
|
48
|
+
end # describe
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# -*- coding:utf-8; mode:ruby; -*-
|
2
|
+
|
3
|
+
require 'rbindkeys'
|
4
|
+
|
5
|
+
include Rbindkeys
|
6
|
+
|
7
|
+
describe BindTree do
|
8
|
+
context "BindTree constracted" do
|
9
|
+
before do
|
10
|
+
@bt = BindTree.new
|
11
|
+
@bt.bind [1,2,3], [4,5,6]
|
12
|
+
@bt.bind [1,2,0], [6]
|
13
|
+
@bt.bind [1,3], [5,6]
|
14
|
+
@bt.bind [1,10,0], [55]
|
15
|
+
@bt.bind [2], [2]
|
16
|
+
@bt.bind [[4],[5]], [6]
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "BindTree#resolve_for_pressed_event" do
|
20
|
+
before do
|
21
|
+
@ev = Revdev::InputEvent.new nil, Revdev::EV_KEY, 0, 1
|
22
|
+
end
|
23
|
+
context "with unsorted pressed keys" do
|
24
|
+
it "should rase" do
|
25
|
+
begin
|
26
|
+
@bt.resolve_for_pressed_event(@ev, [2, 1])
|
27
|
+
violated "should raise"
|
28
|
+
rescue => e
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
context "with binded pressed keys" do
|
33
|
+
it "should return Arrays and pressing_binds added" do
|
34
|
+
@ev.code = 0
|
35
|
+
@bt.resolve_for_pressed_event(@ev, [1,2]).output.should == [6]
|
36
|
+
expected_pressing_binds = [1, 2, @ev.code]
|
37
|
+
@bt.active_key_binds[0].input.should == expected_pressing_binds
|
38
|
+
|
39
|
+
@ev.code = 2
|
40
|
+
@bt.resolve_for_pressed_event(@ev, []).output.should == [2]
|
41
|
+
expected_pressing_binds = [@ev.code]
|
42
|
+
@bt.active_key_binds[1].input.should == expected_pressing_binds
|
43
|
+
end
|
44
|
+
end
|
45
|
+
context "with no binded pressed keys" do
|
46
|
+
it "should return nil" do
|
47
|
+
@ev.code = 5
|
48
|
+
@bt.resolve_for_pressed_event(@ev, []).should == @bt.default_value
|
49
|
+
@bt.resolve_for_pressed_event(@ev, [1]).should == @bt.default_value
|
50
|
+
@ev.code = 1
|
51
|
+
@bt.resolve_for_pressed_event(@ev, []).should == @bt.default_value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
context "with pressed keys as super set of binded keys" do
|
55
|
+
it "should return Arrays" do
|
56
|
+
@ev.code = 0
|
57
|
+
@bt.resolve_for_pressed_event(@ev, [1,2,4,5]).output.should == [6]
|
58
|
+
@bt.resolve_for_pressed_event(@ev, [1,4,5,10]).output.should == [55]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
context "with 2 stroke keybind" do
|
62
|
+
it "should return Arrays" do
|
63
|
+
@ev.code = 4
|
64
|
+
tree = @bt.resolve_for_pressed_event(@ev, [])
|
65
|
+
tree.class.should == BindTree
|
66
|
+
p tree.tree
|
67
|
+
|
68
|
+
@ev.code = 5
|
69
|
+
tree.resolve_for_pressed_event(@ev, []).output.should == [6]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end # context
|
74
|
+
end # describe
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# -*- coding:utf-8; mode:ruby; -*-
|
2
|
+
|
3
|
+
require 'rbindkeys'
|
4
|
+
|
5
|
+
include Rbindkeys
|
6
|
+
|
7
|
+
describe BindTree do
|
8
|
+
describe '#resolve_for_released_event' do
|
9
|
+
before do
|
10
|
+
@bt = BindTree.new
|
11
|
+
@kb = []
|
12
|
+
@kb << KeyBind.new([1,2,3], [4,5,6])
|
13
|
+
@kb << KeyBind.new([1,2,0], [6])
|
14
|
+
@kb.each do |kb|
|
15
|
+
@bt.bind kb.input, kb.output
|
16
|
+
end
|
17
|
+
end
|
18
|
+
context "no pressed binds" do
|
19
|
+
before do
|
20
|
+
@ev = Revdev::InputEvent.new nil, Revdev::EV_KEY, 0, 0
|
21
|
+
end
|
22
|
+
it "'s pressed_binds should have empty" do
|
23
|
+
@bt.active_key_binds.should be_empty
|
24
|
+
@bt.resolve_for_pressed_event(@ev, []).should == @bt.default_value
|
25
|
+
@bt.active_key_binds.should be_empty
|
26
|
+
end
|
27
|
+
end
|
28
|
+
context "a pressed bind" do
|
29
|
+
before do
|
30
|
+
ev = Revdev::InputEvent.new nil, Revdev::EV_KEY, 0, 1
|
31
|
+
@bt.resolve_for_pressed_event ev, [1,2,4]
|
32
|
+
@ev = Revdev::InputEvent.new nil, Revdev::EV_KEY, 0, 0
|
33
|
+
end
|
34
|
+
it "'s pressed_binds should empty" do
|
35
|
+
@bt.active_key_binds.size.should == 1
|
36
|
+
@bt.resolve_for_released_event(@ev, [])[0].output.should == [6]
|
37
|
+
@bt.active_key_binds.should be_empty
|
38
|
+
end
|
39
|
+
end
|
40
|
+
context "two pressed binds" do
|
41
|
+
before do
|
42
|
+
ev = Revdev::InputEvent.new nil, Revdev::EV_KEY, 0, 1
|
43
|
+
@bt.resolve_for_pressed_event ev, [1,2,4]
|
44
|
+
ev = Revdev::InputEvent.new nil, Revdev::EV_KEY, 3, 1
|
45
|
+
@bt.resolve_for_pressed_event ev, [1,2,4]
|
46
|
+
@ev = Revdev::InputEvent.new nil, Revdev::EV_KEY, 0, 0
|
47
|
+
end
|
48
|
+
it "'s pressed_binds should decrease" do
|
49
|
+
@bt.active_key_binds.length.should == 2
|
50
|
+
@bt.resolve_for_released_event(@ev, [])
|
51
|
+
@bt.active_key_binds.length.should == 1
|
52
|
+
@ev.code = 3
|
53
|
+
@bt.resolve_for_released_event(@ev, [])
|
54
|
+
@bt.active_key_binds.should be_empty
|
55
|
+
end
|
56
|
+
it "'s pressed_binds should empty" do
|
57
|
+
@ev.code = 1
|
58
|
+
@bt.resolve_for_released_event(@ev, []).length.should == 2
|
59
|
+
@bt.active_key_binds.should be_empty
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# -*- coding:utf-8; mode:ruby; -*-
|
2
|
+
|
3
|
+
require 'rbindkeys'
|
4
|
+
require 'revdev'
|
5
|
+
|
6
|
+
include Rbindkeys
|
7
|
+
|
8
|
+
describe CLI do
|
9
|
+
describe '#.main' do
|
10
|
+
context ', when ARGV is empty,' do
|
11
|
+
before do
|
12
|
+
@stdout = StringIO.new
|
13
|
+
# stub(STDOUT){@stdout}
|
14
|
+
ARGV = []
|
15
|
+
end
|
16
|
+
it 'shoud exit with code 1' do
|
17
|
+
expect { CLI::main }.to raise_error do |e|
|
18
|
+
e.should be_a SystemExit
|
19
|
+
e.status.should == 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
context ', when ARGV have an argument,' do
|
24
|
+
before do
|
25
|
+
ARGV = ['foo']
|
26
|
+
@observer = mock Observer
|
27
|
+
Observer.should_receive(:new){@observer}
|
28
|
+
@observer.should_receive(:start){nil}
|
29
|
+
end
|
30
|
+
it 'should call Observer#new#start' do
|
31
|
+
config = CLI::config
|
32
|
+
CLI::main
|
33
|
+
CLI::config.should == config
|
34
|
+
end
|
35
|
+
end
|
36
|
+
context ', when ARGV have an invalid option (--config),' do
|
37
|
+
before do
|
38
|
+
ARGV = ['--config']
|
39
|
+
end
|
40
|
+
it 'should exit with code 1' do
|
41
|
+
expect { CLI::main }.to raise_error do |e|
|
42
|
+
e.should be_a SystemExit
|
43
|
+
e.status.should == 1
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
context ', when ARGV have an option (--config) and an event device,' do
|
48
|
+
before do
|
49
|
+
@config = 'a_config_file'
|
50
|
+
ARGV = ['--config', @config,'foodev']
|
51
|
+
@observer = mock Observer
|
52
|
+
Observer.should_receive(:new){@observer}
|
53
|
+
@observer.should_receive(:start){nil}
|
54
|
+
end
|
55
|
+
it 'should call Observer#new#start ' do
|
56
|
+
CLI::main
|
57
|
+
CLI::config.should == @config
|
58
|
+
end
|
59
|
+
end
|
60
|
+
context ', when ARGV have an option (--evdev-list),' do
|
61
|
+
before do
|
62
|
+
ARGV = ['--evdev-list']
|
63
|
+
@evdev = mock Revdev::EventDevice
|
64
|
+
@id = mock Object
|
65
|
+
@evdev.stub(:device_name){"foo"}
|
66
|
+
@evdev.stub(:device_id){@id}
|
67
|
+
@id.stub(:hr_bustype){'bar'}
|
68
|
+
Revdev::EventDevice.stub(:new){@evdev}
|
69
|
+
Dir.should_receive(:glob).with(CLI::EVDEVS).
|
70
|
+
and_return(['/dev/input/event4','/dev/input/event2',
|
71
|
+
'/dev/input/event13'])
|
72
|
+
# @stdout = StringIO.new
|
73
|
+
# $stdout = @stdout
|
74
|
+
end
|
75
|
+
it 'should pring device info' do
|
76
|
+
CLI::main
|
77
|
+
# @stdout.string.should match(%r!^/dev/input/event2!)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# -*- coding:utf-8; mode:ruby; -*-
|
2
|
+
|
3
|
+
require 'rbindkeys'
|
4
|
+
require 'revdev'
|
5
|
+
|
6
|
+
include Rbindkeys
|
7
|
+
|
8
|
+
describe DeviceOperator do
|
9
|
+
before do
|
10
|
+
@dev = mock Device
|
11
|
+
@vdev = mock VirtualDevice
|
12
|
+
@operator = DeviceOperator.new @dev, @vdev
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#send_key" do
|
16
|
+
context "with a code and a press value" do
|
17
|
+
before do
|
18
|
+
@code = 10
|
19
|
+
@value = 1
|
20
|
+
end
|
21
|
+
it "should call #send_event" do
|
22
|
+
@operator.should_receive(:send_event).with(Revdev::EV_KEY,@code,@value)
|
23
|
+
@operator.send_key @code, @value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "#send_event" do
|
29
|
+
context "with normal values" do
|
30
|
+
before do
|
31
|
+
@type = Revdev::EV_KEY
|
32
|
+
@code = 10
|
33
|
+
@value = 1
|
34
|
+
end
|
35
|
+
it "should send a #write_input_event to @vdev" do
|
36
|
+
@vdev.should_receive(:write_input_event) do |ie|
|
37
|
+
ie.code.should == @code
|
38
|
+
10
|
39
|
+
end
|
40
|
+
@operator.send_event @type, @code, @value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
context "with an input event" do
|
44
|
+
before do
|
45
|
+
@ie = Revdev::InputEvent.new nil, Revdev::EV_KEY, 10, 1
|
46
|
+
end
|
47
|
+
it "should send a #write_input_event to @vdev" do
|
48
|
+
@vdev.should_receive(:write_input_event) do |ie|
|
49
|
+
ie.should == @ie
|
50
|
+
10
|
51
|
+
end
|
52
|
+
@operator.send_event @ie
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# -*- coding:utf-8; mode:ruby; -*-
|
2
|
+
|
3
|
+
require 'rbindkeys'
|
4
|
+
|
5
|
+
include Rbindkeys
|
6
|
+
|
7
|
+
describe FixResolver do
|
8
|
+
|
9
|
+
describe ".instance" do
|
10
|
+
context "with different value" do
|
11
|
+
it "should return different instances" do
|
12
|
+
f = FixResolver.instance :foo
|
13
|
+
g = FixResolver.instance :bar
|
14
|
+
f.equal?(g).should be_false
|
15
|
+
end
|
16
|
+
it "should return different instances" do
|
17
|
+
f = FixResolver.instance :foo
|
18
|
+
g = FixResolver.instance :foo
|
19
|
+
f.equal?(g).should be_true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.new' do
|
25
|
+
context 'with any arg' do
|
26
|
+
it 'should raise an exception' do
|
27
|
+
lambda{FixResolver.new}.should raise_error
|
28
|
+
lambda{FixResolver.new :foo}.should raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#bind' do
|
34
|
+
before do
|
35
|
+
@resolver = FixResolver.instance :foo
|
36
|
+
end
|
37
|
+
context 'with any args' do
|
38
|
+
it 'should raise an exception' do
|
39
|
+
lambda{@resolver.bind 1, 2}.should raise_error
|
40
|
+
lambda{@resolver.bind [], []}.should raise_error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#resolve' do
|
46
|
+
before do
|
47
|
+
@resolver = FixResolver.instance :foo
|
48
|
+
end
|
49
|
+
context 'with any args' do
|
50
|
+
it 'should return :foo' do
|
51
|
+
@resolver.resolve(1, []).should == :foo
|
52
|
+
@resolver.resolve(3, [1,2]).should == :foo
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
# -*- coding:utf-8; mode:ruby; -*-
|
2
|
+
|
3
|
+
require 'rbindkeys'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'revdev'
|
6
|
+
|
7
|
+
include Rbindkeys
|
8
|
+
|
9
|
+
$tmp_dir = 'tmp'
|
10
|
+
|
11
|
+
describe KeyEventHandler do
|
12
|
+
before :all do
|
13
|
+
FileUtils.mkdir $tmp_dir
|
14
|
+
end
|
15
|
+
|
16
|
+
after :all do
|
17
|
+
FileUtils.rm_r $tmp_dir
|
18
|
+
end
|
19
|
+
|
20
|
+
before do
|
21
|
+
@ope = mock DeviceOperator
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "bind keys methods" do
|
25
|
+
|
26
|
+
before do
|
27
|
+
@defval = :hoge
|
28
|
+
@bind_set = []
|
29
|
+
@res = mock Rbindkeys::BindResolver
|
30
|
+
|
31
|
+
# define stubs
|
32
|
+
@res.stub(:bind) do |i, o|
|
33
|
+
@bind_set << [i, o]
|
34
|
+
end
|
35
|
+
@res.stub(:resolve) do |input, pressed_key_set|
|
36
|
+
if input == 10
|
37
|
+
BindResolver.new
|
38
|
+
else
|
39
|
+
@defval
|
40
|
+
end
|
41
|
+
end
|
42
|
+
@res.stub(:just_resolve) do |input, pressed_key_set|
|
43
|
+
if input == 10
|
44
|
+
BindResolver.new
|
45
|
+
else
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
@res.stub(:kind_of?) do |klass|
|
50
|
+
klass == Rbindkeys::BindResolver
|
51
|
+
end
|
52
|
+
Rbindkeys::BindResolver.stub!(:new).and_return(@res)
|
53
|
+
|
54
|
+
@handler = KeyEventHandler.new @ope
|
55
|
+
end
|
56
|
+
|
57
|
+
describe KeyEventHandler, "#pre_bind_key" do
|
58
|
+
context "with a bind" do
|
59
|
+
it "map the bind to @pre_bind_resolver" do
|
60
|
+
@handler.pre_bind_key 1, 0
|
61
|
+
@handler.pre_bind_resolver[1].should == 0
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context "with duplicated binds" do
|
65
|
+
it "should raise a DuplicatedNodeError" do
|
66
|
+
@handler.pre_bind_key 1, 0
|
67
|
+
lambda{ @handler.pre_bind_key(1, 2) }.should raise_error(DuplicateNodeError)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe KeyEventHandler, "#bind_key" do
|
73
|
+
context "with two Fixnum" do
|
74
|
+
it "construct @bind_set" do
|
75
|
+
@handler.bind_key 0, 1
|
76
|
+
@bind_set.should == [[[0],[1]]]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
context "with two Arrays" do
|
80
|
+
it "construct @bind_set" do
|
81
|
+
@handler.bind_key [0, 1], [2, 3]
|
82
|
+
@bind_set.should == [[[0, 1], [2, 3]]]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
context "with an Array and a KeyResolver" do
|
86
|
+
it "construct @bind_set" do
|
87
|
+
@handler.bind_key [0,1], @res
|
88
|
+
@bind_set.should == [[[0,1], @res]]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
context "with an Array and a block" do
|
92
|
+
it "construct @bind_set" do
|
93
|
+
@handler.bind_key [0,1] do
|
94
|
+
p 'foo'
|
95
|
+
end
|
96
|
+
@bind_set.first[1].class.should == Proc
|
97
|
+
end
|
98
|
+
end
|
99
|
+
context "with mix classes" do
|
100
|
+
it "construct @bind_set" do
|
101
|
+
@handler.bind_key 1, [2, 3]
|
102
|
+
@handler.bind_key [2, 3], 4
|
103
|
+
@bind_set.should == [[[1], [2, 3]], [[2, 3], [4]]]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
context "with invalid args" do
|
107
|
+
it "raise some error" do
|
108
|
+
lambda{@handler.bind_key [1], [[[2]]]}.should raise_error
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe KeyEventHandler, "#bind_prefix_key" do
|
114
|
+
context "with a new prefix key" do
|
115
|
+
it "construct @bind_set" do
|
116
|
+
@handler.bind_prefix_key [0,1] do
|
117
|
+
@handler.bind_key 2, 3
|
118
|
+
end
|
119
|
+
@bind_set.length.should == 2
|
120
|
+
@bind_set.include?([[2],[3]]).should be_true
|
121
|
+
end
|
122
|
+
end
|
123
|
+
context "with a existing prefix key" do
|
124
|
+
it "should construct @bind_set" do
|
125
|
+
@handler.bind_prefix_key [0,10] do
|
126
|
+
@handler.bind_key 2, 3
|
127
|
+
end
|
128
|
+
@bind_set.length.should == 1
|
129
|
+
@bind_set.include?([[2],[3]]).should be_true
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe KeyEventHandler, "#window" do
|
135
|
+
context 'with invalid arg' do
|
136
|
+
it 'should raise ArgumentError' do
|
137
|
+
lambda { @handler.window(nil, "foo") }.should raise_error
|
138
|
+
lambda { @handler.window(nil, :class => "bar") }.should raise_error
|
139
|
+
end
|
140
|
+
end
|
141
|
+
context 'with nil and a regex' do
|
142
|
+
it 'should return the BindResolver and added it to @window_bind_resolver_map' do
|
143
|
+
size = @handler.window_bind_resolver_map.size
|
144
|
+
res = @handler.window(nil, /foo/)
|
145
|
+
res.should be_a BindResolver
|
146
|
+
(@handler.window_bind_resolver_map.size - size).should == 1
|
147
|
+
p '--------------'
|
148
|
+
Hash[*@handler.window_bind_resolver_map.flatten].value?(res).should be_true
|
149
|
+
end
|
150
|
+
end
|
151
|
+
context 'with nil and a Hash having :class key' do
|
152
|
+
it 'should return the BindResolver and added it to @window_bind_resolver_map' do
|
153
|
+
size = @handler.window_bind_resolver_map.size
|
154
|
+
res = @handler.window(nil, :class => /foo/)
|
155
|
+
res.should be_a BindResolver
|
156
|
+
(@handler.window_bind_resolver_map.size - size).should == 1
|
157
|
+
Hash[*@handler.window_bind_resolver_map.flatten].value?(res).should be_true
|
158
|
+
end
|
159
|
+
end
|
160
|
+
context 'with a BindResolver and a regex' do
|
161
|
+
before do
|
162
|
+
@arg_resolver = mock BindResolver
|
163
|
+
@arg_resolver.stub(:kind_of?).and_return(false)
|
164
|
+
@arg_resolver.stub(:kind_of?).with(BindResolver).and_return(true)
|
165
|
+
end
|
166
|
+
it 'should return the BindResolver and added it to @window_bind_resolver_map' do
|
167
|
+
size = @handler.window_bind_resolver_map.size
|
168
|
+
res = @handler.window(@arg_resolver, /foo/)
|
169
|
+
res.should be_a BindResolver
|
170
|
+
(@handler.window_bind_resolver_map.size - size).should == 1
|
171
|
+
Hash[*@handler.window_bind_resolver_map.flatten].value?(res).should be_true
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "KeyEventHandler#load_config" do
|
177
|
+
before :all do
|
178
|
+
@config = File.join $tmp_dir, 'config'
|
179
|
+
open @config, 'w' do |f|
|
180
|
+
f.write <<-EOF
|
181
|
+
pre_bind_key KEY_CAPSLOCK, KEY_LEFTCTRL
|
182
|
+
bind_key [KEY_LEFTCTRL,KEY_F], KEY_RIGHT
|
183
|
+
bind_key [KEY_LEFTCTRL,KEY_W], [KEY_LEFTCTRL,KEY_X]
|
184
|
+
bind_prefix_key [KEY_LEFTCTRL,KEY_X] do
|
185
|
+
bind_key KEY_K, [KEY_LEFTCTRL, KEY_W]
|
186
|
+
end
|
187
|
+
EOF
|
188
|
+
end
|
189
|
+
end
|
190
|
+
it "construct @pre_bind_key_set and @bind_key_set" do
|
191
|
+
@handler.load_config @config
|
192
|
+
@handler.pre_bind_resolver.size.should == 1
|
193
|
+
@bind_set.length.should == 4
|
194
|
+
@bind_set[0][1].should == [Revdev::KEY_RIGHT]
|
195
|
+
@bind_set[1][1].should == [Revdev::KEY_LEFTCTRL, Revdev::KEY_X]
|
196
|
+
@bind_set[2][1].should == @res
|
197
|
+
@bind_set[3][1].should == [Revdev::KEY_LEFTCTRL, Revdev::KEY_W]
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|