// global_events.cpp - Implementació dels events globals // © 2026 JailDesigner #include "global_events.hpp" #include #include "core/input/input.hpp" #include "core/input/mouse.hpp" #include "core/rendering/sdl_manager.hpp" #include "core/system/notifier.hpp" #include "scene_context.hpp" // Using declarations per simplificar el codi using SceneManager::SceneContext; using SceneType = SceneContext::SceneType; namespace GlobalEvents { auto handle(const SDL_Event& event, SDLManager& sdl, SceneContext& context) -> bool { // 1. Permitir que Input procese el evento (para hotplug de gamepads) auto event_msg = Input::get()->handleEvent(event); if (!event_msg.empty()) { std::cout << "[Input] " << event_msg << '\n'; } // 2. Procesar SDL_EVENT_QUIT directamente (no es input de juego) if (event.type == SDL_EVENT_QUIT) { context.setNextScene(SceneType::EXIT); SceneManager::actual = SceneType::EXIT; return true; } // 3. Gestió del ratolí (auto-ocultar) Mouse::handleEvent(event); // 4. Procesar acciones globales directamente desde eventos SDL // (NO usar Input::checkAction() para evitar desfase de timing) if (event.type == SDL_EVENT_KEY_DOWN) { switch (event.key.scancode) { case SDL_SCANCODE_F1: sdl.decreaseWindowSize(); return true; case SDL_SCANCODE_F2: sdl.increaseWindowSize(); return true; case SDL_SCANCODE_F3: sdl.toggleFullscreen(); return true; case SDL_SCANCODE_F4: sdl.toggleVSync(); return true; case SDL_SCANCODE_F5: sdl.toggleAntialias(); return true; case SDL_SCANCODE_ESCAPE: { // Doble pulsació per confirmar sortida: la primera ESC // dispara un toast d'avís; mentre el toast està entrant // o aguantant (isActiveWindow), la segona ESC tanca el // joc. Si el toast ha començat a sortir o ja ha // desaparegut, ESC torna a obrir la finestra de // confirmació sense tancar. auto* notifier = System::Notifier::get(); if (notifier != nullptr && !notifier->isActiveWindow()) { notifier->notifyExit("PREMEU ESC UN ALTRE COP PER EIXIR"); return true; } // Notifier inexistent (degradació elegant) o segona ESC // dins la finestra activa: tanquem el joc. context.setNextScene(SceneType::EXIT); SceneManager::actual = SceneType::EXIT; return true; } default: // Tecla no global break; } } return false; // Event no processat } } // namespace GlobalEvents