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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * tkMacOSXEvent.c --
  3.  *
  4.  * This file contains the basic Mac OS X Event handling routines.
  5.  *
  6.  * Copyright (c) 1995-1997 Sun Microsystems, Inc.
  7.  * Copyright 2001, Apple Computer, Inc.
  8.  * Copyright (c) 2005-2007 Daniel A. Steffen <das@users.sourceforge.net>
  9.  *
  10.  * See the file "license.terms" for information on usage and redistribution
  11.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12.  *
  13.  * RCS: @(#) $Id: tkMacOSXEvent.c,v 1.3.2.16 2007/11/09 06:26:55 das Exp $
  14.  */
  15. #include "tkMacOSXPrivate.h"
  16. #include "tkMacOSXEvent.h"
  17. #include "tkMacOSXDebug.h"
  18. /*
  19.  *----------------------------------------------------------------------
  20.  *
  21.  * TkMacOSXFlushWindows --
  22.  *
  23.  * This routine flushes all the Carbon windows of the application. It
  24.  * is called by XSync().
  25.  *
  26.  * Results:
  27.  * None.
  28.  *
  29.  * Side effects:
  30.  * Flushes all Carbon windows
  31.  *
  32.  *----------------------------------------------------------------------
  33.  */
  34. MODULE_SCOPE void
  35. TkMacOSXFlushWindows(void)
  36. {
  37.     WindowRef wRef = GetWindowList();
  38.     while (wRef) {
  39. TK_IF_MAC_OS_X_API (3, HIWindowFlush,
  40.     ChkErr(HIWindowFlush, wRef);
  41. ) TK_ELSE_MAC_OS_X (3,
  42.     CGrafPtr portPtr = GetWindowPort(wRef);
  43.     if (QDIsPortBuffered(portPtr)) {
  44. QDFlushPortBuffer(portPtr, NULL);
  45.     }
  46. ) TK_ENDIF
  47. wRef = GetNextWindow(wRef);
  48.     }
  49. }
  50. /*
  51.  *----------------------------------------------------------------------
  52.  *
  53.  * TkMacOSXProcessEvent --
  54.  *
  55.  * This dispatches a filtered Carbon event to the appropriate handler
  56.  *
  57.  * Note on MacEventStatus.stopProcessing: Please be conservative in the
  58.  * individual handlers and don't assume the event is fully handled
  59.  * unless you *really* need to ensure that other handlers don't see the
  60.  * event anymore. Some OS manager or library might be interested in
  61.  * events even after they are already handled on the Tk level.
  62.  *
  63.  * Results:
  64.  * 0 on success
  65.  * -1 on failure
  66.  *
  67.  * Side effects:
  68.  * Converts a Carbon event to a Tk event
  69.  *
  70.  *----------------------------------------------------------------------
  71.  */
  72. MODULE_SCOPE int
  73. TkMacOSXProcessEvent(
  74.     TkMacOSXEvent *eventPtr,
  75.     MacEventStatus *statusPtr)
  76. {
  77.     switch (eventPtr->eClass) {
  78. case kEventClassMouse:
  79.     TkMacOSXProcessMouseEvent(eventPtr, statusPtr);
  80.     break;
  81. case kEventClassWindow:
  82.     TkMacOSXProcessWindowEvent(eventPtr, statusPtr);
  83.     break;
  84. case kEventClassKeyboard:
  85.     TkMacOSXProcessKeyboardEvent(eventPtr, statusPtr);
  86.     break;
  87. case kEventClassApplication:
  88.     TkMacOSXProcessApplicationEvent(eventPtr, statusPtr);
  89.     break;
  90. case kEventClassAppearance:
  91.     TkMacOSXProcessAppearanceEvent(eventPtr, statusPtr);
  92.     break;
  93. case kEventClassMenu:
  94.     TkMacOSXProcessMenuEvent(eventPtr, statusPtr);
  95.     break;
  96. case kEventClassCommand:
  97.     TkMacOSXProcessCommandEvent(eventPtr, statusPtr);
  98.     break;
  99. default: {
  100.     TkMacOSXDbgMsg("Unrecognised event: %s",
  101.     TkMacOSXCarbonEventToAscii(eventPtr->eventRef));
  102.     break;
  103. }
  104.     }
  105.     return 0;
  106. }
  107. /*
  108.  *----------------------------------------------------------------------
  109.  *
  110.  * TkMacOSXProcessMenuEvent --
  111.  *
  112.  * This routine processes the event in eventPtr, and
  113.  * generates the appropriate Tk events from it.
  114.  *
  115.  * Results:
  116.  * True if event(s) are generated - false otherwise.
  117.  *
  118.  * Side effects:
  119.  * Additional events may be place on the Tk event queue.
  120.  *
  121.  *----------------------------------------------------------------------
  122.  */
  123. MODULE_SCOPE int
  124. TkMacOSXProcessMenuEvent(
  125.     TkMacOSXEvent *eventPtr,
  126.     MacEventStatus *statusPtr)
  127. {
  128.     int menuContext;
  129.     OSStatus err;
  130.     switch (eventPtr->eKind) {
  131. case kEventMenuBeginTracking:
  132. case kEventMenuEndTracking:
  133. case kEventMenuOpening:
  134. case kEventMenuTargetItem:
  135.     break;
  136. default:
  137.     return 0;
  138.     break;
  139.     }
  140.     err = ChkErr(GetEventParameter, eventPtr->eventRef, kEventParamMenuContext,
  141.     typeUInt32, NULL, sizeof(menuContext), NULL, &menuContext);
  142.     if (err == noErr && ((menuContext & kMenuContextMenuBarTracking) ||
  143.     (menuContext & kMenuContextPopUpTracking))) {
  144. switch (eventPtr->eKind) {
  145.     MenuRef menu;
  146.     case kEventMenuBeginTracking:
  147. TkMacOSXClearMenubarActive();
  148. /*
  149.  * Handle -postcommand
  150.  */
  151. TkMacOSXPreprocessMenu();
  152. TkMacOSXTrackingLoop(1);
  153. break;
  154.     case kEventMenuEndTracking:
  155. TkMacOSXTrackingLoop(0);
  156. break;
  157.     case kEventMenuOpening:
  158. err = ChkErr(GetEventParameter, eventPtr->eventRef,
  159. kEventParamDirectObject, typeMenuRef, NULL,
  160. sizeof(menu), NULL, &menu);
  161. if (err == noErr) {
  162.     TkMacOSXClearActiveMenu(menu);
  163.     return TkMacOSXGenerateParentMenuSelectEvent(menu);
  164. }
  165. break;
  166.     case kEventMenuTargetItem:
  167. err = ChkErr(GetEventParameter, eventPtr->eventRef,
  168. kEventParamDirectObject, typeMenuRef, NULL,
  169. sizeof(menu), NULL, &menu);
  170. if (err == noErr) {
  171.     MenuItemIndex index;
  172.     err = ChkErr(GetEventParameter, eventPtr->eventRef,
  173.     kEventParamMenuItemIndex, typeMenuItemIndex, NULL,
  174.     sizeof(index), NULL, &index);
  175.     if (err == noErr) {
  176. return TkMacOSXGenerateMenuSelectEvent(menu, index);
  177.     }
  178. }
  179. break;
  180. }
  181.     }
  182.     return 0;
  183. }
  184. /*
  185.  *----------------------------------------------------------------------
  186.  *
  187.  * TkMacOSXProcessCommandEvent --
  188.  *
  189.  * This routine processes the event in eventPtr, and
  190.  * generates the appropriate Tk events from it.
  191.  *
  192.  * Results:
  193.  * True if event(s) are generated - false otherwise.
  194.  *
  195.  * Side effects:
  196.  * Additional events may be place on the Tk event queue.
  197.  *
  198.  *----------------------------------------------------------------------
  199.  */
  200. MODULE_SCOPE int
  201. TkMacOSXProcessCommandEvent(
  202.     TkMacOSXEvent *eventPtr,
  203.     MacEventStatus * statusPtr)
  204. {
  205.     HICommand command;
  206.     int menuContext;
  207.     OSStatus err;
  208.     switch (eventPtr->eKind) {
  209. case kEventCommandProcess:
  210. case kEventCommandUpdateStatus:
  211.     break;
  212. default:
  213.     return 0;
  214.     break;
  215.     }
  216.     err = ChkErr(GetEventParameter, eventPtr->eventRef,
  217.     kEventParamDirectObject, typeHICommand, NULL, sizeof(command),
  218.     NULL, &command);
  219.     if (err == noErr && (command.attributes & kHICommandFromMenu)) {
  220. if (eventPtr->eKind == kEventCommandProcess) {
  221.     err = ChkErr(GetEventParameter, eventPtr->eventRef,
  222.     kEventParamMenuContext, typeUInt32, NULL,
  223.     sizeof(menuContext), NULL, &menuContext);
  224.     if (err == noErr && (menuContext & kMenuContextMenuBar) &&
  225.     (menuContext & kMenuContextMenuBarTracking)) {
  226. TkMacOSXHandleMenuSelect(GetMenuID(command.menu.menuRef),
  227. command.menu.menuItemIndex,
  228. (GetCurrentEventKeyModifiers() & optionKey) != 0);
  229. return 1;
  230.     }
  231. } else {
  232.     Tcl_CmdInfo dummy;
  233.     if (command.commandID == kHICommandPreferences && eventPtr->interp) {
  234. if (Tcl_GetCommandInfo(eventPtr->interp,
  235. "::tk::mac::ShowPreferences", &dummy)) {
  236.     if (!IsMenuItemEnabled(command.menu.menuRef,
  237.     command.menu.menuItemIndex)) {
  238. EnableMenuItem(command.menu.menuRef,
  239. command.menu.menuItemIndex);
  240.     }
  241. } else {
  242.     if (IsMenuItemEnabled(command.menu.menuRef,
  243.     command.menu.menuItemIndex)) {
  244. DisableMenuItem(command.menu.menuRef,
  245. command.menu.menuItemIndex);
  246.     }
  247. }
  248. statusPtr->stopProcessing = 1;
  249. return 1;
  250.     }
  251. }
  252.     }
  253.     return 0;
  254. }