1 /* libfsml - a media library for video and input
2  * Copyright (C) 2011 Frode Solheim <frode-code@fengestad.no>
3  *
4  * This library is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation; either version 2.1 of the License, or (at
7  * your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
12  * License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this library; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #ifndef LIBFSML_ML_H_
20 #define LIBFSML_ML_H_
21 
22 #include <fs/malloc.h>
23 #include <fs/base.h>
24 #include <stdint.h>
25 #include <stdbool.h>
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 void fs_ml_quit();
32 void fs_ml_maybe_quit();
33 int fs_ml_is_quitting();
34 
35 extern int g_fs_ml_opengl_context_stamp;
36 
37 bool fs_ml_fullscreen(void);
38 void fs_ml_set_fullscreen(bool fullscreen);
39 void fs_ml_toggle_fullscreen(void);
40 
41 typedef void (*fs_ml_void_function)();
42 typedef int (*fs_ml_int_function)();
43 
44 typedef struct fs_ml_video_mode {
45     int width;
46     int height;
47     int fps;
48     int bpp;
49     int flags;
50 } fs_ml_video_mode;
51 
52 void fs_ml_show_cursor(int show, int immediate);
53 bool fs_ml_mouse_integration(void);
54 bool fs_ml_cursor_allowed(void);
55 int fs_ml_first_mouse_index(void);
56 
57 bool fs_ml_input_grab(void);
58 void fs_ml_set_input_grab(bool grab);
59 
60 bool fs_ml_automatic_input_grab(void);
61 void fs_ml_set_input_grab_on_activate(bool grab);
62 
63 GList *fs_ml_input_list_custom_keyboards(void);
64 
65 void fs_ml_activate_window_switcher(void);
66 
fs_ml_monotonic_time()67 static inline int64_t fs_ml_monotonic_time() {
68     return fs_get_monotonic_time();
69 }
70 
71 void fs_ml_usleep(int usec);
72 
73 #define FS_ML_VIDEO_EVENT_GRAB_INPUT 1
74 #define FS_ML_VIDEO_EVENT_UNGRAB_INPUT 2
75 #define FS_ML_VIDEO_EVENT_SHOW_CURSOR 3
76 #define FS_ML_VIDEO_EVENT_HIDE_CURSOR 4
77 
78 void fs_ml_init(void);
79 void fs_ml_init_2(void);
80 
81 void fs_ml_stop();
82 
83 int fs_ml_main_loop(void);
84 
85 int fs_ml_get_video_sync();
86 double fs_ml_get_refresh_rate(void);
87 int fs_ml_get_vblank_sync();
88 
89 int fs_ml_get_vblank_count(void);
90 int64_t fs_ml_get_vblank_time(void);
91 
92 int fs_ml_video_mode_get_current(fs_ml_video_mode *mode);
93 int fs_ml_video_create_window(const char *title);
94 
95 void fs_ml_set_quit_function(fs_ml_void_function function);
96 
97 void fs_ml_video_set_update_function(fs_ml_int_function function);
98 void fs_ml_video_set_render_function(fs_ml_void_function function);
99 void fs_ml_video_set_post_render_function(fs_ml_void_function function);
100 
101 //void fs_ml_signal_buffer_swap();
102 //void fs_ml_lock_buffer_swap();
103 //void fs_ml_unlock_buffer_swap();
104 
105 void fs_ml_frame_update_begin(int frame);
106 void fs_ml_frame_update_end(int frame);
107 
108 void fs_ml_video_screenshot(const char *path);
109 int fs_ml_video_width();
110 int fs_ml_video_height();
111 void fs_ml_video_sync_enable(int enable);
112 void fs_ml_vblank_sync_enable();
113 void fs_ml_set_video_fsaa(int fsaa);
114 
115 int fs_ml_get_fullscreen_width();
116 int fs_ml_get_fullscreen_height();
117 int fs_ml_get_windowed_width();
118 int fs_ml_get_windowed_height();
119 
120 char *fs_ml_input_unique_device_name(char *name);
121 char *fs_ml_input_fix_joystick_name(const char *name, int upper);
122 
123 //int fs_ml_main_iteration();
124 // FIXME: REMOVE?
125 //void fs_ml_swap_buffers();
126 //void fs_ml_wait_vblank();
127 void fs_ml_video_swap_buffers();
128 
129 int fs_ml_get_max_texture_size();
130 
131 typedef enum {
132        FS_ML_NOEVENT = 0,
133        FS_ML_ACTIVEEVENT,
134        FS_ML_KEYDOWN,
135        FS_ML_KEYUP,
136        FS_ML_MOUSEMOTION,
137        FS_ML_MOUSEBUTTONDOWN,
138        FS_ML_MOUSEBUTTONUP,
139        FS_ML_JOYAXISMOTION,
140        FS_ML_JOYBALLMOTION,
141        FS_ML_JOYHATMOTION,
142        FS_ML_JOYBUTTONDOWN,
143        FS_ML_JOYBUTTONUP,
144        FS_ML_QUIT,
145        FS_ML_SYSWMEVENT,
146        FS_ML_EVENT_RESERVEDA,
147        FS_ML_EVENT_RESERVEDB,
148        FS_ML_VIDEORESIZE,
149        FS_ML_VIDEOEXPOSE,
150        FS_ML_TEXTINPUT,
151        FS_ML_EVENT_RESERVED3,
152        FS_ML_EVENT_RESERVED4,
153        FS_ML_EVENT_RESERVED5,
154        FS_ML_EVENT_RESERVED6,
155        FS_ML_EVENT_RESERVED7,
156        FS_ML_USEREVENT = 24,
157        FS_ML_NUMEVENTS = 32
158 } FS_ML_EventType;
159 
160 typedef struct fs_ml_keysym {
161     uint16_t scancode;
162     uint16_t sym;
163     // uint16_t unicode;
164     uint16_t mod;
165 } fs_ml_keysym;
166 
167 typedef struct fs_ml_ActiveEvent {
168     uint8_t type;
169     uint8_t gain;
170     uint8_t state;
171 } fs_ml_ActiveEvent;
172 
173 typedef struct fs_ml_KeyboardEvent {
174     uint8_t type;
175     uint8_t which;
176     uint8_t state;
177     fs_ml_keysym keysym;
178 } fs_ml_KeyboardEvent;
179 
180 typedef struct fs_ml_MouseMotionEvent {
181     uint8_t type;
182     uint8_t device;
183     uint8_t state;
184     uint16_t x, y;
185     int16_t xrel;
186     int16_t yrel;
187 } fs_ml_MouseMotionEvent;
188 
189 typedef struct fs_ml_MouseButtonEvent {
190     uint8_t type;
191     uint8_t device;
192     uint8_t button;
193     uint8_t state;
194     uint16_t x, y;
195 } fs_ml_MouseButtonEvent;
196 
197 typedef struct fs_ml_JoyAxisEvent {
198     uint8_t type;
199     uint8_t which;
200     uint8_t axis;
201     int16_t value;
202 } fs_ml_JoyAxisEvent;
203 
204 typedef struct fs_ml_JoyBallEvent {
205     uint8_t type;
206     uint8_t which;
207     uint8_t ball;
208     int16_t xrel;
209     int16_t yrel;
210 } fs_ml_JoyBallEvent;
211 
212 typedef struct fs_ml_JoyHatEvent {
213     uint8_t type;
214     uint8_t which;
215     uint8_t hat;
216     uint8_t value;
217 } fs_ml_JoyHatEvent;
218 
219 typedef struct fs_ml_JoyButtonEvent {
220     uint8_t type;
221     uint8_t which;
222     uint8_t button;
223     uint8_t state;
224 } fs_ml_JoyButtonEvent;
225 
226 typedef struct fs_ml_ResizeEvent {
227     uint8_t type;
228     int w;
229     int h;
230 } fs_ml_ResizeEvent;
231 
232 typedef struct fs_ml_ExposeEvent {
233     uint8_t type;
234 } fs_ml_ExposeEvent;
235 
236 typedef struct fs_ml_QuitEvent {
237     uint8_t type;
238 } fs_ml_QuitEvent;
239 
240 typedef struct fs_ml_UserEvent {
241     uint8_t type;
242     int code;
243     void *data1;
244     void *data2;
245 } fs_ml_UserEvent;
246 
247 struct fs_ml_SysWMmsg;
248 typedef struct fs_ml_SysWMmsg fs_ml_SysWMmsg;
249 typedef struct fs_ml_SysWMEvent {
250     uint8_t type;
251     fs_ml_SysWMmsg *msg;
252 } fs_ml_SysWMEvent;
253 
254 
255 #define TEXTINPUTEVENT_TEXT_SIZE (32)
256 
257 typedef struct fs_ml_TextInputEvent {
258     uint8_t type;
259     char text[TEXTINPUTEVENT_TEXT_SIZE];
260 } fs_ml_TextInputEvent;
261 
262 typedef union fs_ml_event {
263     uint8_t type;
264     fs_ml_ActiveEvent active;
265     fs_ml_KeyboardEvent key;
266     fs_ml_MouseMotionEvent motion;
267     fs_ml_MouseButtonEvent button;
268     fs_ml_JoyAxisEvent jaxis;
269     fs_ml_JoyBallEvent jball;
270     fs_ml_JoyHatEvent jhat;
271     fs_ml_JoyButtonEvent jbutton;
272     fs_ml_ResizeEvent resize;
273     fs_ml_ExposeEvent expose;
274     fs_ml_QuitEvent quit;
275     fs_ml_UserEvent user;
276     fs_ml_SysWMEvent syswm;
277     fs_ml_TextInputEvent text;
278 } fs_ml_event;
279 
280 fs_ml_event* fs_ml_alloc_event();
281 void fs_ml_free_event(fs_ml_event* event);
282 int fs_ml_post_event(fs_ml_event* event);
283 
284 typedef int (*fs_ml_input_function)(fs_ml_event* event);
285 void fs_ml_set_input_function(fs_ml_input_function function);
286 
287 #define FS_ML_INPUT_DEVICES_MAX 64
288 
289 #define FS_ML_KEYBOARD 0
290 #define FS_ML_MOUSE 1
291 #define FS_ML_JOYSTICK 2
292 
293 typedef struct fs_ml_input_device {
294     int index;
295     int type;
296     char *name;
297     char *alias;
298     int buttons;
299     int axes;
300     int hats;
301     int usage;
302     int balls;
303 } fs_ml_input_device;
304 
305 int fs_ml_input_device_count();
306 int fs_ml_input_device_get(int index, fs_ml_input_device *device);
307 fs_ml_input_device *fs_ml_get_input_devices(int* count);
308 
309 #define FS_ML_HAT_CENTERED        0x00
310 #define FS_ML_HAT_UP              0x01
311 #define FS_ML_HAT_RIGHT           0x02
312 #define FS_ML_HAT_DOWN            0x04
313 #define FS_ML_HAT_LEFT            0x08
314 #define FS_ML_HAT_RIGHTUP         (FS_ML_HAT_RIGHT | FS_ML_HAT_UP)
315 #define FS_ML_HAT_RIGHTDOWN       (FS_ML_HAT_RIGHT | FS_ML_HAT_DOWN)
316 #define FS_ML_HAT_LEFTUP          (FS_ML_HAT_LEFT | FS_ML_HAT_UP)
317 #define FS_ML_HAT_LEFTDOWN        (FS_ML_HAT_LEFT | FS_ML_HAT_DOWN)
318 
319 #define FS_ML_BUTTON_LEFT      1
320 #define FS_ML_BUTTON_MIDDLE    2
321 #define FS_ML_BUTTON_RIGHT     3
322 #define FS_ML_BUTTON_WHEELUP   4
323 #define FS_ML_BUTTON_WHEELDOWN 5
324 
325 #define FS_ML_NO_ABSOLUTE_MOUSE_POS 0xffff
326 
327 typedef enum {
328     FS_ML_KEY_UNKNOWN      = 0,
329     FS_ML_KEY_FIRST        = 0,
330     FS_ML_KEY_BACKSPACE    = 8,
331     FS_ML_KEY_TAB          = 9,
332     FS_ML_KEY_CLEAR        = 12,
333     FS_ML_KEY_RETURN       = 13,
334     FS_ML_KEY_PAUSE        = 19,
335     FS_ML_KEY_ESCAPE       = 27,
336     FS_ML_KEY_SPACE        = 32,
337     FS_ML_KEY_EXCLAIM      = 33,
338     FS_ML_KEY_QUOTEDBL     = 34,
339     FS_ML_KEY_HASH         = 35,
340     FS_ML_KEY_DOLLAR       = 36,
341     FS_ML_KEY_AMPERSAND    = 38,
342     FS_ML_KEY_QUOTE        = 39,
343     FS_ML_KEY_LEFTPAREN    = 40,
344     FS_ML_KEY_RIGHTPAREN   = 41,
345     FS_ML_KEY_ASTERISK     = 42,
346     FS_ML_KEY_PLUS         = 43,
347     FS_ML_KEY_COMMA        = 44,
348     FS_ML_KEY_MINUS        = 45,
349     FS_ML_KEY_PERIOD       = 46,
350     FS_ML_KEY_SLASH        = 47,
351     FS_ML_KEY_0            = 48,
352     FS_ML_KEY_1            = 49,
353     FS_ML_KEY_2            = 50,
354     FS_ML_KEY_3            = 51,
355     FS_ML_KEY_4            = 52,
356     FS_ML_KEY_5            = 53,
357     FS_ML_KEY_6            = 54,
358     FS_ML_KEY_7            = 55,
359     FS_ML_KEY_8            = 56,
360     FS_ML_KEY_9            = 57,
361     FS_ML_KEY_COLON        = 58,
362     FS_ML_KEY_SEMICOLON    = 59,
363     FS_ML_KEY_LESS         = 60,
364     FS_ML_KEY_EQUALS       = 61,
365     FS_ML_KEY_GREATER      = 62,
366     FS_ML_KEY_QUESTION     = 63,
367     FS_ML_KEY_AT           = 64,
368 
369     FS_ML_KEY_LEFTBRACKET  = 91,
370     FS_ML_KEY_BACKSLASH    = 92,
371     FS_ML_KEY_RIGHTBRACKET = 93,
372     FS_ML_KEY_CARET        = 94,
373     FS_ML_KEY_UNDERSCORE   = 95,
374     FS_ML_KEY_BACKQUOTE    = 96,
375     FS_ML_KEY_A            = 97,
376     FS_ML_KEY_B            = 98,
377     FS_ML_KEY_C            = 99,
378     FS_ML_KEY_D            = 100,
379     FS_ML_KEY_E            = 101,
380     FS_ML_KEY_F            = 102,
381     FS_ML_KEY_G            = 103,
382     FS_ML_KEY_H            = 104,
383     FS_ML_KEY_I            = 105,
384     FS_ML_KEY_J            = 106,
385     FS_ML_KEY_K            = 107,
386     FS_ML_KEY_L            = 108,
387     FS_ML_KEY_M            = 109,
388     FS_ML_KEY_N            = 110,
389     FS_ML_KEY_O            = 111,
390     FS_ML_KEY_P            = 112,
391     FS_ML_KEY_Q            = 113,
392     FS_ML_KEY_R            = 114,
393     FS_ML_KEY_S            = 115,
394     FS_ML_KEY_T            = 116,
395     FS_ML_KEY_U            = 117,
396     FS_ML_KEY_V            = 118,
397     FS_ML_KEY_W            = 119,
398     FS_ML_KEY_X            = 120,
399     FS_ML_KEY_Y            = 121,
400     FS_ML_KEY_Z            = 122,
401     FS_ML_KEY_DELETE       = 127,
402 
403     FS_ML_KEY_WORLD_0      = 160,
404     FS_ML_KEY_WORLD_1      = 161,
405     FS_ML_KEY_WORLD_2      = 162,
406     FS_ML_KEY_WORLD_3      = 163,
407     FS_ML_KEY_WORLD_4      = 164,
408     FS_ML_KEY_WORLD_5      = 165,
409     FS_ML_KEY_WORLD_6      = 166,
410     FS_ML_KEY_WORLD_7      = 167,
411     FS_ML_KEY_WORLD_8      = 168,
412     FS_ML_KEY_WORLD_9      = 169,
413     FS_ML_KEY_WORLD_10     = 170,
414     FS_ML_KEY_WORLD_11     = 171,
415     FS_ML_KEY_WORLD_12     = 172,
416     FS_ML_KEY_WORLD_13     = 173,
417     FS_ML_KEY_WORLD_14     = 174,
418     FS_ML_KEY_WORLD_15     = 175,
419     FS_ML_KEY_WORLD_16     = 176,
420     FS_ML_KEY_WORLD_17     = 177,
421     FS_ML_KEY_WORLD_18     = 178,
422     FS_ML_KEY_WORLD_19     = 179,
423     FS_ML_KEY_WORLD_20     = 180,
424     FS_ML_KEY_WORLD_21     = 181,
425     FS_ML_KEY_WORLD_22     = 182,
426     FS_ML_KEY_WORLD_23     = 183,
427     FS_ML_KEY_WORLD_24     = 184,
428     FS_ML_KEY_WORLD_25     = 185,
429     FS_ML_KEY_WORLD_26     = 186,
430     FS_ML_KEY_WORLD_27     = 187,
431     FS_ML_KEY_WORLD_28     = 188,
432     FS_ML_KEY_WORLD_29     = 189,
433     FS_ML_KEY_WORLD_30     = 190,
434     FS_ML_KEY_WORLD_31     = 191,
435     FS_ML_KEY_WORLD_32     = 192,
436     FS_ML_KEY_WORLD_33     = 193,
437     FS_ML_KEY_WORLD_34     = 194,
438     FS_ML_KEY_WORLD_35     = 195,
439     FS_ML_KEY_WORLD_36     = 196,
440     FS_ML_KEY_WORLD_37     = 197,
441     FS_ML_KEY_WORLD_38     = 198,
442     FS_ML_KEY_WORLD_39     = 199,
443     FS_ML_KEY_WORLD_40     = 200,
444     FS_ML_KEY_WORLD_41     = 201,
445     FS_ML_KEY_WORLD_42     = 202,
446     FS_ML_KEY_WORLD_43     = 203,
447     FS_ML_KEY_WORLD_44     = 204,
448     FS_ML_KEY_WORLD_45     = 205,
449     FS_ML_KEY_WORLD_46     = 206,
450     FS_ML_KEY_WORLD_47     = 207,
451     FS_ML_KEY_WORLD_48     = 208,
452     FS_ML_KEY_WORLD_49     = 209,
453     FS_ML_KEY_WORLD_50     = 210,
454     FS_ML_KEY_WORLD_51     = 211,
455     FS_ML_KEY_WORLD_52     = 212,
456     FS_ML_KEY_WORLD_53     = 213,
457     FS_ML_KEY_WORLD_54     = 214,
458     FS_ML_KEY_WORLD_55     = 215,
459     FS_ML_KEY_WORLD_56     = 216,
460     FS_ML_KEY_WORLD_57     = 217,
461     FS_ML_KEY_WORLD_58     = 218,
462     FS_ML_KEY_WORLD_59     = 219,
463     FS_ML_KEY_WORLD_60     = 220,
464     FS_ML_KEY_WORLD_61     = 221,
465     FS_ML_KEY_WORLD_62     = 222,
466     FS_ML_KEY_WORLD_63     = 223,
467     FS_ML_KEY_WORLD_64     = 224,
468     FS_ML_KEY_WORLD_65     = 225,
469     FS_ML_KEY_WORLD_66     = 226,
470     FS_ML_KEY_WORLD_67     = 227,
471     FS_ML_KEY_WORLD_68     = 228,
472     FS_ML_KEY_WORLD_69     = 229,
473     FS_ML_KEY_WORLD_70     = 230,
474     FS_ML_KEY_WORLD_71     = 231,
475     FS_ML_KEY_WORLD_72     = 232,
476     FS_ML_KEY_WORLD_73     = 233,
477     FS_ML_KEY_WORLD_74     = 234,
478     FS_ML_KEY_WORLD_75     = 235,
479     FS_ML_KEY_WORLD_76     = 236,
480     FS_ML_KEY_WORLD_77     = 237,
481     FS_ML_KEY_WORLD_78     = 238,
482     FS_ML_KEY_WORLD_79     = 239,
483     FS_ML_KEY_WORLD_80     = 240,
484     FS_ML_KEY_WORLD_81     = 241,
485     FS_ML_KEY_WORLD_82     = 242,
486     FS_ML_KEY_WORLD_83     = 243,
487     FS_ML_KEY_WORLD_84     = 244,
488     FS_ML_KEY_WORLD_85     = 245,
489     FS_ML_KEY_WORLD_86     = 246,
490     FS_ML_KEY_WORLD_87     = 247,
491     FS_ML_KEY_WORLD_88     = 248,
492     FS_ML_KEY_WORLD_89     = 249,
493     FS_ML_KEY_WORLD_90     = 250,
494     FS_ML_KEY_WORLD_91     = 251,
495     FS_ML_KEY_WORLD_92     = 252,
496     FS_ML_KEY_WORLD_93     = 253,
497     FS_ML_KEY_WORLD_94     = 254,
498     FS_ML_KEY_WORLD_95     = 255,
499 
500     FS_ML_KEY_KP0          = 256,
501     FS_ML_KEY_KP1          = 257,
502     FS_ML_KEY_KP2          = 258,
503     FS_ML_KEY_KP3          = 259,
504     FS_ML_KEY_KP4          = 260,
505     FS_ML_KEY_KP5          = 261,
506     FS_ML_KEY_KP6          = 262,
507     FS_ML_KEY_KP7          = 263,
508     FS_ML_KEY_KP8          = 264,
509     FS_ML_KEY_KP9          = 265,
510     FS_ML_KEY_KP_PERIOD    = 266,
511     FS_ML_KEY_KP_DIVIDE    = 267,
512     FS_ML_KEY_KP_MULTIPLY  = 268,
513     FS_ML_KEY_KP_MINUS     = 269,
514     FS_ML_KEY_KP_PLUS      = 270,
515     FS_ML_KEY_KP_ENTER     = 271,
516     FS_ML_KEY_KP_EQUALS    = 272,
517 
518     FS_ML_KEY_UP           = 273,
519     FS_ML_KEY_DOWN         = 274,
520     FS_ML_KEY_RIGHT        = 275,
521     FS_ML_KEY_LEFT         = 276,
522     FS_ML_KEY_INSERT       = 277,
523     FS_ML_KEY_HOME         = 278,
524     FS_ML_KEY_END          = 279,
525     FS_ML_KEY_PAGEUP       = 280,
526     FS_ML_KEY_PAGEDOWN     = 281,
527 
528     FS_ML_KEY_F1           = 282,
529     FS_ML_KEY_F2           = 283,
530     FS_ML_KEY_F3           = 284,
531     FS_ML_KEY_F4           = 285,
532     FS_ML_KEY_F5           = 286,
533     FS_ML_KEY_F6           = 287,
534     FS_ML_KEY_F7           = 288,
535     FS_ML_KEY_F8           = 289,
536     FS_ML_KEY_F9           = 290,
537     FS_ML_KEY_F10          = 291,
538     FS_ML_KEY_F11          = 292,
539     FS_ML_KEY_F12          = 293,
540     FS_ML_KEY_F13          = 294,
541     FS_ML_KEY_F14          = 295,
542     FS_ML_KEY_F15          = 296,
543 
544     FS_ML_KEY_NUMLOCK      = 300,
545     FS_ML_KEY_CAPSLOCK     = 301,
546     FS_ML_KEY_SCROLLOCK    = 302,
547     FS_ML_KEY_RSHIFT       = 303,
548     FS_ML_KEY_LSHIFT       = 304,
549     FS_ML_KEY_RCTRL        = 305,
550     FS_ML_KEY_LCTRL        = 306,
551     FS_ML_KEY_RALT         = 307,
552     FS_ML_KEY_LALT         = 308,
553 #if 0
554     FS_ML_KEY_RMETA        = 309,
555     FS_ML_KEY_LMETA        = 310,
556 #endif
557     FS_ML_KEY_LSUPER       = 311,
558     FS_ML_KEY_RSUPER       = 312,
559     FS_ML_KEY_MODE         = 313,
560     FS_ML_KEY_COMPOSE      = 314,
561     FS_ML_KEY_HELP         = 315,
562     FS_ML_KEY_PRINT        = 316,
563     FS_ML_KEY_SYSREQ       = 317,
564     FS_ML_KEY_BREAK        = 318,
565     FS_ML_KEY_MENU         = 319,
566     FS_ML_KEY_POWER        = 320,
567     FS_ML_KEY_EURO         = 321,
568     FS_ML_KEY_UNDO         = 322,
569 
570     FS_ML_KEY_NEW_SECTION,
571     FS_ML_KEY_VOLUMEUP,
572     FS_ML_KEY_VOLUMEDOWN,
573     FS_ML_KEY_MUTE,
574     FS_ML_KEY_AUDIONEXT,
575     FS_ML_KEY_AUDIOPREV,
576     FS_ML_KEY_AUDIOSTOP,
577     FS_ML_KEY_AUDIOPLAY,
578 
579     FS_ML_KEY_APP1,
580     FS_ML_KEY_APP2,
581 
582     FS_ML_KEY_ACHOME,
583     FS_ML_KEY_MAIL,
584     FS_ML_KEY_ACSEARCH,
585     FS_ML_KEY_MEDIASELECT,
586 
587     FS_ML_KEY_LAST
588 } fs_ml_key;
589 
590 typedef enum {
591     FS_ML_KEY_MOD_NONE     = 0x0000,
592     FS_ML_KEY_MOD_LSHIFT   = 0x0001,
593     FS_ML_KEY_MOD_RSHIFT   = 0x0002,
594 
595     FS_ML_KEY_MOD_F11      = 0x0004,
596     FS_ML_KEY_MOD_F12      = 0x0010,
597     FS_ML_KEY_MOD_SPECIAL  = 0x0020,
598 
599     FS_ML_KEY_MOD_LCTRL    = 0x0040,
600     FS_ML_KEY_MOD_RCTRL    = 0x0080,
601     FS_ML_KEY_MOD_LALT     = 0x0100,
602     FS_ML_KEY_MOD_RALT     = 0x0200,
603     FS_ML_KEY_MOD_LMETA    = 0x0400,
604     FS_ML_KEY_MOD_RMETA    = 0x0800,
605     FS_ML_KEY_MOD_NUM      = 0x1000,
606     FS_ML_KEY_MOD_CAPS     = 0x2000,
607     FS_ML_KEY_MOD_MODE     = 0x4000,
608     FS_ML_KEY_MOD_RESERVED = 0x8000
609 } fs_ml_key_mod;
610 
611 #define FS_ML_KEY_MOD_CTRL   (FS_ML_KEY_MOD_LCTRL | FS_ML_KEY_MOD_RCTRL)
612 #define FS_ML_KEY_MOD_SHIFT  (FS_ML_KEY_MOD_LSHIFT | FS_ML_KEY_MOD_RSHIFT)
613 #define FS_ML_KEY_MOD_ALT    (FS_ML_KEY_MOD_LALT | FS_ML_KEY_MOD_RALT)
614 #define FS_ML_KEY_MOD_META   (FS_ML_KEY_MOD_LMETA | FS_ML_KEY_MOD_RMETA)
615 
616 #ifdef __cplusplus
617 }
618 #endif
619 
620 #endif // LIBFSML_ML_H_
621