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: