1 /*
2  * This file is part of mpv.
3  *
4  * mpv is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * mpv is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with mpv.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef MPLAYER_KEYCODES_H
19 #define MPLAYER_KEYCODES_H
20 
21 // Keys in the range [0, MP_KEY_BASE) follow unicode.
22 // Special keys come after this.
23 #define MP_KEY_BASE (1<<21)
24 
25 // printable, and valid unicode range (we don't care too much about whether
26 // certain sub-ranges are reserved and disallowed, like surrogate pairs)
27 #define MP_KEY_IS_UNICODE(key) ((key) >= 32 && (key) <= 0x10FFFF)
28 
29 #define MP_KEY_ENTER 13
30 #define MP_KEY_TAB 9
31 
32 /* Control keys */
33 #define MP_KEY_BACKSPACE        (MP_KEY_BASE+0)
34 #define MP_KEY_DELETE           (MP_KEY_BASE+1)
35 #define MP_KEY_INSERT           (MP_KEY_BASE+2)
36 #define MP_KEY_HOME             (MP_KEY_BASE+3)
37 #define MP_KEY_END              (MP_KEY_BASE+4)
38 #define MP_KEY_PAGE_UP          (MP_KEY_BASE+5)
39 #define MP_KEY_PAGE_DOWN        (MP_KEY_BASE+6)
40 #define MP_KEY_ESC              (MP_KEY_BASE+7)
41 #define MP_KEY_PRINT            (MP_KEY_BASE+8)
42 
43 /* Control keys short name */
44 #define MP_KEY_BS       MP_KEY_BACKSPACE
45 #define MP_KEY_DEL      MP_KEY_DELETE
46 #define MP_KEY_INS      MP_KEY_INSERT
47 #define MP_KEY_PGUP     MP_KEY_PAGE_UP
48 #define MP_KEY_PGDOWN   MP_KEY_PAGE_DOWN
49 #define MP_KEY_PGDWN    MP_KEY_PAGE_DOWN
50 
51 /* Cursor movement */
52 #define MP_KEY_CRSR     (MP_KEY_BASE+0x10)
53 #define MP_KEY_RIGHT    (MP_KEY_CRSR+0)
54 #define MP_KEY_LEFT     (MP_KEY_CRSR+1)
55 #define MP_KEY_DOWN     (MP_KEY_CRSR+2)
56 #define MP_KEY_UP       (MP_KEY_CRSR+3)
57 
58 /* Multimedia/internet keyboard/remote keys */
59 #define MP_KEY_MM_BASE          (MP_KEY_BASE+0x20)
60 #define MP_KEY_POWER            (MP_KEY_MM_BASE+0)
61 #define MP_KEY_MENU             (MP_KEY_MM_BASE+1)
62 #define MP_KEY_PLAY             (MP_KEY_MM_BASE+2)
63 #define MP_KEY_PAUSE            (MP_KEY_MM_BASE+3)
64 #define MP_KEY_PLAYPAUSE        (MP_KEY_MM_BASE+4)
65 #define MP_KEY_STOP             (MP_KEY_MM_BASE+5)
66 #define MP_KEY_FORWARD          (MP_KEY_MM_BASE+6)
67 #define MP_KEY_REWIND           (MP_KEY_MM_BASE+7)
68 #define MP_KEY_NEXT             (MP_KEY_MM_BASE+8)
69 #define MP_KEY_PREV             (MP_KEY_MM_BASE+9)
70 #define MP_KEY_VOLUME_UP        (MP_KEY_MM_BASE+10)
71 #define MP_KEY_VOLUME_DOWN      (MP_KEY_MM_BASE+11)
72 #define MP_KEY_MUTE             (MP_KEY_MM_BASE+12)
73 #define MP_KEY_HOMEPAGE         (MP_KEY_MM_BASE+13)
74 #define MP_KEY_WWW              (MP_KEY_MM_BASE+14)
75 #define MP_KEY_MAIL             (MP_KEY_MM_BASE+15)
76 #define MP_KEY_FAVORITES        (MP_KEY_MM_BASE+16)
77 #define MP_KEY_SEARCH           (MP_KEY_MM_BASE+17)
78 #define MP_KEY_SLEEP            (MP_KEY_MM_BASE+18)
79 #define MP_KEY_CANCEL           (MP_KEY_MM_BASE+19)
80 #define MP_KEY_RECORD           (MP_KEY_MM_BASE+20)
81 #define MP_KEY_CHANNEL_UP       (MP_KEY_MM_BASE+21)
82 #define MP_KEY_CHANNEL_DOWN     (MP_KEY_MM_BASE+22)
83 #define MP_KEY_PLAYONLY         (MP_KEY_MM_BASE+23)
84 #define MP_KEY_PAUSEONLY        (MP_KEY_MM_BASE+24)
85 
86 /*  Function keys  */
87 #define MP_KEY_F (MP_KEY_BASE+0x40)
88 
89 /* Keypad keys */
90 #define MP_KEY_KEYPAD   (MP_KEY_BASE+0x60)
91 #define MP_KEY_KP0      (MP_KEY_KEYPAD+0)
92 #define MP_KEY_KP1      (MP_KEY_KEYPAD+1)
93 #define MP_KEY_KP2      (MP_KEY_KEYPAD+2)
94 #define MP_KEY_KP3      (MP_KEY_KEYPAD+3)
95 #define MP_KEY_KP4      (MP_KEY_KEYPAD+4)
96 #define MP_KEY_KP5      (MP_KEY_KEYPAD+5)
97 #define MP_KEY_KP6      (MP_KEY_KEYPAD+6)
98 #define MP_KEY_KP7      (MP_KEY_KEYPAD+7)
99 #define MP_KEY_KP8      (MP_KEY_KEYPAD+8)
100 #define MP_KEY_KP9      (MP_KEY_KEYPAD+9)
101 #define MP_KEY_KPDEC    (MP_KEY_KEYPAD+10)
102 #define MP_KEY_KPINS    (MP_KEY_KEYPAD+11)
103 #define MP_KEY_KPDEL    (MP_KEY_KEYPAD+12)
104 #define MP_KEY_KPENTER  (MP_KEY_KEYPAD+13)
105 
106 // Mouse events from VOs
107 #define MP_MBTN_BASE     ((MP_KEY_BASE+0xA0)|MP_NO_REPEAT_KEY|MP_KEY_EMIT_ON_UP)
108 #define MP_MBTN_LEFT     (MP_MBTN_BASE+0)
109 #define MP_MBTN_MID      (MP_MBTN_BASE+1)
110 #define MP_MBTN_RIGHT    (MP_MBTN_BASE+2)
111 #define MP_WHEEL_UP      (MP_MBTN_BASE+3)
112 #define MP_WHEEL_DOWN    (MP_MBTN_BASE+4)
113 #define MP_WHEEL_LEFT    (MP_MBTN_BASE+5)
114 #define MP_WHEEL_RIGHT   (MP_MBTN_BASE+6)
115 #define MP_MBTN_BACK     (MP_MBTN_BASE+7)
116 #define MP_MBTN_FORWARD  (MP_MBTN_BASE+8)
117 #define MP_MBTN9         (MP_MBTN_BASE+9)
118 #define MP_MBTN10        (MP_MBTN_BASE+10)
119 #define MP_MBTN11        (MP_MBTN_BASE+11)
120 #define MP_MBTN12        (MP_MBTN_BASE+12)
121 #define MP_MBTN13        (MP_MBTN_BASE+13)
122 #define MP_MBTN14        (MP_MBTN_BASE+14)
123 #define MP_MBTN15        (MP_MBTN_BASE+15)
124 #define MP_MBTN16        (MP_MBTN_BASE+16)
125 #define MP_MBTN17        (MP_MBTN_BASE+17)
126 #define MP_MBTN18        (MP_MBTN_BASE+18)
127 #define MP_MBTN19        (MP_MBTN_BASE+19)
128 #define MP_MBTN_END      (MP_MBTN_BASE+20)
129 
130 #define MP_KEY_IS_MOUSE_BTN_SINGLE(code) \
131     ((code) >= MP_MBTN_BASE && (code) < MP_MBTN_END)
132 #define MP_KEY_IS_WHEEL(code) \
133     ((code) >= MP_WHEEL_UP && (code) <= MP_WHEEL_RIGHT)
134 
135 #define MP_MBTN_DBL_BASE   ((MP_KEY_BASE+0xC0)|MP_NO_REPEAT_KEY)
136 #define MP_MBTN_LEFT_DBL   (MP_MBTN_DBL_BASE+0)
137 #define MP_MBTN_MID_DBL    (MP_MBTN_DBL_BASE+1)
138 #define MP_MBTN_RIGHT_DBL  (MP_MBTN_DBL_BASE+2)
139 #define MP_MBTN_DBL_END    (MP_MBTN_DBL_BASE+20)
140 
141 #define MP_KEY_IS_MOUSE_BTN_DBL(code) \
142     ((code) >= MP_MBTN_DBL_BASE && (code) < MP_MBTN_DBL_END)
143 
144 #define MP_KEY_MOUSE_BTN_COUNT (MP_MBTN_END - MP_MBTN_BASE)
145 
146 /* game controller keys */
147 #define MP_KEY_GAMEPAD                    (MP_KEY_BASE+0xF0)
148 #define MP_KEY_GAMEPAD_ACTION_DOWN        (MP_KEY_GAMEPAD+0)
149 #define MP_KEY_GAMEPAD_ACTION_RIGHT       (MP_KEY_GAMEPAD+1)
150 #define MP_KEY_GAMEPAD_ACTION_LEFT        (MP_KEY_GAMEPAD+2)
151 #define MP_KEY_GAMEPAD_ACTION_UP          (MP_KEY_GAMEPAD+3)
152 #define MP_KEY_GAMEPAD_BACK               (MP_KEY_GAMEPAD+4)
153 #define MP_KEY_GAMEPAD_MENU               (MP_KEY_GAMEPAD+5)
154 #define MP_KEY_GAMEPAD_START              (MP_KEY_GAMEPAD+6)
155 #define MP_KEY_GAMEPAD_LEFT_SHOULDER      (MP_KEY_GAMEPAD+7)
156 #define MP_KEY_GAMEPAD_RIGHT_SHOULDER     (MP_KEY_GAMEPAD+8)
157 #define MP_KEY_GAMEPAD_LEFT_TRIGGER       (MP_KEY_GAMEPAD+9)
158 #define MP_KEY_GAMEPAD_RIGHT_TRIGGER      (MP_KEY_GAMEPAD+10)
159 #define MP_KEY_GAMEPAD_LEFT_STICK         (MP_KEY_GAMEPAD+11)
160 #define MP_KEY_GAMEPAD_RIGHT_STICK        (MP_KEY_GAMEPAD+12)
161 #define MP_KEY_GAMEPAD_DPAD_UP            (MP_KEY_GAMEPAD+13)
162 #define MP_KEY_GAMEPAD_DPAD_DOWN          (MP_KEY_GAMEPAD+14)
163 #define MP_KEY_GAMEPAD_DPAD_LEFT          (MP_KEY_GAMEPAD+15)
164 #define MP_KEY_GAMEPAD_DPAD_RIGHT         (MP_KEY_GAMEPAD+16)
165 #define MP_KEY_GAMEPAD_LEFT_STICK_UP      (MP_KEY_GAMEPAD+17)
166 #define MP_KEY_GAMEPAD_LEFT_STICK_DOWN    (MP_KEY_GAMEPAD+18)
167 #define MP_KEY_GAMEPAD_LEFT_STICK_LEFT    (MP_KEY_GAMEPAD+19)
168 #define MP_KEY_GAMEPAD_LEFT_STICK_RIGHT   (MP_KEY_GAMEPAD+20)
169 #define MP_KEY_GAMEPAD_RIGHT_STICK_UP     (MP_KEY_GAMEPAD+21)
170 #define MP_KEY_GAMEPAD_RIGHT_STICK_DOWN   (MP_KEY_GAMEPAD+22)
171 #define MP_KEY_GAMEPAD_RIGHT_STICK_LEFT   (MP_KEY_GAMEPAD+23)
172 #define MP_KEY_GAMEPAD_RIGHT_STICK_RIGHT  (MP_KEY_GAMEPAD+24)
173 
174 // Reserved area. Can be used for keys that have no explicit names assigned,
175 // but should be mappable by the user anyway.
176 #define MP_KEY_UNKNOWN_RESERVED_START (MP_KEY_BASE+0x10000)
177 #define MP_KEY_UNKNOWN_RESERVED_LAST (MP_KEY_BASE+0x20000-1)
178 
179 /* Special keys */
180 #define MP_KEY_INTERN (MP_KEY_BASE+0x20000)
181 #define MP_KEY_CLOSE_WIN (MP_KEY_INTERN+0)
182 // Generated by input.c (VOs use mp_input_set_mouse_pos())
183 #define MP_KEY_MOUSE_MOVE ((MP_KEY_INTERN+1)|MP_NO_REPEAT_KEY)
184 #define MP_KEY_MOUSE_LEAVE ((MP_KEY_INTERN+2)|MP_NO_REPEAT_KEY)
185 #define MP_KEY_MOUSE_ENTER ((MP_KEY_INTERN+3)|MP_NO_REPEAT_KEY)
186 
187 #define MP_KEY_IS_MOUSE_CLICK(code) \
188     (MP_KEY_IS_MOUSE_BTN_SINGLE(code) || MP_KEY_IS_MOUSE_BTN_DBL(code))
189 
190 #define MP_KEY_IS_MOUSE_MOVE(code) \
191     ((code) == MP_KEY_MOUSE_MOVE || (code) == MP_KEY_MOUSE_ENTER || \
192      (code) == MP_KEY_MOUSE_LEAVE)
193 
194 // Whether to dispatch the key binding by current mouse position.
195 #define MP_KEY_DEPENDS_ON_MOUSE_POS(code) \
196     (MP_KEY_IS_MOUSE_CLICK(code) || (code) == MP_KEY_MOUSE_MOVE)
197 
198 #define MP_KEY_IS_MOUSE(code) \
199     (MP_KEY_IS_MOUSE_CLICK(code) || MP_KEY_IS_MOUSE_MOVE(code))
200 
201 // No input source should generate this.
202 #define MP_KEY_UNMAPPED         (MP_KEY_INTERN+4)
203 #define MP_KEY_ANY_UNICODE      (MP_KEY_INTERN+5)
204 // For mp_input_put_key(): release all keys that are down.
205 #define MP_INPUT_RELEASE_ALL    (MP_KEY_INTERN+6)
206 
207 // Emit a command even on key-up (normally key-up is ignored). This means by
208 // default they binding will be triggered on key-up instead of key-down.
209 // This is a fixed part of the keycode, not a modifier than can change.
210 #define MP_KEY_EMIT_ON_UP      (1u<<22)
211 
212 // Use this when the key shouldn't be auto-repeated (like mouse buttons)
213 // Also means both key-down key-up events produce emit bound commands.
214 // This is a fixed part of the keycode, not a modifier than can change.
215 #define MP_NO_REPEAT_KEY       (1u<<23)
216 
217 /* Modifiers added to individual keys */
218 #define MP_KEY_MODIFIER_SHIFT  (1u<<24)
219 #define MP_KEY_MODIFIER_CTRL   (1u<<25)
220 #define MP_KEY_MODIFIER_ALT    (1u<<26)
221 #define MP_KEY_MODIFIER_META   (1u<<27)
222 
223 // Flag for key events. Multiple down events are idempotent. Release keys by
224 // sending the key code with KEY_STATE_UP set, or by sending
225 // MP_INPUT_RELEASE_ALL as key code.
226 #define MP_KEY_STATE_DOWN      (1u<<28)
227 
228 // Flag for key events. Releases a key previously held down with
229 // MP_KEY_STATE_DOWN. Do not send redundant UP events and do not forget to
230 // release keys at all with UP. If input is unreliable, use MP_INPUT_RELEASE_ALL
231 // or don't use MP_KEY_STATE_DOWN in the first place.
232 #define MP_KEY_STATE_UP        (1u<<29)
233 
234 #define MP_KEY_MODIFIER_MASK (MP_KEY_MODIFIER_SHIFT | MP_KEY_MODIFIER_CTRL | \
235                               MP_KEY_MODIFIER_ALT | MP_KEY_MODIFIER_META | \
236                               MP_KEY_STATE_DOWN | MP_KEY_STATE_UP)
237 
238 // Makes adjustments like turning "shift+z" into "Z"
239 int mp_normalize_keycode(int keycode);
240 
241 // Get input key from its name.
242 int mp_input_get_key_from_name(const char *name);
243 
244 // Return given key (plus modifiers) as talloc'ed name.
245 char *mp_input_get_key_name(int key);
246 
247 // Combination of multiple keys to string.
248 char *mp_input_get_key_combo_name(const int *keys, int max);
249 
250 // String containing combination of multiple string to keys.
251 int mp_input_get_keys_from_string(char *str, int max_num_keys,
252                                   int *out_num_keys, int *keys);
253 
254 struct mp_log;
255 void mp_print_key_list(struct mp_log *out);
256 char **mp_get_key_list(void);
257 
258 #endif /* MPLAYER_KEYCODES_H */
259