rkremap 0.2.1 → 0.4.0
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 +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
|