#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_sdl3.h" #include "sdl3_events.h" #include // 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); }