Vuo 2.4.4
Loading...
Searching...
No Matches
VuoWindow.m
Go to the documentation of this file.
1
10#import "VuoWindow.h"
12#import "VuoGraphicsWindow.h"
13#include "VuoEventLoop.h"
14#include "VuoCompositionState.h"
15#include "VuoApp.h"
17
18#ifdef VUO_COMPILER
20 "title" : "VuoWindow",
21 "dependencies" : [
22 "AppKit.framework",
23 "VuoGraphicsWindow",
24 "VuoWindowTextInternal"
25 ]
26 });
27#endif
28
30
39{
40 void *compositionState = vuoCopyCompositionStateFromThreadLocalStorage();
41
42 __block VuoWindowTextInternal *window = NULL;
43 VUOLOG_PROFILE_BEGIN(mainQueue);
44 dispatch_sync(dispatch_get_main_queue(), ^{
45 VUOLOG_PROFILE_END(mainQueue);
47
48 VuoApp_init(true);
49 window = [[VuoWindowTextInternal alloc] init];
50
51 window.alphaValue = 0;
53 [window orderWindow:NSWindowBelow relativeTo:VuoApp_splashWindow.windowNumber];
54 else
55 [window orderFront:NSApp];
56 [window makeKeyWindow];
57
58 [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
59 context.duration = VuoApp_windowFadeSeconds;
60 window.animator.alphaValue = 1;
61 } completionHandler:^{}];
62
64 free(compositionState);
65 });
67 return (VuoWindowText *)window;
68}
69
76(
78 VuoOutputTrigger(typedLine, VuoText),
79 VuoOutputTrigger(typedWord, VuoText),
80 VuoOutputTrigger(typedCharacter, VuoText)
81)
82{
84 VUOLOG_PROFILE_BEGIN(mainQueue);
85 dispatch_sync(dispatch_get_main_queue(), ^{
86 VUOLOG_PROFILE_END(mainQueue);
87 [window enableTriggersWithTypedLine:typedLine typedWord:typedWord typedCharacter:typedCharacter];
88 });
89}
90
97{
99 VUOLOG_PROFILE_BEGIN(mainQueue);
100 dispatch_sync(dispatch_get_main_queue(), ^{
101 VUOLOG_PROFILE_END(mainQueue);
102 [window disableTriggers];
103 });
104}
105
111void VuoWindowText_appendLine(VuoWindowText vw, const char *text)
112{
114 char *textCopy = text ? strdup(text) : strdup(""); // ... in case the caller frees text before the asynchronous block uses it.
115 VUOLOG_PROFILE_BEGIN(mainQueue);
116 dispatch_async(dispatch_get_main_queue(), ^{
117 VUOLOG_PROFILE_END(mainQueue);
118 [window appendLine:textCopy];
119 free(textCopy);
120 });
121}
122
129{
132 [window clear];
133 });
134}
135
142{
144 VuoRetain(window);
145 VUOLOG_PROFILE_BEGIN(mainQueue);
146 dispatch_sync(dispatch_get_main_queue(), ^{
147 VUOLOG_PROFILE_END(mainQueue);
148
149 void (^completionHandler)(void) = ^{
150 [window close];
151 VuoRelease(window);
152 };
153
154 // When fullscreen, macOS performs its own close animation, so only apply our fade-out animation when windowed.
155 if (window.styleMask & NSWindowStyleMaskFullScreen)
156 completionHandler();
157 else
158 [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
159 context.duration = VuoApp_windowFadeSeconds;
160 window.animator.alphaValue = 0;
161 } completionHandler:completionHandler];
162 });
163}
164
171{
174 [window release];
175 });
176}
177
178
180
189(
190 void (*initCallback)(void *, float backingScaleFactor),
191 void (*updateBackingCallback)(void *, float backingScaleFactor),
192 void (*resizeCallback)(void *, unsigned int, unsigned int),
193 VuoIoSurface (*drawCallback)(void *),
194 void *context
195)
196{
197 __block VuoGraphicsWindow *window = NULL;
198 void *compositionState = vuoCopyCompositionStateFromThreadLocalStorage();
199
200 VUOLOG_PROFILE_BEGIN(mainQueue);
201 dispatch_sync(dispatch_get_main_queue(), ^{
202 VUOLOG_PROFILE_END(mainQueue);
204
205 VuoApp_init(true);
206 window = [[VuoGraphicsWindow alloc] initWithInitCallback:initCallback
207 updateBackingCallback:updateBackingCallback
208 resizeCallback:resizeCallback
209 drawCallback:drawCallback
210 userData:context];
211 window.compositionUid = vuoGetCompositionUniqueIdentifier(compositionState);
212
213 window.alphaValue = 0;
215 [window orderWindow:NSWindowBelow relativeTo:VuoApp_splashWindow.windowNumber];
216 else
217 [window orderFront:NSApp];
218 [window makeKeyWindow];
219
220 [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
221 context.duration = VuoApp_windowFadeSeconds;
222 window.animator.alphaValue = 1;
223 } completionHandler:^{}];
224
226 free(compositionState);
227 });
229 return (VuoWindowOpenGl *)window;
230}
231
239(
241 VuoOutputTrigger(updatedWindow, VuoRenderedLayers)
242)
243{
245 [window enableUpdatedWindowTrigger:updatedWindow];
246}
247
255(
258 VuoOutputTrigger(requestedFrame, VuoReal)
259)
260{
262 [window enableShowedWindowTrigger:showedWindow requestedFrameTrigger:requestedFrame];
263}
264
275
283{
285 [window draw];
286}
287
294{
296 VUOLOG_PROFILE_BEGIN(mainQueue);
297 dispatch_sync(dispatch_get_main_queue(), ^{
298 VUOLOG_PROFILE_END(mainQueue);
299 [window setProperties:properties];
300 });
301}
302
309void VuoWindowOpenGl_setAspectRatio(VuoWindowOpenGl w, unsigned int pixelsWide, unsigned int pixelsHigh)
310{
312 VUOLOG_PROFILE_BEGIN(mainQueue);
313 dispatch_async(dispatch_get_main_queue(), ^{
314 VUOLOG_PROFILE_END(mainQueue);
315 [window setAspectRatioToWidth:pixelsWide height:pixelsHigh];
316 });
317}
318
325{
327 VUOLOG_PROFILE_BEGIN(mainQueue);
328 dispatch_async(dispatch_get_main_queue(), ^{
329 VUOLOG_PROFILE_END(mainQueue);
330 [window unlockAspectRatio];
331 });
332}
333
340void VuoWindowOpenGl_close(VuoWindowOpenGl vw, void (^closedHandler)(void))
341{
342 VuoGraphicsWindow *window = (VuoGraphicsWindow *)vw;
343 VuoRetain(window);
344 VUOLOG_PROFILE_BEGIN(mainQueue);
345 dispatch_sync(dispatch_get_main_queue(), ^{
346 VUOLOG_PROFILE_END(mainQueue);
347
348 void (^completionHandler)(void) = ^{
349 [window close];
350 VuoRelease(window);
351 closedHandler();
352 };
353
354 // When fullscreen, macOS performs its own close animation, so only apply our fade-out animation when windowed.
355 if (window.isFullScreen)
356 completionHandler();
357 else
358 [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
359 context.duration = VuoApp_windowFadeSeconds;
360 window.animator.alphaValue = 0;
361 } completionHandler:completionHandler];
362 });
363}
364
371{
372 VuoGraphicsWindow *window = (VuoGraphicsWindow *)vw;
374 [window release];
375 });
376}