rkremap 0.2.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +76 -4
- data/example/henkan-super.rb +52 -0
- data/example/keylogger.rb +2 -2
- data/example/mac-shortcut.rb +48 -11
- data/example/tmtms.rb +98 -100
- data/lib/rkremap/evdev.rb +49 -61
- data/lib/rkremap/evdev_list.rb +84 -0
- data/lib/rkremap/event.rb +58 -0
- data/lib/rkremap/keycode.rb +81 -1
- data/lib/rkremap/uinput.rb +40 -0
- data/lib/rkremap/version.rb +1 -1
- data/lib/rkremap/winattr.rb +4 -1
- data/lib/rkremap.rb +108 -57
- metadata +25 -8
- data/example/henkan-alt.rb +0 -93
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 127371f8cab9cd5ff002b35b886b79a3a4424d779f4bf938b9006fb633917a51
|
4
|
+
data.tar.gz: a02bd1649a62f30916e125582409f9b9ab8d57c33caf10bdfc5f7e6392ece992
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 111e0d08dfaec939535f150eb8d2852c5bbda078d705191d8d03d0d035782088cf73f7c861029cc49b99860f8645be46c1ef557326bae1e17170d15116ee887d
|
7
|
+
data.tar.gz: a1124ae0dabd8f87286d7ae2cc375a0490ffc58a884c2fb0f9694f51cee9d97b309ea83842afeb46f86184a1523e96c06429688bf71aa05e1a6e9555d6f488cb
|
data/README.md
CHANGED
@@ -23,7 +23,9 @@ KERNEL=="uinput", GROUP="input"
|
|
23
23
|
という内容で作れば `/dev/uinput` のグループを `input` にできるっぽい。
|
24
24
|
|
25
25
|
|
26
|
-
|
26
|
+
## Rkremap
|
27
|
+
|
28
|
+
### Rkremap.new
|
27
29
|
|
28
30
|
引数を指定しなければ自動的にキーボードデバイスの検出を試みる。
|
29
31
|
|
@@ -40,14 +42,42 @@ sudo evtest /dev/input/eventX
|
|
40
42
|
|
41
43
|
ThinkPad 本体のキーボードは `/dev/input/event3` だった。
|
42
44
|
|
45
|
+
### Rkremap#exclude
|
46
|
+
|
47
|
+
無視するデバイス名を正規表現で指定できる。
|
48
|
+
|
49
|
+
例
|
50
|
+
```ruby
|
51
|
+
rkremap.exclude = /touchpad/i
|
52
|
+
```
|
53
|
+
|
54
|
+
### Rkremap#mouse
|
55
|
+
|
56
|
+
真を指定するとマウスも対象にする。
|
57
|
+
|
43
58
|
### Rkremap#grab
|
44
59
|
|
45
|
-
`true`
|
60
|
+
`true` を設定するとキーイベントを奪う。キーイベントを見るだけでいいなら `false` を設定する。
|
61
|
+
|
62
|
+
`:keyboard` を設定するとキーボードデバイスを grab する。
|
63
|
+
|
64
|
+
`:mouse` を設定するとマウスデバイスを grab する。
|
65
|
+
|
66
|
+
正規表現を設定するとデバイス名がマッチした場合にデバイスを grab する。
|
46
67
|
|
47
68
|
### Rkremap#x11
|
48
69
|
|
49
70
|
`true` に設定すると X のアプリ名等を取得できる。X 環境下でないなら `false` を設定する。
|
50
71
|
|
72
|
+
### Rkremap#modifers
|
73
|
+
|
74
|
+
修飾キーの一覧。これらのキーは単体で押されただけでは `start` ブロックを実行しない。
|
75
|
+
|
76
|
+
### Rkremap#auto_detect
|
77
|
+
|
78
|
+
`true` の場合はキーボードデバイスの接続を自動検知する。
|
79
|
+
`new` 時にデバイスファイルが指定されない場合は `true` になる。
|
80
|
+
|
51
81
|
### Rkremap#start
|
52
82
|
|
53
83
|
なにかキーを押されたらブロックを実行する。修飾キー単体ではブロックは実行されない。
|
@@ -56,13 +86,27 @@ ThinkPad 本体のキーボードは `/dev/input/event3` だった。
|
|
56
86
|
|
57
87
|
### Rkremap#match
|
58
88
|
|
59
|
-
キーイベントが引数に適合するとブロックを実行する。ブロック引数は Event オブジェクト。
|
60
|
-
`Event#skip` するとこのイベントはスキップされる。
|
89
|
+
キーイベントが引数に適合するとブロックを実行する。ブロック引数は `Rkremap::Event` オブジェクト。
|
90
|
+
`Rkremap::Event#skip` するとこのイベントはスキップされる。
|
91
|
+
|
92
|
+
複数回指定した場合は記述順に実行される。
|
61
93
|
|
62
94
|
### Rkremap#key
|
63
95
|
|
64
96
|
キーを押したことにする。引数はキーコード(`Integer`)と修飾キー(`Hash`)。
|
65
97
|
|
98
|
+
修飾キーのハッシュのキーはキーコード(`KEY_LEFTCTRL` 等)、値は `true`, または `false`。
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
{
|
102
|
+
KEY_LEFTSHIFT => false,
|
103
|
+
KEY_LEFTCTRL => true,
|
104
|
+
}
|
105
|
+
```
|
106
|
+
|
107
|
+
と指定すると、左シフトは離した状態、左Ctrlは押した状態、それ以外の修飾キーはそのまま。
|
108
|
+
`#key()` 処理後は処理前の修飾キーの状態に戻る。
|
109
|
+
|
66
110
|
### Rkremap#event
|
67
111
|
|
68
112
|
キーイベントを発生させる。`code` 引数はキーコード(`Integer`)。`type` 引数はイベントタイプ(`Symbol`)で `:press`, `:release`。
|
@@ -75,6 +119,34 @@ ThinkPad 本体のキーボードは `/dev/input/event3` だった。
|
|
75
119
|
|
76
120
|
コードからキー名のシンボルに変換するための Hash。
|
77
121
|
|
122
|
+
## Rkremap::Event
|
123
|
+
|
124
|
+
### Rkremap::Event#code
|
125
|
+
|
126
|
+
キーコード。`Rkremap::KeyCode::KEY_*` に該当。
|
127
|
+
|
128
|
+
### Rkremap::Event#type
|
129
|
+
|
130
|
+
イベントタイプ。 `:press`, `:release`, `:repeat` のいずれか。
|
131
|
+
|
132
|
+
### Rkremap::Event#app
|
133
|
+
|
134
|
+
`Rkremap::App`。イベントが発生したアプリケーション。
|
135
|
+
|
136
|
+
### Rkremap::Event#skip
|
137
|
+
|
138
|
+
このイベントをこれ以降処理しない。
|
139
|
+
|
140
|
+
## Rkremap::App
|
141
|
+
|
142
|
+
### Rkremap::App#class_name
|
143
|
+
|
144
|
+
アプリケーションのクラス名。
|
145
|
+
|
146
|
+
### Rkremap::App#title
|
147
|
+
|
148
|
+
アプリケーションのタイトル。
|
149
|
+
|
78
150
|
## 参考
|
79
151
|
|
80
152
|
* [mooz/xkeysnail: Yet another keyboard remapping tool for X environment](https://github.com/mooz/xkeysnail)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# 変換/無変換キーを0.5秒以上押してるとSUPERキーとして扱う。
|
2
|
+
# 0.5秒以内でも変換/無変換キーを押しながら他のキーを押すとSUPERキーとして扱う。
|
3
|
+
|
4
|
+
require 'rkremap'
|
5
|
+
require 'tmtms_timer'
|
6
|
+
|
7
|
+
include Rkremap::KeyCode
|
8
|
+
|
9
|
+
rk = Rkremap.new
|
10
|
+
rk.grab = true
|
11
|
+
|
12
|
+
timer = Tmtms::Timer.new
|
13
|
+
jobs = {
|
14
|
+
KEY_HENKAN => nil,
|
15
|
+
KEY_MUHENKAN => nil,
|
16
|
+
}
|
17
|
+
|
18
|
+
henkan_map = {
|
19
|
+
KEY_HENKAN => KEY_RIGHTMETA,
|
20
|
+
KEY_MUHENKAN => KEY_RIGHTMETA, # LEFTMETA だとデスクトップ環境のメニューが開いたりするため
|
21
|
+
}
|
22
|
+
|
23
|
+
rk.match(code: [KEY_HENKAN, KEY_MUHENKAN]) do |event|
|
24
|
+
if event.type == :press
|
25
|
+
job = timer.set(0.5) do
|
26
|
+
rk.synchronize do
|
27
|
+
rk.event(code: henkan_map[event.code], type: :press)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
jobs[event.code] = job
|
31
|
+
elsif event.type == :release
|
32
|
+
if jobs[event.code]&.cancel # 0.5秒以内に離された
|
33
|
+
rk.key(event.code)
|
34
|
+
else
|
35
|
+
rk.event(code: henkan_map[event.code], type: :release)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
event.skip
|
39
|
+
end
|
40
|
+
|
41
|
+
# 何かキーが押されたときに HENKAN, MUHENKAN が押されてれば SUPER が押されてることにする
|
42
|
+
rk.match(type: :press) do
|
43
|
+
[KEY_HENKAN, KEY_MUHENKAN].each do |code|
|
44
|
+
if jobs[code]&.cancel # 0.5秒以内
|
45
|
+
rk.event(code: henkan_map[code], type: :press)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
rk.start do |code, mod|
|
51
|
+
rk.key(code, mod)
|
52
|
+
end
|
data/example/keylogger.rb
CHANGED
@@ -6,9 +6,9 @@ def code2key(code)
|
|
6
6
|
Rkremap::CODE_KEY[code].to_s.sub(/\AKEY_/, '')
|
7
7
|
end
|
8
8
|
|
9
|
-
rk = Rkremap.new
|
9
|
+
rk = Rkremap.new(*ARGV)
|
10
10
|
rk.grab = false
|
11
|
-
rk.x11 = true
|
11
|
+
rk.x11 = true if ENV['DISPLAY']
|
12
12
|
rk.start do |code, mod, app|
|
13
13
|
key = (mod.select{|_, v| v}.keys + [code]).map{|c| code2key(c)}.join('-')
|
14
14
|
key << " at #{app.title} [#{app.class_name}]" if rk.x11
|
data/example/mac-shortcut.rb
CHANGED
@@ -36,39 +36,76 @@ mod_disable_all = {}.merge(mod_disable_ctrl, mod_disable_shift, mod_disable_alt,
|
|
36
36
|
rk = Rkremap.new
|
37
37
|
rk.grab = true
|
38
38
|
rk.x11 = true
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
|
40
|
+
# Emacs や VirtualBox ではそのまま
|
41
|
+
rk.match(app: /Emacs|VirtualBox Machine/) do |event|
|
42
|
+
rk.event(code: event.code, type: event.type)
|
43
|
+
event.skip
|
44
|
+
end
|
45
|
+
|
46
|
+
# 端末
|
47
|
+
rk.match(app: /terminal/i) do |event, mod|
|
48
|
+
# Super+Ctrl はそのまま
|
49
|
+
if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL])
|
50
|
+
rk.event(code: event.code, type: event.type)
|
51
|
+
end
|
52
|
+
# Super+KEY は Ctrl+Shift+KEY に変換
|
53
|
+
if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && Rkremap::CODE_KEY[event.code] =~ /\AKEY_[A-Z]\z/
|
54
|
+
rk.with_modifier(mod_disable_meta.merge(KEY_LEFTCTRL => true, KEY_LEFTSHIFT => true)) do
|
55
|
+
rk.event(code: event.code, type: event.type)
|
56
|
+
end
|
57
|
+
else
|
58
|
+
rk.event(code: event.code, type: event.type)
|
59
|
+
end
|
60
|
+
event.skip
|
61
|
+
end
|
62
|
+
|
63
|
+
rk.start do |code, mod|
|
64
|
+
# Super + Ctrl + 何か はそのまま
|
65
|
+
if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL])
|
42
66
|
rk.key(code, mod)
|
43
67
|
next
|
44
68
|
end
|
45
69
|
|
46
|
-
#
|
47
|
-
if (mod[
|
48
|
-
mod.merge
|
49
|
-
|
50
|
-
|
70
|
+
# SUPER+[A-Z]/Enter を Ctrl+[A-Z]/Enter に変換
|
71
|
+
if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/ || code == KEY_ENTER)
|
72
|
+
rk.key(code, mod.merge(mod_disable_meta, KEY_LEFTCTRL => true))
|
73
|
+
next
|
74
|
+
end
|
75
|
+
|
76
|
+
# Alt + F, B は Ctrl + →, ← に変換
|
77
|
+
if (mod[KEY_LEFTALT] || mod[KEY_RIGHTALT]) && (code == KEY_F || code == KEY_B)
|
78
|
+
rk.key(code == KEY_F ? KEY_RIGHT : KEY_LEFT, mod.merge(mod_disable_alt, KEY_LEFTCTRL => true))
|
51
79
|
next
|
52
80
|
end
|
53
81
|
|
54
82
|
# Ctrl は他のキーに変換
|
55
83
|
if mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL]
|
84
|
+
# Ctrl+I/O はそのまま
|
85
|
+
if code == KEY_I || code == KEY_O
|
86
|
+
rk.key(code, mod)
|
87
|
+
next
|
88
|
+
end
|
89
|
+
|
56
90
|
# Ctrl+K は行末まで削除
|
57
91
|
if code == KEY_K
|
58
|
-
rk.key(KEY_END, mod_disable_all.merge(
|
59
|
-
rk.key(KEY_X, mod_disable_all.merge(
|
92
|
+
rk.key(KEY_END, mod_disable_all.merge(KEY_LEFTSHIFT => true)) # SHIFT+END
|
93
|
+
rk.key(KEY_X, mod_disable_all.merge(KEY_LEFTCTRL => true)) # Ctrl+X
|
60
94
|
next
|
61
95
|
end
|
96
|
+
|
62
97
|
# 単純な変換
|
63
98
|
if ctrl_map[code]
|
64
|
-
rk.key(ctrl_map[code], mod_disable_ctrl)
|
99
|
+
rk.key(ctrl_map[code], mod.merge(mod_disable_ctrl))
|
65
100
|
next
|
66
101
|
end
|
102
|
+
|
67
103
|
# その他の Ctrl+[A-Z] は無視
|
68
104
|
if Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/
|
69
105
|
next
|
70
106
|
end
|
71
107
|
end
|
72
108
|
|
109
|
+
# それ以外はそのまま
|
73
110
|
rk.key(code, mod)
|
74
111
|
end
|
data/example/tmtms.rb
CHANGED
@@ -1,117 +1,69 @@
|
|
1
1
|
# tmtms 用
|
2
|
-
#
|
3
|
-
# fcitx が有効な場合に /tmp/fcitx-enabled ファイルを作るスクリプトを動かしておく:
|
4
|
-
# while :; do
|
5
|
-
# if [ $(fcitx-remote) -eq 2 ]; then
|
6
|
-
# touch /tmp/fcitx-enabled
|
7
|
-
# else
|
8
|
-
# rm -f /tmp/fcitx-enabled
|
9
|
-
# fi
|
10
|
-
# sleep 0.1
|
11
|
-
# done
|
12
2
|
|
13
3
|
require 'rkremap'
|
14
|
-
|
15
|
-
|
16
|
-
class State
|
17
|
-
attr_accessor :converted
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
@press = nil
|
21
|
-
@converted = false
|
22
|
-
@thread = nil
|
23
|
-
end
|
24
|
-
|
25
|
-
def press(thread)
|
26
|
-
@press = true
|
27
|
-
@converted = false
|
28
|
-
@thread = thread
|
29
|
-
end
|
30
|
-
|
31
|
-
def release
|
32
|
-
@press = false
|
33
|
-
@converted = false
|
34
|
-
@thread.kill
|
35
|
-
@thread = nil
|
36
|
-
end
|
4
|
+
require 'tmtms_timer'
|
37
5
|
|
38
|
-
|
39
|
-
@press
|
40
|
-
end
|
41
|
-
end
|
6
|
+
include Rkremap::KeyCode
|
42
7
|
|
43
|
-
rk = Rkremap.new
|
8
|
+
rk = Rkremap.new(*ARGV, mouse: true, exclude: /touchpad/)
|
44
9
|
rk.grab = true
|
45
10
|
rk.x11 = true
|
46
11
|
|
47
|
-
|
48
|
-
|
12
|
+
until system "xinput | grep -q rkremap"
|
13
|
+
sleep 0.1
|
14
|
+
end
|
15
|
+
system "xinput set-prop pointer:rkremap 'libinput Scroll Method Enabled' 0 0 1"
|
49
16
|
|
50
|
-
|
51
|
-
|
52
|
-
|
17
|
+
# HENKAN, MUHENKAN を 0.5秒以上押したら SUPER とする
|
18
|
+
timer = Tmtms::Timer.new
|
19
|
+
jobs = {
|
20
|
+
KEY_HENKAN => nil,
|
21
|
+
KEY_MUHENKAN => nil,
|
53
22
|
}
|
54
23
|
|
55
24
|
henkan_map = {
|
56
|
-
KEY_HENKAN =>
|
57
|
-
KEY_MUHENKAN =>
|
25
|
+
KEY_HENKAN => KEY_RIGHTMETA,
|
26
|
+
KEY_MUHENKAN => KEY_RIGHTMETA, # LEFTMETA だとデスクトップ環境のメニューが開いたりするため
|
58
27
|
}
|
59
28
|
|
60
|
-
rk.match(code: [KEY_HENKAN, KEY_MUHENKAN]
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
rk.event(code: henkan_map[code], type: :press)
|
66
|
-
state[code].converted = true
|
29
|
+
rk.match(code: [KEY_HENKAN, KEY_MUHENKAN]) do |event|
|
30
|
+
if event.type == :press
|
31
|
+
job = timer.set(0.5) do
|
32
|
+
rk.synchronize do
|
33
|
+
rk.event(code: henkan_map[event.code], type: :press)
|
67
34
|
end
|
68
35
|
end
|
36
|
+
jobs[event.code] = job
|
37
|
+
elsif event.type == :release
|
38
|
+
if jobs[event.code]&.cancel # 0.5秒以内に離された
|
39
|
+
rk.key(event.code)
|
40
|
+
else
|
41
|
+
rk.event(code: henkan_map[event.code], type: :release)
|
42
|
+
end
|
69
43
|
end
|
70
|
-
state[event.code].press(thr)
|
71
|
-
event.skip
|
72
|
-
end
|
73
|
-
|
74
|
-
rk.match(code: [KEY_HENKAN, KEY_MUHENKAN], type: :release) do |event|
|
75
|
-
if state[event.code].converted
|
76
|
-
rk.event(code: henkan_map[event.code], type: :release)
|
77
|
-
event.skip
|
78
|
-
else
|
79
|
-
rk.event(code: event.code, type: :press)
|
80
|
-
rk.event(code: event.code, type: :release)
|
81
|
-
end
|
82
|
-
state[event.code].release
|
83
|
-
end
|
84
|
-
|
85
|
-
rk.match(code: [KEY_HENKAN, KEY_MUHENKAN], type: :repeat) do |event|
|
86
44
|
event.skip
|
87
45
|
end
|
88
46
|
|
47
|
+
# 何かキーが押されたときに HENKAN, MUHENKAN が押されてれば SUPER が押されてることにする
|
89
48
|
rk.match(type: :press) do
|
90
49
|
[KEY_HENKAN, KEY_MUHENKAN].each do |code|
|
91
|
-
if
|
50
|
+
if jobs[code]&.cancel # 0.5秒以内
|
92
51
|
rk.event(code: henkan_map[code], type: :press)
|
93
|
-
state[code].converted = true
|
94
52
|
end
|
95
53
|
end
|
96
54
|
end
|
97
55
|
|
56
|
+
# マウスボタンイベントはそのまま
|
57
|
+
rk.match(device: :mouse) do |event|
|
58
|
+
rk.event(code: event.code, type: event.type)
|
59
|
+
event.skip
|
60
|
+
end
|
61
|
+
|
98
62
|
# CAPSLOCK は CTRL に変換
|
99
63
|
rk.match(code: KEY_CAPSLOCK) do |event|
|
100
|
-
|
101
|
-
event.skip
|
64
|
+
event.code = KEY_LEFTCTRL
|
102
65
|
end
|
103
66
|
|
104
|
-
ctrl_map = {
|
105
|
-
KEY_A => KEY_HOME,
|
106
|
-
KEY_E => KEY_END,
|
107
|
-
KEY_B => KEY_LEFT,
|
108
|
-
KEY_F => KEY_RIGHT,
|
109
|
-
KEY_N => KEY_DOWN,
|
110
|
-
KEY_P => KEY_UP,
|
111
|
-
KEY_D => KEY_DELETE,
|
112
|
-
KEY_H => KEY_BACKSPACE,
|
113
|
-
KEY_I => KEY_TAB,
|
114
|
-
}
|
115
67
|
mod_disable_ctrl = {
|
116
68
|
KEY_LEFTCTRL => false,
|
117
69
|
KEY_RIGHTCTRL => false,
|
@@ -130,56 +82,102 @@ mod_disable_meta = {
|
|
130
82
|
}
|
131
83
|
mod_disable_all = {}.merge(mod_disable_ctrl, mod_disable_shift, mod_disable_alt, mod_disable_meta)
|
132
84
|
|
85
|
+
# JISキーボードを英語配列にしたときに一部キーを変える
|
133
86
|
key_map = {
|
134
87
|
KEY_YEN => KEY_BACKSLASH,
|
135
88
|
KEY_BACKSLASH => KEY_GRAVE,
|
136
89
|
KEY_GRAVE => KEY_ESC,
|
137
90
|
}
|
91
|
+
rk.match do |event, mod|
|
92
|
+
event.code = key_map[event.code] || event.code
|
93
|
+
# RO キーは「\」(SHIFTキーを押してる場合は「_」)
|
94
|
+
if event.code == KEY_RO
|
95
|
+
event.code = (mod[KEY_LEFTSHIFT] || mod[KEY_RIGHTSHIFT]) ? KEY_MINUS : KEY_BACKSLASH
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Emacs や VirtualBox ではそのまま
|
100
|
+
rk.match(app: /Emacs|VirtualBox Machine/) do |event|
|
101
|
+
rk.event(code: event.code, type: event.type)
|
102
|
+
event.skip
|
103
|
+
end
|
138
104
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
if
|
143
|
-
code
|
105
|
+
# 端末
|
106
|
+
rk.match(app: /terminal/i) do |event, mod|
|
107
|
+
# Super+Ctrl はそのまま
|
108
|
+
if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL])
|
109
|
+
rk.event(code: event.code, type: event.type)
|
144
110
|
end
|
111
|
+
# Super+KEY は Ctrl+Shift+KEY に変換
|
112
|
+
if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && Rkremap::CODE_KEY[event.code] =~ /\AKEY_[A-Z]\z/
|
113
|
+
rk.with_modifier(mod_disable_meta.merge(KEY_LEFTCTRL => true, KEY_LEFTSHIFT => true)) do
|
114
|
+
rk.event(code: event.code, type: event.type)
|
115
|
+
end
|
116
|
+
else
|
117
|
+
rk.event(code: event.code, type: event.type)
|
118
|
+
end
|
119
|
+
event.skip
|
120
|
+
end
|
121
|
+
|
122
|
+
# その他のウィンドウ
|
123
|
+
ctrl_map = {
|
124
|
+
KEY_A => KEY_HOME,
|
125
|
+
KEY_E => KEY_END,
|
126
|
+
KEY_B => KEY_LEFT,
|
127
|
+
KEY_F => KEY_RIGHT,
|
128
|
+
KEY_N => KEY_DOWN,
|
129
|
+
KEY_P => KEY_UP,
|
130
|
+
KEY_D => KEY_DELETE,
|
131
|
+
KEY_H => KEY_BACKSPACE,
|
132
|
+
KEY_I => KEY_TAB,
|
133
|
+
}
|
145
134
|
|
146
|
-
|
147
|
-
|
135
|
+
rk.start do |code, mod|
|
136
|
+
# Super + Ctrl + 何か はそのまま
|
137
|
+
if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL])
|
148
138
|
rk.key(code, mod)
|
149
139
|
next
|
150
140
|
end
|
151
141
|
|
152
|
-
#
|
153
|
-
if (mod[
|
154
|
-
mod.merge
|
155
|
-
|
156
|
-
|
142
|
+
# Super+[A-Z]/Enter を Ctrl+[A-Z]/Enter に変換
|
143
|
+
if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/ || code == KEY_ENTER)
|
144
|
+
rk.key(code, mod.merge(mod_disable_meta, KEY_LEFTCTRL => true))
|
145
|
+
next
|
146
|
+
end
|
147
|
+
|
148
|
+
# Alt + F, B は Ctrl + →, ← に変換
|
149
|
+
if (mod[KEY_LEFTALT] || mod[KEY_RIGHTALT]) && (code == KEY_F || code == KEY_B)
|
150
|
+
rk.key(code == KEY_F ? KEY_RIGHT : KEY_LEFT, mod.merge(mod_disable_alt, KEY_LEFTCTRL => true))
|
157
151
|
next
|
158
152
|
end
|
159
153
|
|
160
154
|
# Ctrl は他のキーに変換
|
161
155
|
if mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL]
|
162
|
-
# Ctrl
|
163
|
-
if
|
156
|
+
# Ctrl+I/O はそのまま
|
157
|
+
if code == KEY_I || code == KEY_O
|
164
158
|
rk.key(code, mod)
|
165
159
|
next
|
166
160
|
end
|
161
|
+
|
167
162
|
# Ctrl+K は行末まで削除
|
168
163
|
if code == KEY_K
|
169
|
-
rk.key(KEY_END, mod_disable_all.merge(
|
170
|
-
rk.key(KEY_X, mod_disable_all.merge(
|
164
|
+
rk.key(KEY_END, mod_disable_all.merge(KEY_LEFTSHIFT => true)) # SHIFT+END
|
165
|
+
rk.key(KEY_X, mod_disable_all.merge(KEY_LEFTCTRL => true)) # Ctrl+X
|
171
166
|
next
|
172
167
|
end
|
168
|
+
|
173
169
|
# 単純な変換
|
174
170
|
if ctrl_map[code]
|
175
|
-
rk.key(ctrl_map[code], mod_disable_ctrl)
|
171
|
+
rk.key(ctrl_map[code], mod.merge(mod_disable_ctrl))
|
176
172
|
next
|
177
173
|
end
|
174
|
+
|
178
175
|
# その他の Ctrl+[A-Z] は無視
|
179
176
|
if Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/
|
180
177
|
next
|
181
178
|
end
|
182
179
|
end
|
183
180
|
|
181
|
+
# それ以外はそのまま
|
184
182
|
rk.key(code, mod)
|
185
183
|
end
|