[comp.sys.amiga] DMOUSE 1.06 SHAR

dillon@CORY.BERKELEY.EDU (Matt Dillon) (05/21/88)

	Wow, I never expected such resounding success!  O.K.  Here is 1.06

	-# clicks required for window-to-front now setable, default 1 (-c#)
	 you can set it to 1, 2, 3, 50... whatever you want.
	-mouse non-blanking problem fixed, similar fix for screen blanking
	 though nobody reported a problem with that.

	-The bug reported having to do with the screen title for (was it
	 online?) disappearing has NOT been fixed.  I do not have the program
	 in question.

						-Matt


#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	dmouse-handler.c
#	dmouse-handler.uue
#	dmouse.c
#	dmouse.doc
#	dmouse.h
#	dmouse.uue
# This archive created: Wed May 18 15:31:18 1988
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'dmouse-handler.c'" '(8571 characters)'
if test -f 'dmouse-handler.c'
then
	echo shar: "will not over-write existing file 'dmouse-handler.c'"
else
cat << \!Funky!Stuff! > 'dmouse-handler.c'

/*
 *  DMOUSE-HANDLER.C		compile 32 bit integers (+L)
 *				AZTEC COMPILATION
 *  18 May 1988
 */

#include "dmouse.h"

#define IBASE IntuitionBase

DMS	*Dms;
struct IntuitionBase *IntuitionBase;
struct GfxBase	     *GfxBase;
long		     *LayersBase;

NS	Ns = {	0, 0, 64, -1, 1, -1, -1, 0, CUSTOMSCREEN|SCREENQUIET };

IE *handler();

_main()
{
    register DMS *dms;
    IOR  *ior;
    INT addhand;

    {
	register PROC *proc = (PROC *)FindTask(NULL);
	proc->pr_ConsoleTask = NULL;
    }
    dms = Dms = FindPort(PORTNAME);
    if (!dms)
	_exit(0);
    dms->Port.mp_Flags = PA_SIGNAL;
    dms->Port.mp_SigBit = AllocSignal(-1);
    dms->Port.mp_SigTask = FindTask(NULL);
    dms->HandTask = dms->Port.mp_SigTask;
    ior = CreateStdIO(&dms->Port);
    IntuitionBase = OpenLibrary("intuition.library", 0);
    GfxBase = OpenLibrary("graphics.library", 0);
    LayersBase = OpenLibrary("layers.library", 0);

    if (!IntuitionBase || !GfxBase || !LayersBase)
	goto startupfail;
    addhand.is_Node.ln_Pri = 51;
    addhand.is_Code = (FPTR)handler;
    addhand.is_Data = NULL;

    if (OpenDevice("input.device", 0, ior, 0)) {
	goto startupfail;
    } else {
	SCR *scr = NULL;
	uword *SprSavePtr = NULL;

	Signal(dms->ShakeTask, 1 << dms->ShakeSig);
	ior->io_Command = IND_ADDHANDLER;
	ior->io_Data = (APTR)&addhand;
	DoIO(ior);
	for (;;) {
	    register long sigs = Wait(SBF_C|(1<<dms->Port.mp_SigBit));
	    if (sigs & (1 << dms->Port.mp_SigBit)) {
		register MSG *msg;
		while (msg = GetMsg(&dms->Port)) {
		    switch((long)msg->mn_Node.ln_Name) {
		    case REQ_SCREENON:
			if (scr)
			    CloseScreen(scr);
			scr = NULL;
			break;
		    case REQ_SCREENOFF:
			if (scr) {
			    ScreenToFront(scr);
			} else {
			    if (scr = OpenScreen(&Ns))
				SetRGB4(&scr->ViewPort, 0, 0, 0, 0);
			}
			break;
		    case REQ_MOUSEON:
			if (SprSavePtr) {
			    register COPINIT *ci = GfxBase->copinit;
			    ci->sprstrtup[1] = (ulong)SprSavePtr >> 16;
			    ci->sprstrtup[3] = (uword)(long)SprSavePtr;
			    SprSavePtr = NULL;
			}
			break;
		    case REQ_MOUSEOFF:
			{
			    register COPINIT *ci = GfxBase->copinit;
			    if (!SprSavePtr)
				SprSavePtr = (uword *)((ci->sprstrtup[1] << 16) | ci->sprstrtup[3]);
			    ci->sprstrtup[1] = (ulong)dms->NoSprData >> 16;
			    ci->sprstrtup[3] = (uword)(long)dms->NoSprData;
			}
			break;
		    case REQ_DOCMD:
			{
			    long fh = Open("nil:", 1006);
			    Execute(dms->Cmd, NULL, fh);
			    if (fh)
				Close(fh);
			}
			break;
		    }
		    FreeMem(msg, msg->mn_Length);
		}
	    }
	    if (sigs & SBF_C)
		break;
	}
	Forbid();
	ior->io_Command = IND_REMHANDLER;
	ior->io_Data = (APTR)&addhand;
	DoIO(ior);
	Permit();
	CloseDevice(ior);
	{
	    register MSG *msg;
	    while (msg = GetMsg(&dms->Port))
		FreeMem(msg, msg->mn_Length);
	}
	if (scr)
	    CloseScreen(scr);
	if (SprSavePtr) {
	    register COPINIT *ci = GfxBase->copinit;
	    ci->sprstrtup[1] = (ulong)SprSavePtr >> 16;
	    ci->sprstrtup[3] = (uword)(long)SprSavePtr;
	    SprSavePtr = NULL;
	}
    }
    goto closedown;
startupfail:
    dms->StartupError = 1;
    Signal(dms->ShakeTask, 1 << dms->ShakeSig);
    Wait(SBF_C);
closedown:
    DeleteStdIO(ior);
fail:
    if (IntuitionBase)
	CloseLibrary(IntuitionBase);
    if (GfxBase)
	CloseLibrary(GfxBase);
    if (LayersBase)
	CloseLibrary(LayersBase);
    Forbid();
    Signal(dms->ShakeTask, 1 << dms->ShakeSig);
}


#asm
	    ;	A0 = pointer to event linked list
	    ;	A1 = pointer to my data segment
	    ;	return new event linked list in D0

	    public  _CHandler

_handler:
	    movem.l D2/D3/A0/A1/A4/A6,-(sp)
	    jsr     _CHandler
	    movem.l (sp)+,D2/D3/A0/A1/A4/A6
	    rts

#endasm

/*
 *  (1) Accellerate mouse movements.
 *  (2) Auto-Select window
 */

IE *
CHandler(scr0, scr1, Ev)
IE *Ev;
{
    register IE *ev;
    register DMS *dms;
    static char STimedout;
    static char MTimedout;
    static long STime, MTime;

    geta4();
    dms = Dms;
    for (ev = Ev; ev; ev = Ev->ie_NextEvent) {
	switch(ev->ie_Class) {
	case IECLASS_RAWMOUSE:
	    /*
	     *	Mouse events restore both the screen and mouse pointer.
	     */

	    STime = ev->ie_TimeStamp.tv_secs + dms->STo;
	    MTime = ev->ie_TimeStamp.tv_secs + dms->MTo;
	    if (STimedout)
		sendrequest(REQ_SCREENON);
	    if (MTimedout)
		sendrequest(REQ_MOUSEON);
	    STimedout = MTimedout = 0;

	    /*
	     *	Mouse Acceleration
	     */
	    {
		register short n;
		register short s;

		if (dms->Acc != 1) {
		    n = ev->ie_X;
		    s = 1;
		    if (n < 0) {
			n = -n;
			s = -1;
		    }
		    if (n > dms->AThresh)
			ev->ie_X = s * (short)((n - dms->AThresh - 1) * dms->Acc + dms->AThresh + 1);
		    n = ev->ie_Y;
		    s = 1;
		    if (n < 0) {
			n = -n;
			s = -1;
		    }
		    if (n > dms->AThresh)
			ev->ie_Y = s * (short)((n - dms->AThresh - 1) * dms->Acc + dms->AThresh + 1);
		}
	    }

	    /*
	     *	Auto Activate and LMB (win/scrn front/bak)
	     */
	    if (dms->AAEnable | dms->LMBEnable) {
		register LAYER *layer;

		Forbid();
		layer = WhichMouseLayer();
		if (dms->LMBEnable && ev->ie_Code == IECODE_RBUTTON && (ev->ie_Qualifier & dms->RQual)) {
		    register WIN *win;
		    if (layer && (win = (WIN *)layer->Window) && !(win->Flags & BACKDROP) && (win->NextWindow || win->WScreen->FirstWindow != win))
			WindowToBack(layer->Window);
		    else if (IBASE->FirstScreen)
			ScreenToBack(IBASE->FirstScreen);
		    ev->ie_Class = IECLASS_NULL;    /*	remove event	*/
		}
		if (layer && layer->Window) {
		    if (dms->LMBEnable && ev->ie_Code == IECODE_LBUTTON && layer->ClipRect && layer->ClipRect->Next) {
			/*
			 *  Note: Case where it is the 'first' click in a series, where dms->CTime is
			 *	  garbage, works properly no matter what DoubleClick returns.
			 */
			if ((APTR)dms->CWin == layer->Window && DoubleClick(dms->CTime.tv_secs, dms->CTime.tv_micro, ev->ie_TimeStamp.tv_secs, ev->ie_TimeStamp.tv_micro))
			    --dms->CLeft;
			else
			    dms->CLeft = dms->Clicks - 1;
			dms->CTime = ev->ie_TimeStamp;
			dms->CWin = (WIN *)layer->Window;
			if (dms->CLeft == 0) {
			    dms->CLeft = dms->Clicks;
			    WindowToFront(layer->Window);
			}
		    }
		    if (dms->AAEnable && ev->ie_Code == IECODE_NOBUTTON && !(ev->ie_Qualifier & 0x7000) && layer->Window != IBASE->ActiveWindow)
			ActivateWindow(layer->Window);
		}
		Permit();
	    }
	    break;
	case IECLASS_RAWKEY:
	    /*
	     *	Keyboard events will kill the screen timeout but not
	     *	the mouse timeout.
	     */
	    {
		register LAYER *layer;

		Forbid();
		layer = WhichMouseLayer();
		if (layer && layer->Window) {
		    if (dms->AAEnable && layer->Window != IBASE->ActiveWindow)
			ActivateWindow(layer->Window);
		}
		Permit();
	    }
	    STime = ev->ie_TimeStamp.tv_secs + dms->STo;
	    if (STimedout)
		sendrequest(REQ_SCREENON);
	    STimedout = 0;
	    if (ev->ie_Code == dms->Code && ev->ie_Qualifier == dms->Qual) {
		sendrequest(REQ_DOCMD);
		ev->ie_Class = IECLASS_NULL;	/*  remove event    */
	    }
	    break;
	case IECLASS_TIMER:
	    /*
	     *	On a timer event, if timeout has occured execute the operation
	     *	and reset the timeout.	Note that this will cause continuous
	     *	timeouts every STo and MTo seconds... required because at any
	     *	time Intuition might turn the mouse back on or open a screen or
	     *	something and I want the blanker's to work in the long run.
	     */
	    {
		register long old;
		if (dms->STo && (old = STime - ev->ie_TimeStamp.tv_secs) < 0) {
		    STime = ev->ie_TimeStamp.tv_secs + dms->STo + 10;
		    STimedout = 1;
		    if (old > -10)
			sendrequest(REQ_SCREENOFF);
		}
		if (dms->MTo && (old = MTime - ev->ie_TimeStamp.tv_secs) < 0) {
		    MTime = ev->ie_TimeStamp.tv_secs + dms->MTo + 1;
		    MTimedout = 1;
		    if (old > -10)
			sendrequest(REQ_MOUSEOFF);
		}
	    }
	    break;
	}
    }
    return(Ev);
}


sendrequest(req)
long req;
{
    register MSG *msg = AllocMem(sizeof(MSG), MEMF_PUBLIC);

    if (msg) {
	msg->mn_Node.ln_Name = (char *)req;
	msg->mn_ReplyPort = NULL;
	msg->mn_Length = sizeof(MSG);
	PutMsg(&Dms->Port, msg);
    }
}

LAYER *
WhichMouseLayer()
{
    register struct IntuitionBase *ib = IBASE;
    register LAYER *layer = NULL;
    register SCR *scr = ib->FirstScreen;

    for (scr = ib->FirstScreen; scr; scr = scr->NextScreen) {
	register short mousey = ib->MouseY;
	if (!(scr->ViewPort.Modes & LACE))
	    mousey >>= 1;
	if (layer = WhichLayer(&scr->LayerInfo, ib->MouseX, mousey - scr->ViewPort.DyOffset))
	    break;
	if (mousey >= scr->ViewPort.DyOffset)
	    break;
    }
    return(layer);
}

!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'dmouse-handler.uue'" '(4525 characters)'
if test -f 'dmouse-handler.uue'
then
	echo shar: "will not over-write existing file 'dmouse-handler.uue'"
else
cat << \!Funky!Stuff! > 'dmouse-handler.uue'
begin 644 dmouse-handler
M```#\P`````````#``````````(```,0````(`````$```/I```#$$[Z"`!.
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
M`````_(```/J````"0``````0/__``'__P```0\`````````````````````
4`!0``````_(```/K`````0```_+_
`
end
!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'dmouse.c'" '(5766 characters)'
if test -f 'dmouse.c'
then
	echo shar: "will not over-write existing file 'dmouse.c'"
else
cat << \!Funky!Stuff! > 'dmouse.c'

/*
 *  DMOUSE.C	V1.06	18 May 1988	 (Aztec Compile, +L  ... 32 bit ints)
 *					 and link w/ c32.lib
 *
 *  DMOUSE QUIT
 *  DMOUSE -a# -t# -s# -m# -c# -L0 -Rqqqq -A0 -Kcccc -Qqqqq -C cmd
 *
 *  -a#     # = acceleration, default 3.	1 to disable
 *  -t#     # = mouse threshold before acceleration takes effect, def. 0
 *		(in pixels/event)
 *  -s#     # = screen timeout, default 5min,	0 to disable
 *  -m#     # = pointer timeout, default 5 secs,0 to disable
 *  -c#     # = # of clicks to bring window to front
 *  -L0     Disable LeftMouseButton->WindowToFront (LMB+RMB->ToBack)
 *  -L1     Enable it
 *  -Rqqqq  Set qualifier + RMB for Window/ScreenToBack (default LMB)
 *  -A0     Disable Auto-Activate window on mouse move
 *  -A1     Enable it
 *  -Kcccc  Set key code in hex that activates cmd, def is escape
 *  -Qqqqq  Set key qualifier in hex for keycode, def is left-amiga
 *  -C cmd  Set command (must be last option on command line), def NewCli
 *
 *	Note:	The -Q Qualifiers usually must be or'd with x8000
 *	Note:	The -R Qualifier should NOT be or'd with x8000.
 *
 *
 *  To remove, BREAK the CLI it ran under.
 *
 *  TODO:   mouse pointer sometimes gets turned on by intuition
 */

#include <stdio.h>
#include "dmouse.h"

#define VERSION 6

int	Enable_Abort;	    /*	CLI break enable	*/

main(ac, av)
char *av[];
{
    register short i, j, len;
    register long val;
    register char *ptr;
    register DMS  *dms = FindPort(PORTNAME);
    short   exists = (dms != NULL);
    short   create = (dms == NULL);
    short   quit = 0;

    Enable_Abort = 0;
    if (create) {
	dms = AllocMem(sizeof(DMS), MEMF_PUBLIC|MEMF_CLEAR);
	dms->Version = VERSION;
	dms->Acc = 3;
	dms->STo = 5*60;
	dms->MTo = 5;
	dms->Code = 0x45;
	dms->Qual = 0x8040;
	dms->RQual= 0x4000;
	dms->Clicks = 1;
	dms->CLeft = dms->Clicks;
	strcpy(dms->Cmd, "newcli");
	dms->LMBEnable = 1;
	dms->AAEnable = 1;
	dms->NoSprData = AllocMem(12, MEMF_PUBLIC|MEMF_CHIP|MEMF_CLEAR);
	dms->NoSprData[0] = 0xFE00;
	dms->NoSprData[1] = 0xFF00;
    }

    for (i = 1; i < ac; ++i) {
	ptr = av[i];
	if (strcmp(ptr, "QUIT") == 0 || strcmp(ptr, "quit") == 0) {
	    quit = 1;
	    create = 0;
	    break;
	}
	val = atoi(ptr+2);
	if (*ptr == '-') {
	    switch(ptr[1]) {
	    case 'a':
		dms->Acc = val;
		break;
	    case 'c':
		if (val < 1)
		    val = 1;
		dms->Clicks = dms->CLeft = val;
		break;
	    case 't':
		dms->AThresh = val;
		break;
	    case 's':
		dms->STo = val;
		break;
	    case 'm':
		dms->MTo = val;
		break;
	    case 'L':
		dms->LMBEnable = val;
		break;
	    case 'R':
		dms->RQual = ahtoi(ptr+2);
		break;
	    case 'A':
		dms->AAEnable = val;
		break;
	    case 'K':
		dms->Code = ahtoi(ptr+2);
		break;
	    case 'Q':
		dms->Qual = ahtoi(ptr+2);
		break;
	    case 'C':
		for (len = strlen(ptr+2) + 2, j = i + 1; j < ac; ++j)
		    len += strlen(av[j]) + 1;
		strcpy(dms->Cmd, ptr + 2);
		for (j = i + 1; j < ac; ++j) {
		    if (dms->Cmd[0])
			strcat(dms->Cmd, " ");
		    strcat(dms->Cmd, av[j]);
		}
		break;
	    default:
		puts("DMOUSE QUIT  or");
		puts("DMOUSE -a# -t# -s# -m# -L0 -Rqqqq -A0 -Kcccc -Qqqqq -C cmd");
		printf("V1.%02d PUBLIC DOMAIN, Matthew Dillon, 14 May 1988\n\n", VERSION);
		puts("  -a#     Acceleration (default 3)");
		puts("  -t#     Accel. threshold (default 0)");
		puts("  -s#     Screen timeout (default 300)");
		puts("  -m#     Mouse timeout (default 5)");
		puts("  -c#     Set # of clicks for wintofront (default 1)");
		puts("  -L0/1   LMB disable/enable (default 1=enabled)");
		puts("  -Rqqqq  RMB qualifier wintoback (default 4000=LMB)");
		puts("  -A0/1   Auto-Activate Window disable/enable");
		puts("  -Kcccc  Command Key Code, default 45 = esc");
		puts("  -Qqqqq  Command Key Qualifier (must | with 8000)");
		puts("  -C cmd  cmd to run, must be last option");
		puts("Note: LMB(or -R qualifier)(hold)+RMB = WindowToBack");
		puts("\n");
		puts("Additionaly, Any option may be modified while DMOUSE is active");
		create = 0;
		break;
	    }
	}
    }
    if (!exists && create) {
	PROC *proc;
	printf("Installing DMouse, ");
	fflush(stdout);
	dms->Port.mp_Flags = PA_IGNORE;
	dms->Port.mp_Node.ln_Pri = 0;
	dms->Port.mp_Node.ln_Type= NT_MSGPORT;
	dms->Port.mp_Node.ln_Name= AllocMem(sizeof(PORTNAME), MEMF_PUBLIC);
	strcpy(dms->Port.mp_Node.ln_Name, PORTNAME);
	NewList(&dms->Port.mp_MsgList);
	dms->Segment = LoadSeg("l:DMouse-Handler");
	if (!dms->Segment)
	    dms->Segment = LoadSeg("DMouse-Handler");
	if (!dms->Segment) {
	    puts("Unable to find L:DMouse-Handler");
	    FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
	    create = 0;
	} else {
	    AddPort(&dms->Port);
	    dms->ShakeTask = FindTask(NULL);
	    dms->ShakeSig = AllocSignal(-1);
	    proc = CreateProc(dms->Port.mp_Node.ln_Name, 1, dms->Segment, 4096);
	    Wait(1 << dms->ShakeSig);
	    FreeSignal(dms->ShakeSig);
	    exists = 1;
	    quit = dms->StartupError;
	    if (quit)
		puts("Handler error");
	    else
		printf("ok.  DMouse V1.%02d, by Matthew Dillon.  PUBLIC DOMAIN.\n", VERSION);
	}
    }
    if (quit) {
	if (exists) {
	    printf("Removing, ");
	    fflush(stdout);
	    dms->ShakeTask = FindTask(NULL);
	    dms->ShakeSig = AllocSignal(-1);
	    Signal(dms->HandTask, SBF_C);
	    Wait(1 << dms->ShakeSig);
	    FreeSignal(dms->ShakeSig);
	    RemPort(&dms->Port);
	    FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
	    UnLoadSeg(dms->Segment);
	    puts("ok");
	}
	exists = 0;
	create = 0;
    }
    if (!exists) {
	FreeMem(dms->NoSprData, 12);
	FreeMem(dms, sizeof(DMS));
    }
}

ahtoi(str)
register char *str;
{
    register long val = 0;
    register char c;
    while (c = *str) {
	val <<= 4;
	if (c >= '0' && c <= '9')
	    val |= (c & 15);
	else
	    val |= (c & 15) + 9;
	++str;
    }
    return(val);
}


!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'dmouse.doc'" '(3528 characters)'
if test -f 'dmouse.doc'
then
	echo shar: "will not over-write existing file 'dmouse.doc'"
else
cat << \!Funky!Stuff! > 'dmouse.doc'

V1.06			   DMOUSE.DOC	       18 May 1988

			  Matthew Dillon
			  891 Regal Rd
			  Berkeley, California 94708
			  USA

	YAIH (Yet Another Input Handler)... nahh, like DMouse better...
for "Dillon's Mouse"???   Placed in PUBLIC DOMAIN because it's such a
nifty program!

	After looking at and rejecting several mouse-intuition input
handler enhancers (you know, accelerate the mouse, click-to-front, etc...)
and finding them all useless, I have written my own.

	- Any option can be turned off or modified.

	- Screen blanks if keyboard or mouse is idle > N1 secs (def 300)

	- The Pesky Mouse blanks if mouse is idle > N2 secs (def 5)

	- Auto Activate a window when the mouse is moved over it.  Window
	  also activated (if not already active) when you type.

	- Mouse Accelerator.  Back feeds power into the mouse unit;
	  give it a nudge and it is guarenteed to penetrate up to an
	  inch and a half of wall plaster (programmable depth).  Once
	  you start using it, you won't be able to switch back!

	- Programmable command-key and command string ala PopCli, default
	  left-Amiga ESC.

	- Left Mouse Button click in window brings it to the front
	    DOES NOT BRING THE WINDOW TO THE FRONT IF IT IS ALREADY
	    IN THE FRONT.  Other programs would call WindowToFront() on
	    every click, which is horrible if you have a simple-refresh
	    window.

	  # clicks required is settable.

	- Hold LMB, click Right Mouse Button .. Window to Back!  Great
	  for cycling windows.	See next feature for more info.

	- Same sequence as above, but if there is no window under the
	  current mouse position, there is only one window on the screen,
	  or the window under the mouse is a BACKDROP window, the
	  sequence cycles through Screens!

	- NO DAMN CLOCK.  Use another utility to get a clock.  No other
	  glossy thrills.  DMouse is short, sweet, and functional.

	- Does not use a CLI, can be placed in workbench startup sequence.

INSTALLATION:

    Place dmouse-handler in L: (or in the 'current' directory when DMOUSE
    is run).

EXECUTE FROM A CLI (e.g. WORKBENCH STARTUP SCRIPT), example:

    1> DMouse -C newcli "<nil: >nil: con:320/120/320/80/Shell c:shell.exe"

    There is no need to 'RUN' DMouse.  A double set of quotes may be
    required for the program to work properly with ConMan.

TO KILL:

    1> dmouse QUIT

SOURCE:

    Source is compileable under Aztec, +L (32 bit ints) and suitable
    precompiled include file (remember the precompiled include file must
    be precompiled with +L also)

COMMAND LINE ARGUMENTS:

    If DMouse is already running, any specified options will be
    incorporated.

    quit	QUIT .. remove DMouse
    -h		HELP
    -a# 	Set acceleration to #.	Default 3,	     1 disables option
    -t# 	Set mouse acceleration threshhold, pixs/ev. default 0.
    -s# 	Set screen timeout to # (secs), Default 300, 0 disables option
    -m# 	Set mouse timeout to # (secs), Defalut 5,    0 disabled option
    -c# 	Set # of clicks required to bring window to frlont (def 1)
    -L0 	Disable LMB Window To Front and LMB/RMB Window To Back
    -A0 	Disable Auto-Activate when mouse moved over a window
    -Rqqqq	Set Qualfier (HEX) with RMB for Window To Back (default is
		 the LMB qualifier).
    -Kcccc	Set Keycode (HEX)   for command key (default 0045)
    -Qqqqq	Set Qualifier (HEX) for command key (default 8040)
		    (For keycode and qualfier, must specify 4 hex digits)
    -C CMD	Set Command to run.  Default is NEWCLI.  Remaining arguments
		on command line is the command.


!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'dmouse.h'" '(1798 characters)'
if test -f 'dmouse.h'
then
	echo shar: "will not over-write existing file 'dmouse.h'"
else
cat << \!Funky!Stuff! > 'dmouse.h'

/*
 *  DMOUSE.H
 */

#define DMS struct _DMS

#define PORTNAME    "DMouse"

#define REQ_SCREENON	-1
#define REQ_SCREENOFF	-2
#define REQ_MOUSEON	-3
#define REQ_MOUSEOFF	-4
#define REQ_DOCMD	-5

#define SBF_C	SIGBREAKF_CTRL_C
#define SBF_D	SIGBREAKF_CTRL_D
#define SBF_E	SIGBREAKF_CTRL_E
#define SBF_F	SIGBREAKF_CTRL_F

typedef unsigned short	    uword;
typedef unsigned long	    ulong;

typedef struct copinit	    COPINIT;
typedef struct Message	    MSG;
typedef struct Custom	    CUST;
typedef struct Preferences  PREFS;
typedef struct InputEvent   IE;
typedef struct MsgPort	    PORT;
typedef struct IOStdReq     IOR;
typedef struct Interrupt    INT;
typedef struct Screen	    SCR;
typedef struct Window	    WIN;
typedef struct Layer	    LAYER;
typedef struct NewScreen    NS;
typedef struct Task	    TASK;
typedef struct Process	    PROC;
typedef struct timeval	    TS;
typedef void		    (*FPTR)();


DMS {
    PORT    Port;
    short   Version;
    short   Acc;
    short   AThresh;
    long    STo;
    long    MTo;
    uword   Code;
    uword   Qual;
    uword   RQual;
    char    Cmd[256];
    char    LMBEnable;
    char    AAEnable;
    TASK    *HandTask;
    TASK    *ShakeTask;
    short   ShakeSig;
    short   StartupError;
    uword   *NoSprData;
    long    Segment;

    uword   Clicks;	/*  # clicks required		*/
    uword   CLeft;	/*  # clicks left to do 	*/
    TS	    CTime;	/*  time of last click		*/
    WIN     *CWin;	/*  All clicks in same window	*/
};

extern IOR *CreateStdIO();
extern SCR *OpenScreen();
extern void *AllocMem();
extern void *malloc();
extern void *GetMsg();
extern void *OpenLibrary();
extern PORT *CreatePort();
extern TASK *FindTask();
extern PROC *CreateProc();
extern LAYER *WhichMouseLayer();
extern LAYER *WhichLayer();
extern DMS   *FindPort();

!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'dmouse.uue'" '(10803 characters)'
if test -f 'dmouse.uue'
then
	echo shar: "will not over-write existing file 'dmouse.uue'"
else
cat << \!Funky!Stuff! > 'dmouse.uue'
begin 644 dmouse
M```#\P`````````#``````````(```;Z````IP````$```/I```&^D[Z">9.
M5?_V2.</,$AZ!5!.NAKN6$\F0"`+9P1R`6`"<@`[0?_^(`MF!'(!8`)R`#M!
M__Q";?_Z0JR"EDIM__QG``".2'D``0`!2'@!7$ZZ&IY03R9`-WP`!@`B-WP`
M`P`D)WP```$L`"@G?`````4`+#=\`$4`,#=\@$``,C=\0```-#=\``$!3#=K
M`4P!3DAZ!--(:P`V3KH-/%!/%WP``0$V%WP``0$W2'D``0`#2'@`#$ZZ&CA0
M3R=``40@:P%$,+S^`"!K`40Q?/\```)X`6```H`P!$C`Y8`@;0`,)'`(`$AZ
M!(8O"DZZ#+I03TJ`9Q!(>@1[+PI.N@RJ4$]*@&8..WP``?_Z0FW__&```E`@
M2E2(+PA.N@A26$\N``P2`"UF``(L$"H``4B`2,!@``'.-T<`)&```AB^O```
M``%L`GX!-T<!3C='`4Q@``("-T<`)F```?HG1P`H8``!\B='`"Q@``'J%T<!
M-F```>(@2E2(+PA.N@>@6$\W0``T8``!SA='`3=@``'&($I4B"\(3KH'A%A/
M-T``,&```;(@2E2(+PA.N@=P6$\W0``R8``!GB!*5(@O"$ZZ$<183U2`/``R
M!$C!4H$Z`4C!8!HP!4C`Y8`@;0`,+S`(`$ZZ$:!83U*`W$!213`%2,"PK0`(
M;=P@2E2(+PA(:P`V3KH+U%!/,`1(P%*`.@!@+DHK`#9G#DAZ`UY(:P`V3KH+
M7%!/,`5(P.6`(&T`#"\P"`!(:P`V3KH+1%!/4D4P!4C`L*T`"&W(8``!"$AZ
M`RI.N@N46$](>@,P3KH+BEA/2'@`!DAZ`UU.N@QN4$](>@.(3KH+<EA/2'H#
MH4ZZ"VA83TAZ`[Y.N@M>6$](>@/;3KH+5%A/2'H#]4ZZ"TI83TAZ!"!.N@M`
M6$](>@1'3KH+-EA/2'H$<DZZ"RQ83TAZ!)9.N@LB6$](>@2Y3KH+&%A/2'H$
MXDZZ"PY83TAZ!0).N@L$6$](>@4L3KH*^EA/2'H%)$ZZ"O!83T)M__Q@4I"\
M````06<`_GY5@&<`_JA1@&<`_GI3@&<`_E!;@&<`_H)3@&<`_DR0O`````]G
M`/X$58!G`/X&D+P````*9P#^(EV`9P#^%%.`9P#^!F``_OQ21#`$2,"PK0`(
M;0#]>$IM__YF``$N2FW__&<``29(>@3C3KH+8EA/2'C__TAL@*Q.NA%>4$\7
M?``"``Y"*P`)%WP`!``(2'@``4AX``=.NA=,4$\G0``*2'H$Q"\K``I.N@HB
M4$](:P`43KH7DEA/2'H$LTZZ%JI83R=``4A*JP%(9@Y(>@2P3KH6EEA/)T`!
M2$JK`4AF($AZ!*M.N@GV6$](>``'+RL`"DZZ%R903T)M__Q@``",+PM.NA;(
M6$]"ITZZ%O983R=``3Q(>/__3KH6OEA/-T`!0$AX$``O*P%(2'@``2\K``I.
MNA7L3^\`$"M`__8P*P%`2,!R`>&A+P%.NA=26$\P*P%`2,`O`$ZZ%M183SM\
M``'__CMK`4+_^DIM__IG#$AZ!$).N@EF6$]@#DAX``9(>@1`3KH*2%!/2FW_
M^F<``)Q*;?_^9P``C$AZ!%].N@HN6$](>/__2&R`K$ZZ$"I03T*G3KH63%A/
M)T`!/$AX__].NA846$\W0`%`2'@0`"\K`3A.NA:X4$\P*P%`2,!R`>&A+P%.
MNA:V6$\P*P%`2,`O`$ZZ%CA83R\+3KH6:EA/2'@`!R\K``I.NA8.4$\O*P%(
M3KH5=%A/2'H#\4ZZ"+Q83T)M__Y";?_\2FW__F8:2'@`#"\K`41.NA7>4$](
M>`%<+PM.NA724$],WPSP3EU.=41-;W5S90!N97=C;&D`455)5`!Q=6ET`"``
M1$U/55-%(%%5250@(&]R`$1-3U5312`M82,@+70C("US(R`M;2,@+4PP("U2
M<7%Q<2`M03`@+4MC8V-C("U1<7%Q<2`M0R!C;60`5C$N)3`R9"!054),24,@
M1$]-04E.+"!-871T:&5W($1I;&QO;BP@,30@36%Y(#$Y.#@*"@`@("UA(R`@
M("`@06-C96QE<F%T:6]N("AD969A=6QT(#,I`"`@+70C("`@("!!8V-E;"X@
M=&AR97-H;VQD("AD969A=6QT(#`I`"`@+7,C("`@("!38W)E96X@=&EM96]U
M="`H9&5F875L="`S,#`I`"`@+6TC("`@("!-;W5S92!T:6UE;W5T("AD969A
M=6QT(#4I`"`@+6,C("`@("!3970@(R!O9B!C;&EC:W,@9F]R('=I;G1O9G)O
M;G0@*&1E9F%U;'0@,2D`("`M3#`O,2`@($Q-0B!D:7-A8FQE+V5N86)L92`H
M9&5F875L="`Q/65N86)L960I`"`@+5)Q<7%Q("!234(@<75A;&EF:65R('=I
M;G1O8F%C:R`H9&5F875L="`T,#`P/4Q-0BD`("`M03`O,2`@($%U=&\M06-T
M:79A=&4@5VEN9&]W(&1I<V%B;&4O96YA8FQE`"`@+4MC8V-C("!#;VUM86YD
M($ME>2!#;V1E+"!D969A=6QT(#0U(#T@97-C`"`@+5%Q<7%Q("!#;VUM86YD
M($ME>2!1=6%L:69I97(@*&UU<W0@?"!W:71H(#@P,#`I`"`@+4,@8VUD("!C
M;60@=&\@<G5N+"!M=7-T(&)E(&QA<W0@;W!T:6]N`$YO=&4Z($Q-0BAO<B`M
M4B!Q=6%L:69I97(I*&AO;&0I*U)-0B`](%=I;F1O=U1O0F%C:P`*`$%D9&ET
M:6]N86QY+"!!;GD@;W!T:6]N(&UA>2!B92!M;V1I9FEE9"!W:&EL92!$34]5
M4T4@:7,@86-T:79E`$EN<W1A;&QI;F<@1$UO=7-E+"``1$UO=7-E`$1-;W5S
M90!L.D1-;W5S92U(86YD;&5R`$1-;W5S92U(86YD;&5R`%5N86)L92!T;R!F
M:6YD($PZ1$UO=7-E+4AA;F1L97(`1$UO=7-E`$AA;F1L97(@97)R;W(`;VLN
M("!$36]U<V4@5C$N)3`R9"P@8GD@36%T=&AE=R!$:6QL;VXN("!054),24,@
M1$]-04E.+@H`4F5M;W9I;F<L(`!$36]U<V4`;VL`3E4``$CG#"`D;0`(>``:
M$F<VZ82Z/``P;1:Z/``Y;A`0!4B`2,#`O`````^(@&`4$`5(@$C`P+P````/
MT+P````)B(!2BF#&(`1,WP0P3EU.=4Y5``!(YPP@)&T`"`P2`"!G!@P2``EF
M!%**8/!Z``P2`"UF!GH!4HI@"`P2`"MF`E**>`!@("!*4HH0$$B`2,!R"B\`
M(`1.NA!&)!_4@"@"F+P````P$!)(@$C`0>R`%0@P``((`&;.2H5G!B`$1(!@
M`B`$3-\$,$Y=3G5A<$/L@E)%[()2M<EF#C(\`!)K"'0`(L)1R?_\*4^"5BQX
M``0I3H):2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYH*4""
M7F8,+CP``X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.=4Y5
M```O"DAY``$``#`L@D[!_``&+P!.NA!X4$\I0()B9A1"ITAY``$``$ZZ$"!0
M3RYL@E9.=2!L@F)":``$(&R"8C%\``$`$")L@F(S?``!``H@;()6("R"5I"H
M``10@"E`@F8@;()F(+Q-04Y80J=.NA`\6$\D0$JJ`*QG,"\M``PO+0`(+PI.
MN@"T3^\`#"E\`````8*6(&R"8@!H@```!"!L@F(`:(````I@1$AJ`%Q.NA">
M6$](:@!<3KH0)%A/*4"":B!L@FI*J``D9Q`@;()J(F@`)"\13KH/`%A/+RR"
M:B\*3KH"VE!/*6R":H)N3KH/`"!L@F(@@$ZZ#RP@;()B(4``!F<62'@#[4AZ
M`"Q.N@\(4$\@;()B(4``#"\L@FXO+()R3KKT>%!/0J=.N@T*6$\D7TY=3G4J
M`$Y5``!(YPPP)&T`$"!M``@@*`"LY8`H`"!$("@`$.6`)D`0$TB`2,#0K0`,
M5(`I0()V0J<O+()V3KH/&%!/*4"">F8(3-\,,$Y=3G40$TB`2,`O`"!+4H@O
M""\L@GI.N@%:3^\`#$AZ`5`0$TB`2,#0K()Z+P!.N@&^4$\O+0`,+PHO+()Z
M3KH!6D_O``Q"K()R)FR">B1+$!-(@$C`*@"PO````"!G(+J\````"6<8NKP`
M```,9Q"ZO`````UG"+J\````"F8$4HM@S`P3`"!M``",#!,`(F8R4HL@2U*+
M$!!(@$C`*@!G("!*4HH0A;J\````(F80#!,`(F8$4HM@!D(J__]@`F#28$0@
M2U*+$!!(@$C`*@!G,+J\````(&<HNKP````)9R"ZO`````QG&+J\````#6<0
MNKP````*9P@@2E**$(5@PB!*4HI"$$J%9@)3BU*L@G)@`/\\0A)"IR`L@G)2
M@.6`+P!.N@WD4$\I0()N9@A"K()R8`#^QGH`)FR">F`:(`7E@"!L@FXABP@`
M+PM.N@9*6$]2@-?`4H6ZK()R;>`@!>6`(&R";D*P"`!@`/Z.(`!,[P,```0@
M""(O``Q@`A#95\G__&<&4D%@`D(84<G__$YU,#Q__V`$,"\`#B!O``1*&&;\
M4T@B;P`(4T`0V5?(__QG`D(0("\`!$YU,#Q__V`$,"\`#E-`:Q0@;P`$(F\`
M"+$)9@Q32$H85\C_]G``3G5C!'`!3G5P_TYU(&\`!"`((F\`"!#99OQ.=4Y5
M```O"B1M``A*$F<D($I2BA`02(!(P"\`3KH%DEA/L+S_____9@AP_R1?3EU.
M=6#82'@`"DZZ!7983V#L3E4``$CG#C`D;0`(0J=(>@".3KH-*E!/*4""FF8(
M3-\,<$Y=3G4@;0`,(F@`)"\I``1.N@V"6$\H`&=22'H`;2!$+R@`-DZZ#510
M3R9`2H!G-$AX`^TO"TZZ#`!03RP`9R0@!N6`*@`@125H``@`I"5&`)Q(>`/M
M2'H`.$ZZ"]Q03R5``*`O!$ZZ#2!83R\L@II.N@P.6$]"K(*:8(!I8V]N+FQI
M8G)A<GD`5TE.1$]7`"H`3E4``$AM``PO+0`(2'H$KDZZ`)!/[P`,3EU.=4Y5
M``!(YP@@)&T`$`RM````!``49@@@;0`(*!!@%$JM``QO""!M``@H$&`&(&T`
M""@00JT`%$JM``QL$D2M``Q*A&P*1(0K?`````$`%"(M``P@!$ZZ`])![(`"
M4XH4L`@`(BT`#"`$3KH#RB@`9MY*K0`49P93BA2\`"T@"DS?!!!.74YU3E7_
M%$CG"#`D;0`()FT`#$*M__@K;0`0__P@2U*+$!!(@$C`*`!G``,PN+P````E
M9@`#"D(M_R(K?`````'_]"M\````(/_P*WP``"<0_^P@2U*+$!!(@$C`*`"P
MO````"UF$$*M__0@2U*+$!!(@$C`*`"XO````#!F%"M\````,/_P($M2BQ`0
M2(!(P"@`N+P````J9AH@;?_\6*W__"M0_^@@2U*+$!!(@$C`*`!@-$*M_^A@
M(G(*("W_Z$ZZ"<#0A)"\````,"M`_^@@2U*+$!!(@$C`*`!![(`5"#```D@`
M9M*XO````"YF8B!+4HL0$$B`2,`H`+"\````*F8:(&W__%BM__PK4/_L($M2
MBQ`02(!(P"@`8#1"K?_L8")R"B`M_^Q.N@E6T(20O````#`K0/_L($M2BQ`0
M2(!(P"@`0>R`%0@P``)(`&;2*WP````$_^2XO````&QF%B!+4HL0$$B`2,`H
M`"M\````!/_D8!2XO````&AF#"!+4HL0$$B`2,`H`"`$8'XK?`````C_X&`<
M*WP````*_^!@$BM\````$/_@8`@K?/____;_X"\M_^1(;?\B+RW_X"\M__Q.
MNOVT3^\`$"M`_]P@+?_DT:W__&!:(&W__%BM__PK4/_<+RW_W$ZZ`AQ83RM`
M_^1@2B!M__Q8K?_\*!!![?\A*TC_W!"$8"B0O````&-GXE.`9Y20O`````MG
M`/]N68!GM%6`9P#_;E>`9P#_<F#,0>W_(I'M_]PK2/_D("W_Y+"M_^QO!BMM
M_^S_Y$JM__1G<"!M_]P,$``M9PHB;?_<#!$`*V8T#*T````P__!F*E.M_^@@
M;?_<4JW_W!`02(!(P"\`3I)83["\_____V8*</],WPP03EU.=6`8+RW_\$Z2
M6$^PO/____]F!'#_8.)2K?_X("W_Z%.M_^BPK?_D;MI"K?_@8"0@;?_<4JW_
MW!`02(!(P"\`3I)83["\_____V8$</]@JE*M_^`@;?_<2A!G"B`M_^"PK?_L
M;<H@+?_@T:W_^$JM__1F*F`:2'@`($Z26$^PO/____]F!G#_8`#_<%*M__@@
M+?_H4ZW_Z+"M_^1NV&`8+P1.DEA/L+S_____9@9P_V``_TA2K?_X8`#\Q"`M
M__A@`/\X2.=(`$*$2H!J!$2`4D1*@6H&1($*1``!83Y*1&<"1(!,WP`22H!.
M=4CG2`!"A$J`:@1$@%)$2H%J`D2!81H@`6#8+P%A$B`!(A]*@$YU+P%A!B(?
M2H!.=4CG,`!(04I!9B!(038!-`!"0$A`@,,B`$A`,@*"PS`!0D%(04S?``Q.
M=4A!)@$B`$)!2$%(0$)`=`_0@-.!MH%B!)*#4D!1RO_R3-\`#$YU(&\`!"`(
M2AAF_)'`(`A3@$YU3E4``$AL@*PO+0`(3KH`"%!/3EU.=4Y5```O!"@M``@O
M+0`,+P1.N@`T4$^XO`````IF)B!M``P0*``,2(!(P`@```=G%$AX__\O+0`,
M3KH`_E!/*!].74YU8/A.50``+PHD;0`,(%*QZ@`$91H@+0`(P+P```#_+P`O
M"DZZ`-!03R1?3EU.=2!24I(0+0`+$(!(@$C`P+P```#_8.1.50``+PI![("6
M)$@@2M7\````%B\(81!83T'L@DZUR&7J)%].74YU3E4``$CG""`D;0`(>``@
M"F8*</],WP003EU.=4HJ``QG5`@J``(`#&<,2'C__R\*85903R@`$"H`#4B`
M2,`O`$ZZ!0A83XB`""H``0`,9PHO*@`(3KH"/%A/""H`!0`,9Q0O*@`23KH"
MV%A/+RH`$DZZ`B!83T*20JH`!$*J``A"*@`,(`1@C$Y5__Y(YP@@)&T`"$'Z
M_T(I2()^""H`!``,9PIP_TS?!!!.74YU""H``@`,9S(H$IBJ``@O!"\J``@0
M*@`-2(!(P"\`3KH"ED_O``RPA&<0".H`!``,0I)"J@`$</]@O@RM_____P`,
M9A`(J@`"``Q"DD*J``1P`&"D2JH`"&8(+PI.N@"D6$\,:@`!`!!F,!MM``__
M_TAX``%(;?__$"H`#4B`2,`O`$ZZ`C)/[P`,L+P````!9I@@+0`,8`#_8"2J
M``@P*@`02,#0J@`()4``!`CJ``(`#"!24I(0+0`/$(!(@$C`P+P```#_8`#_
M,$Y5```O"D'L@)8D2$HJ``QG&-7\````%D'L@DZUR&4(<``D7TY=3G5@XD*2
M0JH`!$*J``@@"F#J3E7__"\*)&T`"$AX!`!.N@#"6$\K0/_\9A@U?``!`!`@
M"M"\````#B5```@D7TY=3G4U?`0``!`(Z@`!``PE;?_\``@0*@`-2(!(P"\`
M3KH`WEA/2H!G!@`J`(``#&#,3E4``$CG`#`D;()28!0F4B`J``10@"\`+PI.
MN@2B4$\D2R`*9NA"K()23-\,`$Y=3G5.50``+PI!^O_&*4B"@D*G("T`"%"`
M+P!.N@0\4$\D0$J`9@AP`"1?3EU.=22L@E(E;0`(``0I2H)2(`I0@&#F3E4`
M`"\M``AAMEA/3EU.=4Y5``!(YP`PE\LD;()28`X@;0`(48BQRF<2)DHD4B`*
M9NYP_TS?#`!.74YU(`MG!":28`0I4H)2("H`!%"`+P`O"DZZ`_A03W``8-A.
M50``+PIR!B`M``A.N@*T)$#5[()B2JT`"&T2,"R"3DC`(BT`"+*`;`1*DF80
M*7P````"@H9P_R1?3EU.=7(&("T`"$ZZ`GP@;()B+S`(`$ZZ`MQ83TJ`9P1P
M`6`"<`!@UDY5```O+0`(3KH"IEA/2H!F#DZZ`K`I0(*&</].74YU<`!@^$Y5
M``!(YPP@*"T`"$ZZ`'9R!B`$3KH")B1`U>R"8DJ$;0XP+().2,"X@&P$2I)F
M$BE\`````H*&</],WP0P3EU.=3`J``3`?``#9@PI?`````6"AG#_8.(O+0`0
M+RT`#"\23KH"?D_O``PJ`+"\_____V8,3KH"*BE`@H9P_V"Z(`5@MDY5__Q(
M>!``0J=.N@,\4$\K0/_\"```#&<22JR"EF8(("W__$Y=3G5.N@`&<`!@]$Y5
M``!(>``$2'H`'DZZ`@PO`$ZZ`AI/[P`,2'@``4ZZ``Q83TY=3G5>0PH`3E4`
M`$JL@GYG!B!L@GY.D"\M``A.N@`(6$].74YU3E7__"\$*VT`"/_\2JR"8F<L
M>`!@"B\$3KH`SEA/4H0P+().2,"X@&WL,"R"3L'\``8O`"\L@F).N@(R4$]*
MK(*"9P8@;(*"3I!*K(**9PHO+(**3KH!N%A/2JR"CF<*+RR"CDZZ`:A83TJL
M@I)G"B\L@I).N@&86$\L>``$""X`!`$I9Q0O#4OZ``I.KO_B*E]@!D*G\U].
M<TJL@FIF*DJL@GIG(B\L@G8O+()Z3KH!O%!/("R"<E*`Y8`O`"\L@FY.N@&H
M4$]@#DZZ`90O+()J3KH![EA/("W__"YL@E9.=2@?3EU.=4Y5``!(YPX@*"T`
M"'(&(`1.N@!$)$#5[()B2H1M#C`L@DY(P+B`;`1*DF82*7P````"@H9P_TS?
M!'!.74YU,"H`!,!\@`!F""\23KH`+EA/0I)P`&#@2.=P`#0!Q,`F`4A#QL!(
M0T)#U(-(0,#!2$!"0-""3-\`#DYU(B\`!"QL@EY.[O_<+P1,[P`>``@L;()>
M3J[_=B@?3G4B+P`$+&R"7D[N_X(B+P`$+&R"7D[N_[@L;()>3N[_RBQL@EY.
M[O]\(B\`!"QL@EY.[O\H(B\`!"QL@EY.[O]J3.\`!@`$+&R"7D[N_^(L;()>
M3N[_Q"(O``0L;()>3N[_9$SO``X`!"QL@EY.[O_02.<!!$SO((``#"QL@EI.
MKO^43-\@@$YU3OH``B)O``0L;():3N[^8B)O``0L;():3N[^GB`O``0L;():
M3N[^MD[Z``),[P`#``0L;():3N[_.B)O``0L;():3N[^>D[Z``(B;P`$+&R"
M6D[N_MHL;():3N[_?$[Z``(B;P`$("\`""QL@EI.[O\N("\`!"QL@EI.[OZP
M(&\`!"QL@EI.[OZ,(&\`!""(6)!"J``$(4@`"$YU+&R"6B)O``0@+P`(3N[]
MV")O``0L;():3N[^F")O``0L;():3N[^ADSO``,`!"QL@EI.[O[.(F\`!"`O
M``@L;():3N[^O"`O``0L;():3N[^PB!O``0L;():3N[^@$SO`P``!"QL@II.
M[O^@(&\`!"QL@II.[O^F(&\`!"QL@II.[O^R``````/L`````0````$```I<
M`````````_(```/J````E#`Q,C,T-38W.#EA8F-D968````@("`@("`@("`P
M,#`P,"`@("`@("`@("`@("`@("`@()!`0$!`0$!`0$!`0$!`0$`,#`P,#`P,
M#`P,0$!`0$!`0`D)"0D)"0$!`0$!`0$!`0$!`0$!`0$!`0$!0$!`0$!`"@H*
M"@H*`@("`@("`@("`@("`@("`@("`@)`0$!`(``````````````````!````
M``$``````````````````````0$````!``````````````````````$"````
M`0``````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
G```````````````````````````4``````/R```#ZP````$```/R
`
end
!Funky!Stuff!
fi  # end of overwriting check
exit 0
#	End of shell archive

hull@hao.ucar.edu (Howard Hull) (05/22/88)

Having tried Matt Dillon's dmouse, I _had_ to make a workbench
icon for it.  Somebody else no doubt has a better one, but if
you need one, here it is:

Using  CRC Ver. 1.000 by Donald Kindred,  dmouse.info : 513C

begin 644 dmouse.info
MXQ```0```````````%``(P`&``,``0#".?``PCH@````````````````````X
M`````P``P;E(`,(Z"(````"```````````````````````````!0`"(``@`!^
M.)`#````````````````````^_W_O^_]_]_]_P````````````#_O_?^_[_WO
M_W_W````````.````/O^\````![O_?\````````'````_]X``````]^_]P``;
M```2``'@``#[\```````\_]_`````````'@``/_````````\[_<``"JH````Z
M/@``^P`4%````!\^_P``"`H````/@`#^`!0%````#\_[```("@````/@`/@`[
M%!0````#X_\``"JH`````_``\`````(`(`/Q^P`````%`%`!^`#P`````H"@S
M`?S?``````5!4`'\`/`````"(B`!_/L`````!110`?P`\`````J(J`'\WP``'
M```````!_`#P`````````?S[``````````'\`/`````````!_-\`````````N
M````````````````````````````````````````````________________T
M____________________________________________________________3
M____________________________________[?______________________!
M____________________________________________________________3
M____________________________________________________________3
M____________________________________________________________3
M____________________________________________________________3
M_____________________________________[N[N[N[N[N[N[M555555555%
M5555JJJJJJJJJJJJJ@``````4``B``(``3LX`P```````````````````/O]&
M_[_O_?_?_?\`````````````_[_W_O^_]_]_]P```````#@```#[_O`````>@
M[_W_````````!P```/_>``````/?O_<```?P`'X!X```^_`,&_S#`//_?P``_
M##__@P!X``#_P`?___X`/._W```!___X`#X``/L```P`@``?/O\````?GL``^
M#X``_@``/))```_/^P```!88\``#X`#X``"/P[\``^/_```!L&85P`/P`/`0"
M#[_@C6`#\?L`$/^$@<:P"?@`\!_Y\`/E4`G\WP!GT>?___`9_`#P/@_X___@>
M&?S[````SQ_]\!G\`/```,.\'_`Q_-\```!3<*<1X?P`\```?L4EG\'\^P``1
M`*'T?!@!_`#P``=3>KZ``?S?```>KOU8@```````__Q_\@``````````````1
M`````````````````/__________________________________________@
M____________________________________________________________3
M______________________P#___________X`?__________^`'_________*
M_@``!_______________________^&'___________MM___________YY___#
M_____________________________________W__________^WX_________.
M___\'__________X```/_________P``?__________@`___________P^'_(
M_________X_X__________\__G__________________________________;
M__________^[N_____N[N[N[5555555555555:JJJJJJJJJJJJH````!````)
,``P````!``````$`.
``
end
size 1497