(mac) application menu
Peter Brigham
pmbrig at gmail.com
Sat Nov 17 12:28:06 EST 2007
I tried to send this message once before but I don't think it all got
through. Here it is again.
Mark Schonewille:
****
When you use the Quit menu item, Mac OS X sends an event to
Revolution. You can catch this message with the AppleEvent handler or
the shutdownRequest handler. On Mac OS X, I prefer to use the
AppleEvent handler most of the time.
If you use either the AppleEvent handler or the shutdownRequest
handler without a pass command, the application will not quit by
itself (you can also lock messages and issue the quit command).
When you press command-Q, the Quit menu item should work just like
when you use the mouse to select this menu item and you can catch the
AppleEvent and shutdownRequest messages again. However, your script
may catch the commandKeyDown message. If you don't pass this message
with the pass command, your application may not quit.
There are versions of Revolution that don't pass the commandKeydown
message because of a bug. There are also versions that don't pass the
AppleEvent message.
If you are using Rev 2.8.1, problems with quitting are probably due
to a script.
****
You seem to be right.
After much experimentation in a small test stack, I find that, in a
standalone:
1. choosing "quit <myApp> from the "myApp" menu triggers the
shutdownrequest handler, which can block the quitting, but the
closestackrequest is not triggered at any time. And the menuPick
"quit" in the File menu script is *not* triggered, it's completely
ignored (contrary to what Devin suggested (and what I would expect)).
2. command-q also triggers the shutdownrequest handler but not the
closestackrequest as in (1), and it never triggers my
"commandkeydown" handler.
So in these two cases it appears that the commandkeydown and menupick
handlers are ignored. (!?)
3. Clicking the closebox at the top left of the window does *not*
trigger the shutdownrequest handler at all, but does trigger the
closestackrequest handler, which can block the close.
All of these ways of exiting the app finally trigger the closestack
handler (unless the closing process is blocked by the other
handlers), but -- if I put an "answer" command at the beginning of
the closestack handler (ie, answer "triggered closeStack") only the
closebox operates the way I would expect. That is, clicking the
closebox brings up the dialog and waits for me to click "OK" then
executes other commands in the closeStack handler and finally closes
the app. The other two open the answer dialog then go on without
pausing to run the other commands in the closeStack handler -- the
next ones include an ask file command, and that dialog appears in
front of the still-open "triggered closestack" dialog, but the ask
file dialog waits appropriately for input, then the rest of the
commands are executed and the app summarily closes (ignoring the
still-open answer dialog), even if an "exit to top" is one of the
further commands. So the system is definitely intruding on the rev
scripting here in some way, causing Rev to ignore what would
otherwise be blocking commands. ???
So it appears that if I want to perform any last save of my data, I
*could* put those commands in the closestack handler. But the failure
to wait for the button click on an answer dialog seems like a bug to
me -- what if I need to use an answer dialog in my shutdown routines?
As it happens, for the stack I'm working on now I don't need this,
but I sure will in the future.
The alternative is to put the same shutdown routines in both the
closestackrequest and the shudownrequest handlers, which covers the
bases no matter how the user quits the app. Which is what I will do,
I guess. All of this does seem excessively complex, though, and not
at all well-documented. What do other people do to handle their
closing routines? This must be a common need, so I imagine that there
are well-established ways of handling it. Input would be appreciated.
I'm still trying to figure out why my actual RecipeFile stack doesn't
respond at all to either cmd-q or the RecipeFile > 'quit RecipeFile'
menuitem. It's acting as though the shutdownrequest were not passed.
But my shutdownrequest handler does indeed pass the shutdownrequest
message at the end of a bunch of housekeeping stuff. Could an error
in those housekeeping routines somehow derail things so the "pass"
command is never reached?
Sorry to go on and on about this stuff but it's really hanging me up
and if I don't understand it I'll never be able to make workable apps
from Rev.
-- Peter
Peter M. Brigham
pmbrig at gmail.com
http://home.comcast.net/~pmbrig/
-- To err is human, but to really foul things up you need a computer.
More information about the use-livecode
mailing list