aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Lembcke <slembcke@gmail.com>2019-06-08 05:42:02 -0500
committerAndre Weissflog <floooh@gmail.com>2019-06-08 12:42:02 +0200
commit4b17d948049e998d3d9059a201723bb08c0baf0d (patch)
tree661692782024335371f024f6f97a53118b4117ae
parent37234b8b2e6f05e8e25b2932baab92c9c46761c6 (diff)
Implement key repeat flag. (#164)
-rw-r--r--sokol_app.h48
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();