PageRenderTime 21ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/brlcad/tags/rel-7-16-10/src/other/tk/macosx/tkMacOSXEvent.c

https://bitbucket.org/vrrm/brl-cad-copy-for-fast-history-browsing-in-git
C | 272 lines | 171 code | 14 blank | 87 comment | 32 complexity | 67547994c5e8039409e86c9fb2caf358 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, LGPL-2.1, Apache-2.0, AGPL-3.0, LGPL-3.0, GPL-3.0, MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, 0BSD, BSD-3-Clause
  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$
  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. }