1 #import <AppKit/NSWindow.h>
2 #import <CoreFoundation/CFArray.h>
3 #include "cocoadisplay.h"
4 #include "cocoawindow.h"
6 @interface WindowDelegate: NSObject <NSWindowDelegate>
8 - (BOOL)windowShouldClose:(id)sender;
14 CocoaDisplay *display;
15 __strong NSWindow *window;
16 __strong WindowDelegate *delegate;
20 CFMutableDictionaryRef windows = NULL;
22 CocoaWindow *create_window(CocoaDisplay *display, unsigned width, unsigned height, bool fullscreen, bool resizable)
24 NSRect rect = NSMakeRect(0, 0, width, height);
25 NSUInteger style = NSTitledWindowMask|NSClosableWindowMask;
27 style |= NSResizableWindowMask;
28 NSWindow *window = [NSWindow alloc];
29 window = [window initWithContentRect:rect styleMask:style backing:NSBackingStoreBuffered defer:NO];
30 [window setAcceptsMouseMovedEvents:YES];
34 CocoaWindow *wrapper = (CocoaWindow *)malloc(sizeof(CocoaWindow));
35 wrapper->display = display;
36 wrapper->window = window;
37 wrapper->style = style;
39 wrapper->delegate = [[WindowDelegate alloc] init];
40 [window setDelegate:wrapper->delegate];
43 windows = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
44 CFDictionaryAddValue(windows, window, wrapper);
49 void destroy_window(CocoaWindow *window)
51 CFDictionaryRemoveValue(windows, window->window);
52 if(!CFDictionaryGetCount(windows))
58 [window->window release];
59 [window->delegate release];
63 NSWindow *get_native_window(CocoaWindow *window)
65 return window->window;
68 CocoaWindow *lookup_window(NSWindow *window)
70 return (CocoaWindow *)CFDictionaryGetValue(windows, window);
73 void set_window_title(CocoaWindow *window, const char *title)
75 [window->window setTitle:[NSString stringWithCString:title encoding:NSUTF8StringEncoding]];
78 void set_window_size(CocoaWindow *window, unsigned width, unsigned height)
80 NSRect rect = NSMakeRect(0, 0, width, height);
81 rect = [NSWindow frameRectForContentRect:rect styleMask:window->style];
82 [window->window setFrame:rect display:YES];
85 void show_window(CocoaWindow *window)
87 [window->window makeKeyAndOrderFront:nil];
88 [NSApp activateIgnoringOtherApps:NO];
91 void hide_window(CocoaWindow *window)
96 @implementation WindowDelegate
98 - (BOOL)windowShouldClose:(id)sender
100 CocoaWindow *window = lookup_window((NSWindow *)sender);
104 event.any.type = WINDOW_CLOSED;
105 event.any.window = window;
106 queue_event(window->display, &event);