3 #define Cursor OSXCursor
4 #import "osx-delegate.h"
5 #import <Foundation/Foundation.h>
6 #import <AppKit/AppKit.h>
13 #include <sys/select.h>
21 #include <drawfcall.h>
23 AUTOFRAMEWORK(Foundation)
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
39 NSMenu *mainMenu = [[NSMenu alloc] initWithTitle:@"MainMenu"];
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];
68 +(void)populateApplicationMenu:(NSMenu *)aMenu
70 NSString *applicationName = [[NSProcessInfo processInfo] processName];
73 menuItem = [aMenu addItemWithTitle:[NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"About", nil), applicationName]
74 action:@selector(orderFrontStandardAboutPanel:)
76 [menuItem setTarget:NSApp];
78 [aMenu addItem:[NSMenuItem separatorItem]];
80 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Preferences...", nil)
84 [aMenu addItem:[NSMenuItem separatorItem]];
86 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Services", nil)
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:)
98 [menuItem setTarget:NSApp];
100 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Hide Others", nil)
101 action:@selector(hideOtherApplications:)
103 [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
104 [menuItem setTarget:NSApp];
106 menuItem = [aMenu addItemWithTitle:NSLocalizedString(@"Show All", nil)
107 action:@selector(unhideAllApplications:)
109 [menuItem setTarget:NSApp];
111 [aMenu addItem:[NSMenuItem separatorItem]];
113 menuItem = [aMenu addItemWithTitle:[NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"Quit", nil), applicationName]
114 action:@selector(terminate:)
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
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];
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
162 [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
163 selector:@selector(receiveWake:)
164 name:NSWorkspaceDidWakeNotification
172 [[NSNotificationCenter defaultCenter] removeObserver:self];
173 [readHandle release];
174 return [super dealloc];
177 - (void)devdrawMain:(NSNotification *)notification
187 data = [readHandle readDataOfLength:4];
188 if([data length] == 4){
189 [data getBytes:buf length:4];
195 sysfatal("malloc: %r");
198 memmove(mbuf, buf, 4);
199 data = [readHandle readDataOfLength:(n-4)];
200 [data getBytes:(mbuf+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);
211 [NSApp terminate:self];
213 [readHandle waitForDataInBackgroundAndNotify];
217 while((n = read(3, buf, 4)) == 4){
223 sysfatal("malloc: %r");
226 memmove(mbuf, buf, 4);
227 nn = readn(3, mbuf+4, 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);
239 #pragma mark Notifications
241 - (void)fullscreen:(NSNotification *)notification
246 - (void)windowWillClose:(NSNotification *)notification
248 // if(osx.window == [notification object]){
249 [[NSNotificationCenter defaultCenter] removeObserver:self];
250 [NSApp terminate:self];
254 - (void)windowDidResize:(NSNotification *)notification
256 // if(osx.window == [notification object]) {
261 - (void)receiveWake:(NSNotification *)notification
263 if(trace) NSLog(@"%s:%d %@", __FILE__, __LINE__, notification);
267 - (void)mouseDown:(NSEvent *)anEvent
272 - (void)mouseDragged:(NSEvent *)anEvent
277 - (void)keydown:(NSEvent *)anEvent