diff options
author | das <das> | 2002-08-31 06:12:19 (GMT) |
---|---|---|
committer | das <das> | 2002-08-31 06:12:19 (GMT) |
commit | e947c1d0d386b229818958dc12ea0cc20e4ec582 (patch) | |
tree | 303845583d22d9e5e5f3f53edf451167cb5847e6 /macosx/tkMacOSXEvent.c | |
parent | 62d94160aed093a9505d60181a1509e69bd02bb6 (diff) | |
download | tk-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.c | 276 |
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; + } +} |