tkMacMDEF.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

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