changeset 101857:2ce0c9304190

* 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:03:52 +0000
parents ceb61718bdae
children b1643c6cb416
files src/nsmenu.m
diffstat 1 files changed, 14 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/nsmenu.m	Sat Feb 07 10:52:13 2009 +0000
+++ b/src/nsmenu.m	Sat Feb 07 11:03:52 2009 +0000
@@ -73,6 +73,7 @@
 
 /* Nonzero means a menu is currently active.  */
 static int popup_activated_flag;
+static NSModalSession popupSession;
 
 /* NOTE: toolbar implementation is at end,
   following complete menu implementation. */
@@ -1495,6 +1496,7 @@
   struct Lisp_Save_Value *p = XSAVE_VALUE (arg);
   popup_activated_flag = 0;
   BLOCK_INPUT;
+  [NSApp endModalSession: popupSession];
   [((EmacsDialogPanel *) (p->pointer)) close];
   [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow];
   UNBLOCK_INPUT;
@@ -1554,6 +1556,8 @@
 
   p.x = (int)f->left_pos + ((int)FRAME_COLUMN_WIDTH (f) * f->text_cols)/2;
   p.y = (int)f->top_pos + (FRAME_LINE_HEIGHT (f) * f->text_lines)/2;
+
+  BLOCK_INPUT;
   dialog = [[EmacsDialogPanel alloc] initFromContents: contents
                                            isQuestion: isQ];
   {
@@ -1567,6 +1571,7 @@
 
   [dialog close];
   [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow];
+  UNBLOCK_INPUT;
 
   return tem;
 }
@@ -1872,27 +1877,21 @@
 
 - (Lisp_Object)runDialogAt: (NSPoint)p
 {
-  NSEvent *e;
-  NSModalSession session;
   int ret;
 
-  [self center];  /*XXX p ignored? */
-  [self orderFront: NSApp];
-
-  session = [NSApp beginModalSessionForWindow: self];
+  popupSession = [NSApp beginModalSessionForWindow: self];
   while (popup_activated_flag
-         && (ret = [NSApp runModalSession: session]) == NSRunContinuesResponse)
+         && (ret = [NSApp runModalSession: popupSession])
+              == NSRunContinuesResponse)
     {
-      timer_check (1);  // for timers.el, indep of atimers; might not return
-      e = [NSApp nextEventMatchingMask: NSAnyEventMask
-                             untilDate: [NSDate dateWithTimeIntervalSinceNow: 1]
-                                inMode: NSModalPanelRunLoopMode
-                               dequeue: NO];
-/*fprintf (stderr, "ret = %d\te = %p\n", ret, e);*/
+      /* Run this for timers.el, indep of atimers; might not return.
+         TODO: use return value to avoid calling every iteration. */
+      timer_check (1);
+      [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.1]];
     }
-  [NSApp endModalSession: session];
+  [NSApp endModalSession: popupSession];
 
-  {				// FIXME: BIG UGLY HACK!!!
+  {				/* FIXME: BIG UGLY HACK!!! */
       Lisp_Object tmp;
       *(EMACS_INT*)(&tmp) = ret;
       return tmp;