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

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkMacMenus.c --
  3.  *
  4.  * These calls set up and manage the menubar for the
  5.  * Macintosh version of Tk.
  6.  *
  7.  * Copyright (c) 1995-1996 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: tkMacMenus.c,v 1.8 2002/01/27 11:11:02 das Exp $
  13.  */
  14. #include "tcl.h"
  15. #include "tclMacInt.h" /* Needed for FSpLocationFromPath */
  16. #include "tk.h"
  17. #include "tkInt.h"
  18. #include "tkMacInt.h"
  19. /*
  20.  * The define Status defined by Xlib.h conflicts with the function Status
  21.  * defined by Devices.h.  We undefine it here to compile.
  22.  */
  23. #undef Status
  24. #include <Devices.h>
  25. #include <Menus.h>
  26. #include <Memory.h>
  27. #include <SegLoad.h>
  28. #include <StandardFile.h>
  29. #include <ToolUtils.h>
  30. #include <Balloons.h>
  31. #define kAppleMenu 256
  32. #define kAppleAboutItem 1
  33. #define kFileMenu 2
  34. #define kEditMenu 3
  35. #define kSourceItem 1
  36. #define kCloseItem 2
  37. #define kQuitItem 4
  38. #define EDIT_CUT 1
  39. #define EDIT_COPY 2
  40. #define EDIT_PASTE 3
  41. #define EDIT_CLEAR 4
  42. MenuHandle tkAppleMenu;
  43. MenuHandle tkFileMenu;
  44. MenuHandle tkEditMenu;
  45. static Tcl_Interp * gInterp; /* Interpreter for this application. */
  46. static void GenerateEditEvent _ANSI_ARGS_((int flag));
  47. static void SourceDialog _ANSI_ARGS_((void));
  48. /*
  49.  *----------------------------------------------------------------------
  50.  *
  51.  * TkMacHandleMenuSelect --
  52.  *
  53.  * Handles events that occur in the Menu bar.
  54.  *
  55.  * Results:
  56.  * None.
  57.  *
  58.  * Side effects:
  59.  * None.
  60.  *
  61.  *----------------------------------------------------------------------
  62.  */
  63. void 
  64. TkMacHandleMenuSelect(
  65.     long mResult,
  66.     int optionKeyPressed)
  67. {
  68.     short theItem = LoWord(mResult);
  69.     short theMenu = HiWord(mResult);
  70.     Str255 name;
  71.     Tk_Window tkwin;
  72.     Window window;
  73.     TkDisplay *dispPtr;
  74.     if (mResult == 0) {
  75.      TkMacHandleTearoffMenu();
  76. TkMacClearMenubarActive();
  77. return;
  78.     }
  79.     switch (theMenu) {
  80. case kAppleMenu:
  81.     switch (theItem) {
  82. case kAppleAboutItem:
  83.     {
  84. Tcl_CmdInfo dummy;
  85. if (optionKeyPressed || gInterp == NULL ||
  86.     Tcl_GetCommandInfo(gInterp,
  87.     "tkAboutDialog", &dummy) == 0) {
  88.     TkAboutDlg();
  89. } else {
  90.     Tcl_Eval(gInterp, "tkAboutDialog");
  91. }
  92. break;
  93.     }
  94. default:
  95.     GetMenuItemText(tkAppleMenu, theItem, name);
  96.     HiliteMenu(0);
  97.     OpenDeskAcc(name);
  98.     return;
  99.     }
  100.     break;
  101. case kFileMenu:
  102.     switch (theItem) {
  103. case kSourceItem:
  104.     /* TODO: source script */
  105.     SourceDialog();
  106.     break;
  107. case kCloseItem:
  108.     /* Send close event */
  109.     if (TkMacHaveAppearance() >= 0x110) {
  110.         window = TkMacGetXWindow(FrontNonFloatingWindow());
  111.     } else {
  112.         window = TkMacGetXWindow(FrontWindow());
  113.     }
  114.     dispPtr = TkGetDisplayList();
  115.     tkwin = Tk_IdToWindow(dispPtr->display, window);
  116.     TkGenWMDestroyEvent(tkwin);
  117.     break;
  118. case kQuitItem:
  119.     /* Exit */
  120.     if (optionKeyPressed || gInterp == NULL) {
  121. Tcl_Exit(0);
  122.     } else {
  123. Tcl_Eval(gInterp, "exit");
  124.     }
  125.     break;
  126.     }
  127.     break;
  128. case kEditMenu:
  129.     /*
  130.      * This implementation just send keysyms
  131.      * the Tk thinks are associated with function keys that
  132.      * do Cut, Copy & Paste on a Sun keyboard.
  133.      */
  134.     GenerateEditEvent(theItem);
  135.     break;
  136. default:
  137.     TkMacDispatchMenuEvent(theMenu, theItem);
  138.     TkMacClearMenubarActive();
  139.     break;
  140.     }
  141.     /*
  142.      * Finally we unhighlight the menu.
  143.      */
  144.     HiliteMenu(0);
  145. } /* TkMacHandleMenuSelect */
  146. /*
  147.  *----------------------------------------------------------------------
  148.  *
  149.  * TkMacInitMenus --
  150.  *
  151.  * This procedure initializes the Macintosh menu bar.
  152.  *
  153.  * Results:
  154.  * None.
  155.  *
  156.  * Side effects:
  157.  * None.
  158.  *
  159.  *----------------------------------------------------------------------
  160.  */
  161. void 
  162. TkMacInitMenus(
  163.     Tcl_Interp  *interp)
  164. {
  165.     gInterp = interp;
  166.     /* 
  167.      * At this point, InitMenus() should have already been called. 
  168.      */
  169.     if (TkMacUseMenuID(256) != TCL_OK) {
  170.      panic("Menu ID 256 is already in use!");
  171.     }
  172.     tkAppleMenu = NewMenu(256, "p24");
  173.     if (tkAppleMenu == NULL) {
  174. panic("memory - menus");
  175.     }
  176.     InsertMenu(tkAppleMenu, 0);
  177.     AppendMenu(tkAppleMenu, "pAbout Tcl & Tk