diff src/nsterm.m @ 101858:b1643c6cb416

* nsterm.m (EmacsApp-sendEvent:): Defer NSApplicationDefined event when modal window is active. (Bug #2152) (applicationShouldTerminate:): Remove now-unneeded while loop around NSRunAlertPanel. * nsmenu.m (popupSession): New file-global variable. (pop_down_menu): End the popupSession before closing dialog. (ns_popup_dialog): BLOCK_INPUT around dialog presentation. (EmacsDialogPanel-runDialogAt:): Don't place window (superfluous), don't query NSApp for events (just sleep instead).
author Adrian Robert <Adrian.B.Robert@gmail.com>
date Sat, 07 Feb 2009 11:04:07 +0000
parents 2dad5b4d31d5
children df135773c0eb
line wrap: on
line diff
--- a/src/nsterm.m	Sat Feb 07 11:03:52 2009 +0000
+++ b/src/nsterm.m	Sat Feb 07 11:04:07 2009 +0000
@@ -4037,7 +4037,8 @@
 
 - (void)sendEvent: (NSEvent *)theEvent
 /* --------------------------------------------------------------------------
-     Events posted by ns_send_appdefined interrupt the run loop here
+     Called when NSApp is running for each event received.  Used to stop
+     the loop when we choose, since there's no way to just run one iteration.
    -------------------------------------------------------------------------- */
 {
   int type = [theEvent type];
@@ -4081,8 +4082,19 @@
 
   if (type == NSApplicationDefined)
     {
-      last_appdefined_event = theEvent;
-      [self stop: self];
+      /* Events posted by ns_send_appdefined interrupt the run loop here.
+         But, if a modal window is up, an appdefined can still come through,
+         (e.g., from a makeKeyWindow event) but stopping self also stops the
+         modal loop. Just defer it until later. */
+      if ([NSApp modalWindow] == nil)
+        {
+          last_appdefined_event = theEvent;
+          [self stop: self];
+        }
+      else
+        {
+          send_appdefined = YES;
+        }
     }
 
   [super sendEvent: theEvent];
@@ -4199,28 +4211,15 @@
   if (ns_shutdown_properly || NILP (ns_confirm_quit))
     return NSTerminateNow;
 
-  /* XXX: This while() loop is needed because if the user switches to another
-          application while the panel is up, it is taken down w/a return value
-          of NSRunStoppedResponse, and the event queue gets messed up.
-          In this case resend the appdefined and put up the window again. */
-  while (1) {
     ret = NSRunAlertPanel([[NSProcessInfo processInfo] processName],
                           [NSString stringWithUTF8String:"Exit requested.  Would you like to Save Buffers and Exit, or Cancel the request?"],
                           @"Save Buffers and Exit", @"Cancel", nil);
 
     if (ret == NSAlertDefaultReturn)
-      {
-        send_appdefined = YES;
-        ns_send_appdefined(-1);
         return NSTerminateNow;
-      }
     else if (ret == NSAlertAlternateReturn)
-      {
-        send_appdefined = YES;
-        ns_send_appdefined(-1);
         return NSTerminateCancel;
-      }
-  }
+    return NSTerminateNow;  /* just in case */
 }