From 413da068905437f950c4f16ac5f0c699724fb5b4 Mon Sep 17 00:00:00 2001 From: wolfsuit Date: Wed, 12 Mar 2003 05:56:21 +0000 Subject: 2003-03-11 Jim Ingham * macosx/tkMacOSXMenu.c (EventuallyInvokeMenu): New function, used to invoke menu commands at idle time. (TkMacOSXDispatchMenuEvent): Don't immediately dispatch menu commands, wait till the idle loop to do so. This is more like what is done on Windows, and avoids the crash from destroying a menu in it's command. * macosx/tkMacOSXHLEvents.c (ReallyKillMe): Don't force the shell to exit. According to the OS X HI guidelines, it should be possible to cancel an attempt to quit, and if we force the kill, here, it would not be possible to implement this. --- ChangeLog | 14 ++++++++++++ macosx/tkMacOSXHLEvents.c | 11 ++++------ macosx/tkMacOSXMenu.c | 54 ++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 67 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 89a3f4d..3903402 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2003-03-11 Jim Ingham + + * macosx/tkMacOSXMenu.c (EventuallyInvokeMenu): New function, + used to invoke menu commands at idle time. + (TkMacOSXDispatchMenuEvent): Don't immediately dispatch menu + commands, wait till the idle loop to do so. This is more like + what is done on Windows, and avoids the crash from destroying + a menu in it's command. + + * macosx/tkMacOSXHLEvents.c (ReallyKillMe): Don't force the shell + to exit. According to the OS X HI guidelines, it should be + possible to cancel an attempt to quit, and if we force the kill, + here, it would not be possible to implement this. + 2003-03-11 Mo DeJong * tests/unixWm.test: Add the testwrapper diff --git a/macosx/tkMacOSXHLEvents.c b/macosx/tkMacOSXHLEvents.c index 65b0b6c..90821c7 100644 --- a/macosx/tkMacOSXHLEvents.c +++ b/macosx/tkMacOSXHLEvents.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacOSXHLEvents.c,v 1.5 2003/02/25 16:11:22 das Exp $ + * RCS: @(#) $Id: tkMacOSXHLEvents.c,v 1.6 2003/03/12 05:56:21 wolfsuit Exp $ */ #include "tkMacOSXPort.h" @@ -404,13 +404,11 @@ ScriptHandler (const AppleEvent * event, AppleEvent * reply, long handlerRefcon) * * ReallyKillMe -- * - * This proc tries to kill the shell by running exit, and if that - * has not succeeded (e.g. because someone has renamed the exit - * command), calls Tcl_Exit to really kill the shell. Called from - * an event scheduled by the "Quit" AppleEvent handler. + * This proc tries to kill the shell by running exit, + * called from an event scheduled by the "Quit" AppleEvent handler. * * Results: - * Kills the shell. + * Runs the "exit" command which might kill the shell. * * Side effects: * None. @@ -425,7 +423,6 @@ ReallyKillMe(Tcl_Event *eventPtr, int flags) if (interp != NULL) { Tcl_GlobalEval(interp, "exit"); } - Tcl_Exit(0); return 1; } diff --git a/macosx/tkMacOSXMenu.c b/macosx/tkMacOSXMenu.c index 0f853f9..bfaff7e 100644 --- a/macosx/tkMacOSXMenu.c +++ b/macosx/tkMacOSXMenu.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacOSXMenu.c,v 1.7 2003/03/08 02:15:46 wolfsuit Exp $ + * RCS: @(#) $Id: tkMacOSXMenu.c,v 1.8 2003/03/12 05:56:21 wolfsuit Exp $ */ #include "tkMacOSXInt.h" #include "tkMenuButton.h" @@ -200,6 +200,11 @@ static struct TearoffSelect { * when we are in this menu */ } tearoffStruct; +struct MenuCommandHandlerData { /* This is the ClientData we pass to */ + TkMenu *menuPtr; /* Tcl_DoWhenIdle to move handling */ + int index; /* menu commands to the event loop. */ +}; + static RgnHandle totalMenuRgn = NULL; /* Used to update windows which have been * obscured by menus. */ @@ -257,6 +262,7 @@ static void DrawTearoffEntry _ANSI_ARGS_((TkMenu *menuPtr, TkMenuEntry *mePtr, Drawable d, GC gc, Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr, int x, int y, int width, int height)); +static void EventuallyInvokeMenu (ClientData data); static void GetEntryText _ANSI_ARGS_((TkMenuEntry *mePtr, Tcl_DString *dStringPtr)); static void GetMenuAccelGeometry _ANSI_ARGS_((TkMenu *menuPtr, @@ -2071,7 +2077,36 @@ TkpSetWindowMenuBar( listPtr->menuPtr = menuPtr; } } - + +static void +/* + *---------------------------------------------------------------------- + * + * EventuallyInvokeMenu -- + * + * This IdleTime callback actually invokes the menu command + * scheduled in TkMacOSXDispatchMenuEvent. + * + * Results: + * None. + * + * Side effects: + * Commands get executed. + * + *---------------------------------------------------------------------- + */ + +EventuallyInvokeMenu (ClientData data) +{ + struct MenuCommandHandlerData *realData + = (struct MenuCommandHandlerData *) data; + + Tcl_Release(realData->menuPtr->interp); + Tcl_Release(realData->menuPtr); + TkInvokeMenu(realData->menuPtr->interp, realData->menuPtr, + realData->index); +} + /* *---------------------------------------------------------------------- * @@ -2084,7 +2119,7 @@ TkpSetWindowMenuBar( * None. * * Side effects: - * Commands get executed. + * Commands for the event are scheduled for execution at idle time. * *---------------------------------------------------------------------- */ @@ -2127,7 +2162,16 @@ TkMacOSXDispatchMenuEvent( GetMenuItemText(GetMenuHandle(menuID), index, itemText); result = TCL_OK; } else { - result = TkInvokeMenu(menuPtr->interp, menuPtr, index - 1); + struct MenuCommandHandlerData *data + = (struct MenuCommandHandlerData *) + ckalloc(sizeof(struct MenuCommandHandlerData)); + Tcl_Preserve(menuPtr->interp); + Tcl_Preserve(menuPtr); + data->menuPtr = menuPtr; + data->index = index - 1; + Tcl_DoWhenIdle (EventuallyInvokeMenu, + (ClientData) data); + /* result = TkInvokeMenu(menuPtr->interp, menuPtr, index - 1); */ } } else { return TCL_ERROR; @@ -2136,7 +2180,7 @@ TkMacOSXDispatchMenuEvent( } return result; } - + /* *---------------------------------------------------------------------- * -- cgit v0.12