1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/*
* TkMacMDEF.c --
*
* This module is implements the MDEF for tkMenus. The address of the
* real entry proc will be blasted into the MDEF.
*
* Copyright (c) 1996 by Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tkMacMDEF.c,v 1.2 1998/09/14 18:23:37 stanton Exp $
*/
#define MAC_TCL
#define NeedFunctionPrototypes 1
#define NeedWidePrototypes 0
#include <Menus.h>
#include <LowMem.h>
#include "tkMacInt.h"
/*
* The following structure is built from assembly equates in MPW 3.0
* AIncludes file: "Private.a." We're forced to update several locations not
* documented in "Inside Mac" to make our MDEF behave properly with hierarchical
* menus.
*/
#if STRUCTALIGNMENTSUPPORTED
#pragma options align=mac68k
#endif
typedef struct mbPrivate {
Byte unknown[6];
Rect mbItemRect; /* rect of currently chosen menu item */
} mbPrivate;
#if STRUCTALIGNMENTSUPPORTED
#pragma options align=reset
#endif
/*
* We are forced to update a low-memory global to get cascades to work. This
* global does not have a LMEquate associated with it.
*/
#define SELECTRECT (*(Rect *)0x09fa) /* Menu select seems to need this */
#define MBSAVELOC (*(short *)0x0B5C) /* address of handle to mbarproc private data redefined below */
pascal void main _ANSI_ARGS_((short message,
MenuHandle menu, Rect *menuRect,
Point hitPt, short *whichItem));
/*
*----------------------------------------------------------------------
*
* TkMacStdMenu --
*
* The dispatch routine called by the system to handle menu drawing,
* scrolling, etc. This is a stub; the address of the real routine
* is blasted in. The real routine will be a UniversalProcPtr,
* which will give the real dispatch routine in Tk globals
* and the like.
*
* Results:
* None.
*
* Side effects:
* This routine causes menus to be drawn and will certainly allocate
* memory as a result. Also, the menu can scroll up and down, and
* various other interface actions can take place
*
*----------------------------------------------------------------------
*/
pascal void
main(
short message, /* What action are we taking? */
MenuHandle menu, /* The menu we are working with */
Rect *menuRect, /* A pointer to the rect we are working with */
Point hitPt, /* Where the mouse was hit for appropriate
* messages. */
short *whichItemPtr) /* Output result. Which item was hit by
* the user? */
{
/*
* The constant 'MDEF' is what will be punched during menu intialization.
*/
TkMenuDefProcPtr procPtr = (TkMenuDefProcPtr) 'MDEF';
TkMenuLowMemGlobals globals;
short oldItem;
globals.menuDisable = LMGetMenuDisable();
globals.menuTop = LMGetTopMenuItem();
globals.menuBottom = LMGetAtMenuBottom();
if (MBSAVELOC == -1) {
globals.itemRect = (**(mbPrivate***)&MBSAVELOC)->mbItemRect;
}
if (message == mChooseMsg) {
oldItem = *whichItemPtr;
}
TkCallMenuDefProc(procPtr, message, menu, menuRect, hitPt, whichItemPtr,
&globals);
LMSetMenuDisable(globals.menuDisable);
LMSetTopMenuItem(globals.menuTop);
LMSetAtMenuBottom(globals.menuBottom);
if ((message == mChooseMsg) && (oldItem != *whichItemPtr)
&& (MBSAVELOC != -1)) {
(**(mbPrivate***)&MBSAVELOC)->mbItemRect = globals.itemRect;
SELECTRECT = globals.itemRect;
}
}
|