summaryrefslogtreecommitdiff
path: root/src/ctrl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ctrl')
-rw-r--r--src/ctrl/CMakeLists.txt1
-rw-r--r--src/ctrl/include/engine/ctrl/input.h11
-rw-r--r--src/ctrl/include/engine/ctrl/scancodes.h82
-rw-r--r--src/ctrl/src/input.c65
4 files changed, 153 insertions, 6 deletions
diff --git a/src/ctrl/CMakeLists.txt b/src/ctrl/CMakeLists.txt
index 3f76069..e7dd0a9 100644
--- a/src/ctrl/CMakeLists.txt
+++ b/src/ctrl/CMakeLists.txt
@@ -7,3 +7,4 @@ add_library(daw_ctrl
)
target_include_directories(daw_ctrl PRIVATE ${DAW_INCLUDE_DIRS})
+target_link_libraries(daw_ctrl PRIVATE cglm glfw)
diff --git a/src/ctrl/include/engine/ctrl/input.h b/src/ctrl/include/engine/ctrl/input.h
index 26a5f5b..d06dcfe 100644
--- a/src/ctrl/include/engine/ctrl/input.h
+++ b/src/ctrl/include/engine/ctrl/input.h
@@ -1,9 +1,10 @@
-#ifndef INPUT_H
-#define INPUT_H
+#ifndef ENGINE_CTRL_INPUT_H
+#define ENGINE_CTRL_INPUT_H
#include <engine/core/types.h>
+#include <engine/ctrl/scancodes.h>
-typedef void input_callback_t(void*);
+typedef void input_callback_t(f64, void*);
typedef i32 scancode_t;
typedef enum InputType {
@@ -49,9 +50,11 @@ typedef struct 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(usize numcalls, void* state_mem, input_callback_t* c[]);
+void i_flush_bindings(f64 dt, usize numcalls, input_callback_t* c[], void* state_mem);
action_t i_get_action(const i_ctx* restrict ctx, u32 time, scancode_t scancode);
+void key_callback(void* window, int key, int scancode, int action, int mods);
+
void i_ctx_push(i_ctx* ctx);
void i_ctx_pop(void);
void i_ctx_reset(void);
diff --git a/src/ctrl/include/engine/ctrl/scancodes.h b/src/ctrl/include/engine/ctrl/scancodes.h
new file mode 100644
index 0000000..90bd749
--- /dev/null
+++ b/src/ctrl/include/engine/ctrl/scancodes.h
@@ -0,0 +1,82 @@
+#ifndef ENGINE_CTRL_SCANCODES_H
+
+// 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 SCANCODE
+// 0000 0000 0000 0000 XXXX XXXX XXXX XXXX
+#define 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 = MOD(0),
+ MOD_CONTROL = MOD(1),
+ MOD_ALT = MOD(2),
+ MOD_SUPER = MOD(3),
+} ScanCode;
+#undef ACTION
+#undef MOD
+
+#endif
diff --git a/src/ctrl/src/input.c b/src/ctrl/src/input.c
index 3b6a4df..5fe643e 100644
--- a/src/ctrl/src/input.c
+++ b/src/ctrl/src/input.c
@@ -1,8 +1,13 @@
#include <engine/core/dltools.h>
#include <engine/core/logging.h>
+#include <engine/core/platform.h>
#include <engine/ctrl/input.h>
#include <string.h>
+extern input_callback_t* callbacks[128];
+extern usize callbacks_len;
+
+extern Platform* GLOBAL_PLATFORM;
/* Lazy binds, used internally. They are similar to BindAction and friends.
* The only difference is that we set callbacks and such to NULL, but populate
* the function name strings such that can be reloaded. */
@@ -30,6 +35,60 @@
.scancode = key, .scancode_alt = altkey, .since_last_activation = 0 \
}
+void key_callback(void* window, int key, int scancode, int action, int mods) {
+
+ const i_ctx* bindings = *GLOBAL_PLATFORM->bindings;
+ const usize bindings_len = GLOBAL_PLATFORM->bindings_len;
+
+ const f64 now = get_time();
+
+ for (usize b = 0; b < bindings_len; b++) {
+ const action_t a = i_get_action(&bindings[b], now, scancode);
+ switch (action) {
+ case GLFW_PRESS:
+
+ switch (a.type) {
+ case InputType_action:
+ if (a.action.callback != NULL) {
+ callbacks[callbacks_len++] = a.action.callback;
+ }
+ break;
+
+ case InputType_state:
+ if (a.state.activate != NULL) {
+ callbacks[callbacks_len++] = a.state.activate;
+ }
+ break;
+ case InputType_range:
+ WARN("Range inputs not supported yet!");
+ break;
+ case InputType_error:
+ WARN("Unhandled scancode: %lu", scancode);
+
+ default:
+ break;
+ }
+ break;
+
+ case GLFW_RELEASE:
+ switch (a.type) {
+ case InputType_state:
+ if (a.state.deactivate != NULL) {
+ callbacks[callbacks_len++] = a.state.deactivate;
+ }
+ break;
+ default:break;
+ }
+ break;
+ case GLFW_REPEAT:
+ /* unhandled so far */
+ break;
+ default:
+ break;
+ }
+ }
+}
+
void binding_t_free(binding_t* b) {
switch (b->action.type) {
case InputType_error:
@@ -129,10 +188,12 @@ bool i_update_unique_binding(i_ctx* ctx, binding_t* binding) {
return false;
}
-void i_flush_bindings(usize numcalls, void* state_mem, input_callback_t* c[]) {
+void i_flush_bindings(f64 dt, usize numcalls, input_callback_t* c[], void* state_mem) {
for (usize i = 0; i < numcalls; i++) {
- (c[i])(state_mem);
+ (c[i])(dt, state_mem);
}
+ // reset callback len and be ready for more
+ callbacks_len = 0;
}
action_t i_get_action(const i_ctx* restrict ctx, u32 time,