ref: 347c54dbd3495d7414c6149c828d276efd232f7d
parent: 6c519f33091bdee3a5c2f65e89510239825f76a8
author: Russ Cox <rsc@swtch.com>
date: Tue Jun 24 13:50:12 EDT 2008
better handling of quit events (underspecified@gmail)
--- a/gui-osx/screen.c
+++ b/gui-osx/screen.c
@@ -111,6 +111,8 @@
ksleep(&rend, isready, 0);
}
+// No wonder Apple sells so many wide displays!
+static OSStatus ApplicationQuitEventHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData);
static OSStatus MainWindowEventHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData);
static OSStatus MainWindowCommandHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData);
@@ -165,6 +167,9 @@
if(PasteboardCreate(kPasteboardClipboard, &appleclip) != noErr)
sysfatal("pasteboard create failed");+ const EventTypeSpec quit_events[] = {+ { kEventClassApplication, kEventAppQuit }+ };
const EventTypeSpec commands[] = { { kEventClassWindow, kEventWindowClosed }, { kEventClassWindow, kEventWindowBoundsChanged },@@ -181,6 +186,13 @@
{ kEventClassMouse, kEventMouseWheelMoved },};
+ InstallApplicationEventHandler (
+ NewEventHandlerUPP (ApplicationQuitEventHandler),
+ GetEventTypeCount(quit_events),
+ quit_events,
+ NULL,
+ NULL);
+
InstallApplicationEventHandler (
NewEventHandlerUPP (MainWindowEventHandler),
GetEventTypeCount(events),
@@ -328,6 +340,14 @@
}
}
+// catch quit events to handle quits from menu, Cmd+Q, applescript, and task switcher
+static OSStatus ApplicationQuitEventHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData)
+{+ exit(0);
+// QuitApplicationEventLoop();
+ return noErr;
+}
+
static OSStatus MainWindowEventHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData)
{OSStatus result = noErr;
@@ -517,9 +537,21 @@
switch (kind)
{case kEventWindowClosed:
- theWindow = NULL;
- exit(0); // only one window
- break;
+ // send a quit carbon event instead of directly calling cleanexit
+ // so that all quits are done in ApplicationQuitEventHandler
+ {+ EventRef quitEvent;
+ CreateEvent(NULL,
+ kEventClassApplication,
+ kEventAppQuit,
+ 0,
+ kEventAttributeNone,
+ &quitEvent);
+ EventTargetRef target;
+ target = GetApplicationEventTarget();
+ SendEventToEventTarget(quitEvent, target);
+ }
+ break;
//resize window
case kEventWindowBoundsChanged:
--
⑨