/* * Tuxánci 2 - A first person shooter * 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; }