From f1ddc12b68b4e4c8087962de25260470e6df2bea Mon Sep 17 00:00:00 2001 From: Connor Thomson Date: Tue, 8 Sep 2026 18:27:39 -0700 Subject: Add tuxanci2 files --- src/keyboard.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/keyboard.c (limited to 'src/keyboard.c') diff --git a/src/keyboard.c b/src/keyboard.c new file mode 100644 index 0000000..b5f6a2c --- /dev/null +++ b/src/keyboard.c @@ -0,0 +1,81 @@ +/* + * Tuxánci 2 - A first person shooter + * Copyright (C) 2007-2011 Tuxánci Development Team + * Copyright (C) 2025-2026 Connor Thomson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ta_sdl.h" +#include "keyboard.h" +#include +#include + +static ta_key_callback_fn *ta_keyboard_callbacks = NULL; +static int ta_keyboard_callbacks_capacity = 0; + +static int ta_keyboard_ensure_capacity(int key) { + if (key < ta_keyboard_callbacks_capacity) { + return 1; + } + + int new_capacity = ta_keyboard_callbacks_capacity; + while (new_capacity <= key) { + new_capacity += sizeof(SDLK_UNKNOWN); + } + + ta_key_callback_fn *new_array = realloc( + ta_keyboard_callbacks, + (size_t)new_capacity * sizeof(ta_key_callback_fn) + ); + if (new_array == NULL) { + return 0; + } + + memset( + new_array + ta_keyboard_callbacks_capacity, + 0, + (size_t)(new_capacity - ta_keyboard_callbacks_capacity) * sizeof(ta_key_callback_fn) + ); + + ta_keyboard_callbacks = new_array; + ta_keyboard_callbacks_capacity = new_capacity; + return 1; +} + +void ta_keyboard_set_callback(int key, void (*callback)(void)) { + if (key < 0 || !ta_keyboard_ensure_capacity(key)) { + return; + } + ta_keyboard_callbacks[key] = callback; +} + +void ta_keyboard_dispatch(int key) { + if (key < 0) { + return; + } + + if (key < ta_keyboard_callbacks_capacity && ta_keyboard_callbacks[key] != NULL) { + ta_keyboard_callbacks[key](); + } +} + +void ta_keyboard_shutdown(void) { + if (ta_keyboard_callbacks) { + free(ta_keyboard_callbacks); + } + + ta_keyboard_callbacks = NULL; + ta_keyboard_callbacks_capacity = 0; +} \ No newline at end of file -- cgit v1.2.3