yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
main.cc
Go to the documentation of this file.
1#include <cstdlib>
2#include <set>
3#include <string>
4
10#include "app/gui/core/icons.h"
12#include "imgui/imgui.h"
13#include "util/log.h"
14
15namespace {
16
17constexpr size_t kLabSessionId = 0;
18
20 const char* id;
21 const char* display_name;
22 const char* window_title;
23 const char* icon;
24 const char* category;
25 const char* shortcut;
26 const char* disabled_tooltip;
29};
30
31constexpr LabPanelSeed kLabPanels[] = {
32 // Overworld
33 {"overworld.canvas", "Overworld Canvas", nullptr, ICON_MD_MAP, "Overworld",
34 "Ctrl+Shift+O", nullptr, 5, true},
35 {"overworld.area_graphics", "Area Graphics", nullptr, ICON_MD_IMAGE,
36 "Overworld", nullptr, nullptr, 50, false},
37 {"overworld.tile16_selector", "Tile16 Selector", nullptr, ICON_MD_GRID_ON,
38 "Overworld", nullptr, nullptr, 50, true},
39 {"overworld.tile16_editor", "Tile16 Editor", nullptr, ICON_MD_EDIT,
40 "Overworld", nullptr, nullptr, 15, false},
41 {"overworld.tile8_selector", "Tile8 Selector", nullptr, ICON_MD_GRID_3X3,
42 "Overworld", nullptr, nullptr, 50, false},
43 {"overworld.properties", "Map Properties", nullptr, ICON_MD_TUNE,
44 "Overworld", nullptr, nullptr, 50, false},
45 {"overworld.scratch", "Scratch Workspace", nullptr, ICON_MD_DRAW,
46 "Overworld", nullptr, nullptr, 50, false},
47 {"overworld.usage_stats", "Usage Statistics", nullptr, ICON_MD_ANALYTICS,
48 "Overworld", nullptr, nullptr, 50, false},
49 {"overworld.debug", "Debug Window", nullptr, ICON_MD_BUG_REPORT,
50 "Overworld", nullptr, nullptr, 50, false},
51 {"overworld.gfx_groups", "Graphics Groups", nullptr, ICON_MD_COLLECTIONS,
52 "Overworld", nullptr, nullptr, 50, false},
53 {"overworld.v3_settings", "v3 Settings", nullptr, ICON_MD_SETTINGS,
54 "Overworld", nullptr, nullptr, 50, false},
55
56 // Dungeon
57 {"dungeon.control_panel", "Dungeon Controls", " Dungeon Controls",
58 ICON_MD_CASTLE, "Dungeon", "Ctrl+Shift+D",
59 "Load a ROM to access dungeon controls", 10, false},
60 {"dungeon.room_selector", "Room List", " Room List", ICON_MD_LIST,
61 "Dungeon", "Ctrl+Shift+R", "Load a ROM to browse dungeon rooms", 20,
62 false},
63 {"dungeon.entrance_list", "Entrance List", " Entrance List",
64 ICON_MD_DOOR_FRONT, "Dungeon", "Ctrl+Shift+E",
65 "Load a ROM to browse dungeon entrances", 25, false},
66 {"dungeon.entrance_properties", "Entrance Properties",
67 " Entrance Properties", ICON_MD_TUNE, "Dungeon", nullptr,
68 "Load a ROM to edit entrance properties", 26, false},
69 {"dungeon.room_matrix", "Room Matrix", " Room Matrix", ICON_MD_GRID_VIEW,
70 "Dungeon", "Ctrl+Shift+M", "Load a ROM to view the room matrix", 30,
71 false},
72 {"dungeon.room_graphics", "Room Graphics", " Room Graphics", ICON_MD_IMAGE,
73 "Dungeon", "Ctrl+Shift+G", "Load a ROM to view room graphics", 50, false},
74 {"dungeon.object_editor", "Object Editor", nullptr, ICON_MD_CONSTRUCTION,
75 "Dungeon", nullptr, nullptr, 60, false},
76 {"dungeon.sprite_editor", "Sprite Editor", nullptr, ICON_MD_PERSON,
77 "Dungeon", nullptr, nullptr, 65, false},
78 {"dungeon.item_editor", "Item Editor", nullptr, ICON_MD_INVENTORY,
79 "Dungeon", nullptr, nullptr, 66, false},
80 {"dungeon.palette_editor", "Palette Editor", " Palette Editor",
81 ICON_MD_PALETTE, "Dungeon", "Ctrl+Shift+P",
82 "Load a ROM to edit dungeon palettes", 70, false},
83
84 // Graphics
85 {"graphics.sheet_browser_v2", "Sheet Browser", nullptr, ICON_MD_VIEW_LIST,
86 "Graphics", nullptr, nullptr, 10, true},
87 {"graphics.pixel_editor", "Pixel Editor", nullptr, ICON_MD_DRAW,
88 "Graphics", nullptr, nullptr, 20, true},
89 {"graphics.palette_controls", "Palette Controls", nullptr, ICON_MD_PALETTE,
90 "Graphics", nullptr, nullptr, 30, false},
91 {"graphics.link_sprite_editor", "Link Sprite Editor", nullptr,
92 ICON_MD_PERSON, "Graphics", nullptr, nullptr, 35, false},
93 {"graphics.polyhedral_editor", "3D Objects", nullptr, ICON_MD_VIEW_IN_AR,
94 "Graphics", nullptr, nullptr, 38, false},
95 {"graphics.gfx_group_editor", "Graphics Groups", nullptr,
96 ICON_MD_VIEW_MODULE, "Graphics", nullptr, nullptr, 39, false},
97 {"graphics.paletteset_editor", "Palettesets", nullptr,
98 ICON_MD_COLOR_LENS, "Graphics", nullptr, nullptr, 45, false},
99 {"graphics.prototype_viewer", "Prototype Viewer", nullptr,
100 ICON_MD_CONSTRUCTION, "Graphics", nullptr, nullptr, 50, false},
101
102 // Palette
103 {"palette.control_panel", "Palette Controls", " Group Manager",
104 ICON_MD_PALETTE, "Palette", "Ctrl+Shift+P", "Load a ROM first", 10, false},
105 {"palette.ow_main", "Overworld Main", " Overworld Main", ICON_MD_LANDSCAPE,
106 "Palette", "Ctrl+Alt+1", "Load a ROM first", 20, false},
107 {"palette.ow_animated", "Overworld Animated", " Overworld Animated",
108 ICON_MD_WATER, "Palette", "Ctrl+Alt+2", "Load a ROM first", 30, false},
109 {"palette.dungeon_main", "Dungeon Main", " Dungeon Main", ICON_MD_CASTLE,
110 "Palette", "Ctrl+Alt+3", "Load a ROM first", 40, false},
111 {"palette.sprites", "Global Sprite Palettes", " SNES Palette",
112 ICON_MD_PETS, "Palette", "Ctrl+Alt+4", "Load a ROM first", 50, false},
113 {"palette.sprites_aux1", "Sprites Aux 1", " Sprites Aux 1",
114 ICON_MD_FILTER_1, "Palette", "Ctrl+Alt+7", "Load a ROM first", 51, false},
115 {"palette.sprites_aux2", "Sprites Aux 2", " Sprites Aux 2",
116 ICON_MD_FILTER_2, "Palette", "Ctrl+Alt+8", "Load a ROM first", 52, false},
117 {"palette.sprites_aux3", "Sprites Aux 3", " Sprites Aux 3",
118 ICON_MD_FILTER_3, "Palette", "Ctrl+Alt+9", "Load a ROM first", 53, false},
119 {"palette.equipment", "Equipment Palettes", " Equipment Palettes",
120 ICON_MD_SHIELD, "Palette", "Ctrl+Alt+5", "Load a ROM first", 60, false},
121 {"palette.quick_access", "Quick Access", " Color Harmony",
122 ICON_MD_COLOR_LENS, "Palette", "Ctrl+Alt+Q", "Load a ROM first", 70, false},
123 {"palette.custom", "Custom Palette", " Palette Editor", ICON_MD_BRUSH,
124 "Palette", "Ctrl+Alt+C", "Load a ROM first", 80, false},
125
126 // Sprite
127 {"sprite.vanilla_editor", "Vanilla Sprites", nullptr, ICON_MD_SMART_TOY,
128 "Sprite", nullptr, nullptr, 10, true},
129 {"sprite.custom_editor", "Custom Sprites", nullptr, ICON_MD_ADD_CIRCLE,
130 "Sprite", nullptr, nullptr, 20, false},
131
132 // Screen
133 {"screen.dungeon_maps", "Dungeon Maps", " Dungeon Map Editor", ICON_MD_MAP,
134 "Screen", "Alt+1", "Load a ROM first", 10, false},
135 {"screen.inventory_menu", "Inventory Menu", " Inventory Menu",
136 ICON_MD_INVENTORY, "Screen", "Alt+2", "Load a ROM first", 20, false},
137 {"screen.overworld_map", "Overworld Map", " Overworld Map", ICON_MD_PUBLIC,
138 "Screen", "Alt+3", "Load a ROM first", 30, false},
139 {"screen.title_screen", "Title Screen", " Title Screen", ICON_MD_TITLE,
140 "Screen", "Alt+4", "Load a ROM first", 40, false},
141 {"screen.naming_screen", "Naming Screen", " Naming Screen", ICON_MD_EDIT,
142 "Screen", "Alt+5", "Load a ROM first", 50, false},
143
144 // Music
145 {"music.song_browser", "Song Browser", " Song Browser",
146 ICON_MD_LIBRARY_MUSIC, "Music", "Ctrl+Shift+B", nullptr, 5, false},
147 {"music.tracker", "Playback Control", " Playback Control",
148 ICON_MD_PLAY_CIRCLE, "Music", "Ctrl+Shift+M", nullptr, 10, false},
149 {"music.piano_roll", "Piano Roll", " Piano Roll", ICON_MD_PIANO, "Music",
150 "Ctrl+Shift+P", nullptr, 15, false},
151 {"music.instrument_editor", "Instrument Editor", " Instrument Editor",
152 ICON_MD_SPEAKER, "Music", "Ctrl+Shift+I", nullptr, 20, false},
153 {"music.sample_editor", "Sample Editor", " Sample Editor", ICON_MD_WAVES,
154 "Music", "Ctrl+Shift+S", nullptr, 25, false},
155 {"music.assembly", "Assembly View", " Music Assembly", ICON_MD_CODE,
156 "Music", "Ctrl+Shift+A", nullptr, 30, false},
157 {"music.audio_debug", "Audio Debug", " Audio Debug", ICON_MD_BUG_REPORT,
158 "Music", nullptr, nullptr, 95, false},
159 {"music.help", "Help", " Music Editor Help", ICON_MD_HELP, "Music", nullptr,
160 nullptr, 99, false},
161
162 // Message
163 {"message.message_list", "Message List", nullptr, ICON_MD_LIST, "Message",
164 nullptr, nullptr, 10, false},
165 {"message.message_editor", "Message Editor", nullptr, ICON_MD_EDIT,
166 "Message", nullptr, nullptr, 20, false},
167 {"message.font_atlas", "Font Atlas", nullptr, ICON_MD_FONT_DOWNLOAD,
168 "Message", nullptr, nullptr, 30, false},
169 {"message.dictionary", "Dictionary", nullptr, ICON_MD_BOOK, "Message",
170 nullptr, nullptr, 40, false},
171
172 // Assembly
173 {"assembly.toolbar", "Toolbar", nullptr, ICON_MD_CONSTRUCTION, "Assembly",
174 nullptr, nullptr, 5, true},
175 {"assembly.code_editor", "Code Editor", nullptr, ICON_MD_CODE, "Assembly",
176 nullptr, nullptr, 10, true},
177 {"assembly.file_browser", "File Browser", nullptr, ICON_MD_FOLDER_OPEN,
178 "Assembly", nullptr, nullptr, 20, true},
179 {"assembly.symbols", "Symbols", nullptr, ICON_MD_LIST_ALT, "Assembly",
180 nullptr, nullptr, 30, false},
181 {"assembly.build_output", "Build Output", nullptr, ICON_MD_TERMINAL,
182 "Assembly", nullptr, nullptr, 40, false},
183
184 // Emulator + Memory
185 {"emulator.cpu_debugger", "CPU Debugger", " CPU Debugger",
186 ICON_MD_BUG_REPORT, "Emulator", nullptr, nullptr, 10, false},
187 {"emulator.ppu_viewer", "PPU Viewer", " PPU Viewer",
188 ICON_MD_VIDEOGAME_ASSET, "Emulator", nullptr, nullptr, 20, false},
189 {"emulator.memory_viewer", "Memory Viewer", " Memory Viewer",
190 ICON_MD_MEMORY, "Emulator", nullptr, nullptr, 30, false},
191 {"emulator.breakpoints", "Breakpoints", " Breakpoints", ICON_MD_STOP,
192 "Emulator", nullptr, nullptr, 40, false},
193 {"emulator.performance", "Performance", " Performance", ICON_MD_SPEED,
194 "Emulator", nullptr, nullptr, 50, false},
195 {"emulator.ai_agent", "AI Agent", " AI Agent", ICON_MD_SMART_TOY,
196 "Emulator", nullptr, nullptr, 60, false},
197 {"emulator.save_states", "Save States", " Save States", ICON_MD_SAVE,
198 "Emulator", nullptr, nullptr, 70, false},
199 {"emulator.keyboard_config", "Keyboard Config", " Keyboard Config",
200 ICON_MD_KEYBOARD, "Emulator", nullptr, nullptr, 80, false},
201 {"emulator.virtual_controller", "Virtual Controller",
202 " Virtual Controller", ICON_MD_SPORTS_ESPORTS, "Emulator", nullptr, nullptr,
203 85, false},
204 {"emulator.apu_debugger", "APU Debugger", " APU Debugger",
205 ICON_MD_AUDIOTRACK, "Emulator", nullptr, nullptr, 90, false},
206 {"emulator.audio_mixer", "Audio Mixer", " Audio Mixer", ICON_MD_AUDIO_FILE,
207 "Emulator", nullptr, nullptr, 100, false},
208 {"memory.hex_editor", "Hex Editor", nullptr, ICON_MD_MEMORY, "Memory",
209 nullptr, nullptr, 10, false},
210};
211
213 panel_manager->RegisterSession(kLabSessionId);
214 panel_manager->SetActiveSession(kLabSessionId);
215
216 for (const auto& panel : kLabPanels) {
218 descriptor.card_id = panel.id;
219 descriptor.display_name = panel.display_name;
220 descriptor.window_title = panel.window_title ? panel.window_title : "";
221 descriptor.icon = panel.icon ? panel.icon : "";
222 descriptor.category = panel.category ? panel.category : "";
223 descriptor.shortcut_hint = panel.shortcut ? panel.shortcut : "";
224 descriptor.disabled_tooltip =
225 panel.disabled_tooltip ? panel.disabled_tooltip : "";
226 descriptor.visibility_flag = nullptr;
227 descriptor.priority = panel.priority;
228
229 panel_manager->RegisterPanel(kLabSessionId, descriptor);
230 if (panel.visible_by_default) {
231 panel_manager->ShowPanel(kLabSessionId, panel.id);
232 }
233 }
234}
235
237 const ImGuiViewport* viewport = ImGui::GetMainViewport();
238 ImGui::SetNextWindowPos(viewport->WorkPos);
239 ImGui::SetNextWindowSize(viewport->WorkSize);
240 ImGui::SetNextWindowViewport(viewport->ID);
241
242 ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking |
243 ImGuiWindowFlags_NoTitleBar |
244 ImGuiWindowFlags_NoCollapse |
245 ImGuiWindowFlags_NoResize |
246 ImGuiWindowFlags_NoMove |
247 ImGuiWindowFlags_NoBringToFrontOnFocus |
248 ImGuiWindowFlags_NoNavFocus |
249 ImGuiWindowFlags_NoBackground;
250
251 ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
252 ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
253 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
254 ImGui::Begin("LabDockspace", nullptr, window_flags);
255 ImGui::PopStyleVar(3);
256
257 ImGuiID dockspace_id = ImGui::GetID("MainDockSpace");
258 ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f),
259 ImGuiDockNodeFlags_PassthruCentralNode);
260 ImGui::End();
261}
262
263void DrawLabPanels(const yaze::editor::PanelManager& panel_manager) {
264 const auto& descriptors = panel_manager.GetAllPanelDescriptors();
265 for (const auto& [panel_id, descriptor] : descriptors) {
266 if (descriptor.visibility_flag && !*descriptor.visibility_flag) {
267 continue;
268 }
269
270 bool open = true;
271 bool* open_ptr = descriptor.visibility_flag ? descriptor.visibility_flag : &open;
272 const std::string title = descriptor.GetWindowTitle();
273
274 if (ImGui::Begin(title.c_str(), open_ptr)) {
275 ImGui::Text("Lab panel: %s", descriptor.display_name.c_str());
276 ImGui::Text("Panel ID: %s", panel_id.c_str());
277 }
278 ImGui::End();
279 }
280}
281
282} // namespace
283
284int main(int argc, char** argv) {
285 (void)argc;
286 (void)argv;
287
289 yaze::util::LogLevel::INFO, "", std::set<std::string>{});
290
293 if (!window_backend) {
294 return EXIT_FAILURE;
295 }
296
298 config.title = "Yaze Lab";
299 config.width = 1400;
300 config.height = 900;
301 config.resizable = true;
302 config.high_dpi = false;
303
304 if (!window_backend->Initialize(config).ok()) {
305 return EXIT_FAILURE;
306 }
307
308 auto renderer = yaze::gfx::RendererFactory::Create();
309 if (!renderer || !window_backend->InitializeRenderer(renderer.get())) {
310 window_backend->Shutdown();
311 return EXIT_FAILURE;
312 }
313
314 if (!window_backend->InitializeImGui(renderer.get()).ok()) {
315 renderer->Shutdown();
316 window_backend->Shutdown();
317 return EXIT_FAILURE;
318 }
319
320 yaze::editor::PanelManager panel_manager;
321 RegisterLabPanels(&panel_manager);
322
323 yaze::editor::LayoutManager layout_manager;
324 layout_manager.SetPanelManager(&panel_manager);
325
327 layout_designer.Initialize(&panel_manager, &layout_manager, nullptr);
328 layout_designer.Open();
329
330 bool running = true;
332
333 while (running && window_backend->IsActive()) {
334 while (window_backend->PollEvent(event)) {
337 running = false;
338 }
339 }
340
341 window_backend->NewImGuiFrame();
342 ImGui::NewFrame();
343
345 layout_designer.Draw();
346 DrawLabPanels(panel_manager);
347
348 ImGui::Render();
349 renderer->Clear();
350 window_backend->RenderImGui(renderer.get());
351 renderer->Present();
352 }
353
354 window_backend->ShutdownImGui();
355 renderer->Shutdown();
356 window_backend->Shutdown();
357 return EXIT_SUCCESS;
358}
int main(int argc, char **argv)
Definition main.cc:176
Manages ImGui DockBuilder layouts for each editor type.
void SetPanelManager(PanelManager *manager)
Set the panel manager for window title lookups.
Central registry for all editor cards with session awareness and dependency injection.
void RegisterSession(size_t session_id)
void SetActiveSession(size_t session_id)
bool ShowPanel(size_t session_id, const std::string &base_card_id)
void RegisterPanel(size_t session_id, const PanelDescriptor &base_info)
const std::unordered_map< std::string, PanelDescriptor > & GetAllPanelDescriptors() const
Get all panel descriptors (for layout designer, panel browser, etc.)
Main window for the WYSIWYG layout designer.
void Draw()
Draw the designer window (call every frame)
void Initialize(PanelManager *panel_manager, yaze::editor::LayoutManager *layout_manager=nullptr, yaze::editor::EditorManager *editor_manager=nullptr)
Initialize the designer with manager references.
static std::unique_ptr< IRenderer > Create(RendererBackendType type=RendererBackendType::kDefault)
Create a renderer instance with the specified backend type.
static WindowBackendType GetDefaultType()
Get the default backend type for this build.
static std::unique_ptr< IWindowBackend > Create(WindowBackendType type)
Create a window backend of the specified type.
static LogManager & instance()
Definition log.cc:32
void configure(LogLevel level, const std::string &file_path, const std::set< std::string > &categories)
Configures the logging system.
Definition log.cc:46
#define ICON_MD_GRID_VIEW
Definition icons.h:897
#define ICON_MD_FOLDER_OPEN
Definition icons.h:813
#define ICON_MD_SETTINGS
Definition icons.h:1699
#define ICON_MD_PIANO
Definition icons.h:1462
#define ICON_MD_LIBRARY_MUSIC
Definition icons.h:1080
#define ICON_MD_WAVES
Definition icons.h:2133
#define ICON_MD_TITLE
Definition icons.h:1990
#define ICON_MD_MEMORY
Definition icons.h:1195
#define ICON_MD_LANDSCAPE
Definition icons.h:1059
#define ICON_MD_VIEW_MODULE
Definition icons.h:2093
#define ICON_MD_PETS
Definition icons.h:1431
#define ICON_MD_SHIELD
Definition icons.h:1724
#define ICON_MD_VIEW_LIST
Definition icons.h:2092
#define ICON_MD_CONSTRUCTION
Definition icons.h:458
#define ICON_MD_COLLECTIONS
Definition icons.h:438
#define ICON_MD_DRAW
Definition icons.h:625
#define ICON_MD_BRUSH
Definition icons.h:325
#define ICON_MD_TUNE
Definition icons.h:2022
#define ICON_MD_MAP
Definition icons.h:1173
#define ICON_MD_CODE
Definition icons.h:434
#define ICON_MD_STOP
Definition icons.h:1862
#define ICON_MD_LIST_ALT
Definition icons.h:1095
#define ICON_MD_VIDEOGAME_ASSET
Definition icons.h:2076
#define ICON_MD_FONT_DOWNLOAD
Definition icons.h:818
#define ICON_MD_FILTER_2
Definition icons.h:752
#define ICON_MD_BUG_REPORT
Definition icons.h:327
#define ICON_MD_GRID_3X3
Definition icons.h:892
#define ICON_MD_EDIT
Definition icons.h:645
#define ICON_MD_PUBLIC
Definition icons.h:1524
#define ICON_MD_SPEED
Definition icons.h:1817
#define ICON_MD_AUDIOTRACK
Definition icons.h:213
#define ICON_MD_CASTLE
Definition icons.h:380
#define ICON_MD_VIEW_IN_AR
Definition icons.h:2090
#define ICON_MD_GRID_ON
Definition icons.h:896
#define ICON_MD_FILTER_3
Definition icons.h:753
#define ICON_MD_LIST
Definition icons.h:1094
#define ICON_MD_INVENTORY
Definition icons.h:1011
#define ICON_MD_KEYBOARD
Definition icons.h:1028
#define ICON_MD_DOOR_FRONT
Definition icons.h:613
#define ICON_MD_SPEAKER
Definition icons.h:1812
#define ICON_MD_PLAY_CIRCLE
Definition icons.h:1480
#define ICON_MD_IMAGE
Definition icons.h:982
#define ICON_MD_TERMINAL
Definition icons.h:1951
#define ICON_MD_PERSON
Definition icons.h:1415
#define ICON_MD_SAVE
Definition icons.h:1644
#define ICON_MD_FILTER_1
Definition icons.h:751
#define ICON_MD_SPORTS_ESPORTS
Definition icons.h:1826
#define ICON_MD_PALETTE
Definition icons.h:1370
#define ICON_MD_AUDIO_FILE
Definition icons.h:212
#define ICON_MD_COLOR_LENS
Definition icons.h:440
#define ICON_MD_ANALYTICS
Definition icons.h:154
#define ICON_MD_HELP
Definition icons.h:933
#define ICON_MD_BOOK
Definition icons.h:283
#define ICON_MD_WATER
Definition icons.h:2129
#define ICON_MD_ADD_CIRCLE
Definition icons.h:95
#define ICON_MD_SMART_TOY
Definition icons.h:1781
constexpr size_t kLabSessionId
Definition main.cc:17
constexpr LabPanelSeed kLabPanels[]
Definition main.cc:31
void DrawLabPanels(const yaze::editor::PanelManager &panel_manager)
Definition main.cc:263
void RegisterLabPanels(yaze::editor::PanelManager *panel_manager)
Definition main.cc:212
SDL2/SDL3 compatibility layer.
Metadata for an editor panel (formerly PanelInfo)
Window configuration parameters.
Definition iwindow.h:24
Platform-agnostic window event data.
Definition iwindow.h:63
WindowEventType type
Definition iwindow.h:64