Paul DuBois
unread,Nov 25, 1986, 10:59:14 AM11/25/86You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# TDDemos/EventLog.c
# TDDemos/MiniDisplay.c
#
# MODERATOR'S NOTE: Tab-width is 4
#
sed 's/^X//' << 'SHAR_EOF' > TDDemos/EventLog.c
X/*
X EventLog - TransDisplay event-logging demonstration program
X
X The project should include EventLog.c (this file), TransDisplay.c
X (or a project made from TransDisplay.c), TransSkel.c (or a project
X made from TransSkel.c), and MacTraps.
X
X 8 November 1986 Paul DuBois
X*/
X
X
X# include <EventMgr.h>
X# include <MenuMgr.h>
X# include <ControlMgr.h>
X# include <FontMgr.h>
X# include "TransDisplay.h"
X
X
Xenum /* declare zoom box part codes */
X{
X inZoomIn = 7,
X inZoomOut
X};
X
X
X# define maxButton 14
X
X
X# define helpTextRes 1000 /* help text resource number */
X# define aboutAlrtRes 1000 /* About... alert resource number */
X
X
Xtypedef enum /* Menu resource numbers */
X{
X fileMenuRes = 1000,
X editMenuRes,
X logMenuRes
X};
X
X
Xtypedef enum /* Window resource numbers */
X{
X logWindRes = 1000,
X helpWindRes,
X selectWindRes
X};
X
X
Xtypedef enum /* File menu item numbers */
X{
X showLog = 1, /* make windows visible/bring to front */
X showHelp,
X showSelect,
X /* --- */
X quit = 5
X};
X
X
Xtypedef enum /* Edit menu item numbers */
X{
X undo = 1,
X /* --- */
X cut = 3,
X copy,
X paste,
X clear
X};
X
X
Xtypedef enum /* Log menu item numbers */
X{
X logEvents = 1, /* whether events are logged */
X excludeLWind,
X /* --- */
X flushLog = 4, /* flush log output */
X /* --- */
X wrapStyle = 6, /* word wrap or not */
X /* --- */
X leftJust = 8, /* justification */
X centerJust,
X rightJust,
X /* --- */
X small = 12, /* text size */
X medium,
X large,
X /* --- */
X top = 16, /* scroll home */
X bottom /* scroll to bottom */
X};
X
X
Xtypedef struct CtrlInfo
X{
X Point loc; /* upper left of control */
X Str255 title; /* control title */
X Boolean *flagAddr; /* associated boolean */
X ControlHandle ctrl; /* associated control */
X struct CtrlInfo *subInfo; /* subsidiary control */
X
X} CtrlInfo;
X
X
XWindowPtr selectWind; /* event selection window */
XWindowPtr helpWind; /* help text window */
XWindowPtr logWind; /* log output window */
XMenuHandle fileMenu;
XMenuHandle editMenu;
XMenuHandle logMenu;
XBoolean reportEvents; /* report events or not */
XBoolean excludeLog; /* exclude log window events or not */
Xint logFont;
Xint logSize;
Xint logWrap;
Xint logJust;
X
X
XBoolean /* event type selection flags */
X rMouseDown = true,
X rMouseMods = false,
X rMouseWind = true,
X rMouseLoc = false,
X rMousePart = true,
X rMouseSys = false,
X rMouseUp = false,
X rKeyDown = true,
X rKDMods = false,
X rAutoKey = true,
X rAKMods = false,
X rUpdate = true,
X rActivate = true,
X rDisk = true;
X
X
X/*
X Control information. The last field is used to tell which controls
X are "owned" by another. When the owner is unchecked, all the owned
X controls go dim.
X*/
X
XCtrlInfo ctrlInfo [maxButton] =
X{
X { { 5, 10}, "\pMouse Down", &rMouseDown, nil, nil },
X { { 25, 30}, "\pModifiers", &rMouseMods, nil, &ctrlInfo[0] },
X { { 45, 30}, "\pWindow", &rMouseWind, nil, &ctrlInfo[0] },
X { { 65, 30}, "\pLocation", &rMouseLoc, nil, &ctrlInfo[0] },
X { { 85, 30}, "\pPart Code", &rMousePart, nil, &ctrlInfo[0] },
X { { 105, 30}, "\pSystem Clicks", &rMouseSys, nil, &ctrlInfo[0] },
X { { 125, 10}, "\pMouse Up", &rMouseUp, nil, nil },
X { { 5, 160}, "\pKey Down", &rKeyDown, nil, nil },
X { { 25, 180}, "\pModifiers", &rKDMods, nil, &ctrlInfo[7] },
X { { 45, 160}, "\pAutoKey", &rAutoKey, nil, nil },
X { { 65, 180}, "\pModifiers", &rAKMods, nil, &ctrlInfo[9] },
X { { 85, 160}, "\pUpdate", &rUpdate, nil, nil },
X { { 105, 160}, "\pActivate", &rActivate, nil, nil },
X { { 125, 160}, "\pDisk", &rDisk, nil, nil }
X};
X
X/* Window that was in front last time checked */
X
XWindowPtr lastFront = nil;
X
X
X/*
X Print information about a window. If it's a window with a title,
X print the title. Print whether it's a
X desk accessory window.
X*/
X
XWindowInfo (theWind)
XWindowPeek theWind;
X{
XStr255 title;
X
X GetWTitle (theWind, title);
X if (title[0] != 0) /* window has title */
X {
X DisplayChar (' ');
X DisplayString (title);
X }
X
X if (theWind->windowKind < 0)
X DisplayString ("\p (DA)");
X}
X
X
XModifiers (mods)
Xint mods;
X{
X DisplayString ("\p mods (0x");
X DisplayHexInt (mods);
X DisplayChar (')');
X}
X
X
XMouseLoc (thePt, thePort)
XPoint thePt;
XGrafPtr thePort;
X{
XGrafPtr savePort;
X
X GetPort (&savePort);
X SetPort (thePort);
X GlobalToLocal (&thePt);
X SetPort (savePort);
X if (rMouseLoc)
X {
X DisplayString ("\p loc (");
X DisplayInt (thePt.h);
X DisplayString ("\p, ");
X DisplayInt (thePt.v);
X DisplayChar (')');
X }
X}
X
X
X/*
X Mouse click. Get the window that the click occurred in, and the
X part of the window.
X
X Make sure to get all the part codes! (incl. zoom box stuff)
X*/
X
XReportMouse (theEvent)
XEventRecord *theEvent;
X{
XPoint evtPt;
Xint evtPart;
XGrafPtr evtPort;
X
X evtPt = theEvent->where;
X evtPart = FindWindow (evtPt, &evtPort);
X if (excludeLog && evtPort == logWind)
X return;
X DisplayString ("\pMouse click");
X
X switch (evtPart)
X {
X
X/*
X Click in a desk accessory window.
X*/
X case inSysWindow:
X if (rMouseSys)
X {
X if (rMousePart)
X DisplayString ("\p in system window:");
X if (rMouseWind)
X WindowInfo (evtPort);
X MouseLoc (evtPt, evtPort);
X }
X break;
X
X/*
X Click in desk top.
X*/
X case inDesk:
X if (rMousePart)
X DisplayString ("\p in desktop");
X break;
X
X/*
X Click in menu bar.
X*/
X case inMenuBar:
X if (rMousePart)
X DisplayString ("\p in menu bar");
X break;
X
X/*
X Click in grow box.
X*/
X case inGrow:
X if (rMousePart)
X DisplayString ("\p in grow region:");
X if (rMouseWind)
X WindowInfo (evtPort);
X MouseLoc (evtPt, evtPort);
X break;
X
X/*
X Click in title bar.
X*/
X case inDrag:
X if (rMousePart)
X DisplayString ("\p in drag region:");
X if (rMouseWind)
X WindowInfo (evtPort);
X break;
X
X/*
X Click in close box.
X*/
X case inGoAway:
X if (rMousePart)
X DisplayString ("\p in close box:");
X if (rMouseWind)
X WindowInfo (evtPort);
X break;
X
X/*
X Click in zoom-in box.
X*/
X case inZoomIn:
X if (rMousePart)
X DisplayString ("\p in zoom-in box:");
X if (rMouseWind)
X WindowInfo (evtPort);
X break;
X
X/*
X Click in zoom-out box.
X*/
X case inZoomOut:
X if (rMousePart)
X DisplayString ("\p in zoom-out box:");
X if (rMouseWind)
X WindowInfo (evtPort);
X break;
X
X/*
X Click in content region.
X
X (Might also check in in control, and if so, print control information)
X*/
X case inContent:
X if (rMousePart)
X DisplayString ("\p in content region:");
X if (rMouseWind)
X WindowInfo (evtPort);
X MouseLoc (evtPt, evtPort);
X break;
X
X }
X if (rMouseMods)
X Modifiers (theEvent->modifiers);
X DisplayLn ();
X}
X
X
XReportKey (what, c, mods, modFlag)
Xint what;
Xchar c;
Xint mods;
XBoolean modFlag;
X{
X if (what == keyDown)
X DisplayString ("\pKey down: char '");
X else
X DisplayString ("\pAutokey: char '");
X DisplayChar (c);
X DisplayString ("\p' ");
X if (modFlag)
X Modifiers (mods);
X DisplayLn ();
X}
X
X
XReportActivate (theWind, mods)
XWindowPtr theWind;
Xint mods;
X{
X if ((mods & activeFlag) != 0)
X DisplayString ("\pActivate:");
X else
X DisplayString ("\pDeactivate:");
X WindowInfo (theWind);
X DisplayLn ();
X}
X
X
XReportUpdate (theWind)
XWindowPtr theWind;
X{
X DisplayString ("\pUpdate:");
X WindowInfo (theWind);
X DisplayLn ();
X}
X
X
X/*
X General event logger
X*/
X
XLogEvent (theEvt)
XEventRecord *theEvt;
X
X{
Xregister EventRecord *theEvent;
XPoint evtPt;
XGrafPtr evtPort;
Xregister int evtPart;
Xregister char evtChar;
Xregister int evtMods;
XRect r;
X
X if (reportEvents == false)
X return (false); /* don't do anything */
X theEvent = theEvt;
X evtPt = theEvent->where;
X switch (theEvent->what)
X {
X
X/*
X Mouse click.
X*/
X case mouseDown:
X if (rMouseDown)
X ReportMouse (theEvent);
X break;
X
X case mouseUp:
X if (rMouseUp)
X DisplayString ("\pMouse up\r");
X break;
X
X/*
X Key event.
X*/
X case keyDown:
X if (excludeLog && FrontWindow () == logWind)
X break;
X if (rKeyDown)
X {
X evtChar = theEvent->message & charCodeMask;
X evtMods = theEvent->modifiers;
X ReportKey (keyDown, evtChar, evtMods, rKDMods);
X }
X break;
X
X case autoKey:
X if (excludeLog && FrontWindow () == logWind)
X break;
X if (rKeyDown)
X {
X evtChar = theEvent->message & charCodeMask;
X evtMods = theEvent->modifiers;
X ReportKey (autoKey, evtChar, evtMods, rAKMods);
X }
X break;
X
X/*
X Update a window. If it's an update for the log window, invalidate
X it, because the message is written and will cause a scroll BEFORE
X the window actually gets updated. This means that part of what
X needs redrawing will be scrolled out of the update region and won't
X be redrawn properly. Invalidating the entire port is wasteful but
X makes sure the whole window can be drawn properly.
X*/
X case updateEvt:
X if ((WindowPtr) theEvent->message == logWind)
X {
X SetPort (logWind);
X InvalRect (&logWind->portRect);
X }
X if (excludeLog && (WindowPtr) theEvent->message == logWind)
X break;
X if (rUpdate)
X ReportUpdate (theEvent->message);
X break;
X
X/*
X Activate or deactivate a window.
X*/
X case activateEvt:
X if (excludeLog && (WindowPtr) theEvent->message == logWind)
X break;
X if (rActivate)
X ReportActivate (theEvent->message, theEvent->modifiers);
X break;
X
X/*
X handle inserts of uninitialized disks
X*/
X case diskEvt:
X if (rDisk)
X {
X DisplayString ("\pDisk insertion");
X if (HiWord (theEvent->message) != noErr)
X {
X DisplayString ("\p (needs initializing)");
X }
X DisplayLn ();
X }
X break;
X
X }
X return (false);
X}
X
X
X/*
X Background procedure. Check front window, reset edit menu if window
X changes from an application window to a non-application window.
X Disable the Edit menu whenever an application window is active,
X enable it otherwise.
X Also called whenever it is known that the active window has changed.
X*/
X
XCheckFront ()
X{
XWindowPtr curWind;
Xint theKind;
XBoolean lastIsApp = false,
X curIsApp = false;
X
X curWind = FrontWindow ();
X if (IsDWindow (lastFront) || lastFront == selectWind)
X lastIsApp = true;
X if (IsDWindow (curWind) || curWind == selectWind)
X curIsApp = true;
X if (lastFront != curWind)
X {
X if (IsDWindow (lastFront) || lastFront == selectWind)
X lastIsApp = true;
X if (IsDWindow (curWind) || curWind == selectWind)
X curIsApp = true;
X if (lastIsApp != curIsApp)
X {
X theKind = 0;
X if (curWind != nil)
X theKind = ((WindowPeek) curWind)->windowKind;
X if (curWind == nil || theKind < 0) /* no window or DA in front */
X EnableItem (editMenu, 0);
X else
X DisableItem (editMenu, 0);
X DrawMenuBar ();
X }
X lastFront = curWind;
X }
X}
X
X
X/* ------------------------------------------------------------ */
X/* Event Selection Window Handler Routines */
X/* ------------------------------------------------------------ */
X
X
X/*
X Activate event procedure for both display windows and the checkbox
X window.
X*/
X
XActivate (active)
XBoolean active;
X{
X CheckFront ();
X}
X
X/*
X Update window. This is easy, just draw the controls.
X*/
X
XUpdate (resized)
XBoolean resized; /* ignored */
X{
X DrawControls (selectWind);
X}
X
X
X/*
X Handle hits in check boxes:
X Toggle check box, sync the associated flag, and enable or disable
X any subsidiary check boxes accordingly. (Subsidiaries have
X information in the control structure that points back to the owner
X check box.)
X
X*/
X
XMouse (thePt, t, mods)
XPoint thePt;
Xlong t;
Xint mods;
X{
XControlHandle ctl;
XCtrlInfo *ci;
XBoolean val;
Xint i;
X
X if (FindControl (thePt, selectWind, &ctl))
X {
X if (TrackControl (ctl, thePt, nil))
X {
X ci = (CtrlInfo *) GetCRefCon (ctl);
X val = !GetCtlValue (ctl);
X *(ci->flagAddr) = val;
X SetCtlValue (ctl, val);
X
X /* enable/disable any subsidiaries */
X
X for (i = 0; i < maxButton; ++i)
X {
X if (ctrlInfo[i].subInfo->ctrl == ci->ctrl)
X HiliteControl (ctrlInfo[i].ctrl, val ? 0 : 255);
X }
X }
X }
X}
X
X
X/*
X File menu handler
X*/
X
XDoFileMenu (item)
Xint item;
X{
X switch (item)
X {
X case showHelp:
X SelectWindow (helpWind);
X ShowWindow (helpWind);
X break;
X
X case showSelect:
X SelectWindow (selectWind);
X ShowWindow (selectWind);
X break;
X
X case showLog:
X SelectWindow (logWind);
X ShowWindow (logWind);
X break;
X
X case quit:
X SkelWhoa ();
X break;
X
X }
X}
X
X/*
X Put the right check marks in the Log menu
X*/
X
XSetLogMenu ()
X{
X CheckItem (logMenu, logEvents, reportEvents);
X CheckItem (logMenu, excludeLWind, excludeLog);
X CheckItem (logMenu, wrapStyle, logWrap >= 0);
X CheckItem (logMenu, leftJust, logJust == teJustLeft);
X CheckItem (logMenu, centerJust, logJust == teJustCenter);
X CheckItem (logMenu, rightJust, logJust == teJustRight);
X CheckItem (logMenu, small, logSize == 9);
X CheckItem (logMenu, medium, logSize == 12);
X CheckItem (logMenu, large, logSize == 24);
X}
X
X
X/*
X Set display style of log window
X*/
X
XSetStyle ()
X{
X SetDWindowStyle (logWind, logFont, logSize, logWrap, logJust);
X SetLogMenu ();
X}
X
X
X/*
X Log menu handler
X*/
X
XDoLogMenu (item)
Xint item;
X{
X switch (item)
X {
X case logEvents:
X reportEvents = !reportEvents;
X SetLogMenu ();
X break;
X
X case excludeLWind:
X excludeLog = !excludeLog;
X SetLogMenu ();
X break;
X
X case flushLog:
X FlushDWindow (logWind, 32767L);
X break;
X
X case wrapStyle:
X logWrap = (logWrap >= 0 ? -1 : 0);
X SetStyle ();
X break;
X
X case leftJust:
X logJust = teJustLeft;
X SetStyle ();
X break;
X
X case centerJust:
X logJust = teJustCenter;
X SetStyle ();
X break;
X
X case rightJust:
X logJust = teJustRight;
X SetStyle ();
X break;
X
X case small:
X logFont = monaco;
X logSize = 9;
X SetStyle ();
X break;
X
X case medium:
X logFont = systemFont;
X logSize = 12;
X SetStyle ();
X break;
X
X case large:
X logFont = geneva;
X logSize = 24;
X SetStyle ();
X break;
X
X case top:
X SetDWindowPos (logWind, 0);
X break;
X
X case bottom:
X SetDWindowPos (logWind, 32767);
X break;
X }
X}
X
X
X/*
X Handle selection of AboutI item from Apple menu
X*/
X
XDoAbout ()
X{
X (void) Alert (aboutAlrtRes, nil);
X}
X
X
X/*
X Dispose of event selection window (and controls)
X*/
X
XWClobber ()
X{
X DisposeWindow (selectWind);
X}
X
X
X
X/*
X Create controls
X*/
X
XMakeControls (theWind)
XWindowPtr theWind;
X{
Xint i;
XCtrlInfo *ci;
XRect r;
X
X for (i = 0; i < maxButton; ++i)
X {
X ci = &ctrlInfo[i];
X SetRect (&r, ci->loc.h, ci->loc.v,
X ci->loc.h + StringWidth (ci->title) + 30,
X ci->loc.v + 20);
X ci->ctrl = NewControl (theWind, &r, ci->title, true,
X *(ci->flagAddr), 0, 1,
X checkBoxProc, ci);
X }
X ValidRect (&theWind->portRect);
X}
X
X
Xmain ()
X{
XHandle h;
X
X SkelInit ();
X SkelApple ("\pAbout EventLogI", DoAbout);
X
X fileMenu = GetMenu (fileMenuRes);
X SkelMenu (fileMenu, DoFileMenu, nil);
X
X editMenu = GetMenu (editMenuRes);
X DisableItem (editMenu, 0);
X SkelMenu (editMenu, nil, nil);
X
X logMenu = GetMenu (logMenuRes);
X SkelMenu (logMenu, DoLogMenu, nil);
X
X/*
X Create windows and install handlers.
X*/
X
X SetDWindowNotify (nil, Activate);
X
X helpWind = GetNewDWindow (helpWindRes, -1L);
X SetDWindowStyle (helpWind, 0, 0, 0, teJustLeft);
X
X h = GetResource ('TEXT', helpTextRes); /* read help text */
X HLock (h); /* lock it and write to window */
X DisplayText (*h, GetHandleSize (h));
X HUnlock (h);
X ReleaseResource (h); /* done with it, so goodbye */
X SetDWindowPos (helpWind, 0); /* scroll back to top */
X ShowWindow (helpWind);
X
X logWind = GetNewDWindow (logWindRes, -1L);
X
X SkelEventHook (LogEvent);
X reportEvents = true;
X excludeLog = false;
X
X logFont = monaco;
X logSize = 9;
X logWrap = 0;
X logJust = teJustLeft;
X SetStyle ();
X ShowWindow (logWind);
X
X selectWind = GetNewWindow (selectWindRes, nil, -1L);
X
X SkelWindow (selectWind, /* the window */
X Mouse, /* mouse click handler */
X nil, /* key clicks are ignored */
X Update, /* window updating procedure */
X Activate, /* window activate/deactivate procedure */
X nil, /* hide window */
X WClobber, /* window disposal procedure */
X nil, /* idle proc */
X true); /* irrelevant */
X
X MakeControls (selectWind);
X
X/*
X Process events until user quits,
X then clean up and exit
X*/
X
X CheckFront ();
X SkelBackground (CheckFront);
X SkelMain ();
X SkelClobber ();
X}
SHAR_EOF
sed 's/^X//' << 'SHAR_EOF' > TDDemos/MiniDisplay.c
X/*
X MiniDisplay - TransDisplay Demonstration. Very simple: just
X demonstrates the various output calls.
X
X The project should include MiniDisplay.c (this file),
X TransDisplay.c (or a project made from TransDisplay.c),
X TransSkel.c (or a project made from TransSkel.c), and MacTraps.
X
X 4 October 1986 Paul DuBois
X*/
X
X# include <MenuMgr.h>
X# include "TransDisplay.h"
X
X
X
XDoFileMenu (item)
Xint item; /* ignored - there's only Quit */
X{
X SkelWhoa (); /* tell SkelMain to quit */
X}
X
X
Xmain ()
X{
XRect r;
XMenuHandle m;
XWindowPtr w;
X
X SkelInit (); /* initialize */
X SkelApple (nil, nil); /* handle desk accessories */
X
X m = NewMenu (2, "\pFile"); /* create menu */
X AppendMenu (m, "\pQuit/Q");
X SkelMenu (m, DoFileMenu, nil); /* tell TransSkel to handle it */
X
X SetRect (&r, 100, 75, 400, 250);
X w = NewDWindow (&r, "\pMiniDisplay", false, -1L, false, 0L);
X
X DisplayString ("\pThis is MiniDisplay, a minimal demonstration of ");
X DisplayString ("\pTransDisplay. The following types of output may ");
X DisplayString ("\pbe written with the built-in output calls:\r");
X
X DisplayString ("\p\rArbitrary length text: ");
X DisplayText ("Some text", 9L);
X DisplayString ("\p\rString: ");
X DisplayString ("\p\"\\pThis is a string.\"");
X DisplayString ("\p\rChar: '");
X DisplayChar ('x');
X DisplayString ("\p' Hex char: ");
X DisplayHexChar ('x');
X DisplayString ("\p\rInt: ");
X DisplayInt (1023);
X DisplayString ("\p Hex int: ");
X DisplayHexInt (1023);
X DisplayString ("\p\rLong: ");
X DisplayLong (32768L);
X DisplayString ("\p Hex long: ");
X DisplayHexLong (32768L);
X DisplayString ("\p\rBoolean: ");
X DisplayBoolean (true);
X DisplayString ("\p, ");
X DisplayBoolean (false);
X DisplayString ("\p\rCarriage return. ");
X DisplayString ("\p\r\rSelect Quit from the File menu to exit.");
X SetDWindowPos (w, 0); /* scroll back to top */
X ShowWindow (w);
X
X SkelMain (); /* loop 'til Quit selected */
X SkelClobber (); /* clean up */
X}
SHAR_EOF
exit