summaryrefslogtreecommitdiffstats
path: root/macosx/tkMacOSXEvent.c
diff options
context:
space:
mode:
authordas <das>2002-08-31 06:12:19 (GMT)
committerdas <das>2002-08-31 06:12:19 (GMT)
commite947c1d0d386b229818958dc12ea0cc20e4ec582 (patch)
tree303845583d22d9e5e5f3f53edf451167cb5847e6 /macosx/tkMacOSXEvent.c
parent62d94160aed093a9505d60181a1509e69bd02bb6 (diff)
downloadtk-e947c1d0d386b229818958dc12ea0cc20e4ec582.zip
tk-e947c1d0d386b229818958dc12ea0cc20e4ec582.tar.gz
tk-e947c1d0d386b229818958dc12ea0cc20e4ec582.tar.bz2
*** macosx-8-4-branch merged into the mainline [tcl patch #602770] ***macosx_8_4_merge_2002_08_31_trunk
* generic/tk.decls: * generic/tkInt.decls: added new "aqua" specific entries to the stubs tables. Changed all "unix" entries to "x11" to allow us to distinguish and build both "aqua" on MacOSX and "x11" on MacOSX. * generic/tk.h: added a #ifnded RESOURCE_INCLUDED so that tk.h can be passed to the resource compiler. * generic/tkCmds.c (Tk_TkObjCmd): added [tk windowingsystem] subcommand: returns "x11" when running on X11, "win32" on Windows, "classic" on MacOS9 and "aqua" on MacOSX Aqua (i.e. Carbon) * generic/tkFont.c (TkFontGetFirstTextLayout): new private function returning the first chunk of a Tk_TextLayout, i.e. until the first font change on the first line (or the whole first line if there is no such font change). * generic/tkMain.c: made Tcl_ThreadDataKey static * library/demos/puzzle.tcl: fixed button metrics for aqua * tests/cursor.test: check for presence of arrow cursor instead of heart cursor * xlib/xcolors.c: changed xColors static initialization to more standard C * macosx/Wish.pbproj/jingham.pbxuser (new): * macosx/Wish.pbproj/project.pbxproj (new): project for Apple's ProjectBuilder IDE. * macosx/Makefile (new): simple makefile for building the project from the command line via the ProjectBuilder tool 'pbxbuild'. * macosx/tkMacOSXAppInit.c (new): macosx specific AppInit looking for a AppMain.tcl file in its bundled Resources/Scripts folder. If present, argv[1] is set to that file and the Scripts folder is added to the auto_path. This allows tk apps to embed scripts within their bundle directory structure. * macosx/tkMacOSXInit.c (new): macosx adapted version of tkUnixInit.c: we initialize & cache the Carbon native encoding (e.g. 'macRoman') and try to find the tk script library files inside Tk packaged as a framework. * macosx/tkMacOSXNotify.c (new): new macosx specific merged Carbon/select-based notifier. * macosx/tkMacOSXEvent.c (new): * macosx/tkMacOSXEvent.h (new): * macosx/tkMacOSXKeyEvent.c (new): * macosx/tkMacOSXMouseEvent.c (new): * macosx/tkMacOSXWindowEvent.c (new): new macosx specific event handling functionality. * macosx/tkMacOSX.h (new): * macosx/tkMacOSXBitmap.c (new): * macosx/tkMacOSXButton.c (new): * macosx/tkMacOSXClipboard.c (new): * macosx/tkMacOSXColor.c (new): * macosx/tkMacOSXConfig.c (new): * macosx/tkMacOSXCursor.c (new): * macosx/tkMacOSXDefault.h (new): * macosx/tkMacOSXDialog.c (new): * macosx/tkMacOSXDraw.c (new): * macosx/tkMacOSXEmbed.c (new): * macosx/tkMacOSXFont.c (new): * macosx/tkMacOSXHLEvents.c (new): * macosx/tkMacOSXInt.h (new): * macosx/tkMacOSXKeyboard.c (new): * macosx/tkMacOSXMenu.c (new): * macosx/tkMacOSXMenubutton.c (new): * macosx/tkMacOSXMenus.c (new): * macosx/tkMacOSXPort.h (new): * macosx/tkMacOSXRegion.c (new): * macosx/tkMacOSXScale.c (new): * macosx/tkMacOSXScrlbr.c (new): * macosx/tkMacOSXSubwindows.c (new): * macosx/tkMacOSXTest.c (new): * macosx/tkMacOSXUtil.c (new): * macosx/tkMacOSXUtil.h (new): * macosx/tkMacOSXWm.c (new): * macosx/tkMacOSXWm.h (new): * macosx/tkMacOSXXStubs.c (new): macosx ports of classic mac Tk implementation in tk/mac. * macosx/tkMacOSXSend.c (new): only send to local interp implemented currently. * macosx/tkMacOSXDebug.h (new): * macosx/tkMacOSXDebug.c (new): new macosx specific functions for debugging MacOS events, regions, etc. * macosx/tkAboutDlg.r (new): * macosx/tkMacOSXApplication.r (new): * macosx/tkMacOSXCursors.r (new): * macosx/tkMacOSXLibrary.r (new): * macosx/tkMacOSXMenu.r (new): * macosx/tkMacOSXResource.r (new): * macosx/tkMacOSXXCursors.r (new): * macosx/tclets.r (new): sources for Rez resource compiler. * macosx/Wish.icns (new): Wish application icon. * generic/tk.h: * generic/default.h: * generic/tkBind.c: * generic/tkCmds.c: * generic/tkGrab.c: * generic/tkPointer.c: * generic/tkPort.h: * generic/tkSelect.c: * generic/tkStubLib.c: * generic/tkTest.c: * generic/tkText.c: * generic/tkWindow.c: * unix/tkUnix3d.c: * xlib/xgc.c: * xlib/X11/X.h: * xlib/X11/Xlib.h: * xlib/X11/Xutil.h: added #includes and #ifdefs for macosx * library/bgerror.tcl: * library/button.tcl: * library/console.tcl: * library/dialog.tcl: * library/entry.tcl: * library/listbox.tcl: * library/menu.tcl: * library/msgbox.tcl: * library/scrlbar.tcl: * library/spinbox.tcl: * library/text.tcl: * library/tk.tcl: * library/demos/menu.tcl: * library/demos/menubu.tcl: * library/demos/widget: check [tk windowingsystem] instead of and/or in addition to $tcl_platform(platform). * generic/tkInt.h: * mac/tkMacBitmap.c: * mac/tkMacWm.c: added missing CONSTification * generic/tkIntDecls.h: * generic/tkIntPlatDecls.h: * generic/tkIntXlibDecls.h: * generic/tkPlatDecls.h: * generic/tkStubInit.c: regen
Diffstat (limited to 'macosx/tkMacOSXEvent.c')
-rw-r--r--macosx/tkMacOSXEvent.c276
1 files changed, 276 insertions, 0 deletions
diff --git a/macosx/tkMacOSXEvent.c b/macosx/tkMacOSXEvent.c
new file mode 100644
index 0000000..a55d0fd
--- /dev/null
+++ b/macosx/tkMacOSXEvent.c
@@ -0,0 +1,276 @@
+/*
+ * tkMacOSXEvent.c --
+ *
+ * This file contains most of the X calls called by Tk. Many of
+ * these calls are just stubs and either don't make sense on the
+ * Macintosh or thier implamentation just doesn't do anything. Other
+ * calls will eventually be moved into other files.
+ *
+ * Copyright (c) 1995-1997 Sun Microsystems, Inc.
+ * Copyright 2001, Apple Computer, Inc.
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ *
+ * RCS: @(#) $Id: tkMacOSXEvent.c,v 1.2 2002/08/31 06:12:29 das Exp $
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+#include "tkMacOSXInt.h"
+#include "tkMacOSXEvent.h"
+#include "tkMacOSXDebug.h"
+
+#define TK_MAC_DEBUG 1
+
+/*
+ * The following are undocumented event classes
+ *
+ */
+enum {
+ kEventClassUser = 'user',
+ kEventClassCgs = 'cgs ',
+};
+
+/*
+ * The following are undocumented event kinds
+ *
+ */
+enum {
+ kEventMouse8 = 8,
+ kEventMouse9 = 9,
+ kEventApp103 = 103
+};
+
+EventRef TkMacOSXCreateFakeEvent ();
+
+/*
+ * Forward declarations of procedures used in this file.
+ */
+static int ReceiveAndProcessEvent _ANSI_ARGS_(());
+
+static EventTargetRef targetRef;
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * tkMacOSXFlushWindows --
+ *
+ * This routine flushes all the Carbon windows of the application
+ * It is called by the setup procedure for the Tcl/Carbon event source
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Flushes all Carbon windows
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+tkMacOSXFlushWindows ()
+{
+ WindowRef wRef = GetWindowList();
+
+ while (wRef) {
+ CGrafPtr portPtr = GetWindowPort(wRef);
+ if (QDIsPortBuffered(portPtr)) {
+ QDFlushPortBuffer(portPtr, NULL);
+ }
+ wRef=GetNextWindow(wRef);
+ }
+}
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkMacOSXCountAndProcessMacEvents --
+ *
+ * This routine receives any Carbon events that aare in the
+ * queue and converts them to tk events
+ * It is called by the event set-up and check routines
+ * Results:
+ * The number of events in the queue.
+ *
+ * Side effects:
+ * Tells the Window Manager to deliver events to the event
+ * queue of the current thread.
+ * Receives any Carbon events on the queue and converts them to tk events
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkMacOSXCountAndProcessMacEvents()
+{
+ EventQueueRef qPtr;
+ int eventCount;
+ qPtr = GetMainEventQueue();
+ eventCount = GetNumEventsInQueue(qPtr);
+ if (eventCount) {
+ int n, err;
+ for (n = 0, err = 0;n<eventCount && !err;n++) {
+ err = ReceiveAndProcessEvent();
+ }
+ }
+ return eventCount;
+}
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkMacOSXProcessAppleEvent --
+ *
+ * This processes Apple events
+ *
+ * Results:
+ * 0 on success
+ * -1 on failure
+ *
+ * Side effects:
+ * Calls the Tk high-level event handler
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+TkMacOSXProcessAppleEvent(TkMacOSXEvent * eventPtr, MacEventStatus * statusPtr)
+{
+ int err;
+ EventRecord eventRecord;
+ if (ConvertEventRefToEventRecord(eventPtr->eventRef,
+ &eventRecord )) {
+ err=TkMacOSXDoHLEvent(&eventRecord);
+ if (err!=noErr) {
+ char buf1 [ 256 ];
+ char buf2 [ 256 ];
+ fprintf(stderr,
+ "TkMacOSXDoHLEvent failed : %s,%s,%d\n",
+ CarbonEventToAscii(eventPtr->eventRef, buf1),
+ ClassicEventToAscii(&eventRecord,buf2), err);
+ statusPtr->err = 1;
+ } else {
+ statusPtr->handledByTk = 1;
+ }
+ } else {
+ statusPtr->err = 1;
+ fprintf(stderr,"ConvertEventRefToEventRecord failed\n");
+ }
+ return 0;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkMacOSXProcessEvent --
+ *
+ * This dispatches a filtered Carbon event to the appropriate handler
+ *
+ * Results:
+ * 0 on success
+ * -1 on failure
+ *
+ * Side effects:
+ * Converts a Carbon event to a Tk event
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+TkMacOSXProcessEvent(TkMacOSXEvent * eventPtr, MacEventStatus * statusPtr)
+{
+ switch (eventPtr->eClass) {
+ case kEventClassMouse:
+ TkMacOSXProcessMouseEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassWindow:
+ TkMacOSXProcessWindowEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassKeyboard:
+ TkMacOSXProcessKeyboardEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassApplication:
+ TkMacOSXProcessApplicationEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassAppleEvent:
+ TkMacOSXProcessAppleEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassCgs:
+ case kEventClassUser:
+ case kEventClassWish:
+ statusPtr->handledByTk = 1;
+ break;
+ default:
+#ifdef TK_MAC_DEBUG
+ if (0)
+ {
+ char buf [ 256 ];
+ fprintf(stderr,
+ "Unrecognised event : %s\n",
+ CarbonEventToAscii(eventPtr->eventRef, buf));
+ }
+#endif
+ break;
+ }
+ return 0;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * ReceiveAndProcessEvent --
+ *
+ * This receives a carbon event and converts it to a tk event
+ *
+ * Results:
+ * 0 on success
+ * Mac OS error number on failure
+ *
+ * Side effects:
+ * This receives the next Carbon event
+ * and converts it to the appropriate tk event
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ReceiveAndProcessEvent()
+{
+ TkMacOSXEvent macEvent;
+ MacEventStatus eventStatus;
+ int err;
+ char buf [ 256 ];
+
+ /*
+ * This is a poll, since we have already counted the events coming
+ * into this routine, and are guaranteed to have one waiting.
+ */
+
+ err=ReceiveNextEvent(0, NULL, kEventDurationNoWait,
+ true, &macEvent.eventRef);
+ if (err != noErr) {
+ return err;
+ } else {
+ macEvent.eClass = GetEventClass(macEvent.eventRef);
+ macEvent.eKind = GetEventKind(macEvent.eventRef);
+ bzero(&eventStatus, sizeof(eventStatus));
+ TkMacOSXProcessEvent(&macEvent,&eventStatus);
+ if (!eventStatus.handledByTk) {
+ if (!targetRef) {
+ targetRef=GetEventDispatcherTarget();
+ }
+
+ err= SendEventToEventTarget(macEvent.eventRef,targetRef);
+ if (err != noErr /* && err != eventNotHandledErr */) {
+ fprintf(stderr,
+ "RCNE SendEventToEventTarget (%s) failed, %d\n",
+ CarbonEventToAscii(macEvent.eventRef,buf ),err);
+ }
+ }
+ ReleaseEvent(macEvent.eventRef);
+ return 0;
+ }
+}