sdl3/php-sdl3/sdl3_events.c
2025-10-26 13:39:25 +01:00

176 lines
8.4 KiB
C

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_sdl3.h"
#include "sdl3_events.h"
#include <SDL3/SDL.h>
// Registriert Event-Konstanten
void sdl3_events_register_constants(int module_number) {
// Event Types
REGISTER_LONG_CONSTANT("SDL_EVENT_QUIT", SDL_EVENT_QUIT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_CLOSE_REQUESTED", SDL_EVENT_WINDOW_CLOSE_REQUESTED, CONST_CS | CONST_PERSISTENT);
// Window Events
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_SHOWN", SDL_EVENT_WINDOW_SHOWN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_HIDDEN", SDL_EVENT_WINDOW_HIDDEN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_EXPOSED", SDL_EVENT_WINDOW_EXPOSED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_MOVED", SDL_EVENT_WINDOW_MOVED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_RESIZED", SDL_EVENT_WINDOW_RESIZED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_MINIMIZED", SDL_EVENT_WINDOW_MINIMIZED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_MAXIMIZED", SDL_EVENT_WINDOW_MAXIMIZED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_RESTORED", SDL_EVENT_WINDOW_RESTORED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_MOUSE_ENTER", SDL_EVENT_WINDOW_MOUSE_ENTER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_MOUSE_LEAVE", SDL_EVENT_WINDOW_MOUSE_LEAVE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_FOCUS_GAINED", SDL_EVENT_WINDOW_FOCUS_GAINED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_WINDOW_FOCUS_LOST", SDL_EVENT_WINDOW_FOCUS_LOST, CONST_CS | CONST_PERSISTENT);
// Keyboard Events
REGISTER_LONG_CONSTANT("SDL_EVENT_KEY_DOWN", SDL_EVENT_KEY_DOWN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_KEY_UP", SDL_EVENT_KEY_UP, CONST_CS | CONST_PERSISTENT);
// Mouse Events
REGISTER_LONG_CONSTANT("SDL_EVENT_MOUSE_MOTION", SDL_EVENT_MOUSE_MOTION, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_MOUSE_BUTTON_DOWN", SDL_EVENT_MOUSE_BUTTON_DOWN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_MOUSE_BUTTON_UP", SDL_EVENT_MOUSE_BUTTON_UP, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_MOUSE_WHEEL", SDL_EVENT_MOUSE_WHEEL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_EVENT_TEXT_INPUT", SDL_EVENT_TEXT_INPUT, CONST_CS | CONST_PERSISTENT);
// Mouse Buttons
REGISTER_LONG_CONSTANT("SDL_BUTTON_LEFT", SDL_BUTTON_LEFT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_BUTTON_MIDDLE", SDL_BUTTON_MIDDLE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_BUTTON_RIGHT", SDL_BUTTON_RIGHT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_BUTTON_X1", SDL_BUTTON_X1, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDL_BUTTON_X2", SDL_BUTTON_X2, CONST_CS | CONST_PERSISTENT);
// Common Keycodes
REGISTER_LONG_CONSTANT("SDLK_RETURN", SDLK_RETURN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDLK_ESCAPE", SDLK_ESCAPE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDLK_BACKSPACE", SDLK_BACKSPACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDLK_TAB", SDLK_TAB, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDLK_DELETE", SDLK_DELETE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDLK_LEFT", SDLK_LEFT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDLK_RIGHT", SDLK_RIGHT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDLK_UP", SDLK_UP, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SDLK_DOWN", SDLK_DOWN, CONST_CS | CONST_PERSISTENT);
}
PHP_FUNCTION(sdl_poll_event) {
SDL_Event event;
if (!SDL_PollEvent(&event)) {
RETURN_FALSE;
}
// Event als Array zurückgeben
array_init(return_value);
add_assoc_long(return_value, "type", event.type);
add_assoc_long(return_value, "timestamp", event.common.timestamp);
switch (event.type) {
case SDL_EVENT_QUIT:
// Keine zusätzlichen Daten
break;
case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
case SDL_EVENT_WINDOW_SHOWN:
case SDL_EVENT_WINDOW_HIDDEN:
case SDL_EVENT_WINDOW_EXPOSED:
case SDL_EVENT_WINDOW_MOVED:
case SDL_EVENT_WINDOW_RESIZED:
case SDL_EVENT_WINDOW_MINIMIZED:
case SDL_EVENT_WINDOW_MAXIMIZED:
case SDL_EVENT_WINDOW_RESTORED:
case SDL_EVENT_WINDOW_MOUSE_ENTER:
case SDL_EVENT_WINDOW_MOUSE_LEAVE:
case SDL_EVENT_WINDOW_FOCUS_GAINED:
case SDL_EVENT_WINDOW_FOCUS_LOST:
add_assoc_long(return_value, "window_id", event.window.windowID);
if (event.type == SDL_EVENT_WINDOW_MOVED || event.type == SDL_EVENT_WINDOW_RESIZED) {
add_assoc_long(return_value, "data1", event.window.data1);
add_assoc_long(return_value, "data2", event.window.data2);
}
break;
case SDL_EVENT_KEY_DOWN:
case SDL_EVENT_KEY_UP:
add_assoc_long(return_value, "window_id", event.key.windowID);
add_assoc_long(return_value, "scancode", event.key.scancode);
add_assoc_long(return_value, "keycode", event.key.key);
add_assoc_long(return_value, "mod", event.key.mod);
add_assoc_bool(return_value, "repeat", event.key.repeat);
add_assoc_bool(return_value, "down", event.key.down);
break;
case SDL_EVENT_MOUSE_MOTION:
add_assoc_long(return_value, "window_id", event.motion.windowID);
add_assoc_long(return_value, "which", event.motion.which);
add_assoc_double(return_value, "x", event.motion.x);
add_assoc_double(return_value, "y", event.motion.y);
add_assoc_double(return_value, "xrel", event.motion.xrel);
add_assoc_double(return_value, "yrel", event.motion.yrel);
add_assoc_long(return_value, "state", event.motion.state);
break;
case SDL_EVENT_MOUSE_BUTTON_DOWN:
case SDL_EVENT_MOUSE_BUTTON_UP:
add_assoc_long(return_value, "window_id", event.button.windowID);
add_assoc_long(return_value, "which", event.button.which);
add_assoc_long(return_value, "button", event.button.button);
add_assoc_bool(return_value, "down", event.button.down);
add_assoc_long(return_value, "clicks", event.button.clicks);
add_assoc_double(return_value, "x", event.button.x);
add_assoc_double(return_value, "y", event.button.y);
break;
case SDL_EVENT_MOUSE_WHEEL:
add_assoc_long(return_value, "window_id", event.wheel.windowID);
add_assoc_long(return_value, "which", event.wheel.which);
add_assoc_double(return_value, "x", event.wheel.x);
add_assoc_double(return_value, "y", event.wheel.y);
add_assoc_long(return_value, "direction", event.wheel.direction);
add_assoc_double(return_value, "mouse_x", event.wheel.mouse_x);
add_assoc_double(return_value, "mouse_y", event.wheel.mouse_y);
break;
case SDL_EVENT_TEXT_INPUT:
add_assoc_long(return_value, "window_id", event.text.windowID);
add_assoc_string(return_value, "text", event.text.text);
break;
}
}
PHP_FUNCTION(sdl_wait_event) {
SDL_Event event;
if (!SDL_WaitEvent(&event)) {
php_error_docref(NULL, E_WARNING, "SDL_WaitEvent failed: %s", SDL_GetError());
RETURN_FALSE;
}
// Event als Array zurückgeben (gleiche Logik wie poll_event)
array_init(return_value);
add_assoc_long(return_value, "type", event.type);
add_assoc_long(return_value, "timestamp", event.common.timestamp);
}
PHP_FUNCTION(sdl_wait_event_timeout) {
zend_long timeout_ms;
SDL_Event event;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &timeout_ms) == FAILURE) {
RETURN_THROWS();
}
if (!SDL_WaitEventTimeout(&event, (int)timeout_ms)) {
RETURN_FALSE; // Timeout oder Fehler
}
// Event als Array zurückgeben
array_init(return_value);
add_assoc_long(return_value, "type", event.type);
add_assoc_long(return_value, "timestamp", event.common.timestamp);
}