1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef CAST_STANDALONE_RECEIVER_SDL_GLUE_H_ 6*3f982cf4SFabien Sanglard #define CAST_STANDALONE_RECEIVER_SDL_GLUE_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <stdint.h> 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard #pragma GCC diagnostic push 11*3f982cf4SFabien Sanglard #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" 12*3f982cf4SFabien Sanglard #include <SDL2/SDL.h> 13*3f982cf4SFabien Sanglard #pragma GCC diagnostic pop 14*3f982cf4SFabien Sanglard 15*3f982cf4SFabien Sanglard #include <functional> 16*3f982cf4SFabien Sanglard #include <memory> 17*3f982cf4SFabien Sanglard #include <utility> 18*3f982cf4SFabien Sanglard #include <vector> 19*3f982cf4SFabien Sanglard 20*3f982cf4SFabien Sanglard #include "util/alarm.h" 21*3f982cf4SFabien Sanglard 22*3f982cf4SFabien Sanglard namespace openscreen { 23*3f982cf4SFabien Sanglard 24*3f982cf4SFabien Sanglard class TaskRunner; 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard namespace cast { 27*3f982cf4SFabien Sanglard 28*3f982cf4SFabien Sanglard template <uint32_t subsystem> 29*3f982cf4SFabien Sanglard class ScopedSDLSubSystem { 30*3f982cf4SFabien Sanglard public: ScopedSDLSubSystem()31*3f982cf4SFabien Sanglard ScopedSDLSubSystem() { SDL_InitSubSystem(subsystem); } ~ScopedSDLSubSystem()32*3f982cf4SFabien Sanglard ~ScopedSDLSubSystem() { SDL_QuitSubSystem(subsystem); } 33*3f982cf4SFabien Sanglard }; 34*3f982cf4SFabien Sanglard 35*3f982cf4SFabien Sanglard // Macro that, for an SDL_Foo, generates code for: 36*3f982cf4SFabien Sanglard // 37*3f982cf4SFabien Sanglard // using SDLFooUniquePtr = std::unique_ptr<SDL_Foo, SDLFooDestroyer>; 38*3f982cf4SFabien Sanglard // SDLFooUniquePtr MakeUniqueSDLFoo(...args...); 39*3f982cf4SFabien Sanglard #define DEFINE_SDL_UNIQUE_PTR(name) \ 40*3f982cf4SFabien Sanglard struct SDL##name##Destroyer { \ 41*3f982cf4SFabien Sanglard void operator()(SDL_##name* obj) const { \ 42*3f982cf4SFabien Sanglard if (obj) { \ 43*3f982cf4SFabien Sanglard SDL_Destroy##name(obj); \ 44*3f982cf4SFabien Sanglard } \ 45*3f982cf4SFabien Sanglard } \ 46*3f982cf4SFabien Sanglard }; \ 47*3f982cf4SFabien Sanglard using SDL##name##UniquePtr = \ 48*3f982cf4SFabien Sanglard std::unique_ptr<SDL_##name, SDL##name##Destroyer>; \ 49*3f982cf4SFabien Sanglard template <typename... Args> \ 50*3f982cf4SFabien Sanglard SDL##name##UniquePtr MakeUniqueSDL##name(Args&&... args) { \ 51*3f982cf4SFabien Sanglard return SDL##name##UniquePtr( \ 52*3f982cf4SFabien Sanglard SDL_Create##name(std::forward<Args>(args)...)); \ 53*3f982cf4SFabien Sanglard } 54*3f982cf4SFabien Sanglard 55*3f982cf4SFabien Sanglard DEFINE_SDL_UNIQUE_PTR(Window); 56*3f982cf4SFabien Sanglard DEFINE_SDL_UNIQUE_PTR(Renderer); 57*3f982cf4SFabien Sanglard DEFINE_SDL_UNIQUE_PTR(Texture); 58*3f982cf4SFabien Sanglard 59*3f982cf4SFabien Sanglard #undef DEFINE_SDL_UNIQUE_PTR 60*3f982cf4SFabien Sanglard 61*3f982cf4SFabien Sanglard // A looping mechanism that runs the SDL event loop by scheduling periodic tasks 62*3f982cf4SFabien Sanglard // to the given TaskRunner. Looping continues indefinitely, until the instance 63*3f982cf4SFabien Sanglard // is destroyed. A client-provided quit callback is invoked whenever a SDL_QUIT 64*3f982cf4SFabien Sanglard // event is received. 65*3f982cf4SFabien Sanglard class SDLEventLoopProcessor { 66*3f982cf4SFabien Sanglard public: 67*3f982cf4SFabien Sanglard SDLEventLoopProcessor(TaskRunner* task_runner, 68*3f982cf4SFabien Sanglard std::function<void()> quit_callback); 69*3f982cf4SFabien Sanglard ~SDLEventLoopProcessor(); 70*3f982cf4SFabien Sanglard 71*3f982cf4SFabien Sanglard using KeyboardEventCallback = std::function<void(const SDL_KeyboardEvent&)>; 72*3f982cf4SFabien Sanglard void RegisterForKeyboardEvent(KeyboardEventCallback cb); 73*3f982cf4SFabien Sanglard 74*3f982cf4SFabien Sanglard private: 75*3f982cf4SFabien Sanglard void ProcessPendingEvents(); 76*3f982cf4SFabien Sanglard 77*3f982cf4SFabien Sanglard Alarm alarm_; 78*3f982cf4SFabien Sanglard std::function<void()> quit_callback_; 79*3f982cf4SFabien Sanglard std::vector<KeyboardEventCallback> keyboard_callbacks_; 80*3f982cf4SFabien Sanglard }; 81*3f982cf4SFabien Sanglard 82*3f982cf4SFabien Sanglard } // namespace cast 83*3f982cf4SFabien Sanglard } // namespace openscreen 84*3f982cf4SFabien Sanglard 85*3f982cf4SFabien Sanglard #endif // CAST_STANDALONE_RECEIVER_SDL_GLUE_H_ 86