This repository has been archived by the owner on Jan 1, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathtransform.py
160 lines (107 loc) · 4.64 KB
/
transform.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
from enum import Enum
from key import Action, Combo, Key, Modifier
from output import send_combo, send_key_action, send_key
__author__ = 'zh'
_pressed_modifier_keys = set()
def update_pressed_modifier_keys(key, action):
if action.is_pressed():
_pressed_modifier_keys.add(key)
else:
_pressed_modifier_keys.discard(key)
def get_pressed_modifiers():
return {Modifier.from_key(key) for key in _pressed_modifier_keys}
class Mode(Enum):
GLOBAL, CONTROL_X, CONTROL_Q = range(3)
def get_map(self):
return {
Mode.GLOBAL: _GLOBAL_MAP,
Mode.CONTROL_X: _CONTROL_X_MAP,
Mode.CONTROL_Q: _CONTROL_Q_MAP
}[self]
_mark_set = False
def with_mark(combo):
if isinstance(combo, Key):
combo = Combo(None, combo)
def _with_mark():
return combo.with_modifier(Modifier.SHIFT) if _mark_set else combo
return _with_mark
def set_mark(mark_set):
def _set_mark():
global _mark_set
_mark_set = mark_set
return _set_mark
_GLOBAL_MAP = {
Combo(Modifier.CONTROL, Key.B): with_mark(Key.LEFT),
Combo(Modifier.CONTROL, Key.F): with_mark(Key.RIGHT),
Combo(Modifier.CONTROL, Key.P): with_mark(Key.UP),
Combo(Modifier.CONTROL, Key.N): with_mark(Key.DOWN),
Combo(Modifier.ALT, Key.B): with_mark(Combo(Modifier.CONTROL, Key.LEFT)),
Combo(Modifier.ALT, Key.F): with_mark(Combo(Modifier.CONTROL, Key.RIGHT)),
Combo(Modifier.CONTROL, Key.A): with_mark(Key.HOME),
Combo(Modifier.CONTROL, Key.E): with_mark(Key.END),
Combo(Modifier.ALT, Key.V): with_mark(Key.PAGE_UP),
Combo(Modifier.CONTROL, Key.V): with_mark(Key.PAGE_DOWN),
Combo({Modifier.ALT, Modifier.SHIFT}, Key.COMMA): with_mark(Combo(Modifier.CONTROL, Key.HOME)),
Combo({Modifier.ALT, Modifier.SHIFT}, Key.DOT): with_mark(Combo(Modifier.CONTROL, Key.END)),
Combo(Modifier.CONTROL, Key.J): Key.ENTER,
Combo(Modifier.CONTROL, Key.O): [Key.ENTER, Key.LEFT],
Combo(Modifier.CONTROL, Key.W): [Combo(Modifier.CONTROL, Key.X), set_mark(False)],
Combo(Modifier.ALT, Key.W): [Combo(Modifier.CONTROL, Key.C), set_mark(False)],
Combo(Modifier.CONTROL, Key.Y): [Combo(Modifier.CONTROL, Key.V), set_mark(False)],
Combo(Modifier.CONTROL, Key.D): [Key.DELETE, set_mark(False)],
Combo(Modifier.ALT, Key.D): [Combo(Modifier.CONTROL, Key.DELETE), set_mark(False)],
Combo(Modifier.CONTROL, Key.K): [Combo(Modifier.SHIFT, Key.END), Combo(Modifier.CONTROL, Key.X), set_mark(False)],
Combo(Modifier.CONTROL, Key.SLASH): [Combo(Modifier.CONTROL, Key.Z), set_mark(False)],
Combo(Modifier.CONTROL, Key.SPACE): set_mark(True),
Combo(Modifier.CONTROL, Key.S): Key.F3,
Combo(Modifier.CONTROL, Key.R): Combo(Modifier.SHIFT, Key.F3),
Combo({Modifier.ALT, Modifier.SHIFT}, Key.KEY_5): Combo(Modifier.CONTROL, Key.H),
Combo(Modifier.CONTROL, Key.G): [Key.ESC, set_mark(False)],
Combo(Modifier.CONTROL, Key.X): Mode.CONTROL_X,
Combo(Modifier.CONTROL, Key.Q): Mode.CONTROL_Q
}
_CONTROL_X_MAP = {
Combo(None, Key.H): [Combo(Modifier.CONTROL, Key.HOME), Combo(Modifier.CONTROL, Key.A), set_mark(True), Mode.GLOBAL],
Combo(Modifier.CONTROL, Key.F): [Combo(Modifier.CONTROL, Key.O), Mode.GLOBAL],
Combo(Modifier.CONTROL, Key.S): [Combo(Modifier.CONTROL, Key.S), Mode.GLOBAL],
Combo(None, Key.K): [Combo(Modifier.CONTROL, Key.F4), Mode.GLOBAL],
Combo(Modifier.CONTROL, Key.C): [Combo(Modifier.ALT, Key.F4), Mode.GLOBAL],
Combo(Modifier.CONTROL, Key.G): Mode.GLOBAL
}
_CONTROL_Q_MAP = {}
_mode_map = _GLOBAL_MAP
def on_event(event):
on_key(Key(event.code), Action(event.value))
def on_key(key, action):
if key in Modifier.get_all_keys():
update_pressed_modifier_keys(key, action)
send_key_action(key, action)
elif not action.is_pressed():
send_key_action(key, action)
else:
transform_key(key, action)
def transform_key(key, action):
global _mode_map
combo = Combo(get_pressed_modifiers(), key)
if _mode_map is _GLOBAL_MAP and combo not in _mode_map:
send_key_action(key, action)
return
if _mode_map is _CONTROL_Q_MAP:
send_key_action(key, action)
if combo not in _mode_map:
_mode_map = _GLOBAL_MAP
return
values = _mode_map[combo]
if not isinstance(values, list):
values = [values]
for value in values:
if callable(value):
value = value()
if value is None:
continue
if isinstance(value, Key):
send_key(value)
elif isinstance(value, Combo):
send_combo(value)
elif isinstance(value, Mode):
_mode_map = value.get_map()