ObjectivelyMVC
Object oriented MVC framework for SDL3 and GNU C
Loading...
Searching...
No Matches
WindowController Struct Reference

A WindowController manages a ViewController and its descendants within an SDL_Window. More...

#include <WindowController.h>

Inheritance diagram for WindowController:

Public Member Functions

Class * _WindowController (void)
 The WindowController archetype.
 
void debug (WindowController *self)
 Debugs the current frame.
 
WindowControllerinitWithDevice (WindowController *self, RenderDevice *device)
 Initializes this WindowController with the given RenderDevice.
 
ViewkeyResponder (const WindowController *self)
 
Array * keyResponders (const WindowController *self)
 
ViewnextKeyResponder (const WindowController *self, View *keyResponder)
 Finds the next available keyResponder from the given keyResponder.
 
ViewpreviousKeyResponder (const WindowController *self, View *keyResponder)
 Finds the previous available keyResponder from the given keyResponder.
 
void render (WindowController *self)
 Renders the ViewController's View into the RenderDevice's current frame.
 
void renderTo (WindowController *self, CommandBuffer *commands, Framebuffer *framebuffer)
 Renders the ViewController's View into the given Framebuffer.
 
void respondToEvent (WindowController *self, const SDL_Event *event)
 Responds to the given event.
 
void setTheme (WindowController *self, Theme *theme)
 Sets this WindowController's Theme.
 
void setViewController (WindowController *self, ViewController *viewController)
 Sets this WindowController's ViewController.
 
void setWindow (WindowController *self, SDL_Window *window)
 Sets this WindowController's window.
 
void toggleDebugger (WindowController *self)
 Toggles the debugger tools.
 
ViewtouchResponder (const WindowController *self)
 
ViewtouchResponder (const WindowController *self, const SDL_Event *event)
 
WindowControllerwindowController (SDL_Window *window)
 

Data Fields

DebugViewControllerdebugViewController
 The DebugViewController.
 
Object object
 The superclass.
 
Rendererrenderer
 The Renderer.
 
Themetheme
 The Theme.
 
ViewControllerviewController
 The ViewController.
 
SDL_Window * window
 The window.
 

Protected Attributes

WindowControllerInterface * interface
 The interface.
 

Detailed Description

A WindowController manages a ViewController and its descendants within an SDL_Window.

Definition at line 45 of file WindowController.h.

Member Function Documentation

◆ _WindowController()

Class * _WindowController ( void  )

The WindowController archetype.

Returns
The WindowController Class.

Definition at line 547 of file WindowController.c.

547 {
548 static Class *clazz;
549 static Once once;
550
551 do_once(&once, {
552 clazz = _initialize(&(const ClassDef) {
553 .name = "WindowController",
554 .superclass = _Object(),
555 .instanceSize = sizeof(WindowController),
556 .interfaceOffset = offsetof(WindowController, interface),
557 .interfaceSize = sizeof(WindowControllerInterface),
559 });
560 });
561
562 return clazz;
563}
static void initialize(Class *clazz)
Definition Box.c:123
A WindowController manages a ViewController and its descendants within an SDL_Window.
WindowControllerInterface * interface
The interface.

◆ debug()

void debug ( WindowController self)

Debugs the current frame.

Parameters
selfThe WindowController.

Definition at line 76 of file WindowController.c.

76 {
77
78 if (self->viewController && self->debugViewController) {
79
81
82 float mx, my;
83 SDL_GetMouseState(&mx, &my);
84 SDL_Point point = MakePoint(mx, my);
85
86 View *view = $(self->viewController->view, hitTest, &point);
87 if (view) {
88 $(self->debugViewController, debug, view, self->renderer);
89 }
90
94 }
95}
static void layoutIfNeeded(View *self)
Definition View.c:1104
static void draw(View *self, Renderer *renderer)
Definition View.c:709
static View * hitTest(const View *self, const SDL_Point *point)
Definition View.c:943
static void applyThemeIfNeeded(View *self, const Theme *theme)
Definition View.c:317
A ViewController manages a View and its descendants.
View * view
The main view.
Views are the fundamental building blocks of ObjectivelyMVC user interfaces.
Definition View.h:134
ViewController * viewController
The ViewController.
Theme * theme
The Theme.
Renderer * renderer
The Renderer.
DebugViewController * debugViewController
The DebugViewController.
void debug(WindowController *self)
Debugs the current frame.

◆ initWithDevice()

WindowController * initWithDevice ( WindowController self,
RenderDevice *  device 
)

Initializes this WindowController with the given RenderDevice.

Parameters
selfThe WindowController.
deviceThe RenderDevice.
Returns
The initialized WindowController, or NULL on error.

Definition at line 131 of file WindowController.c.

131 {
132
133 assert(device);
134
135 self = (WindowController *) super(Object, self, init);
136 if (self) {
137 self->renderer = $(alloc(Renderer), initWithDevice, device);
138 assert(self->renderer);
139
140 $(self, setWindow, device->window);
141 $(self, setViewController, NULL);
142 $(self, setTheme, NULL);
143
146 }
147
148 return self;
149}
static View * init(View *self)
Definition Box.c:67
static void renderDeviceDidReset(Font *self)
Definition Font.c:248
Renderer extends Object with ObjectivelyMVC's UI rendering layer.
Definition Renderer.h:70
void setWindow(WindowController *self, SDL_Window *window)
Sets this WindowController's window.
WindowController * initWithDevice(WindowController *self, RenderDevice *device)
Initializes this WindowController with the given RenderDevice.
void setViewController(WindowController *self, ViewController *viewController)
Sets this WindowController's ViewController.
void setTheme(WindowController *self, Theme *theme)
Sets this WindowController's Theme.

◆ keyResponder()

View * keyResponder ( const WindowController self)
Parameters
selfThe WindowController.
Returns
The key responder or NULL.

Definition at line 101 of file WindowController.c.

101 {
102 return SDL_GetPointerProperty(SDL_GetWindowProperties(self->window), "keyResponder", NULL);
103}
SDL_Window * window
The window.

◆ keyResponders()

Array * keyResponders ( const WindowController self)
Parameters
selfThe WindowController.
Returns
An Array of all first responders in the WindowController's View hierarchy.

Definition at line 119 of file WindowController.c.

119 {
120
121 Array *array = (Array *) $(alloc(Array), init);
123
124 return array;
125}
static void enumerateDescendants(const View *self, ViewEnumerator enumerator, ident data)
Definition View.c:797
static void enumerateKeyResponders(View *view, ident data)
ViewEnumerator for finding the next key responder.

◆ nextKeyResponder()

View * nextKeyResponder ( const WindowController self,
View keyResponder 
)

Finds the next available keyResponder from the given keyResponder.

Parameters
selfThe WindowController.
keyResponderThe current keyResponder.
Returns
The next keyResponder, or NULL.

Definition at line 188 of file WindowController.c.

188 {
189
190 View *next = NULL;
191
192 Array *array = $(self, keyResponders);
193
194 if (array->count) {
195 if (keyResponder && $(array, containsObject, keyResponder)) {
196 const ssize_t index = $(array, indexOfObject, keyResponder);
197 next = $(array, objectAtIndex, (index + 1) % array->count);
198 } else {
199 next = $(array, firstObject);
200 }
201 }
202
203 release(array);
204 return next;
205}
Array * keyResponders(const WindowController *self)
View * keyResponder(const WindowController *self)

◆ previousKeyResponder()

View * previousKeyResponder ( const WindowController self,
View keyResponder 
)

Finds the previous available keyResponder from the given keyResponder.

Parameters
selfThe WindowController.
keyResponderThe current keyResponder.
Returns
The previous keyResponder, or NULL.

Definition at line 211 of file WindowController.c.

211 {
212
213 View *prev = NULL;
214
215 Array *array = $(self, keyResponders);
216
217 if (array->count) {
218 if (keyResponder && $(array, containsObject, keyResponder)) {
219 const ssize_t index = $(array, indexOfObject, keyResponder);
220 prev = $(array, objectAtIndex, (index + array->count - 1) % array->count);
221 } else {
222 prev = $(array, firstObject);
223 }
224 }
225
226 release(array);
227 return prev;
228}

◆ render()

void render ( WindowController self)

Renders the ViewController's View into the RenderDevice's current frame.

Convenience over renderTo for the common case of rendering the UI into the device's own current command buffer and framebuffer. Equivalent to $(self, renderTo, device->commands, device->framebuffer).

Parameters
selfThe WindowController.

Definition at line 155 of file WindowController.c.

155 {
156
157 assert(self->renderer);
158
159 const RenderDevice *device = self->renderer->device;
160 $(self, renderTo, device->commands, device->framebuffer);
161}
RenderDevice * device
The backing RenderDevice.
Definition Renderer.h:92
void renderTo(WindowController *self, CommandBuffer *commands, Framebuffer *framebuffer)
Renders the ViewController's View into the given Framebuffer.

◆ renderTo()

void renderTo ( WindowController self,
CommandBuffer *  commands,
Framebuffer *  framebuffer 
)

Renders the ViewController's View into the given Framebuffer.

The caller owns commands and is responsible for submitting it after this returns. The UI is composited over whatever is already in the Framebuffer's color texture (SDL_GPU_LOADOP_LOAD), so render your scene into the Framebuffer first.

Parameters
selfThe WindowController.
commandsThe frame's CommandBuffer.
framebufferThe Framebuffer to render the UI into.

Definition at line 167 of file WindowController.c.

167 {
168
169 assert(self->renderer);
170 assert(commands);
171 assert(framebuffer);
172
173 $(self->renderer, beginFrameWith, commands, framebuffer);
174
177 $(self->viewController->view, draw, self->renderer);
178
179 $(self, debug);
180
181 $(self->renderer, endFrame);
182}
static void endFrame(Renderer *self)
Definition Renderer.c:261
static void beginFrameWith(Renderer *self, CommandBuffer *commands, Framebuffer *framebuffer)
Definition Renderer.c:108

◆ respondToEvent()

void respondToEvent ( WindowController self,
const SDL_Event *  event 
)

Responds to the given event.

Remarks
Exposure MUST NOT reset render device resources. It fires on every frame on some platforms, where resetting leaks a generation of GPU resources per frame. Only the view hierarchy's resources depend on the window, through its pixel density, so only a change in pixel density resets them. The renderer's own resources are created with the device.
Window events for another window MUST be ignored, or a window being torn down releases the resources of the controller that replaced it.
Parameters
selfThe WindowController.
eventThe event.
Remarks
Your application should call this method for each event that the View hierarchy is expected to respond to. The event will be dispatched to WindowController::keyResponder, which is the first of:
By default, the event is passed up the View hierarchy by View::respondToEvent. Subclasses of View, such as Control, may stop event propagation if an event has been captured.

Definition at line 240 of file WindowController.c.

240 {
241
242 if (event->type >= SDL_EVENT_WINDOW_FIRST && event->type <= SDL_EVENT_WINDOW_LAST) {
243 if (event->window.windowID != SDL_GetWindowID(self->window)) {
244 return;
245 }
246 }
247
248 SDL_SetPointerProperty(SDL_GetWindowProperties(self->window), "event", (ident) event);
249
250 switch (event->type) {
251 case SDL_EVENT_WINDOW_MOVED:
252 case SDL_EVENT_WINDOW_RESIZED:
253 case SDL_EVENT_WINDOW_MAXIMIZED:
254 case SDL_EVENT_WINDOW_RESTORED:
255 case SDL_EVENT_WINDOW_SAFE_AREA_CHANGED:
256 $(self, setWindow, self->window);
257 break;
258 case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:
259 case SDL_EVENT_WINDOW_DISPLAY_CHANGED:
260 case SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED:
261 $(self, setWindow, self->window);
265 break;
266 case SDL_EVENT_WINDOW_DESTROYED:
267 case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
270 break;
271 default:
272 break;
273 }
274
275 if (event->type == SDL_EVENT_MOUSE_MOTION) {
277 }
278
280
281 View *touchTarget = $(self, touchTarget, event);
282
283 switch (event->type) {
284 case SDL_EVENT_KEY_UP:
285 case SDL_EVENT_KEY_DOWN:
286 case SDL_EVENT_TEXT_INPUT:
287 if (keyResponder) {
288 $(keyResponder, respondToEvent, event);
289 } else {
290 $(self->viewController, respondToEvent, event);
291 }
292 break;
293 case SDL_EVENT_MOUSE_BUTTON_DOWN:
294 if (touchTarget) {
296 $(touchTarget, respondToEvent, event);
297 } else if (touchResponder) {
300 } else {
301 $(self->viewController, respondToEvent, event);
302 }
303
307 }
308 break;
309 case SDL_EVENT_MOUSE_BUTTON_UP:
310 if (touchResponder) {
312 } else if (touchTarget) {
313 $(touchTarget, respondToEvent, event);
314 } else {
315 $(self->viewController, respondToEvent, event);
316 }
317 break;
318 case SDL_EVENT_MOUSE_MOTION:
319 case SDL_EVENT_MOUSE_WHEEL:
320 if (touchResponder) {
322 } else if (touchTarget) {
323 $(touchTarget, respondToEvent, event);
324 } else {
325 $(self->viewController, respondToEvent, event);
326 }
327 break;
328 default:
329 $(self->viewController, respondToEvent, event);
330 break;
331 }
332
333 if (event->type == SDL_EVENT_KEY_DOWN) {
334 if (event->key.key == SDLK_TAB) {
335
336 if (event->key.mod & SDL_KMOD_SHIFT) {
338 } else {
340 }
341
342 if (keyResponder) {
344 }
345 }
346
347 if (event->key.key == SDLK_D) {
348 if (event->key.mod & SDL_KMOD_CTRL) {
349 $(self, toggleDebugger);
350 }
351 }
352 }
353
354 SDL_SetPointerProperty(SDL_GetWindowProperties(self->window), "event", NULL);
355}
static void becomeKeyResponder(View *self)
Definition Control.c:130
static void resignKeyResponder(View *self)
Definition Control.c:248
static void updateBindings(View *self)
static void renderDeviceWillReset(View *self)
Definition ImageView.c:119
static void enumerateVisible(View *self, ViewEnumerator enumerator, ident data)
Definition View.c:862
static void becomeTouchResponder(View *self)
Definition View.c:451
static void resignTouchResponder(View *self)
Definition View.c:1500
static View * touchTarget(const WindowController *self, const SDL_Event *event)
static void mouseMotion_enumerate(View *view, ident data)
ViewEnumerator for SDL_EVENT_MOUSE_MOTION.
View * touchResponder(const WindowController *self, const SDL_Event *event)
View * previousKeyResponder(const WindowController *self, View *keyResponder)
Finds the previous available keyResponder from the given keyResponder.
void toggleDebugger(WindowController *self)
Toggles the debugger tools.
View * nextKeyResponder(const WindowController *self, View *keyResponder)
Finds the next available keyResponder from the given keyResponder.
void respondToEvent(WindowController *self, const SDL_Event *event)
Responds to the given event.

◆ setTheme()

void setTheme ( WindowController self,
Theme theme 
)

Sets this WindowController's Theme.

Parameters
selfThe WindowController.
themeThe Theme.

Definition at line 361 of file WindowController.c.

361 {
362
363 if (self->theme != theme || self->theme == NULL) {
364
365 release(self->theme);
366
367 if (theme) {
368 self->theme = retain(theme);
369 } else {
370 self->theme = $(alloc(Theme), init);
371 }
372 }
373
375}
static void invalidateStyle(View *self)
Definition View.c:1022
The Theme type.
Definition Theme.h:51

◆ setViewController()

void setViewController ( WindowController self,
ViewController viewController 
)

Sets this WindowController's ViewController.

Parameters
selfThe WindowController.
viewControllerThe ViewController.

Definition at line 381 of file WindowController.c.

381 {
382
383 if (self->viewController != viewController || self->viewController == NULL) {
384
385 SDL_SetPointerProperty(SDL_GetWindowProperties(self->window), "keyResponder", NULL);
386
387 if (self->viewController) {
389 $(self->viewController->view, moveToWindow, NULL);
391 }
392
393 release(self->viewController);
394
395 if (viewController) {
396 self->viewController = retain(viewController);
397 } else {
398 self->viewController = $(alloc(ViewController), init);
399 }
400
402
404 $(self->viewController->view, moveToWindow, self->window);
406 }
407}
static void moveToWindow(View *self, SDL_Window *window)
Definition View.c:1251
static void viewWillAppear(ViewController *self)
static void viewWillDisappear(ViewController *self)
static void loadViewIfNeeded(ViewController *self)
static void viewDidAppear(ViewController *self)
static void viewDidDisappear(ViewController *self)

◆ setWindow()

void setWindow ( WindowController self,
SDL_Window *  window 
)

Sets this WindowController's window.

Parameters
selfThe WindowController.
windowThe window.

Definition at line 413 of file WindowController.c.

413 {
414
415 self->window = window;
416 assert(self->window);
417
418 SDL_PropertiesID properties = SDL_GetWindowProperties(self->window);
419
420 SDL_SetPointerProperty(properties, "windowController", self);
421 SDL_SetPointerProperty(properties, "keyResponder", NULL);
422 SDL_SetPointerProperty(properties, "touchResponder", NULL);
423
424 if (self->renderer) {
425 $(self->renderer->device, setWindow, self->window);
426 }
427
428 if (self->viewController) {
429 $(self->viewController->view, moveToWindow, self->window);
430 }
431
432 if (self->debugViewController) {
434 }
435}
ViewController viewController
The superclass.

◆ toggleDebugger()

void toggleDebugger ( WindowController self)

Toggles the debugger tools.

Parameters
selfThe WindowViewController.

Definition at line 441 of file WindowController.c.

441 {
442
443 if (self->debugViewController == NULL) {
444
446 assert(self->debugViewController);
447
449
454
455 if (self->viewController) {
456 $(self->viewController->view, addClassName, "debug");
457 }
458 } else {
459 self->debugViewController = release(self->debugViewController);
460
461 if (self->viewController) {
462 $(self->viewController->view, removeClassName, "debug");
463 }
464 }
465}
static void loadView(ViewController *self)
static void removeClassName(View *self, const char *className)
Definition View.c:1333
static void addClassName(View *self, const char *className)
Definition View.c:159
The DebugViewController type.

◆ touchResponder() [1/2]

View * touchResponder ( const WindowController self)
Parameters
selfThe WindowController.
Returns
The touch responder or NULL.
See also
View::hitTest(const View *, const SDL_Point *)

Definition at line 471 of file WindowController.c.

471 {
472 return SDL_GetPointerProperty(SDL_GetWindowProperties(self->window), "touchResponder", NULL);
473}

◆ touchResponder() [2/2]

View * touchResponder ( const WindowController self,
const SDL_Event *  event 
)

◆ windowController()

WindowController * windowController ( SDL_Window *  window)
Parameters
windowThe window.
Returns
The WindowController bound to the given window.

Definition at line 509 of file WindowController.c.

509 {
510
511 assert(window);
512
513 return SDL_GetPointerProperty(SDL_GetWindowProperties(window), "windowController", NULL);
514}

Field Documentation

◆ debugViewController

DebugViewController* WindowController::debugViewController

The DebugViewController.

Definition at line 61 of file WindowController.h.

◆ interface

WindowControllerInterface* WindowController::interface
protected

The interface.

Definition at line 56 of file WindowController.h.

◆ object

Object WindowController::object

The superclass.

Definition at line 50 of file WindowController.h.

◆ renderer

Renderer* WindowController::renderer

The Renderer.

Definition at line 66 of file WindowController.h.

◆ theme

Theme* WindowController::theme

The Theme.

Definition at line 71 of file WindowController.h.

◆ viewController

ViewController* WindowController::viewController

The ViewController.

Definition at line 76 of file WindowController.h.

◆ window

SDL_Window* WindowController::window

The window.

Definition at line 81 of file WindowController.h.


The documentation for this struct was generated from the following files: