6#include <Foundation/Foundation.h>
25@property(readonly, nonatomic) NSWindow*
window;
28- (instancetype)initWithWindow:(NSWindow*)window
34@interface NSWindow (FlutterWindowSizing)
41@implementation NSWindow (FlutterWindowSizing)
43 [
self setContentSize:NSMakeSize(contentSize.width, contentSize.height)];
47 NSSize size = [
self frameRectForContentRect:self.frame].size;
48 NSSize originalSize = size;
49 [
self setContentMinSize:NSMakeSize(constraints.min_width, constraints.min_height)];
50 size.width = std::max(size.width, constraints.
min_width);
51 size.height = std::max(size.height, constraints.
min_height);
53 [
self setContentMaxSize:NSMakeSize(constraints.max_width, constraints.max_height)];
54 size.width = std::min(size.width, constraints.
max_width);
55 size.height = std::min(size.height, constraints.
max_height);
57 [
self setContentMaxSize:NSMakeSize(CGFLOAT_MAX, CGFLOAT_MAX)];
59 if (!NSEqualSizes(originalSize, size)) {
60 [
self setContentSize:size];
68@synthesize window = _window;
71- (instancetype)initWithWindow:(NSWindow*)window
74 if (
self = [super init]) {
77 _creationRequest = creationRequest;
83- (void)windowDidBecomeKey:(NSNotification*)notification {
84 [_flutterViewController.engine windowDidBecomeKey:_flutterViewController.viewIdentifier];
87- (void)windowDidResignKey:(NSNotification*)notification {
88 [_flutterViewController.engine windowDidResignKey:_flutterViewController.viewIdentifier];
91- (
BOOL)windowShouldClose:(NSWindow*)sender {
93 _creationRequest.on_should_close();
97- (void)windowWillClose {
98 _creationRequest.on_will_close();
101- (void)windowDidResize:(NSNotification*)notification {
103 _creationRequest.notify_listeners();
108- (void)windowDidMiniaturize:(NSNotification*)notification {
110 _creationRequest.notify_listeners();
115- (void)windowDidDeminiaturize:(NSNotification*)notification {
117 _creationRequest.notify_listeners();
120- (void)windowWillEnterFullScreen:(NSNotification*)notification {
122 _creationRequest.notify_listeners();
125- (void)windowWillExitFullScreen:(NSNotification*)notification {
127 _creationRequest.notify_listeners();
140- (instancetype)init {
143 _windows = [NSMutableArray array];
153 NSWindow*
window = [[NSWindow alloc] init];
156 [window setReleasedWhenClosed:NO];
158 window.contentViewController = c;
160 NSWindowStyleMaskResizable | NSWindowStyleMaskTitled | NSWindowStyleMaskClosable;
161 window.collectionBehavior = NSWindowCollectionBehaviorFullScreenAuxiliary;
163 [window flutterSetContentSize:request->size];
166 [window flutterSetConstraints:request->constraints];
170 flutterViewController:c
171 creationRequest:*request];
173 [_windows addObject:w];
175 NSWindow* parent = nil;
179 if (owner.flutterViewController.viewIdentifier == request->
parent_view_id) {
190 [parent beginCriticalSheet:window
191 completionHandler:^(NSModalResponse response){
194 [window setIsVisible:YES];
195 [window makeKeyAndOrderFront:nil];
206 NSWindow*
window = [[NSWindow alloc] init];
209 [window setReleasedWhenClosed:NO];
211 window.contentViewController = c;
212 window.styleMask = NSWindowStyleMaskResizable | NSWindowStyleMaskTitled |
213 NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable;
215 [window flutterSetContentSize:request->size];
218 [window flutterSetConstraints:request->constraints];
220 [window setIsVisible:YES];
221 [window makeKeyAndOrderFront:nil];
224 flutterViewController:c
225 creationRequest:*request];
227 [_windows addObject:w];
232- (void)destroyWindow:(NSWindow*)window {
241 [_windows removeObject:owner];
243 for (NSWindow* win in owner.
window.sheets) {
244 [
self destroyWindow:win];
247 for (NSWindow* win in owner.
window.childWindows) {
248 [
self destroyWindow:win];
253 [owner.flutterViewController dispose];
254 owner.
window.delegate = nil;
255 [owner.window close];
256 [owner windowWillClose];
260- (void)closeAllWindows {
262 [owner.flutterViewController dispose];
263 [owner.window close];
265 [_windows removeAllObjects];
276 [engine enableMultiView];
277 return [engine.windowController createRegularWindow:request];
284 [engine enableMultiView];
285 return [engine.windowController createDialogWindow:request];
289 NSWindow* w = (__bridge NSWindow*)
window;
291 [engine.windowController destroyWindow:w];
297 return (__bridge
void*)controller.view.window;
301 NSWindow* w = (__bridge NSWindow*)
window;
302 NSRect contentRect = [w contentRectForFrameRect:w.frame];
304 .width = contentRect.size.width,
305 .height = contentRect.size.height,
310 NSWindow* w = (__bridge NSWindow*)
window;
311 [w flutterSetContentSize:*size];
317 NSWindow* w = (__bridge NSWindow*)
window;
318 [w flutterSetConstraints:*constraints];
322 NSWindow* w = (__bridge NSWindow*)
window;
323 w.title = [NSString stringWithUTF8String:title];
327 NSWindow* w = (__bridge NSWindow*)
window;
328 if (maximized & !w.isZoomed) {
330 }
else if (!maximized && w.isZoomed) {
336 NSWindow* w = (__bridge NSWindow*)
window;
341 NSWindow* w = (__bridge NSWindow*)
window;
346 NSWindow* w = (__bridge NSWindow*)
window;
347 [w deminiaturize:nil];
351 NSWindow* w = (__bridge NSWindow*)
window;
352 return w.isMiniaturized;
356 NSWindow* w = (__bridge NSWindow*)
window;
357 bool isFullScreen = (w.styleMask & NSWindowStyleMaskFullScreen) != 0;
358 if (fullScreen && !isFullScreen) {
359 [w toggleFullScreen:nil];
360 }
else if (!fullScreen && isFullScreen) {
361 [w toggleFullScreen:nil];
366 NSWindow* w = (__bridge NSWindow*)
window;
367 return (w.styleMask & NSWindowStyleMaskFullScreen) != 0;
371 NSWindow* w = (__bridge NSWindow*)
window;
372 [NSApplication.sharedApplication activateIgnoringOtherApps:YES];
373 [w makeKeyAndOrderFront:nil];
377 NSWindow* w = (__bridge NSWindow*)
window;
378 return strdup(w.title.UTF8String);
382 NSWindow* w = (__bridge NSWindow*)
window;
383 return w.isKeyWindow;
#define FLUTTER_DARWIN_EXPORT
void InternalFlutter_Window_Activate(void *window)
bool InternalFlutter_Window_IsMaximized(void *window)
FLUTTER_DARWIN_EXPORT void InternalFlutter_Window_SetConstraints(void *window, const FlutterWindowConstraints *constraints)
bool InternalFlutter_Window_IsActivated(void *window)
int64_t InternalFlutter_WindowController_CreateDialogWindow(int64_t engine_id, const FlutterWindowCreationRequest *request)
int64_t InternalFlutter_WindowController_CreateRegularWindow(int64_t engine_id, const FlutterWindowCreationRequest *request)
void InternalFlutter_Window_SetFullScreen(void *window, bool fullScreen)
bool InternalFlutter_Window_IsFullScreen(void *window)
void InternalFlutter_Window_SetContentSize(void *window, const FlutterWindowSize *size)
void InternalFlutter_Window_Minimize(void *window)
void * InternalFlutter_Window_GetHandle(int64_t engine_id, FlutterViewIdentifier view_id)
void InternalFlutter_Window_SetTitle(void *window, const char *title)
bool InternalFlutter_Window_IsMinimized(void *window)
void InternalFlutter_Window_Destroy(int64_t engine_id, void *window)
void InternalFlutter_Window_SetMaximized(void *window, bool maximized)
char * InternalFlutter_Window_GetTitle(void *window)
FlutterWindowSize InternalFlutter_Window_GetContentSize(void *window)
void InternalFlutter_Window_Unminimize(void *window)
NSMutableArray< FlutterWindowOwner * > * _windows
G_BEGIN_DECLS FlutterViewId view_id
#define FML_LOG(severity)
FlutterViewIdentifier viewIdentifier
FlutterViewController * _flutterViewController
std::optional< flutter::Isolate > _isolate
FlutterWindowCreationRequest _creationRequest
FlutterViewController * viewController