HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
GUISystem_base.hpp
1// Copyright 2019 Pokitec
2// All rights reserved.
3
4#pragma once
5
6#include "TTauri/GUI/globals.hpp"
7#include "TTauri/GUI/GUIDevice.hpp"
8#include "TTauri/GUI/Window.hpp"
9#include "TTauri/GUI/VerticalSync.hpp"
10#include "TTauri/GUI/GUISystemDelegate.hpp"
11#include <nonstd/span>
12#include <memory>
13#include <mutex>
14#include <thread>
15#include <vector>
16
17namespace tt {
18
19
24public:
25 GUISystemDelegate *delegate;
26
28
31
36
37 GUISystem_base(GUISystemDelegate *delegate) noexcept :
38 delegate(delegate)
39 {
40 verticalSync = std::make_unique<VerticalSync>(_handleVerticalSync, this);
41 }
42
43 virtual ~GUISystem_base() {}
44
45 GUISystem_base(const GUISystem_base &) = delete;
46 GUISystem_base &operator=(const GUISystem_base &) = delete;
47 GUISystem_base(GUISystem_base &&) = delete;
48 GUISystem_base &operator=(GUISystem_base &&) = delete;
49
50 virtual void initialize() noexcept(false) = 0;
51
52 template<typename T, typename... Args>
53 T *makeWindow(Args &&... args)
54 {
55 auto window = std::make_unique<T>(std::forward<Args>(args)...);
56 auto window_ptr = window.get();
57 window->initialize();
58
59 auto device = findBestDeviceForWindow(*window);
60 if (!device) {
61 TTAURI_THROW(gui_error("Could not find a vulkan-device matching this window"));
62 }
63
64 device->add(std::move(window));
65 return window_ptr;
66 }
67
68
72
73 void render(hires_utc_clock::time_point displayTimePoint) {
74 for (auto &device: devices) {
75 device->render(displayTimePoint);
76 }
77 ttlet currentNumberOfWindows = getNumberOfWindows();
78 if (currentNumberOfWindows == 0 && currentNumberOfWindows != previousNumberOfWindows) {
79 delegate->lastWindowClosed();
80 }
81 previousNumberOfWindows = currentNumberOfWindows;
82 }
83
84 void handleVerticalSync(hires_utc_clock::time_point displayTimePoint)
85 {
86 render(displayTimePoint);
87 }
88
89
90 static void _handleVerticalSync(void *data, hires_utc_clock::time_point displayTimePoint);
91
92protected:
93 GUIDevice *findBestDeviceForWindow(Window const &window);
94};
95
96}
Vulkan GUIDevice controller.
Definition GUISystem_base.hpp:23
ssize_t previousNumberOfWindows
Definition GUISystem_base.hpp:35
std::vector< std::unique_ptr< GUIDevice > > devices
List of all devices.
Definition GUISystem_base.hpp:30
ssize_t getNumberOfWindows()
Definition GUISystemDelegate.hpp:8
T move(T... args)