diff options
| author | Scott Lembcke <slembcke@gmail.com> | 2019-06-08 05:42:02 -0500 |
|---|---|---|
| committer | Andre Weissflog <floooh@gmail.com> | 2019-06-08 12:42:02 +0200 |
| commit | 4b17d948049e998d3d9059a201723bb08c0baf0d (patch) | |
| tree | 661692782024335371f024f6f97a53118b4117ae | |
| parent | 37234b8b2e6f05e8e25b2932baab92c9c46761c6 (diff) | |
Implement key repeat flag. (#164)
| -rw-r--r-- | sokol_app.h | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/sokol_app.h b/sokol_app.h index 3c95d926..69bb467f 100644 --- a/sokol_app.h +++ b/sokol_app.h @@ -598,6 +598,7 @@ typedef struct sapp_event { uint32_t frame_count; sapp_keycode key_code; uint32_t char_code; + bool key_repeat; uint32_t modifiers; sapp_mousebutton mouse_button; float mouse_x; @@ -1298,10 +1299,11 @@ _SOKOL_PRIVATE void _sapp_macos_mouse_event(sapp_event_type type, sapp_mousebutt } } -_SOKOL_PRIVATE void _sapp_macos_key_event(sapp_event_type type, sapp_keycode key, uint32_t mod) { +_SOKOL_PRIVATE void _sapp_macos_key_event(sapp_event_type type, sapp_keycode key, bool repeat, uint32_t mod) { if (_sapp_events_enabled()) { _sapp_init_event(type); _sapp.event.key_code = key; + _sapp.event.key_repeat = repeat; _sapp.event.modifiers = mod; _sapp_call_event(&_sapp.event); } @@ -1439,7 +1441,7 @@ _SOKOL_PRIVATE void _sapp_macos_app_event(sapp_event_type type) { - (void)keyDown:(NSEvent*)event { if (_sapp_events_enabled()) { const uint32_t mods = _sapp_macos_mod(event.modifierFlags); - _sapp_macos_key_event(SAPP_EVENTTYPE_KEY_DOWN, _sapp_translate_key(event.keyCode), mods); + _sapp_macos_key_event(SAPP_EVENTTYPE_KEY_DOWN, _sapp_translate_key(event.keyCode), event.isARepeat, mods); const NSString* chars = event.characters; const NSUInteger len = chars.length; if (len > 0) { @@ -1451,6 +1453,7 @@ _SOKOL_PRIVATE void _sapp_macos_app_event(sapp_event_type type) { continue; } _sapp.event.char_code = codepoint; + _sapp.event.key_repeat = event.isARepeat; _sapp_call_event(&_sapp.event); } } @@ -1459,6 +1462,7 @@ _SOKOL_PRIVATE void _sapp_macos_app_event(sapp_event_type type) { - (void)keyUp:(NSEvent*)event { _sapp_macos_key_event(SAPP_EVENTTYPE_KEY_UP, _sapp_translate_key(event.keyCode), + event.isARepeat, _sapp_macos_mod(event.modifierFlags)); } - (void)flagsChanged:(NSEvent*)event { @@ -1486,6 +1490,7 @@ _SOKOL_PRIVATE void _sapp_macos_app_event(sapp_event_type type) { if (key_code != SAPP_KEYCODE_INVALID) { _sapp_macos_key_event(down ? SAPP_EVENTTYPE_KEY_DOWN : SAPP_EVENTTYPE_KEY_UP, key_code, + event.isARepeat, _sapp_macos_mod(event.modifierFlags)); } } @@ -3831,20 +3836,22 @@ _SOKOL_PRIVATE void _sapp_win32_scroll_event(float x, float y) { } } -_SOKOL_PRIVATE void _sapp_win32_key_event(sapp_event_type type, int vk) { +_SOKOL_PRIVATE void _sapp_win32_key_event(sapp_event_type type, int vk, bool repeat) { if (_sapp_events_enabled() && (vk < SAPP_MAX_KEYCODES)) { _sapp_init_event(type); _sapp.event.modifiers = _sapp_win32_mods(); _sapp.event.key_code = _sapp.keycodes[vk]; + _sapp.event.key_repeat = repeat; _sapp_call_event(&_sapp.event); } } -_SOKOL_PRIVATE void _sapp_win32_char_event(uint32_t c) { +_SOKOL_PRIVATE void _sapp_win32_char_event(uint32_t c, bool repeat) { if (_sapp_events_enabled() && (c >= 32)) { _sapp_init_event(SAPP_EVENTTYPE_CHAR); _sapp.event.modifiers = _sapp_win32_mods(); _sapp.event.char_code = c; + _sapp.event.key_repeat = repeat; _sapp_call_event(&_sapp.event); } } @@ -3951,15 +3958,15 @@ _SOKOL_PRIVATE LRESULT CALLBACK _sapp_win32_wndproc(HWND hWnd, UINT uMsg, WPARAM _sapp_win32_scroll_event((float)((SHORT)HIWORD(wParam)), 0.0f); break; case WM_CHAR: - _sapp_win32_char_event((uint32_t)wParam); + _sapp_win32_char_event((uint32_t)wParam, !!(lParam&0x40000000)); break; case WM_KEYDOWN: case WM_SYSKEYDOWN: - _sapp_win32_key_event(SAPP_EVENTTYPE_KEY_DOWN, (int)(HIWORD(lParam)&0x1FF)); + _sapp_win32_key_event(SAPP_EVENTTYPE_KEY_DOWN, (int)(HIWORD(lParam)&0x1FF), !!(lParam&0x40000000)); break; case WM_KEYUP: case WM_SYSKEYUP: - _sapp_win32_key_event(SAPP_EVENTTYPE_KEY_UP, (int)(HIWORD(lParam)&0x1FF)); + _sapp_win32_key_event(SAPP_EVENTTYPE_KEY_UP, (int)(HIWORD(lParam)&0x1FF), false); break; default: break; @@ -4882,6 +4889,7 @@ void ANativeActivity_onCreate(ANativeActivity* activity, void* saved_state, size #define GL_GLEXT_PROTOTYPES #include <X11/X.h> #include <X11/Xlib.h> +#include <X11/XKBlib.h> #include <X11/Xresource.h> #include <X11/extensions/Xrandr.h> #include <X11/Xmd.h> /* CARD32 */ @@ -6348,19 +6356,21 @@ _SOKOL_PRIVATE void _sapp_x11_scroll_event(float x, float y, uint32_t mods) { } } -_SOKOL_PRIVATE void _sapp_x11_key_event(sapp_event_type type, sapp_keycode key, uint32_t mods) { +_SOKOL_PRIVATE void _sapp_x11_key_event(sapp_event_type type, sapp_keycode key, bool repeat, uint32_t mods) { if (_sapp_events_enabled()) { _sapp_init_event(type); _sapp.event.key_code = key; + _sapp.event.key_repeat = repeat; _sapp.event.modifiers = mods; _sapp_call_event(&_sapp.event); } } -_SOKOL_PRIVATE void _sapp_x11_char_event(uint32_t chr, uint32_t mods) { +_SOKOL_PRIVATE void _sapp_x11_char_event(uint32_t chr, bool repeat, uint32_t mods) { if (_sapp_events_enabled()) { _sapp_init_event(SAPP_EVENTTYPE_CHAR); _sapp.event.char_code = chr; + _sapp.event.key_repeat = repeat; _sapp.event.modifiers = mods; _sapp_call_event(&_sapp.event); } @@ -6538,29 +6548,38 @@ _SOKOL_PRIVATE int32_t _sapp_x11_keysym_to_unicode(KeySym keysym) { return -1; } +// XLib manual says keycodes are in the range [8, 255] inclusive. +// https://tronche.com/gui/x/xlib/input/keyboard-encoding.html +static bool _sapp_x11_keycodes[256]; + _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) { switch (event->type) { case KeyPress: { - const sapp_keycode key = _sapp_x11_translate_key(event->xkey.keycode); + int keycode = event->xkey.keycode; + const sapp_keycode key = _sapp_x11_translate_key(keycode); + bool repeat = _sapp_x11_keycodes[keycode & 0xFF]; + _sapp_x11_keycodes[keycode & 0xFF] = true; const uint32_t mods = _sapp_x11_mod(event->xkey.state); if (key != SAPP_KEYCODE_INVALID) { - _sapp_x11_key_event(SAPP_EVENTTYPE_KEY_DOWN, key, mods); + _sapp_x11_key_event(SAPP_EVENTTYPE_KEY_DOWN, key, repeat, mods); } KeySym keysym; XLookupString(&event->xkey, NULL, 0, &keysym, NULL); int32_t chr = _sapp_x11_keysym_to_unicode(keysym); if (chr > 0) { - _sapp_x11_char_event((uint32_t)chr, mods); + _sapp_x11_char_event((uint32_t)chr, repeat, mods); } } break; case KeyRelease: { - const sapp_keycode key = _sapp_x11_translate_key(event->xkey.keycode); + int keycode = event->xkey.keycode; + const sapp_keycode key = _sapp_x11_translate_key(keycode); + _sapp_x11_keycodes[keycode & 0xFF] = false; if (key != SAPP_KEYCODE_INVALID) { const uint32_t mods = _sapp_x11_mod(event->xkey.state); - _sapp_x11_key_event(SAPP_EVENTTYPE_KEY_UP, key, mods); + _sapp_x11_key_event(SAPP_EVENTTYPE_KEY_UP, key, false, mods); } } break; @@ -6652,6 +6671,7 @@ _SOKOL_PRIVATE void _sapp_run(const sapp_desc* desc) { } _sapp_x11_screen = DefaultScreen(_sapp_x11_display); _sapp_x11_root = DefaultRootWindow(_sapp_x11_display); + XkbSetDetectableAutoRepeat(_sapp_x11_display, true, NULL); _sapp_x11_query_system_dpi(); _sapp.dpi_scale = _sapp_x11_dpi / 96.0f; _sapp_x11_init_extensions(); |