From 0f19feff2536f40cd10c3b7201ecd89e40148626 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Mon, 27 Aug 2012 20:53:10 +0200 Subject: [PATCH] * nsmenu.m (initWithContentRect:styleMask:backing:defer:): Initialize dialog_return. (windowShouldClose:): Use stop instead of stopModalWithCode. (clicked:): Ditto, and also set dialog_return. (timeout_handler:): Use stop instead of abortModal. Send a dummy event. (runDialogAt:): Make ret Lisp_Object. Set it from dialog_return when modal loop returns. * nsterm.h (NSPanel): New class variable dialog_return. Fixes: debbugs:12258 --- src/ChangeLog | 13 +++++++++++++ src/nsmenu.m | 29 +++++++++++++++++++++++++---- src/nsterm.h | 1 + 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 15d5211efd9..79735225542 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,16 @@ +2012-08-27 Jan Djärv + + * nsterm.h (NSPanel): New class variable dialog_return. + + * nsmenu.m (initWithContentRect:styleMask:backing:defer:): Initialize + dialog_return. + (windowShouldClose:): Use stop instead of stopModalWithCode. + (clicked:): Ditto, and also set dialog_return (Bug#12258). + (timeout_handler:): Use stop instead of abortModal. Send a dummy + event. + (runDialogAt:): Make ret Lisp_Object. Set it from dialog_return when + modal loop returns. + 2012-08-27 Paul Eggert * composite.c, data.c, dbusbind.c, dired.c: Use bool for booleans. diff --git a/src/nsmenu.m b/src/nsmenu.m index e8a0b43a01b..ab285f26df2 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -1497,6 +1497,7 @@ ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header) FlippedView *contentView; NSImage *img; + dialog_return = Qundefined; area.origin.x = 3*SPACER; area.origin.y = 2*SPACER; area.size.width = ICONSIZE; @@ -1584,7 +1585,7 @@ ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header) - (BOOL)windowShouldClose: (id)sender { - [NSApp stopModalWithCode: XHASH (Qnil)]; // FIXME: BIG UGLY HACK!! + [NSApp stop:self]; return NO; } @@ -1673,7 +1674,11 @@ void process_dialog (id window, Lisp_Object list) seltag = [[sellist objectAtIndex: 0] tag]; if (seltag != XHASH (Qundefined)) // FIXME: BIG UGLY HACK!! - [NSApp stopModalWithCode: seltag]; + { + dialog_return = seltag; + [NSApp stop:self]; + } + return self; } @@ -1756,13 +1761,27 @@ void process_dialog (id window, Lisp_Object list) - (void)timeout_handler: (NSTimer *)timedEntry { + NSEvent *nxev = [NSEvent otherEventWithType: NSApplicationDefined + location: NSMakePoint (0, 0) + modifierFlags: 0 + timestamp: 0 + windowNumber: [[NSApp mainWindow] windowNumber] + context: [NSApp context] + subtype: 0 + data1: 0 + data2: 0]; + timer_fired = 1; - [NSApp abortModal]; + /* We use sto because stopModal/abortModal out of the main loop does not + seem to work in 10.6. But as we use stop we must send a real event so + the stop is seen and acted upon. */ + [NSApp stop:self]; + [NSApp postEvent: nxev atStart: NO]; } - (Lisp_Object)runDialogAt: (NSPoint)p { - NSInteger ret = 0; + Lisp_Object ret = Qundefined; while (popup_activated_flag) { @@ -1781,7 +1800,9 @@ void process_dialog (id window, Lisp_Object list) forMode: NSModalPanelRunLoopMode]; } timer_fired = 0; + dialog_return = Qundefined; ret = [NSApp runModalForWindow: self]; + ret = dialog_return; if (! timer_fired) { if (tmo != nil) [tmo invalidate]; /* Cancels timer */ diff --git a/src/nsterm.h b/src/nsterm.h index 54f4a4ec89e..72b8d13cc47 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -196,6 +196,7 @@ along with GNU Emacs. If not, see . */ NSMatrix *matrix; int rows, cols; int timer_fired; + Lisp_Object dialog_return; } - initFromContents: (Lisp_Object)menu isQuestion: (BOOL)isQ; - addButton: (char *)str value: (Lisp_Object)val row: (int)row; -- 2.39.2