summaryrefslogtreecommitdiff
path: root/src/ctrl/include
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2025-03-26 17:44:31 +0000
committeronelin <oscar@nelin.dk>2025-03-26 18:04:48 +0000
commit3d3400b495067392fa7675dc326f48dcebeb12f8 (patch)
tree554c21de735405b332b663a9cf52c2ecb5bb9d6a /src/ctrl/include
parent424b2e726933a0ac568034453448899b3368b1d4 (diff)
Use keycodes instead of scancodes
Diffstat (limited to 'src/ctrl/include')
-rw-r--r--src/ctrl/include/engine/ctrl/input.h28
-rw-r--r--src/ctrl/include/engine/ctrl/keycodes.h93
-rw-r--r--src/ctrl/include/engine/ctrl/scancodes.h110
3 files changed, 163 insertions, 68 deletions
diff --git a/src/ctrl/include/engine/ctrl/input.h b/src/ctrl/include/engine/ctrl/input.h
index c8dc56b..8ed77b4 100644
--- a/src/ctrl/include/engine/ctrl/input.h
+++ b/src/ctrl/include/engine/ctrl/input.h
@@ -6,10 +6,12 @@ extern "C" {
#endif
#include <engine/core/types.h>
-#include <engine/ctrl/scancodes.h>
+//#include <engine/ctrl/scancodes.h>
+#include <engine/ctrl/keycodes.h>
typedef void input_callback_t(void*);
typedef i32 scancode_t;
+typedef i32 keycode_t;
typedef enum InputType {
InputType_error = 0,
@@ -40,22 +42,22 @@ typedef struct binding_t {
action_t action;
// Change type depending on input handling back-end. like u16 for GLFW_KEY
- scancode_t scancode;
- scancode_t scancode_alt;
+ keycode_t keycode;
+ keycode_t keycode_alt;
u64 since_last_activation;
} binding_t;
typedef struct i_ctx {
binding_t* bindings;
- isize len;
+ usize len;
} i_ctx;
void i_ctx_t_free(i_ctx* c);
/* Executes all callbacks that has been pushed onto the callstack and resets the
* callstack */
void i_flush_bindings(u64 dt, usize numcalls, input_callback_t* c[], void* state_mem);
-action_t i_get_action(const i_ctx* restrict ctx, u64 time, scancode_t scancode);
+action_t i_get_action(const i_ctx* restrict ctx, u64 time, keycode_t keycode);
void key_callback(void* window, int key, int scancode, int action, int mods);
@@ -63,13 +65,13 @@ void i_ctx_push(i_ctx* ctx);
void i_ctx_pop(void);
void i_ctx_reset(void);
-/* Finds and updates the scancode of a binding with the given action in ctx */
-void i_bind_ctx(i_ctx* c, scancode_t s, action_t* a);
-void i_bind_ctx_alt(i_ctx* c, scancode_t s, action_t* a);
+/* Finds and updates the keycode of a binding with the given action in ctx */
+void i_bind_ctx(i_ctx* c, keycode_t s, action_t* a);
+void i_bind_ctx_alt(i_ctx* c, keycode_t s, action_t* a);
-/* Update the scancode of a binding */
-void i_bind(binding_t* b, scancode_t s);
-void i_bind_alt(binding_t* b, scancode_t s);
+/* Update the keycode of a binding */
+void i_bind(binding_t* b, keycode_t s);
+void i_bind_alt(binding_t* b, keycode_t s);
#define BindAction(key, altkey, f_action) \
(binding_t) { \
@@ -79,7 +81,7 @@ void i_bind_alt(binding_t* b, scancode_t s);
.callback = (input_callback_t*)&f_action, \
.callback_str = strdup(#f_action), \
}}, \
- .scancode = key, .scancode_alt = altkey, .since_last_activation = 0 \
+ .keycode = key, .keycode_alt = altkey, .since_last_activation = 0 \
}
#define BindState(key, altkey, f_activate, f_deactivate) \
@@ -93,7 +95,7 @@ void i_bind_alt(binding_t* b, scancode_t s);
.activate_str = strdup(#f_activate), \
.deactivate_str = strdup(#f_deactivate), \
}}, \
- .scancode = key, .scancode_alt = altkey, .since_last_activation = 0 \
+ .keycode = key, .keycode_alt = altkey, .since_last_activation = 0 \
}
#ifdef __cplusplus
diff --git a/src/ctrl/include/engine/ctrl/keycodes.h b/src/ctrl/include/engine/ctrl/keycodes.h
new file mode 100644
index 0000000..4fff38e
--- /dev/null
+++ b/src/ctrl/include/engine/ctrl/keycodes.h
@@ -0,0 +1,93 @@
+#ifndef ENGINE_CTRL_SCANCODES_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// We want to reserve the following bytes marked with X for MODS,
+// one bit per MODIFIER (shift, control, alt, super):
+// XXXX 0000 0000 0000 0000 0000 0000 0000
+//
+// We want to reserve the following bytes marked with X for ACTIONS
+// enumerate by action type, pressed, released, repeat
+// 0000 0000 XXXX 0000 0000 0000 0000 0000
+//
+// We want to reserve the following bytes marked with X for the KEYCODE
+// 0000 0000 0000 0000 XXXX XXXX XXXX XXXX
+#define KEY_MOD(x) 1 << (32-4 + x)
+#define ACTION(x) (1 << (32-8)) + x
+
+typedef enum {
+ KEY_SPACE = ' ',
+ KEY_APOSTROPHE = '\'',
+ KEY_COMMA = ',',
+ KEY_MINUS = '-',
+ KEY_PERIOD = '.',
+ KEY_SLASH = '/',
+
+ KEY_0 = '0',
+ KEY_1 = '1',
+ KEY_2 = '2',
+ KEY_3 = '3',
+ KEY_4 = '4',
+ KEY_5 = '5',
+ KEY_6 = '6',
+ KEY_7 = '7',
+ KEY_8 = '8',
+ KEY_9 = '9',
+
+ KEY_SEMICOLON = ';',
+ KEY_EQUAL = '=',
+
+ KEY_A = 'A',
+ KEY_B = 'B',
+ KEY_C = 'C',
+ KEY_D = 'D',
+ KEY_E = 'E',
+ KEY_F = 'F',
+ KEY_G = 'G',
+ KEY_H = 'H',
+ KEY_I = 'I',
+ KEY_J = 'J',
+ KEY_K = 'K',
+ KEY_L = 'L',
+ KEY_M = 'M',
+ KEY_N = 'N',
+ KEY_O = 'O',
+ KEY_P = 'P',
+ KEY_Q = 'Q',
+ KEY_R = 'R',
+ KEY_S = 'S',
+ KEY_T = 'T',
+ KEY_U = 'U',
+ KEY_V = 'V',
+ KEY_W = 'W',
+ KEY_X = 'X',
+ KEY_Y = 'Y',
+ KEY_Z = 'Z',
+
+ KEY_LEFT_BRACKET = '[',
+ KEY_BACKSLASH = '\\',
+ KEY_RIGHT_BRACKET = ']',
+ KEY_GRAVE_ACCENT = '`',
+
+ ACTION_PRESS = ACTION(0),
+ ACTION_RELEASE = ACTION(1),
+ ACTION_REPEAT = ACTION(2),
+
+ MOD_SHIFT = KEY_MOD(0),
+ MOD_CONTROL = KEY_MOD(1),
+ MOD_ALT = KEY_MOD(2),
+ MOD_SUPER = KEY_MOD(3),
+} KeyCode;
+#define MOD_SHFT MOD_SHIFT
+#define MOD_CTRL MOD_CONTROL
+#define MOD_SUPR MOD_SUPER
+
+#undef ACTION
+#undef KEY_MOD
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/ctrl/include/engine/ctrl/scancodes.h b/src/ctrl/include/engine/ctrl/scancodes.h
index f01394e..5b18833 100644
--- a/src/ctrl/include/engine/ctrl/scancodes.h
+++ b/src/ctrl/include/engine/ctrl/scancodes.h
@@ -18,67 +18,67 @@ extern "C" {
#define ACTION(x) (1 << (32-8)) + x
typedef enum {
- KEY_SPACE = ' ',
- KEY_APOSTROPHE = '\'',
- KEY_COMMA = ',',
- KEY_MINUS = '-',
- KEY_PERIOD = '.',
- KEY_SLASH = '/',
+ SCAN_KEY_SPACE = ' ',
+ SCAN_KEY_APOSTROPHE = '\'',
+ SCAN_KEY_COMMA = ',',
+ SCAN_KEY_MINUS = '-',
+ SCAN_KEY_PERIOD = '.',
+ SCAN_KEY_SLASH = '/',
- KEY_0 = '0',
- KEY_1 = '1',
- KEY_2 = '2',
- KEY_3 = '3',
- KEY_4 = '4',
- KEY_5 = '5',
- KEY_6 = '6',
- KEY_7 = '7',
- KEY_8 = '8',
- KEY_9 = '9',
+ SCAN_KEY_0 = '0',
+ SCAN_KEY_1 = '1',
+ SCAN_KEY_2 = '2',
+ SCAN_KEY_3 = '3',
+ SCAN_KEY_4 = '4',
+ SCAN_KEY_5 = '5',
+ SCAN_KEY_6 = '6',
+ SCAN_KEY_7 = '7',
+ SCAN_KEY_8 = '8',
+ SCAN_KEY_9 = '9',
- KEY_SEMICOLON = ';',
- KEY_EQUAL = '=',
+ SCAN_KEY_SEMICOLON = ';',
+ SCAN_KEY_EQUAL = '=',
- KEY_A = 'A',
- KEY_B = 'B',
- KEY_C = 'C',
- KEY_D = 'D',
- KEY_E = 'E',
- KEY_F = 'F',
- KEY_G = 'G',
- KEY_H = 'H',
- KEY_I = 'I',
- KEY_J = 'J',
- KEY_K = 'K',
- KEY_L = 'L',
- KEY_M = 'M',
- KEY_N = 'N',
- KEY_O = 'O',
- KEY_P = 'P',
- KEY_Q = 'Q',
- KEY_R = 'R',
- KEY_S = 'S',
- KEY_T = 'T',
- KEY_U = 'U',
- KEY_V = 'V',
- KEY_W = 'W',
- KEY_X = 'X',
- KEY_Y = 'Y',
- KEY_Z = 'Z',
+ SCAN_KEY_A = 'A',
+ SCAN_KEY_B = 'B',
+ SCAN_KEY_C = 'C',
+ SCAN_KEY_D = 'D',
+ SCAN_KEY_E = 'E',
+ SCAN_KEY_F = 'F',
+ SCAN_KEY_G = 'G',
+ SCAN_KEY_H = 'H',
+ SCAN_KEY_I = 'I',
+ SCAN_KEY_J = 'J',
+ SCAN_KEY_K = 'K',
+ SCAN_KEY_L = 'L',
+ SCAN_KEY_M = 'M',
+ SCAN_KEY_N = 'N',
+ SCAN_KEY_O = 'O',
+ SCAN_KEY_P = 'P',
+ SCAN_KEY_Q = 'Q',
+ SCAN_KEY_R = 'R',
+ SCAN_KEY_S = 'S',
+ SCAN_KEY_T = 'T',
+ SCAN_KEY_U = 'U',
+ SCAN_KEY_V = 'V',
+ SCAN_KEY_W = 'W',
+ SCAN_KEY_X = 'X',
+ SCAN_KEY_Y = 'Y',
+ SCAN_KEY_Z = 'Z',
- KEY_LEFT_BRACKET = '[',
- KEY_BACKSLASH = '\\',
- KEY_RIGHT_BRACKET = ']',
- KEY_GRAVE_ACCENT = '`',
+ SCAN_KEY_LEFT_BRACKET = '[',
+ SCAN_KEY_BACKSLASH = '\\',
+ SCAN_KEY_RIGHT_BRACKET = ']',
+ SCAN_KEY_GRAVE_ACCENT = '`',
- ACTION_PRESS = ACTION(0),
- ACTION_RELEASE = ACTION(1),
- ACTION_REPEAT = ACTION(2),
+ SCAN_ACTION_PRESS = ACTION(0),
+ SCAN_ACTION_RELEASE = ACTION(1),
+ SCAN_ACTION_REPEAT = ACTION(2),
- MOD_SHIFT = MOD(0),
- MOD_CONTROL = MOD(1),
- MOD_ALT = MOD(2),
- MOD_SUPER = MOD(3),
+ SCAN_MOD_SHIFT = MOD(0),
+ SCAN_MOD_CONTROL = MOD(1),
+ SCAN_MOD_ALT = MOD(2),
+ SCAN_MOD_SUPER = MOD(3),
} ScanCode;
#undef ACTION
#undef MOD