The open source OpenXR runtime
1// Copyright 2019, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief SDL2 functions to drive the GUI.
6 * @author Jakob Bornecrantz <jakob@collabora.com>
7 * @ingroup gui
8 */
9
10
11#include "gui_common.h"
12
13#include <vector>
14
15
16struct gui_scene_manager
17{
18public:
19 std::vector<gui_scene *> scenes = {};
20 std::vector<gui_scene *> del = {};
21};
22
23extern "C" void
24gui_scene_push_front(struct gui_program *p, struct gui_scene *me)
25{
26 auto &gsm = *p->gsm;
27
28 // Need to remove the scene if it is already on the list.
29 auto index = gsm.scenes.begin();
30 for (auto scene : gsm.scenes) {
31 if (scene != me) {
32 index++;
33 continue;
34 }
35
36 gsm.scenes.erase(index);
37 break;
38 }
39
40 // Now push it to the front.
41 gsm.scenes.push_back(me);
42}
43
44extern "C" void
45gui_scene_delete_me(struct gui_program *p, struct gui_scene *me)
46{
47 auto &gsm = *p->gsm;
48
49 auto index = gsm.scenes.begin();
50 for (auto scene : gsm.scenes) {
51 if (scene != me) {
52 index++;
53 continue;
54 }
55
56 gsm.scenes.erase(index);
57 break;
58 }
59
60 gsm.del.push_back(me);
61}
62
63extern "C" void
64gui_scene_manager_render(struct gui_program *p)
65{
66 auto &gsm = *p->gsm;
67 auto copy = gsm.scenes;
68
69 for (auto scene : copy) {
70 scene->render(scene, p);
71 }
72
73 copy = gsm.del;
74 gsm.del.clear();
75 for (auto scene : copy) {
76 scene->destroy(scene, p);
77 }
78
79 // If there are no scenes left stop the program.
80 if (gsm.scenes.empty()) {
81 p->stopped = true;
82 }
83}
84
85extern "C" void
86gui_scene_manager_init(struct gui_program *p)
87{
88 p->gsm = new gui_scene_manager;
89}
90
91extern "C" void
92gui_scene_manager_destroy(struct gui_program *p)
93{
94 for (auto scene : p->gsm->scenes) {
95 scene->destroy(scene, p);
96 }
97
98 delete p->gsm;
99 p->gsm = NULL;
100}