aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-01-05 16:32:06 +0100
committerLoïc Hoguin <[email protected]>2018-01-05 16:32:06 +0100
commit30cd5551c4cdc7a2d9bbc92dfbc0313764d2bdad (patch)
tree328202812f754455471c883b7f8ab6b68f0f895f
parent435845af18dead29addb2d88e32bf919011a0a51 (diff)
downloadesdl2-30cd5551c4cdc7a2d9bbc92dfbc0313764d2bdad.tar.gz
esdl2-30cd5551c4cdc7a2d9bbc92dfbc0313764d2bdad.tar.bz2
esdl2-30cd5551c4cdc7a2d9bbc92dfbc0313764d2bdad.zip
Add the remaining keyboard functions
Also adds defines for all the keycode and scancode in SDL 2.0.7.
-rw-r--r--README.asciidoc10
-rw-r--r--c_src/esdl2.h8
-rw-r--r--c_src/sdl_keyboard.c103
-rw-r--r--c_src/sdl_rect.c57
-rw-r--r--c_src/sdl_renderer.c42
-rw-r--r--ebin/esdl2.app2
-rw-r--r--include/sdl_keycode.hrl261
-rw-r--r--include/sdl_scancode.hrl261
-rw-r--r--src/esdl2.erl20
-rw-r--r--src/sdl_keyboard.erl29
-rw-r--r--src/sdl_rect.erl21
-rw-r--r--src/sdl_renderer.erl35
12 files changed, 778 insertions, 71 deletions
diff --git a/README.asciidoc b/README.asciidoc
index b3f2f19..a52dc35 100644
--- a/README.asciidoc
+++ b/README.asciidoc
@@ -11,9 +11,12 @@ corresponding to the public headers.
* 'SDL.h'
* 'SDL_blendmode.h'
* 'SDL_cpuinfo.h'
-* 'SDL_mouse.h'
* 'SDL_filesystem.h'
+* 'SDL_keyboard.h'
+* 'SDL_keycode.h'
+* 'SDL_mouse.h'
* 'SDL_power.h'
+* 'SDL_scancode.h'
== Partially implemented
@@ -57,7 +60,7 @@ corresponding to the public headers.
** `SDL_EventState` and `SDL_GetEventState`
** `SDL_RegisterEvents`
* 'SDL_hints.h': We only have a proof of concept callback system.
-* 'SDL_keyboard.h': A few more functions are missing.
+* 'SDL_rect.h': Everything is missing except the map to point/rect conversion functions.
* 'SDL_render.h': The following elements are missing:
** `SDL_TextureAccess` enum
** `SDL_TextureModulate` enum
@@ -149,13 +152,10 @@ corresponding to the public headers.
* 'SDL_gesture.h'
* 'SDL_haptic.h'
* 'SDL_joystick.h'
-* 'SDL_keycode.h' (have a header containing the values)
* 'SDL_messagebox.h'
* 'SDL_pixels.h'
* 'SDL_platform.h'
-* 'SDL_rect.h' (though we have a rect data type in sdl_renderer)
* 'SDL_rwops.h' (unclear if we need it)
-* 'SDL_scancode.h' (have a header containing the values)
* 'SDL_shape.h'
* 'SDL_system.h'
* 'SDL_syswm.h'
diff --git a/c_src/esdl2.h b/c_src/esdl2.h
index 7fa237f..31a1fcc 100644
--- a/c_src/esdl2.h
+++ b/c_src/esdl2.h
@@ -272,12 +272,17 @@
F(get_key_from_name, 1) \
F(get_key_from_scancode, 1) \
F(get_key_name, 1) \
+ F(get_keyboard_focus, 0) \
+ F(get_keyboard_state, 0) \
F(get_mod_state, 0) \
F(get_scancode_from_key, 1) \
F(get_scancode_from_name, 1) \
F(get_scancode_name, 1) \
+ F(has_screen_keyboard_support, 0) \
+ F(is_screen_keyboard_shown, 1) \
F(is_text_input_active, 0) \
F(set_mod_state, 1) \
+ F(set_text_input_rect, 1) \
F(start_text_input, 0) \
F(stop_text_input, 0) \
/* sdl_mouse */ \
@@ -384,6 +389,9 @@ NIF_ENUM_TO_ATOM_FUNCTION_DECL(window_event_to_atom, Uint8)
NIF_LIST_TO_FLAGS_FUNCTION_DECL(keymod_list_to_flags, Uint16)
NIF_FLAGS_TO_LIST_FUNCTION_DECL(keymod_flags_to_list, Uint16)
+int map_to_point(ErlNifEnv*, ERL_NIF_TERM, SDL_Point*);
+int map_to_rect(ErlNifEnv*, ERL_NIF_TERM, SDL_Rect*);
+
ERL_NIF_TERM mouse_state_to_list(ErlNifEnv*, Uint32);
// --
diff --git a/c_src/sdl_keyboard.c b/c_src/sdl_keyboard.c
index 0e961a8..f33a69d 100644
--- a/c_src/sdl_keyboard.c
+++ b/c_src/sdl_keyboard.c
@@ -147,8 +147,51 @@ NIF_FUNCTION(get_scancode_name)
return enif_make_binary(env, &bin);
}
-// @todo get_keyboard_focus
-// @todo get_keyboard_state
+// get_keyboard_focus
+
+NIF_CALL_HANDLER(thread_get_keyboard_focus)
+{
+ SDL_Window* window;
+
+ window = SDL_GetKeyboardFocus();
+
+ if (!window)
+ return atom_undefined;
+
+ return esdl2_windows_find(env, window);
+}
+
+NIF_FUNCTION(get_keyboard_focus)
+{
+ return nif_thread_call(env, thread_get_keyboard_focus, 0);
+}
+
+// get_keyboard_state
+
+NIF_CALL_HANDLER(thread_get_keyboard_state)
+{
+ const Uint8* state;
+ int i, numkeys;
+ ERL_NIF_TERM map;
+
+ state = SDL_GetKeyboardState(&numkeys);
+
+ map = enif_make_new_map(env);
+
+ for (i = 0; i < numkeys; i++) {
+ enif_make_map_put(env, map,
+ enif_make_int(env, i),
+ state[i] ? atom_true : atom_false,
+ &map);
+ }
+
+ return map;
+}
+
+NIF_FUNCTION(get_keyboard_state)
+{
+ return nif_thread_call(env, thread_get_keyboard_state, 0);
+}
// get_mod_state
@@ -166,8 +209,40 @@ NIF_FUNCTION(get_mod_state)
return nif_thread_call(env, thread_get_mod_state, 0);
}
-// @todo has_screen_keyboard_support
-// @todo is_screen_keyboard_shown
+// has_screen_keyboard_support
+
+NIF_CALL_HANDLER(thread_has_screen_keyboard_support)
+{
+ if (SDL_HasScreenKeyboardSupport())
+ return atom_true;
+
+ return atom_false;
+}
+
+NIF_FUNCTION(has_screen_keyboard_support)
+{
+ return nif_thread_call(env, thread_has_screen_keyboard_support, 0);
+}
+
+// is_screen_keyboard_shown
+
+NIF_CALL_HANDLER(thread_is_screen_keyboard_shown)
+{
+ if (SDL_IsScreenKeyboardShown(args[0]))
+ return atom_true;
+
+ return atom_false;
+}
+
+NIF_FUNCTION(is_screen_keyboard_shown)
+{
+ void* window_res;
+
+ BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res));
+
+ return nif_thread_call(env, thread_is_screen_keyboard_shown, 1,
+ NIF_RES_GET(Window, window_res));
+}
// is_text_input_active
@@ -200,7 +275,25 @@ NIF_FUNCTION(set_mod_state)
return nif_thread_cast(env, thread_set_mod_state, 1, mod);
}
-// @todo set_text_input_rect
+// set_text_input_rect
+
+NIF_CAST_HANDLER(thread_set_text_input_rect)
+{
+ SDL_SetTextInputRect(args[0]);
+}
+
+NIF_FUNCTION(set_text_input_rect)
+{
+ SDL_Rect* rect = NULL;
+
+ rect = (SDL_Rect*)enif_alloc(sizeof(SDL_Rect));
+ if (!map_to_rect(env, argv[0], rect)) {
+ enif_free(rect);
+ return enif_make_badarg(env);
+ }
+
+ return nif_thread_cast(env, thread_set_text_input_rect, 1, rect);
+}
// start_text_input
diff --git a/c_src/sdl_rect.c b/c_src/sdl_rect.c
new file mode 100644
index 0000000..eb04d5b
--- /dev/null
+++ b/c_src/sdl_rect.c
@@ -0,0 +1,57 @@
+// Copyright (c) 2014-2018, Loïc Hoguin <[email protected]>
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+#include "esdl2.h"
+
+int map_to_point(ErlNifEnv* env, ERL_NIF_TERM map, SDL_Point* point)
+{
+ ERL_NIF_TERM x, y;
+
+ if (!enif_get_map_value(env, map, atom_x, &x))
+ return 0;
+ if (!enif_get_map_value(env, map, atom_y, &y))
+ return 0;
+
+ if (!enif_get_int(env, x, &point->x))
+ return 0;
+ if (!enif_get_int(env, y, &point->y))
+ return 0;
+
+ return 1;
+}
+
+int map_to_rect(ErlNifEnv* env, ERL_NIF_TERM map, SDL_Rect* rect)
+{
+ ERL_NIF_TERM x, y, w, h;
+
+ if (!enif_get_map_value(env, map, atom_x, &x))
+ return 0;
+ if (!enif_get_map_value(env, map, atom_y, &y))
+ return 0;
+ if (!enif_get_map_value(env, map, atom_w, &w))
+ return 0;
+ if (!enif_get_map_value(env, map, atom_h, &h))
+ return 0;
+
+ if (!enif_get_int(env, x, &rect->x))
+ return 0;
+ if (!enif_get_int(env, y, &rect->y))
+ return 0;
+ if (!enif_get_int(env, w, &rect->w))
+ return 0;
+ if (!enif_get_int(env, h, &rect->h))
+ return 0;
+
+ return 1;
+}
diff --git a/c_src/sdl_renderer.c b/c_src/sdl_renderer.c
index 17eaa07..60bfe85 100644
--- a/c_src/sdl_renderer.c
+++ b/c_src/sdl_renderer.c
@@ -37,48 +37,6 @@ static NIF_LIST_TO_FLAGS_FUNCTION(list_to_renderer_flags, Uint32, RENDERER_FLAGS
static NIF_LIST_TO_FLAGS_FUNCTION(list_to_flip_flags, SDL_RendererFlip, FLIP_FLAGS)
-static int map_to_point(ErlNifEnv* env, ERL_NIF_TERM map, SDL_Point* point)
-{
- ERL_NIF_TERM x, y;
-
- if (!enif_get_map_value(env, map, atom_x, &x))
- return 0;
- if (!enif_get_map_value(env, map, atom_y, &y))
- return 0;
-
- if (!enif_get_int(env, x, &point->x))
- return 0;
- if (!enif_get_int(env, y, &point->y))
- return 0;
-
- return 1;
-}
-
-static int map_to_rect(ErlNifEnv* env, ERL_NIF_TERM map, SDL_Rect* rect)
-{
- ERL_NIF_TERM x, y, w, h;
-
- if (!enif_get_map_value(env, map, atom_x, &x))
- return 0;
- if (!enif_get_map_value(env, map, atom_y, &y))
- return 0;
- if (!enif_get_map_value(env, map, atom_w, &w))
- return 0;
- if (!enif_get_map_value(env, map, atom_h, &h))
- return 0;
-
- if (!enif_get_int(env, x, &rect->x))
- return 0;
- if (!enif_get_int(env, y, &rect->y))
- return 0;
- if (!enif_get_int(env, w, &rect->w))
- return 0;
- if (!enif_get_int(env, h, &rect->h))
- return 0;
-
- return 1;
-}
-
// create_renderer
NIF_CALL_HANDLER(thread_create_renderer)
diff --git a/ebin/esdl2.app b/ebin/esdl2.app
index 3b48762..e4b849b 100644
--- a/ebin/esdl2.app
+++ b/ebin/esdl2.app
@@ -1,7 +1,7 @@
{application, 'esdl2', [
{description, "SDL2 Erlang NIF."},
{vsn, "0.1.0"},
- {modules, ['esdl2','esdl2_app','esdl2_callbacks','esdl2_sup','sdl','sdl_blend_mode','sdl_clipboard','sdl_cpu_info','sdl_cursor','sdl_events','sdl_filesystem','sdl_gl','sdl_hints','sdl_keyboard','sdl_keycode','sdl_mouse','sdl_power','sdl_renderer','sdl_surface','sdl_texture','sdl_version','sdl_window']},
+ {modules, ['esdl2','esdl2_app','esdl2_callbacks','esdl2_sup','sdl','sdl_blend_mode','sdl_clipboard','sdl_cpu_info','sdl_cursor','sdl_events','sdl_filesystem','sdl_gl','sdl_hints','sdl_keyboard','sdl_keycode','sdl_mouse','sdl_power','sdl_rect','sdl_renderer','sdl_surface','sdl_texture','sdl_version','sdl_window']},
{registered, [esdl2_sup]},
{applications, [kernel,stdlib]},
{mod, {esdl2_app, []}},
diff --git a/include/sdl_keycode.hrl b/include/sdl_keycode.hrl
new file mode 100644
index 0000000..f33765c
--- /dev/null
+++ b/include/sdl_keycode.hrl
@@ -0,0 +1,261 @@
+%% Copyright (c) 2018, Loïc Hoguin <[email protected]>
+%%
+%% Permission to use, copy, modify, and/or distribute this software for any
+%% purpose with or without fee is hereby granted, provided that the above
+%% copyright notice and this permission notice appear in all copies.
+%%
+%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-ifndef(__SDL_KEYCODE_HRL__).
+-define(__SDL_KEYCODE_HRL__, 1).
+
+-define(SDLK_SCANCODE_MASK, (1 bsl 30)).
+-define(SDL_SCANCODE_TO_KEYCODE(X), (X bor ?SDLK_SCANCODE_MASK)).
+
+-define(SDLK_RETURN, $\r).
+-define(SDLK_ESCAPE, $\033).
+-define(SDLK_BACKSPACE, $\b).
+-define(SDLK_TAB, $\t).
+-define(SDLK_SPACE, $ ).
+-define(SDLK_EXCLAIM, $!).
+-define(SDLK_QUOTEDBL, $").
+-define(SDLK_HASH, $#).
+-define(SDLK_PERCENT, $%).
+-define(SDLK_DOLLAR, $$).
+-define(SDLK_AMPERSAND, $&).
+-define(SDLK_QUOTE, $').
+-define(SDLK_LEFTPAREN, $().
+-define(SDLK_RIGHTPAREN, $)).
+-define(SDLK_ASTERISK, $*).
+-define(SDLK_PLUS, $+).
+-define(SDLK_COMMA, $,).
+-define(SDLK_MINUS, $-).
+-define(SDLK_PERIOD, $.).
+-define(SDLK_SLASH, $/).
+-define(SDLK_0, $0).
+-define(SDLK_1, $1).
+-define(SDLK_2, $2).
+-define(SDLK_3, $3).
+-define(SDLK_4, $4).
+-define(SDLK_5, $5).
+-define(SDLK_6, $6).
+-define(SDLK_7, $7).
+-define(SDLK_8, $8).
+-define(SDLK_9, $9).
+-define(SDLK_COLON, $:).
+-define(SDLK_SEMICOLON, $;).
+-define(SDLK_LESS, $<).
+-define(SDLK_EQUALS, $=).
+-define(SDLK_GREATER, $>).
+-define(SDLK_QUESTION, $?).
+-define(SDLK_AT, $@).
+-define(SDLK_LEFTBRACKET, $[).
+-define(SDLK_BACKSLASH, $\\).
+-define(SDLK_RIGHTBRACKET, $]).
+-define(SDLK_CARET, $^).
+-define(SDLK_UNDERSCORE, $_).
+-define(SDLK_BACKQUOTE, $`).
+-define(SDLK_a, $a).
+-define(SDLK_b, $b).
+-define(SDLK_c, $c).
+-define(SDLK_d, $d).
+-define(SDLK_e, $e).
+-define(SDLK_f, $f).
+-define(SDLK_g, $g).
+-define(SDLK_h, $h).
+-define(SDLK_i, $i).
+-define(SDLK_j, $j).
+-define(SDLK_k, $k).
+-define(SDLK_l, $l).
+-define(SDLK_m, $m).
+-define(SDLK_n, $n).
+-define(SDLK_o, $o).
+-define(SDLK_p, $p).
+-define(SDLK_q, $q).
+-define(SDLK_r, $r).
+-define(SDLK_s, $s).
+-define(SDLK_t, $t).
+-define(SDLK_u, $u).
+-define(SDLK_v, $v).
+-define(SDLK_w, $w).
+-define(SDLK_x, $x).
+-define(SDLK_y, $y).
+-define(SDLK_z, $z).
+-define(SDLK_CAPSLOCK, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_CAPSLOCK)).
+-define(SDLK_F1, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F1)).
+-define(SDLK_F2, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F2)).
+-define(SDLK_F3, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F3)).
+-define(SDLK_F4, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F4)).
+-define(SDLK_F5, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F5)).
+-define(SDLK_F6, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F6)).
+-define(SDLK_F7, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F7)).
+-define(SDLK_F8, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F8)).
+-define(SDLK_F9, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F9)).
+-define(SDLK_F10, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F10)).
+-define(SDLK_F11, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F11)).
+-define(SDLK_F12, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F12)).
+-define(SDLK_PRINTSCREEN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_PRINTSCREEN)).
+-define(SDLK_SCROLLLOCK, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_SCROLLLOCK)).
+-define(SDLK_PAUSE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_PAUSE)).
+-define(SDLK_INSERT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_INSERT)).
+-define(SDLK_HOME, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_HOME)).
+-define(SDLK_PAGEUP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_PAGEUP)).
+-define(SDLK_DELETE, $\177).
+-define(SDLK_END, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_END)).
+-define(SDLK_PAGEDOWN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_PAGEDOWN)).
+-define(SDLK_RIGHT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_RIGHT)).
+-define(SDLK_LEFT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_LEFT)).
+-define(SDLK_DOWN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_DOWN)).
+-define(SDLK_UP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_UP)).
+-define(SDLK_NUMLOCKCLEAR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_NUMLOCKCLEAR)).
+-define(SDLK_KP_DIVIDE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_DIVIDE)).
+-define(SDLK_KP_MULTIPLY, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_MULTIPLY)).
+-define(SDLK_KP_MINUS, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_MINUS)).
+-define(SDLK_KP_PLUS, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_PLUS)).
+-define(SDLK_KP_ENTER, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_ENTER)).
+-define(SDLK_KP_1, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_1)).
+-define(SDLK_KP_2, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_2)).
+-define(SDLK_KP_3, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_3)).
+-define(SDLK_KP_4, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_4)).
+-define(SDLK_KP_5, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_5)).
+-define(SDLK_KP_6, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_6)).
+-define(SDLK_KP_7, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_7)).
+-define(SDLK_KP_8, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_8)).
+-define(SDLK_KP_9, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_9)).
+-define(SDLK_KP_0, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_0)).
+-define(SDLK_KP_PERIOD, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_PERIOD)).
+-define(SDLK_APPLICATION, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_APPLICATION)).
+-define(SDLK_POWER, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_POWER)).
+-define(SDLK_KP_EQUALS, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_EQUALS)).
+-define(SDLK_F13, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F13)).
+-define(SDLK_F14, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F14)).
+-define(SDLK_F15, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F15)).
+-define(SDLK_F16, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F16)).
+-define(SDLK_F17, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F17)).
+-define(SDLK_F18, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F18)).
+-define(SDLK_F19, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F19)).
+-define(SDLK_F20, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F20)).
+-define(SDLK_F21, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F21)).
+-define(SDLK_F22, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F22)).
+-define(SDLK_F23, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F23)).
+-define(SDLK_F24, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_F24)).
+-define(SDLK_EXECUTE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_EXECUTE)).
+-define(SDLK_HELP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_HELP)).
+-define(SDLK_MENU, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_MENU)).
+-define(SDLK_SELECT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_SELECT)).
+-define(SDLK_STOP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_STOP)).
+-define(SDLK_AGAIN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AGAIN)).
+-define(SDLK_UNDO, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_UNDO)).
+-define(SDLK_CUT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_CUT)).
+-define(SDLK_COPY, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_COPY)).
+-define(SDLK_PASTE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_PASTE)).
+-define(SDLK_FIND, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_FIND)).
+-define(SDLK_MUTE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_MUTE)).
+-define(SDLK_VOLUMEUP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_VOLUMEUP)).
+-define(SDLK_VOLUMEDOWN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_VOLUMEDOWN)).
+-define(SDLK_KP_COMMA, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_COMMA)).
+-define(SDLK_KP_EQUALSAS400, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_EQUALSAS400)).
+-define(SDLK_ALTERASE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_ALTERASE)).
+-define(SDLK_SYSREQ, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_SYSREQ)).
+-define(SDLK_CANCEL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_CANCEL)).
+-define(SDLK_CLEAR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_CLEAR)).
+-define(SDLK_PRIOR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_PRIOR)).
+-define(SDLK_RETURN2, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_RETURN2)).
+-define(SDLK_SEPARATOR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_SEPARATOR)).
+-define(SDLK_OUT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_OUT)).
+-define(SDLK_OPER, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_OPER)).
+-define(SDLK_CLEARAGAIN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_CLEARAGAIN)).
+-define(SDLK_CRSEL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_CRSEL)).
+-define(SDLK_EXSEL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_EXSEL)).
+-define(SDLK_KP_00, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_00)).
+-define(SDLK_KP_000, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_000)).
+-define(SDLK_THOUSANDSSEPARATOR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_THOUSANDSSEPARATOR)).
+-define(SDLK_DECIMALSEPARATOR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_DECIMALSEPARATOR)).
+-define(SDLK_CURRENCYUNIT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_CURRENCYUNIT)).
+-define(SDLK_CURRENCYSUBUNIT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_CURRENCYSUBUNIT)).
+-define(SDLK_KP_LEFTPAREN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_LEFTPAREN)).
+-define(SDLK_KP_RIGHTPAREN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_RIGHTPAREN)).
+-define(SDLK_KP_LEFTBRACE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_LEFTBRACE)).
+-define(SDLK_KP_RIGHTBRACE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_RIGHTBRACE)).
+-define(SDLK_KP_TAB, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_TAB)).
+-define(SDLK_KP_BACKSPACE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_BACKSPACE)).
+-define(SDLK_KP_A, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_A)).
+-define(SDLK_KP_B, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_B)).
+-define(SDLK_KP_C, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_C)).
+-define(SDLK_KP_D, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_D)).
+-define(SDLK_KP_E, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_E)).
+-define(SDLK_KP_F, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_F)).
+-define(SDLK_KP_XOR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_XOR)).
+-define(SDLK_KP_POWER, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_POWER)).
+-define(SDLK_KP_PERCENT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_PERCENT)).
+-define(SDLK_KP_LESS, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_LESS)).
+-define(SDLK_KP_GREATER, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_GREATER)).
+-define(SDLK_KP_AMPERSAND, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_AMPERSAND)).
+-define(SDLK_KP_DBLAMPERSAND, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_DBLAMPERSAND)).
+-define(SDLK_KP_VERTICALBAR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_VERTICALBAR)).
+-define(SDLK_KP_DBLVERTICALBAR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_DBLVERTICALBAR)).
+-define(SDLK_KP_COLON, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_COLON)).
+-define(SDLK_KP_HASH, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_HASH)).
+-define(SDLK_KP_SPACE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_SPACE)).
+-define(SDLK_KP_AT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_AT)).
+-define(SDLK_KP_EXCLAM, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_EXCLAM)).
+-define(SDLK_KP_MEMSTORE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_MEMSTORE)).
+-define(SDLK_KP_MEMRECALL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_MEMRECALL)).
+-define(SDLK_KP_MEMCLEAR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_MEMCLEAR)).
+-define(SDLK_KP_MEMADD, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_MEMADD)).
+-define(SDLK_KP_MEMSUBTRACT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_MEMSUBTRACT)).
+-define(SDLK_KP_MEMMULTIPLY, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_MEMMULTIPLY)).
+-define(SDLK_KP_MEMDIVIDE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_MEMDIVIDE)).
+-define(SDLK_KP_PLUSMINUS, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_PLUSMINUS)).
+-define(SDLK_KP_CLEAR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_CLEAR)).
+-define(SDLK_KP_CLEARENTRY, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_CLEARENTRY)).
+-define(SDLK_KP_BINARY, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_BINARY)).
+-define(SDLK_KP_OCTAL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_OCTAL)).
+-define(SDLK_KP_DECIMAL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_DECIMAL)).
+-define(SDLK_KP_HEXADECIMAL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KP_HEXADECIMAL)).
+-define(SDLK_LCTRL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_LCTRL)).
+-define(SDLK_LSHIFT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_LSHIFT)).
+-define(SDLK_LALT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_LALT)).
+-define(SDLK_LGUI, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_LGUI)).
+-define(SDLK_RCTRL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_RCTRL)).
+-define(SDLK_RSHIFT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_RSHIFT)).
+-define(SDLK_RALT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_RALT)).
+-define(SDLK_RGUI, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_RGUI)).
+-define(SDLK_MODE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_MODE)).
+-define(SDLK_AUDIONEXT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AUDIONEXT)).
+-define(SDLK_AUDIOPREV, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AUDIOPREV)).
+-define(SDLK_AUDIOSTOP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AUDIOSTOP)).
+-define(SDLK_AUDIOPLAY, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AUDIOPLAY)).
+-define(SDLK_AUDIOMUTE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AUDIOMUTE)).
+-define(SDLK_MEDIASELECT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_MEDIASELECT)).
+-define(SDLK_WWW, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_WWW)).
+-define(SDLK_MAIL, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_MAIL)).
+-define(SDLK_CALCULATOR, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_CALCULATOR)).
+-define(SDLK_COMPUTER, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_COMPUTER)).
+-define(SDLK_AC_SEARCH, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AC_SEARCH)).
+-define(SDLK_AC_HOME, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AC_HOME)).
+-define(SDLK_AC_BACK, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AC_BACK)).
+-define(SDLK_AC_FORWARD, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AC_FORWARD)).
+-define(SDLK_AC_STOP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AC_STOP)).
+-define(SDLK_AC_REFRESH, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AC_REFRESH)).
+-define(SDLK_AC_BOOKMARKS, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AC_BOOKMARKS)).
+-define(SDLK_BRIGHTNESSDOWN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_BRIGHTNESSDOWN)).
+-define(SDLK_BRIGHTNESSUP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_BRIGHTNESSUP)).
+-define(SDLK_DISPLAYSWITCH, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_DISPLAYSWITCH)).
+-define(SDLK_KBDILLUMTOGGLE, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KBDILLUMTOGGLE)).
+-define(SDLK_KBDILLUMDOWN, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KBDILLUMDOWN)).
+-define(SDLK_KBDILLUMUP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_KBDILLUMUP)).
+-define(SDLK_EJECT, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_EJECT)).
+-define(SDLK_SLEEP, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_SLEEP)).
+-define(SDLK_APP1, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_APP1)).
+-define(SDLK_APP2, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_APP2)).
+-define(SDLK_AUDIOREWIND, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AUDIOREWIND)).
+-define(SDLK_AUDIOFASTFORWARD, ?SDL_SCANCODE_TO_KEYCODE(?SDL_SCANCODE_AUDIOFASTFORWARD)).
+
+-endif.
diff --git a/include/sdl_scancode.hrl b/include/sdl_scancode.hrl
new file mode 100644
index 0000000..54f9df6
--- /dev/null
+++ b/include/sdl_scancode.hrl
@@ -0,0 +1,261 @@
+%% Copyright (c) 2018, Loïc Hoguin <[email protected]>
+%%
+%% Permission to use, copy, modify, and/or distribute this software for any
+%% purpose with or without fee is hereby granted, provided that the above
+%% copyright notice and this permission notice appear in all copies.
+%%
+%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-ifndef(__SDL_SCANCODE_HRL__).
+-define(__SDL_SCANCODE_HRL__, 1).
+
+-define(SDL_SCANCODE_A, 4).
+-define(SDL_SCANCODE_B, 5).
+-define(SDL_SCANCODE_C, 6).
+-define(SDL_SCANCODE_D, 7).
+-define(SDL_SCANCODE_E, 8).
+-define(SDL_SCANCODE_F, 9).
+-define(SDL_SCANCODE_G, 10).
+-define(SDL_SCANCODE_H, 11).
+-define(SDL_SCANCODE_I, 12).
+-define(SDL_SCANCODE_J, 13).
+-define(SDL_SCANCODE_K, 14).
+-define(SDL_SCANCODE_L, 15).
+-define(SDL_SCANCODE_M, 16).
+-define(SDL_SCANCODE_N, 17).
+-define(SDL_SCANCODE_O, 18).
+-define(SDL_SCANCODE_P, 19).
+-define(SDL_SCANCODE_Q, 20).
+-define(SDL_SCANCODE_R, 21).
+-define(SDL_SCANCODE_S, 22).
+-define(SDL_SCANCODE_T, 23).
+-define(SDL_SCANCODE_U, 24).
+-define(SDL_SCANCODE_V, 25).
+-define(SDL_SCANCODE_W, 26).
+-define(SDL_SCANCODE_X, 27).
+-define(SDL_SCANCODE_Y, 28).
+-define(SDL_SCANCODE_Z, 29).
+-define(SDL_SCANCODE_1, 30).
+-define(SDL_SCANCODE_2, 31).
+-define(SDL_SCANCODE_3, 32).
+-define(SDL_SCANCODE_4, 33).
+-define(SDL_SCANCODE_5, 34).
+-define(SDL_SCANCODE_6, 35).
+-define(SDL_SCANCODE_7, 36).
+-define(SDL_SCANCODE_8, 37).
+-define(SDL_SCANCODE_9, 38).
+-define(SDL_SCANCODE_0, 39).
+-define(SDL_SCANCODE_RETURN, 40).
+-define(SDL_SCANCODE_ESCAPE, 41).
+-define(SDL_SCANCODE_BACKSPACE, 42).
+-define(SDL_SCANCODE_TAB, 43).
+-define(SDL_SCANCODE_SPACE, 44).
+-define(SDL_SCANCODE_MINUS, 45).
+-define(SDL_SCANCODE_EQUALS, 46).
+-define(SDL_SCANCODE_LEFTBRACKET, 47).
+-define(SDL_SCANCODE_RIGHTBRACKET, 48).
+-define(SDL_SCANCODE_BACKSLASH, 49).
+-define(SDL_SCANCODE_NONUSHASH, 50).
+-define(SDL_SCANCODE_SEMICOLON, 51).
+-define(SDL_SCANCODE_APOSTROPHE, 52).
+-define(SDL_SCANCODE_GRAVE, 53).
+-define(SDL_SCANCODE_COMMA, 54).
+-define(SDL_SCANCODE_PERIOD, 55).
+-define(SDL_SCANCODE_SLASH, 56).
+-define(SDL_SCANCODE_CAPSLOCK, 57).
+-define(SDL_SCANCODE_F1, 58).
+-define(SDL_SCANCODE_F2, 59).
+-define(SDL_SCANCODE_F3, 60).
+-define(SDL_SCANCODE_F4, 61).
+-define(SDL_SCANCODE_F5, 62).
+-define(SDL_SCANCODE_F6, 63).
+-define(SDL_SCANCODE_F7, 64).
+-define(SDL_SCANCODE_F8, 65).
+-define(SDL_SCANCODE_F9, 66).
+-define(SDL_SCANCODE_F10, 67).
+-define(SDL_SCANCODE_F11, 68).
+-define(SDL_SCANCODE_F12, 69).
+-define(SDL_SCANCODE_PRINTSCREEN, 70).
+-define(SDL_SCANCODE_SCROLLLOCK, 71).
+-define(SDL_SCANCODE_PAUSE, 72).
+-define(SDL_SCANCODE_INSERT, 73).
+-define(SDL_SCANCODE_HOME, 74).
+-define(SDL_SCANCODE_PAGEUP, 75).
+-define(SDL_SCANCODE_DELETE, 76).
+-define(SDL_SCANCODE_END, 77).
+-define(SDL_SCANCODE_PAGEDOWN, 78).
+-define(SDL_SCANCODE_RIGHT, 79).
+-define(SDL_SCANCODE_LEFT, 80).
+-define(SDL_SCANCODE_DOWN, 81).
+-define(SDL_SCANCODE_UP, 82).
+-define(SDL_SCANCODE_NUMLOCKCLEAR, 83).
+-define(SDL_SCANCODE_KP_DIVIDE, 84).
+-define(SDL_SCANCODE_KP_MULTIPLY, 85).
+-define(SDL_SCANCODE_KP_MINUS, 86).
+-define(SDL_SCANCODE_KP_PLUS, 87).
+-define(SDL_SCANCODE_KP_ENTER, 88).
+-define(SDL_SCANCODE_KP_1, 89).
+-define(SDL_SCANCODE_KP_2, 90).
+-define(SDL_SCANCODE_KP_3, 91).
+-define(SDL_SCANCODE_KP_4, 92).
+-define(SDL_SCANCODE_KP_5, 93).
+-define(SDL_SCANCODE_KP_6, 94).
+-define(SDL_SCANCODE_KP_7, 95).
+-define(SDL_SCANCODE_KP_8, 96).
+-define(SDL_SCANCODE_KP_9, 97).
+-define(SDL_SCANCODE_KP_0, 98).
+-define(SDL_SCANCODE_KP_PERIOD, 99).
+-define(SDL_SCANCODE_NONUSBACKSLASH, 100).
+-define(SDL_SCANCODE_APPLICATION, 101).
+-define(SDL_SCANCODE_POWER, 102).
+-define(SDL_SCANCODE_KP_EQUALS, 103).
+-define(SDL_SCANCODE_F13, 104).
+-define(SDL_SCANCODE_F14, 105).
+-define(SDL_SCANCODE_F15, 106).
+-define(SDL_SCANCODE_F16, 107).
+-define(SDL_SCANCODE_F17, 108).
+-define(SDL_SCANCODE_F18, 109).
+-define(SDL_SCANCODE_F19, 110).
+-define(SDL_SCANCODE_F20, 111).
+-define(SDL_SCANCODE_F21, 112).
+-define(SDL_SCANCODE_F22, 113).
+-define(SDL_SCANCODE_F23, 114).
+-define(SDL_SCANCODE_F24, 115).
+-define(SDL_SCANCODE_EXECUTE, 116).
+-define(SDL_SCANCODE_HELP, 117).
+-define(SDL_SCANCODE_MENU, 118).
+-define(SDL_SCANCODE_SELECT, 119).
+-define(SDL_SCANCODE_STOP, 120).
+-define(SDL_SCANCODE_AGAIN, 121).
+-define(SDL_SCANCODE_UNDO, 122).
+-define(SDL_SCANCODE_CUT, 123).
+-define(SDL_SCANCODE_COPY, 124).
+-define(SDL_SCANCODE_PASTE, 125).
+-define(SDL_SCANCODE_FIND, 126).
+-define(SDL_SCANCODE_MUTE, 127).
+-define(SDL_SCANCODE_VOLUMEUP, 128).
+-define(SDL_SCANCODE_VOLUMEDOWN, 129).
+-define(SDL_SCANCODE_KP_COMMA, 133).
+-define(SDL_SCANCODE_KP_EQUALSAS400, 134).
+-define(SDL_SCANCODE_INTERNATIONAL1, 135).
+-define(SDL_SCANCODE_INTERNATIONAL2, 136).
+-define(SDL_SCANCODE_INTERNATIONAL3, 137).
+-define(SDL_SCANCODE_INTERNATIONAL4, 138).
+-define(SDL_SCANCODE_INTERNATIONAL5, 139).
+-define(SDL_SCANCODE_INTERNATIONAL6, 140).
+-define(SDL_SCANCODE_INTERNATIONAL7, 141).
+-define(SDL_SCANCODE_INTERNATIONAL8, 142).
+-define(SDL_SCANCODE_INTERNATIONAL9, 143).
+-define(SDL_SCANCODE_LANG1, 144).
+-define(SDL_SCANCODE_LANG2, 145).
+-define(SDL_SCANCODE_LANG3, 146).
+-define(SDL_SCANCODE_LANG4, 147).
+-define(SDL_SCANCODE_LANG5, 148).
+-define(SDL_SCANCODE_LANG6, 149).
+-define(SDL_SCANCODE_LANG7, 150).
+-define(SDL_SCANCODE_LANG8, 151).
+-define(SDL_SCANCODE_LANG9, 152).
+-define(SDL_SCANCODE_ALTERASE, 153).
+-define(SDL_SCANCODE_SYSREQ, 154).
+-define(SDL_SCANCODE_CANCEL, 155).
+-define(SDL_SCANCODE_CLEAR, 156).
+-define(SDL_SCANCODE_PRIOR, 157).
+-define(SDL_SCANCODE_RETURN2, 158).
+-define(SDL_SCANCODE_SEPARATOR, 159).
+-define(SDL_SCANCODE_OUT, 160).
+-define(SDL_SCANCODE_OPER, 161).
+-define(SDL_SCANCODE_CLEARAGAIN, 162).
+-define(SDL_SCANCODE_CRSEL, 163).
+-define(SDL_SCANCODE_EXSEL, 164).
+-define(SDL_SCANCODE_KP_00, 176).
+-define(SDL_SCANCODE_KP_000, 177).
+-define(SDL_SCANCODE_THOUSANDSSEPARATOR, 178).
+-define(SDL_SCANCODE_DECIMALSEPARATOR, 179).
+-define(SDL_SCANCODE_CURRENCYUNIT, 180).
+-define(SDL_SCANCODE_CURRENCYSUBUNIT, 181).
+-define(SDL_SCANCODE_KP_LEFTPAREN, 182).
+-define(SDL_SCANCODE_KP_RIGHTPAREN, 183).
+-define(SDL_SCANCODE_KP_LEFTBRACE, 184).
+-define(SDL_SCANCODE_KP_RIGHTBRACE, 185).
+-define(SDL_SCANCODE_KP_TAB, 186).
+-define(SDL_SCANCODE_KP_BACKSPACE, 187).
+-define(SDL_SCANCODE_KP_A, 188).
+-define(SDL_SCANCODE_KP_B, 189).
+-define(SDL_SCANCODE_KP_C, 190).
+-define(SDL_SCANCODE_KP_D, 191).
+-define(SDL_SCANCODE_KP_E, 192).
+-define(SDL_SCANCODE_KP_F, 193).
+-define(SDL_SCANCODE_KP_XOR, 194).
+-define(SDL_SCANCODE_KP_POWER, 195).
+-define(SDL_SCANCODE_KP_PERCENT, 196).
+-define(SDL_SCANCODE_KP_LESS, 197).
+-define(SDL_SCANCODE_KP_GREATER, 198).
+-define(SDL_SCANCODE_KP_AMPERSAND, 199).
+-define(SDL_SCANCODE_KP_DBLAMPERSAND, 200).
+-define(SDL_SCANCODE_KP_VERTICALBAR, 201).
+-define(SDL_SCANCODE_KP_DBLVERTICALBAR, 202).
+-define(SDL_SCANCODE_KP_COLON, 203).
+-define(SDL_SCANCODE_KP_HASH, 204).
+-define(SDL_SCANCODE_KP_SPACE, 205).
+-define(SDL_SCANCODE_KP_AT, 206).
+-define(SDL_SCANCODE_KP_EXCLAM, 207).
+-define(SDL_SCANCODE_KP_MEMSTORE, 208).
+-define(SDL_SCANCODE_KP_MEMRECALL, 209).
+-define(SDL_SCANCODE_KP_MEMCLEAR, 210).
+-define(SDL_SCANCODE_KP_MEMADD, 211).
+-define(SDL_SCANCODE_KP_MEMSUBTRACT, 212).
+-define(SDL_SCANCODE_KP_MEMMULTIPLY, 213).
+-define(SDL_SCANCODE_KP_MEMDIVIDE, 214).
+-define(SDL_SCANCODE_KP_PLUSMINUS, 215).
+-define(SDL_SCANCODE_KP_CLEAR, 216).
+-define(SDL_SCANCODE_KP_CLEARENTRY, 217).
+-define(SDL_SCANCODE_KP_BINARY, 218).
+-define(SDL_SCANCODE_KP_OCTAL, 219).
+-define(SDL_SCANCODE_KP_DECIMAL, 220).
+-define(SDL_SCANCODE_KP_HEXADECIMAL, 221).
+-define(SDL_SCANCODE_LCTRL, 224).
+-define(SDL_SCANCODE_LSHIFT, 225).
+-define(SDL_SCANCODE_LALT, 226).
+-define(SDL_SCANCODE_LGUI, 227).
+-define(SDL_SCANCODE_RCTRL, 228).
+-define(SDL_SCANCODE_RSHIFT, 229).
+-define(SDL_SCANCODE_RALT, 230).
+-define(SDL_SCANCODE_RGUI, 231).
+-define(SDL_SCANCODE_MODE, 257).
+-define(SDL_SCANCODE_AUDIONEXT, 258).
+-define(SDL_SCANCODE_AUDIOPREV, 259).
+-define(SDL_SCANCODE_AUDIOSTOP, 260).
+-define(SDL_SCANCODE_AUDIOPLAY, 261).
+-define(SDL_SCANCODE_AUDIOMUTE, 262).
+-define(SDL_SCANCODE_MEDIASELECT, 263).
+-define(SDL_SCANCODE_WWW, 264).
+-define(SDL_SCANCODE_MAIL, 265).
+-define(SDL_SCANCODE_CALCULATOR, 266).
+-define(SDL_SCANCODE_COMPUTER, 267).
+-define(SDL_SCANCODE_AC_SEARCH, 268).
+-define(SDL_SCANCODE_AC_HOME, 269).
+-define(SDL_SCANCODE_AC_BACK, 270).
+-define(SDL_SCANCODE_AC_FORWARD, 271).
+-define(SDL_SCANCODE_AC_STOP, 272).
+-define(SDL_SCANCODE_AC_REFRESH, 273).
+-define(SDL_SCANCODE_AC_BOOKMARKS, 274).
+-define(SDL_SCANCODE_BRIGHTNESSDOWN, 275).
+-define(SDL_SCANCODE_BRIGHTNESSUP, 276).
+-define(SDL_SCANCODE_DISPLAYSWITCH, 277).
+-define(SDL_SCANCODE_KBDILLUMTOGGLE, 278).
+-define(SDL_SCANCODE_KBDILLUMDOWN, 279).
+-define(SDL_SCANCODE_KBDILLUMUP, 280).
+-define(SDL_SCANCODE_EJECT, 281).
+-define(SDL_SCANCODE_SLEEP, 282).
+-define(SDL_SCANCODE_APP1, 283).
+-define(SDL_SCANCODE_APP2, 284).
+-define(SDL_SCANCODE_AUDIOREWIND, 285).
+-define(SDL_SCANCODE_AUDIOFASTFORWARD, 286).
+
+-endif.
diff --git a/src/esdl2.erl b/src/esdl2.erl
index a8a1f61..0a76f25 100644
--- a/src/esdl2.erl
+++ b/src/esdl2.erl
@@ -83,12 +83,17 @@
-export([get_key_from_name/1]).
-export([get_key_from_scancode/1]).
-export([get_key_name/1]).
+-export([get_keyboard_focus/0]).
+-export([get_keyboard_state/0]).
-export([get_mod_state/0]).
-export([get_scancode_from_key/1]).
-export([get_scancode_from_name/1]).
-export([get_scancode_name/1]).
+-export([has_screen_keyboard_support/0]).
+-export([is_screen_keyboard_shown/1]).
-export([is_text_input_active/0]).
-export([set_mod_state/1]).
+-export([set_text_input_rect/1]).
-export([start_text_input/0]).
-export([stop_text_input/0]).
@@ -360,6 +365,12 @@ get_key_from_scancode(_) ->
get_key_name(_) ->
erlang:nif_error({not_loaded, ?MODULE}).
+get_keyboard_focus() ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
+get_keyboard_state() ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
get_mod_state() ->
erlang:nif_error({not_loaded, ?MODULE}).
@@ -372,12 +383,21 @@ get_scancode_from_name(_) ->
get_scancode_name(_) ->
erlang:nif_error({not_loaded, ?MODULE}).
+has_screen_keyboard_support() ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
+is_screen_keyboard_shown(_) ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
is_text_input_active() ->
erlang:nif_error({not_loaded, ?MODULE}).
set_mod_state(_) ->
erlang:nif_error({not_loaded, ?MODULE}).
+set_text_input_rect(_) ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
start_text_input() ->
erlang:nif_error({not_loaded, ?MODULE}).
diff --git a/src/sdl_keyboard.erl b/src/sdl_keyboard.erl
index 325c727..1e0b68c 100644
--- a/src/sdl_keyboard.erl
+++ b/src/sdl_keyboard.erl
@@ -14,6 +14,7 @@
-module(sdl_keyboard).
+-export([get_focused_window/0]).
-export([get_key_from_name/1]).
-export([get_key_from_scancode/1]).
-export([get_key_name/1]).
@@ -21,11 +22,20 @@
-export([get_scancode_from_key/1]).
-export([get_scancode_from_name/1]).
-export([get_scancode_name/1]).
+-export([get_state/0]).
+-export([has_screen_keyboard_support/0]).
+-export([is_screen_keyboard_shown/1]).
-export([is_text_input_active/0]).
-export([set_mod_state/1]).
+-export([set_text_input_rect/1]).
-export([start_text_input/0]).
-export([stop_text_input/0]).
+-spec get_focused_window() -> sdl_window:window() | undefined.
+get_focused_window() ->
+ esdl2:get_keyboard_focus(),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.
+
-spec get_key_from_name(binary()) -> non_neg_integer() | undefined.
get_key_from_name(Name) ->
esdl2:get_key_from_name(Name).
@@ -56,6 +66,21 @@ get_scancode_from_name(Name) ->
get_scancode_name(Scancode) ->
esdl2:get_scancode_name(Scancode).
+-spec get_state() -> #{non_neg_integer() => boolean()}.
+get_state() ->
+ esdl2:get_keyboard_state(),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.
+
+-spec has_screen_keyboard_support() -> boolean().
+has_screen_keyboard_support() ->
+ esdl2:has_screen_keyboard_support(),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.
+
+-spec is_screen_keyboard_shown(sdl_window:window()) -> boolean().
+is_screen_keyboard_shown(Window) ->
+ esdl2:is_screen_keyboard_shown(Window),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.
+
-spec is_text_input_active() -> boolean().
is_text_input_active() ->
esdl2:is_text_input_active(),
@@ -65,6 +90,10 @@ is_text_input_active() ->
set_mod_state(Mod) ->
esdl2:set_mod_state(Mod).
+-spec set_text_input_rect(sdl_rect:rect()) -> ok.
+set_text_input_rect(Rect) ->
+ esdl2:set_text_input_rect(Rect).
+
-spec start_text_input() -> ok.
start_text_input() ->
esdl2:start_text_input().
diff --git a/src/sdl_rect.erl b/src/sdl_rect.erl
new file mode 100644
index 0000000..b747d64
--- /dev/null
+++ b/src/sdl_rect.erl
@@ -0,0 +1,21 @@
+%% Copyright (c) 2014-2018, Loïc Hoguin <[email protected]>
+%%
+%% Permission to use, copy, modify, and/or distribute this software for any
+%% purpose with or without fee is hereby granted, provided that the above
+%% copyright notice and this permission notice appear in all copies.
+%%
+%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-module(sdl_rect).
+
+-type point() :: #{x=>integer(), y=>integer()}.
+-export_type([point/0]).
+
+-type rect() :: #{x=>integer(), y=>integer(), w=>integer(), h=>integer()}.
+-export_type([rect/0]).
diff --git a/src/sdl_renderer.erl b/src/sdl_renderer.erl
index f596acd..c46df8a 100644
--- a/src/sdl_renderer.erl
+++ b/src/sdl_renderer.erl
@@ -56,9 +56,6 @@
-type renderer_flag() :: software | accelerated | present_vsync | target_texture.
-export_type([renderer_flag/0]).
--type point() :: #{x=>integer(), y=>integer()}.
--type rect() :: #{x=>integer(), y=>integer(), w=>integer(), h=>integer()}.
-
-spec clear(renderer()) -> ok | sdl:error().
clear(Renderer) ->
esdl2:render_clear(Renderer),
@@ -69,14 +66,16 @@ copy(Renderer, Texture) ->
esdl2:render_copy(Renderer, Texture, undefined, undefined),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec copy(renderer(), sdl_texture:texture(), undefined | rect(), undefined | rect())
+-spec copy(renderer(), sdl_texture:texture(),
+ undefined | sdl_rect:rect(), undefined | sdl_rect:rect())
-> ok | sdl:error().
copy(Renderer, Texture, SrcRect, DstRect) ->
esdl2:render_copy(Renderer, Texture, SrcRect, DstRect),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec copy(renderer(), sdl_texture:texture(), undefined | rect(), undefined | rect(),
- float(), undefined | point(), none | horizontal | vertical)
+-spec copy(renderer(), sdl_texture:texture(),
+ undefined | sdl_rect:rect(), undefined | sdl_rect:rect(),
+ float(), undefined | sdl_rect:point(), none | horizontal | vertical)
-> ok | sdl:error().
copy(Renderer, Texture, SrcRect, DstRect, Angle, CenterPoint, FlipFlags) ->
esdl2:render_copy_ex(Renderer, Texture, SrcRect, DstRect, Angle, CenterPoint, FlipFlags),
@@ -93,7 +92,7 @@ create(Window, Index, Flags) ->
esdl2:create_renderer(Window, Index, Flags),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec draw_line(renderer(), point(), point()) -> ok | sdl:error().
+-spec draw_line(renderer(), sdl_rect:point(), sdl_rect:point()) -> ok | sdl:error().
draw_line(Renderer, #{x:=X1, y:=Y1}, #{x:=X2, y:=Y2}) ->
draw_line(Renderer, X1, Y1, X2, Y2).
@@ -102,12 +101,12 @@ draw_line(Renderer, X1, Y1, X2, Y2) ->
esdl2:render_draw_line(Renderer, X1, Y1, X2, Y2),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec draw_lines(renderer(), [point()]) -> ok | sdl:error().
+-spec draw_lines(renderer(), [sdl_rect:point()]) -> ok | sdl:error().
draw_lines(Renderer, Points) ->
esdl2:render_draw_lines(Renderer, Points),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec draw_point(renderer(), point()) -> ok | sdl:error().
+-spec draw_point(renderer(), sdl_rect:point()) -> ok | sdl:error().
draw_point(Renderer, #{x:=X, y:=Y}) ->
draw_point(Renderer, X, Y).
@@ -116,12 +115,12 @@ draw_point(Renderer, X, Y) ->
esdl2:render_draw_point(Renderer, X, Y),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec draw_points(renderer(), [point()]) -> ok | sdl:error().
+-spec draw_points(renderer(), [sdl_rect:point()]) -> ok | sdl:error().
draw_points(Renderer, Points) ->
esdl2:render_draw_points(Renderer, Points),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec draw_rect(renderer(), rect()) -> ok | sdl:error().
+-spec draw_rect(renderer(), sdl_rect:rect()) -> ok | sdl:error().
draw_rect(Renderer, #{x:=X, y:=Y, w:=W, h:=H}) ->
draw_rect(Renderer, X, Y, W, H).
@@ -130,12 +129,12 @@ draw_rect(Renderer, X, Y, W, H) ->
esdl2:render_draw_rect(Renderer, X, Y, W, H),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec draw_rects(renderer(), [rect()]) -> ok | sdl:error().
+-spec draw_rects(renderer(), [sdl_rect:rect()]) -> ok | sdl:error().
draw_rects(Renderer, Rects) ->
esdl2:render_draw_rects(Renderer, Rects),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec fill_rect(renderer(), rect()) -> ok | sdl:error().
+-spec fill_rect(renderer(), sdl_rect:rect()) -> ok | sdl:error().
fill_rect(Renderer, #{x:=X, y:=Y, w:=W, h:=H}) ->
fill_rect(Renderer, X, Y, W, H).
@@ -144,12 +143,12 @@ fill_rect(Renderer, X, Y, W, H) ->
esdl2:render_fill_rect(Renderer, X, Y, W, H),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec fill_rects(renderer(), [rect()]) -> ok | sdl:error().
+-spec fill_rects(renderer(), [sdl_rect:rect()]) -> ok | sdl:error().
fill_rects(Renderer, Rects) ->
esdl2:render_fill_rects(Renderer, Rects),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec get_clip_rect(renderer()) -> rect().
+-spec get_clip_rect(renderer()) -> sdl_rect:rect().
get_clip_rect(Renderer) ->
esdl2:render_get_clip_rect(Renderer),
receive {'_nif_thread_ret_', Ret} -> Ret end.
@@ -188,7 +187,7 @@ get_scale(Renderer) ->
esdl2:render_get_scale(Renderer),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec get_viewport(renderer()) -> rect().
+-spec get_viewport(renderer()) -> sdl_rect:rect().
get_viewport(Renderer) ->
esdl2:render_get_viewport(Renderer),
receive {'_nif_thread_ret_', Ret} -> Ret end.
@@ -202,7 +201,7 @@ is_target_supported(Renderer) ->
present(Renderer) ->
esdl2:render_present(Renderer).
--spec set_clip_rect(renderer(), rect()) -> ok | sdl:error().
+-spec set_clip_rect(renderer(), sdl_rect:rect()) -> ok | sdl:error().
set_clip_rect(Renderer, #{x:=X, y:=Y, w:=W, h:=H}) ->
set_clip_rect(Renderer, X, Y, W, H).
@@ -231,7 +230,7 @@ set_scale(Renderer, ScaleX, ScaleY) ->
esdl2:render_set_scale(Renderer, ScaleX, ScaleY),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec set_viewport(renderer(), rect()) -> ok | sdl:error().
+-spec set_viewport(renderer(), sdl_rect:rect()) -> ok | sdl:error().
set_viewport(Renderer, #{x:=X, y:=Y, w:=W, h:=H}) ->
set_viewport(Renderer, X, Y, W, H).