Blob


1 #define Point OSXPoint
2 #define Rect OSXRect
3 #define Cursor OSXCursor
4 #import "osx-delegate.h"
5 #import <Foundation/Foundation.h>
6 #import <AppKit/AppKit.h>
7 #undef Cursor
8 #undef Rect
9 #undef Point
11 #include <u.h>
12 #include <errno.h>
13 #include <sys/select.h>
14 #include <libc.h>
15 #include <draw.h>
16 #include <memdraw.h>
17 #include <memlayer.h>
18 #include <keyboard.h>
19 #include <mouse.h>
20 #include <cursor.h>
21 #include <drawfcall.h>
23 AUTOFRAMEWORK(Foundation)
24 AUTOFRAMEWORK(AppKit)
26 extern int trace;
28 extern void fullscreen(int);
29 extern void kbdevent(NSEvent *event);
30 extern void mouseevent(NSEvent *event);
31 extern void eresized(int);
33 extern void runmsg(Wsysmsg *m);
34 extern void seticon();
36 @implementation DevdrawDelegate
37 +(void)populateMainMenu
38 {
39 NSMenu *mainMenu = [[NSMenu alloc] initWithTitle:@"MainMenu"];
40 NSMenuItem *menuItem;
41 NSMenu *submenu;
43 menuItem = [mainMenu addItemWithTitle:@"Apple" action:NULL keyEquivalent:@""];
44 submenu = [[NSMenu alloc] initWithTitle:@"Apple"];
45 [NSApp performSelector:@selector(setAppleMenu:) withObject:submenu];
46 [self populateApplicationMenu:submenu];
47 [mainMenu setSubmenu:submenu forItem:menuItem];
49 menuItem = [mainMenu addItemWithTitle:@"View" action:NULL keyEquivalent:@""];
50 submenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"View", "@The View menu")];
51 [self populateViewMenu:submenu];
52 [mainMenu setSubmenu:submenu forItem:menuItem];
54 menuItem = [mainMenu addItemWithTitle:@"Window" action:NULL keyEquivalent:@""];
55 submenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"Window", @"The Window menu")];
56 [self populateWindowMenu:submenu];
57 [mainMenu setSubmenu:submenu forItem:menuItem];
58 [NSApp setWindowsMenu:submenu];
60 menuItem = [mainMenu addItemWithTitle:@"Help" action:NULL keyEquivalent:@""];
61 submenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"Help", @"The Help menu")];
62 [self populateHelpMenu:submenu];
63 [mainMenu setSubmenu:submenu forItem:menuItem];
65 [NSApp setMainMenu:mainMenu];
66 }
68 +(void)populateApplicationMenu:(NSMenu *)aMenu
69 {
70 NSString *applicationName = [[NSProcessInfo processInfo] processName];
71 NSMenuItem *menuItem;
73 menuItem = [aMenu addItemWithTitle:[NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"About", nil), applicationName]
74 action:@selector(orderFrontStandardAboutPanel:)
75 keyEquivalent:@""];
76 [menuItem setTarget:NSApp];
78 [aMenu addItem:[NSMenuItem separatorItem]];
80 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Preferences...", nil)
81 action:NULL
82 keyEquivalent:@","];
84 [aMenu addItem:[NSMenuItem separatorItem]];
86 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Services", nil)
87 action:NULL
88 keyEquivalent:@""];
89 NSMenu * servicesMenu = [[NSMenu alloc] initWithTitle:@"Services"];
90 [aMenu setSubmenu:servicesMenu forItem:menuItem];
91 [NSApp setServicesMenu:servicesMenu];
93 [aMenu addItem:[NSMenuItem separatorItem]];
95 menuItem = [aMenu addItemWithTitle:[NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"Hide", nil), applicationName]
96 action:@selector(hide:)
97 keyEquivalent:@"h"];
98 [menuItem setTarget:NSApp];
100 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Hide Others", nil)
101 action:@selector(hideOtherApplications:)
102 keyEquivalent:@"h"];
103 [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
104 [menuItem setTarget:NSApp];
106 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Show All", nil)
107 action:@selector(unhideAllApplications:)
108 keyEquivalent:@""];
109 [menuItem setTarget:NSApp];
111 [aMenu addItem:[NSMenuItem separatorItem]];
113 menuItem = [aMenu addItemWithTitle:[NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"Quit", nil), applicationName]
114 action:@selector(terminate:)
115 keyEquivalent:@"q"];
116 [menuItem setTarget:NSApp];
119 +(void)populateViewMenu:(NSMenu *)aMenu
121 NSMenuItem *menuItem;
122 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Full Screen", nil)
123 action:@selector(fullscreen:) keyEquivalent:@"F"];
124 [menuItem setTarget:NSApp];
126 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Cmd-F exits full screen", nil)
127 action:NULL keyEquivalent:@""];
130 +(void)populateWindowMenu:(NSMenu *)aMenu
134 +(void)populateHelpMenu:(NSMenu *)aMenu
138 - (void)applicationWillFinishLaunching:(NSNotification *)notification
140 seticon();
143 - (void)applicationDidFinishLaunching:(NSNotification *)notification
145 [DevdrawDelegate populateMainMenu];
147 // [NSThread detachNewThreadSelector:@selector(devdrawMain)
148 // toTarget:self withObject:nil];
149 // [NSApplication detachDrawingThread:@selector(devdrawMain)
150 // toTarget:self withObject:nil];
151 [readHandle waitForDataInBackgroundAndNotify];
154 - (id)init
156 if(self = [super init]){
157 readHandle = [[NSFileHandle alloc] initWithFileDescriptor:3 closeOnDealloc:YES];
158 [[NSNotificationCenter defaultCenter] addObserver:self
159 selector:@selector(devdrawMain:)
160 name:NSFileHandleDataAvailableNotification
161 object:readHandle];
162 [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
163 selector:@selector(receiveWake:)
164 name:NSWorkspaceDidWakeNotification
165 object:NULL];
167 return self;
170 - (void)dealloc
172 [[NSNotificationCenter defaultCenter] removeObserver:self];
173 [readHandle release];
174 return [super dealloc];
177 - (void)devdrawMain:(NSNotification *)notification
179 uchar buf[4], *mbuf;
180 int nmbuf, n, nn;
181 Wsysmsg m;
182 NSData *data;
184 mbuf = nil;
185 nmbuf = 0;
187 data = [readHandle readDataOfLength:4];
188 if([data length] == 4){
189 [data getBytes:buf length:4];
190 GET(buf, n);
191 if(n > nmbuf){
192 free(mbuf);
193 mbuf = malloc(4+n);
194 if(mbuf == nil)
195 sysfatal("malloc: %r");
196 nmbuf = n;
198 memmove(mbuf, buf, 4);
199 data = [readHandle readDataOfLength:(n-4)];
200 [data getBytes:(mbuf+4)];
201 nn = [data length];
202 if(nn != n-4)
203 sysfatal("eof during message");
205 /* pick off messages one by one */
206 if(convM2W(mbuf, nn+4, &m) <= 0)
207 sysfatal("cannot convert message");
208 if(trace) fprint(2, "<- %W\n", &m);
209 runmsg(&m);
210 } else {
211 [NSApp terminate:self];
213 [readHandle waitForDataInBackgroundAndNotify];
215 return;
217 while((n = read(3, buf, 4)) == 4){
218 GET(buf, n);
219 if(n > nmbuf){
220 free(mbuf);
221 mbuf = malloc(4+n);
222 if(mbuf == nil)
223 sysfatal("malloc: %r");
224 nmbuf = n;
226 memmove(mbuf, buf, 4);
227 nn = readn(3, mbuf+4, n-4);
228 if(nn != n-4)
229 sysfatal("eof during message");
231 /* pick off messages one by one */
232 if(convM2W(mbuf, nn+4, &m) <= 0)
233 sysfatal("cannot convert message");
234 if(trace) fprint(2, "<- %W\n", &m);
235 runmsg(&m);
239 #pragma mark Notifications
241 - (void)fullscreen:(NSNotification *)notification
243 fullscreen(1);
246 - (void)windowWillClose:(NSNotification *)notification
248 // if(osx.window == [notification object]){
249 [[NSNotificationCenter defaultCenter] removeObserver:self];
250 [NSApp terminate:self];
251 // }
254 - (void)windowDidResize:(NSNotification *)notification
256 // if(osx.window == [notification object]) {
257 eresized(1);
258 // }
261 - (void)receiveWake:(NSNotification *)notification
263 if(trace) NSLog(@"%s:%d %@", __FILE__, __LINE__, notification);
264 // redraw
267 - (void)mouseDown:(NSEvent *)anEvent
269 mouseevent(anEvent);
272 - (void)mouseDragged:(NSEvent *)anEvent
274 mouseevent(anEvent);
277 - (void)keydown:(NSEvent *)anEvent
279 kbdevent(anEvent);
282 @end