xref: /aosp_15_r20/external/openscreen/cast/standalone_receiver/sdl_glue.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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