From 21d07cab07b347c2cece619a199900d8a7682627 Mon Sep 17 00:00:00 2001 From: Nathan Date: Mon, 5 May 2025 18:14:30 -0500 Subject: [PATCH] sdl use event callback --- include/utils/Window/WindowSDL3/WindowSDL3.h | 152 +++++++------------ modules/WindowModule/src/WindowModule.cpp | 3 + 2 files changed, 61 insertions(+), 94 deletions(-) diff --git a/include/utils/Window/WindowSDL3/WindowSDL3.h b/include/utils/Window/WindowSDL3/WindowSDL3.h index 5f5e334..415e10a 100644 --- a/include/utils/Window/WindowSDL3/WindowSDL3.h +++ b/include/utils/Window/WindowSDL3/WindowSDL3.h @@ -15,6 +15,53 @@ namespace Archimedes { class Window; + static bool EventCallback(void* ptr, SDL_Event* e) { + + WindowData& data = *(WindowData*) ptr; + + switch(e->type) { + + case SDL_EVENT_WINDOW_CLOSE_REQUESTED: + case SDL_EVENT_QUIT: + data.sendEvent(new CloseWindowEvent(data.window, e)); + break; + case SDL_EVENT_WINDOW_RESIZED: + data.sendEvent(new ResizeWindowEvent(e->window.data1, e->window.data2, e)); + break; + case SDL_EVENT_WINDOW_MOUSE_ENTER: + case SDL_EVENT_WINDOW_FOCUS_GAINED: + data.sendEvent(new FocusedWindowEvent(data.window, e)); + break; + case SDL_EVENT_WINDOW_MOUSE_LEAVE: + case SDL_EVENT_WINDOW_FOCUS_LOST: + data.sendEvent(new FocusLostWindowEvent(data.window, e)); + break; + case SDL_EVENT_KEY_DOWN: + data.sendEvent(new KeyPressedWindowEvent(e->key.key, e->key.repeat ? 1 : 0, e)); + break; + case SDL_EVENT_KEY_UP: + data.sendEvent(new KeyReleasedWindowEvent(e->key.key, e)); + break; + case SDL_EVENT_MOUSE_MOTION: + data.sendEvent(new MouseMovedWindowEvent(e->motion.x, e->motion.y, e)); + break; + case SDL_EVENT_MOUSE_BUTTON_DOWN: + data.sendEvent(new MouseButtonPressedWindowEvent(e->button.button, e)); + break; + case SDL_EVENT_MOUSE_BUTTON_UP: + data.sendEvent(new MouseButtonReleasedWindowEvent(e->button.button, e)); + break; + case SDL_EVENT_MOUSE_WHEEL: + data.sendEvent(new ScrollWindowEvent(e->wheel.x, e->wheel.y, e)); + break; + default: + data.sendEvent(new AnonymousEvent(e)); + break; + } + + return true; + } + class WindowSDL3 { public: @@ -23,12 +70,12 @@ namespace Archimedes { data.window = p; data.sendEvent = sendEvent; -/* + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD)) { std::cerr << "Error: SDL_Init(): " << SDL_GetError() << std::flush; std::abort(); } -*/ + #if RENDERER == 1 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); @@ -59,54 +106,7 @@ namespace Archimedes { SDL_GL_MakeCurrent(w, gl_context); SDL_GL_SetSwapInterval(1); // Enable vsync #endif - /*SDL_AddEventWatch([](void* ptr, SDL_Event* e) -> bool { - - WindowData& data = (WindowData&) *ptr; - - switch(e.type) { - - case SDL_EVENT_WINDOW_CLOSE_REQUESTED: - case SDL_EVENT_QUIT: - data.sendEvent(new CloseWindowEvent(data.window, &e)); - break; - case SDL_EVENT_WINDOW_RESIZED: - width = e.window.data1; - height = e.window.data2; - data.sendEvent(new ResizeWindowEvent(e.window.data1, e.window.data2, &e)); - break; - case SDL_EVENT_WINDOW_MOUSE_ENTER: - case SDL_EVENT_WINDOW_FOCUS_GAINED: - data.sendEvent(new FocusedWindowEvent(data.window, &e)); - break; - case SDL_EVENT_WINDOW_MOUSE_LEAVE: - case SDL_EVENT_WINDOW_FOCUS_LOST: - data.sendEvent(new FocusLostWindowEvent(data.window, &e)); - break; - case SDL_EVENT_KEY_DOWN: - data.sendEvent(new KeyPressedWindowEvent(e.key.key, e.key.repeat ? 1 : 0, &e)); - break; - case SDL_EVENT_KEY_UP: - data.sendEvent(new KeyReleasedWindowEvent(e.key.key, &e)); - break; - case SDL_EVENT_MOUSE_MOTION: - data.sendEvent(new MouseMovedWindowEvent(e.motion.x, e.motion.y, &e)); - break; - case SDL_EVENT_MOUSE_BUTTON_DOWN: - data.sendEvent(new MouseButtonPressedWindowEvent(e.button.button, &e)); - break; - case SDL_EVENT_MOUSE_BUTTON_UP: - data.sendEvent(new MouseButtonReleasedWindowEvent(e.button.button, &e)); - break; - case SDL_EVENT_MOUSE_WHEEL: - data.sendEvent(new ScrollWindowEvent(e.wheel.x, e.wheel.y, &e)); - break; - default: - data.sendEvent(new AnonymousEvent(&e)); - break; - } - - return true; - }, &data);*/ + SDL_AddEventWatch(EventCallback, &data); SDL_ShowWindow(w); } @@ -115,6 +115,7 @@ namespace Archimedes { #if RENDERER == 1 SDL_GL_DestroyContext(gl_context); #endif + SDL_RemoveEventWatch(EventCallback, &data); SDL_DestroyWindow(w); SDL_Quit(); } @@ -129,49 +130,8 @@ namespace Archimedes { } void pollEvents() { - while(SDL_PollEvent(&e)) { - switch(e.type) { - - case SDL_EVENT_WINDOW_CLOSE_REQUESTED: - case SDL_EVENT_QUIT: - data.sendEvent(new CloseWindowEvent(data.window, &e)); - break; - case SDL_EVENT_WINDOW_RESIZED: - width = e.window.data1; - height = e.window.data2; - data.sendEvent(new ResizeWindowEvent(e.window.data1, e.window.data2, &e)); - break; - case SDL_EVENT_WINDOW_MOUSE_ENTER: - case SDL_EVENT_WINDOW_FOCUS_GAINED: - data.sendEvent(new FocusedWindowEvent(data.window, &e)); - break; - case SDL_EVENT_WINDOW_MOUSE_LEAVE: - case SDL_EVENT_WINDOW_FOCUS_LOST: - data.sendEvent(new FocusLostWindowEvent(data.window, &e)); - break; - case SDL_EVENT_KEY_DOWN: - data.sendEvent(new KeyPressedWindowEvent(e.key.key, e.key.repeat ? 1 : 0, &e)); - break; - case SDL_EVENT_KEY_UP: - data.sendEvent(new KeyReleasedWindowEvent(e.key.key, &e)); - break; - case SDL_EVENT_MOUSE_MOTION: - data.sendEvent(new MouseMovedWindowEvent(e.motion.x, e.motion.y, &e)); - break; - case SDL_EVENT_MOUSE_BUTTON_DOWN: - data.sendEvent(new MouseButtonPressedWindowEvent(e.button.button, &e)); - break; - case SDL_EVENT_MOUSE_BUTTON_UP: - data.sendEvent(new MouseButtonReleasedWindowEvent(e.button.button, &e)); - break; - case SDL_EVENT_MOUSE_WHEEL: - data.sendEvent(new ScrollWindowEvent(e.wheel.x, e.wheel.y, &e)); - break; - default: - data.sendEvent(new AnonymousEvent(&e)); - break; - } - } + static SDL_Event e; + while(SDL_PollEvent(&e)) {} } #if RENDERER == 1 void restoreContext() { SDL_GL_MakeCurrent(w, gl_context); } @@ -181,6 +141,11 @@ namespace Archimedes { h = this->height; } + void setSize(int& w, int& h) { + this->width = w; + this->height = h; + } + SDL_Window* getWindow() { return w; } #if RENDERER == 1 SDL_GLContext getContext() { return gl_context; } @@ -193,7 +158,6 @@ namespace Archimedes { #if RENDERER == 1 SDL_GLContext gl_context; #endif - SDL_Event e; }; diff --git a/modules/WindowModule/src/WindowModule.cpp b/modules/WindowModule/src/WindowModule.cpp index 0b9af56..070ddd5 100644 --- a/modules/WindowModule/src/WindowModule.cpp +++ b/modules/WindowModule/src/WindowModule.cpp @@ -57,6 +57,9 @@ bool WindowModule::onEvent(const Archimedes::Event& e) { Archimedes::ResizeWindowEvent& event = (Archimedes::ResizeWindowEvent&) e; renderer->w = event.width; renderer->h = event.height; +#if WINDOW == 2 + window->getWindowImpl().setSize(event.width, event.height); +#endif return true; } else if(type == app->getEventType(Archimedes::CloseWindowEvent())) { app->emitEvent(new Archimedes::DoUnloadModuleEvent(name));