dillon@CORY.BERKELEY.EDU (Matt Dillon) (06/19/88)
Please report any bugs (or lack of bugs fixed)! -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: Sun Jun 19 02:08:47 1988 export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'dmouse-handler.c'" '(10372 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), c32.lib * AZTEC COMPILATION * 18 June 1988 * * Note on upping the handler process priority. This is done to cause the * handler task to get CPU before the current input event completes its * processing so intuition calls made by the process are executed before * the event is propogated. If said intuition calls block, it's ok * because they are not blocking the input handler process. */ #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(); short NRMe; /* Don't Repeat Mouse Events */ _main() { register DMS *dms; IOR *ior; INT addhand; { register PROC *proc = (PROC *)FindTask(NULL); proc->pr_ConsoleTask = NULL; } NRMe = 0; 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 = dms->IPri; 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 REQ *msg; while (msg = GetMsg(&dms->Port)) { switch((long)msg->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; case REQ_RAWMOUSE: { register LAYER *layer; NRMe = 0; Forbid(); layer = WhichMouseLayer(); if (msg->ie_Code == IECODE_RBUTTON && dms->LMBEnable && (msg->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); } if (layer && layer->Window) { if (msg->ie_Code == IECODE_LBUTTON && !(((WIN *)layer->Window)->Flags & BACKDROP) && dms->LMBEnable && 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, msg->ie_TimeStamp.tv_secs, msg->ie_TimeStamp.tv_micro)) --dms->CLeft; else dms->CLeft = dms->Clicks - 1; dms->CTime = msg->ie_TimeStamp; dms->CWin = (WIN *)layer->Window; if (dms->CLeft == 0) { dms->CLeft = dms->Clicks; WindowToFront(layer->Window); } } if (dms->AAEnable && layer->Window != IBASE->ActiveWindow && msg->ie_Code == IECODE_NOBUTTON && !(msg->ie_Qualifier & 0x7000)) ActivateWindow(layer->Window); } Permit(); } break; case REQ_RAWKEY: { register LAYER *layer; Forbid(); layer = WhichMouseLayer(); if (layer && layer->Window && layer->Window != IBASE->ActiveWindow) ActivateWindow(layer->Window); Permit(); } break; } FreeMem(msg, 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, ev); if (MTimedout) sendrequest(REQ_MOUSEON, ev); 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->LMBEnable && ev->ie_Code == IECODE_RBUTTON && (ev->ie_Qualifier & dms->RQual)) ev->ie_Class = IECLASS_NULL; /* remove event */ if (NRMe == 0 && ((dms->AAEnable & 1) || dms->LMBEnable)) { register short old; NRMe = 1; if (ev->ie_Code != IECODE_NOBUTTON) old = SetTaskPri(dms->Port.mp_SigTask, 21); sendrequest(REQ_RAWMOUSE, ev); if (ev->ie_Code != IECODE_NOBUTTON) SetTaskPri(dms->Port.mp_SigTask, old); } break; case IECLASS_RAWKEY: /* * Keyboard events will kill the screen timeout but not * the mouse timeout. Note that the priority of the * co-process must be upped to ensure it is able to make the * window active before the keystroke is passed further. */ if (dms->AAEnable & 2) { register short old = SetTaskPri(dms->Port.mp_SigTask, 21); sendrequest(REQ_RAWKEY, ev); SetTaskPri(dms->Port.mp_SigTask, old); } STime = ev->ie_TimeStamp.tv_secs + dms->STo; if (STimedout) sendrequest(REQ_SCREENON, ev); STimedout = 0; if (ev->ie_Code == dms->Code && ev->ie_Qualifier == dms->Qual) { sendrequest(REQ_DOCMD, ev); 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->Reset) { dms->Reset = 0; STime = ev->ie_TimeStamp.tv_secs + dms->STo; MTime = ev->ie_TimeStamp.tv_secs + dms->MTo; } 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, ev); sendrequest(REQ_MOUSEOFF, ev); } } 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, ev); } } break; } } return(Ev); } sendrequest(creq, ev) long creq; register IE *ev; { register REQ *req = AllocMem(sizeof(REQ), MEMF_PUBLIC); if (req) { req->Msg.mn_Node.ln_Name = (char *)creq; req->Msg.mn_ReplyPort = NULL; req->Msg.mn_Length = sizeof(REQ); req->ie_Code = ev->ie_Code; req->ie_Qualifier = ev->ie_Qualifier; req->ie_TimeStamp = ev->ie_TimeStamp; PutMsg(&Dms->Port, req); } } 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; register short mousex = ib->MouseX; if (!(scr->ViewPort.Modes & LACE)) mousey >>= 1; if (!(scr->ViewPort.Modes & HIRES)) mousex >>= 1; if (layer = WhichLayer(&scr->LayerInfo, 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'" '(4951 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`````````#``````````(```-=````(`````$```/I```#74[Z"21. M5?_:2.<.,$*G3KH,)EA/)D!"JP"D0FR`9$AZ!2).N@P&6$\I0(!F)$`@"F8( M0J=.N@EJ6$]"*@`.2'C__TZZ"PI83Q5```]"ITZZ"^983R5``!`E:@`0`3HO M"DZZ"OA83RM`__Q"ITAZ!-M.N@P:4$\I0(!J0J=(>@3=3KH,"E!/*4"`;D*G M2'H$WDZZ"_I03RE`@')*K(!J9P`$($JL@&YG``082JR`<F<`!!`;:@$X_^]! M^@34*TC_^$*M__1"IR\M__Q"ITAZ!*U.N@ND3^\`$$J`9P1@``/B0JW_XD*M M_]XP*@%"2,!R`>&A+P$O*@$^3KH+V%!/(&W__#%\``D`'$'M_^8B;?_\(T@` M*"\M__Q.N@KZ6$]P`!`J``]R`>&A",$`#"\!3KH+LEA/*`!P`!`J``]R`>&A MPH1G``+J+PI.N@L<6$\F0$J`9P`"VB`K``I@``*F2JW_XF<*+RW_XDZZ"Z)8 M3T*M_^)@``*F2JW_XF<,+RW_XDZZ"[Q83V`H2&R``DZZ"YA83RM`_^)G&$*G M0J="IT*G(&W_XDAH`"Q.N@M$3^\`%&```FA*K?_>9R(@;(!N*B@`)B`M_]YR M$.*H($4Q0``*($4Q;?_@``Y"K?_>8``"/"!L@&XJ*``F2JW_WF8:($5P`#`H M``IR$..@(D5T`#0I``Z`@BM`_]X@*@%&<A#BJ"!%,4``"B!%,6H!2``.8``! M^DAX`^Y(>@-@3KH(]%!/*T#_VB\M_]I"ITAJ`#9.N@C23^\`#$JM_]IG"B\M M_]I.N@BP6$]@``'"0FR`9$ZZ">9.N@9$*@`,:P!I`!QF8$HJ`39G6C`K`![` M:@`T9U!*A6<T($4L*``H9RPB1@@I````&F8B+$9*EF8.+$8B;@`N+&D`!+W& M9PX@12\H`"A.N@J86$]@&"!L@&I*J``\9PX@;(!J+R@`/$ZZ"F983TJ%9P`` MXB!%2J@`*&<``-@,:P!H`!QF``":($4B:``H""D````:9@``BDHJ`39G``"" M+$5*K@`(9W@L12)N``A*D6=N($4B:@%:L^@`*&8B+RL`&"\K`!0O*@%6+RH! M4DZZ">9/[P`02H!G!E-J`5!@#'``,"H!3E.`-4`!4"!*T?P```%2(DO3_``` M`!0@V2#9($4E:``H`5I*:@%09A(U:@%.`5`@12\H`"A.N@G86$]**@$W9RX@ M12)L@&HL:``HO>D`-&<>#&L`_P`<9A8P*P`>P'QP`&8,($4O*``H3KH)3EA/ M3KH(Z&!>3KH(B$ZZ!.8J`$J%9R0@14JH`"AG'")%+&R`:B!I`"BQ[@`T9PP@ M12\H`"A.N@D66$].N@BP8";_I/Y"_@K]R/V<_5[]1I"\____^;"\````!V0* MXX`P.P#@3OL``'``,"L`$B\`+PM.N@@L4$]@`/T:"`0`#&8$8`#\Z$ZZ"`P@ M;?_\,7P`"@`<0>W_YB)M__PC2``H+RW__$ZZ![Q83TZZ"$(O+?_\3KH&S%A/ M+PI.N@?X6$\F0$J`9Q)P`#`K`!(O`"\+3KH'SE!/8.!*K?_B9PHO+?_B3KH( M=EA/2JW_WF<>(&R`;B9H`"8@+?_><A#BJ#=```HW;?_@``Y"K?_>8"8U?``! M`40P*@%"2,!R`>&A+P$O*@$^3KH'^E!/2'@0`$ZZ"`!83R\M__Q.N@:$6$]* MK(!J9PHO+(!J3KH&0EA/2JR`;F<*+RR`;DZZ!C)83TJL@')G"B\L@').N@8B M6$].N@<D,"H!0DC`<@'AH2\!+RH!/DZZ!YQ03TS?#'!.74YU1$UO=7-E`&EN M='5I=&EO;BYL:6)R87)Y`&=R87!H:6-S+FQI8G)A<GD`;&%Y97)S+FQI8G)A M<GD`:6YP=70N9&5V:6-E`&YI;#H``$CG,,IA!DS?4PQ.=4Y5``!(YPPP3KH# M]"9L@&8D;0`08``"@G``$"H`!&```F`@*@`.T*L`*"E`@"@@*@`.T*L`+"E` M@"Q*+(`F9PPO"DAX__].N@)B4$]*+(`G9PPO"DAX__U.N@)04$]"+(`G0BR` M)@QK``$`)&=\."H`"GH!2D1L!$1$>O^X:P`F;RHP!$C`,BL`)DC!D(%3@#(K M`"1(P4ZZ!*PT*P`F2,+0@E*`-@7'P#5#``HX*@`,>@%*1&P$1$1Z_[AK`"9O M*C`$2,`R*P`F2,&0@5.`,BL`)$C!3KH$;C0K`"9(PM""4H`V!<?`-4,`#$HK M`39G%@QJ`&D`!F8.,"H`",!K`#1G!$(J``1*;(!D9E`(*P```3=F!DHK`39G M0CE\``&`9`QJ`/\`!F<02'@`%2\K`!!.N@7V4$\X`"\*2'C_^DZZ`6I03PQJ M`/\`!F<0,`1(P"\`+RL`$$ZZ!=!03V```30(*P`!`3=G+$AX`!4O*P`03KH% MME!/.``O"DAX__E.N@$J4$\P!$C`+P`O*P`03KH%F%!/("H`#M"K`"@I0(`H M2BR`)F<,+PI(>/__3KH`_%!/0BR`)C`J``:P:P`P9AHR*@`(LFL`,F80+PI( M>/_[3KH`V%!/0BH`!&```+9**P%>9QQ"*P%>("H`#M"K`"@I0(`H("H`#M"K M`"PI0(`L2JL`*&=`*"R`*)BJ``Y*A&PT("H`#M"K`"C0O`````HI0(`H&7P` M`8`FN+S____V;Q0O"DAX__YA<%!/+PI(>/_\86903TJK`"QG,B@L@"R8J@`. M2H1L)B`J``[0JP`L4H`I0(`L&7P``8`GN+S____V;PHO"DAX__QA+E!/8!)3 M@&<`_MQ3@&<`_9A9@&<`_TX@;0`0)%`@"F8`_7P@+0`03-\,,$Y=3G5.50`` M2.<`,"1M``Q(>``!2'@`($ZZ`ZA03R9`(`MG/"=M``@`"D*K``XW?``@`!(W M:@`&`!PW:@`(`!X@2]'\````%")*T_P````.(-D@V2\++RR`9DZZ!`Q03TS? M#`!.74YU3E4``$CG#C`D;(!JE\LH*@`\*"H`/&!8.BH`1#PJ`$8@1`@H``(` M368"XD4@1#`H`$S`?(``9@+B1C`%2,`@1#(H`$I(P9"!+P`T!DC"+P(B1$AI M`.!.N@1B3^\`#"9`2H!F$"!$NF@`2FP(($0H$$J$9J0@"TS?#'!.74YU87!# M[(`F1>R`)K7)9@XR/``6:PAT`"+"4<G__"E/@#`L>``$*4Z`-$CG@(`(+@`$ M`2EG$$OZ``A.KO_B8`9"I_-?3G-#^@`@3J[^:"E`@#AF#"X\``.`!TZN_Y1@ M!$ZZ]GY03TYU9&]S+FQI8G)A<GD`2?D``'_^3G5.5?_\+P0K;0`(__Q*K(`\ M9RQX`&`*+P1.N@#.6$]2A#`L@")(P+B`;>PP+(`BP?P`!B\`+RR`/$ZZ`GQ0 M3TJL@'9G!B!L@'9.D$JL@$!G"B\L@$!.N@%,6$]*K(!$9PHO+(!$3KH!/%A/ M2JR`2&<*+RR`2$ZZ`2Q83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S M7TYS2JR`3&8J2JR`4&<B+RR`5"\L@%!.N@(&4$\@+(!84H#E@"\`+RR`7$ZZ M`?)03V`.3KH!WB\L@$Q.N@)"6$\@+?_\+FR`,$YU*!].74YU3E4``$CG#B`H M+0`(<@8@!$ZZ`$0D0-7L@#Q*A&T.,"R`(DC`N(!L!$J29A(I?`````*`8'#_ M3-\$<$Y=3G4P*@`$P'R``&8(+Q).N@`R6$]"DG``8.!(YW``-`'$P"8!2$/& MP$A#0D/4@TA`P,%(0$)`T(),WP`.3G5.^@`"(B\`!"QL@#A.[O_<3.\`#@`$ M+&R`.$[N_R).^@`"3.\`!@`$+&R`.$[N_^(B;P`$+&R`-$[N_CY.^@`"(F\` M!"QL@#1.[OYB("\`!"QL@#1.[OZV3E4``$AX`#`O+0`(3KH`&E!/3EU.=4Y5 M```O+0`(3KH`3%A/3EU.=4Y5```O"DJM``AF"'``)%].74YU2'D``0`!+RT` M#$ZZ`&!03R1`2H!F!'``8.`5?``%``@U;0`.`!(E;0`(``X@"F#*3E4``"\* M)&T`""`*9@8D7TY=3G45?`#_``@E?/____\`%"5\_____P`8<``P*@`2+P`O M"DZZ`%903V#23OH``DSO``,`!"QL@#1.[O\Z2.<#`")O``PL;(`T3J[^.$S? M`,!.=2)O``0L;(`T3N[^>D[Z``(B;P`$+&R`-$[N_MI.^@`"+&R`-$[N_WQ. M^@`"(F\`!"`O``@L;(`T3N[_+D[Z``(@;P`$+&R`-$[N_HP@;P`$3.\"`0`( M(B\`$"QL@#1.[OY$3OH``BQL@#0B;P`$("\`"$[N_=@L;(`T3N[_=DSO`P`` M!"QL@#1.[OZ2(F\`!"QL@#1.[OZ&(F\`!"`O``@L;(`T3N[^U")O``0@+P`( M+&R`-$[N_KP@+P`$+&R`-$[N_L(@;P`$3.\`#P`(+&R`;D[N_N`@;P`$+&R` M:D[N_CX@;P`$+&R`:D[N_[Y,[P`/``0L;(!J3N[_FB!O``0L;(!J3N[_.B!O M``0L;(!J3N[_"B!O``0L;(!J3N[_!"!O``0L;(!J3N[^SB!O``0L;(!J3N[^ MR"!O``1,[P`#``@L;(!R3N[_?````^P````!`````0``"9H````````#\@`` M`^H````)``````!`__\``?__```!#P``````````````````````%``````# -\@```^L````!```#\O\` ` end !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'dmouse.c'" '(6089 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.07 17 June 1988 (Aztec Compile, +L ... 32 bit ints) * and link w/ c32.lib * * DMOUSE QUIT * DMOUSE -a# -t# -s# -m# -c# -p# -Ln -Rqqqq -An -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 * -p# # = input device priority * -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, keyhit-auto-activate disabled (bit 0 = mouse aa) * -A3 Enable it, keyhit-auto-activate enabled (bit 1 = key aa) * -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. */ #include <stdio.h> #include "dmouse.h" #define VERSION 7 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->IPri = 51; 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 = 3; 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 != '-') goto def; switch(ptr[1]) { case 'a': dms->Acc = val; break; case 'c': if (val < 1) val = 1; dms->Clicks = dms->CLeft = val; break; case 'p': dms->IPri = 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) | 0x8000; 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]); } i = ac; break; default: def: puts("DMOUSE QUIT or"); puts("DMOUSE -a# -t# -s# -m# -Ln -Rqqqq -An -Kcccc -Qqqqq -C cmd"); printf("V1.%02d PUBLIC DOMAIN, Matthew Dillon, 17 June 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(" -p# # = input device priority"); puts(" -L0/1 LMB disable/enable (default 1=enabled)"); puts(" -Rqqqq RMB qualifier wintoback (default 4000=LMB)"); puts(" -A0-3 Auto-Activate Window disable/enable. B0=mouse B1=keyboard"); 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, Most options may be modified while DMOUSE is active"); create = 0; i = ac; break; } } dms->Reset = 1; 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'" '(5578 characters)' if test -f 'dmouse.doc' then echo shar: "will not over-write existing file 'dmouse.doc'" else cat << \!Funky!Stuff! > 'dmouse.doc' V1.07 DMOUSE.DOC 18 May 1988 Matthew Dillon 891 Regal Rd Berkeley, California 94708 USA NOTE: Workbench users see note below 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) (mouse also blanks even if mouse blanking not turned on) - 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. These two features may be turned on/off independantly - 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. WindowToFront() is NOT called for backdrop windows! # 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. DO NOT 'RUN' DMOUSE! INSTALLATION: Place dmouse-handler in L: (or in the 'current' directory when DMOUSE is run). WORKBENCH USERS!!!!!!!!!! There appears to be a bug in intuition's WindowToFront() call, which can lock up intuition when workbench icons are active. Under the defaults, this will occur whenever you depress the left mouse button over an icon. A partial fix is in place V1.07 and beyond. However, if you find it still freezing up, the problem can be avoided as follows: Either turn off the left-mouse-button window- to-front feature (-L0) or leave it on and set the number of clicks required to 2 (-c2) (and don't use the feature while your mouse is over an icon). 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). Use the c32.lib library (Aztec C) Precompiled include files: All amiga includes that are in sub-directories (i.e. */*.h, but not things like <stdio.h>) 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 front (def 1) -p# Set input handler priority (def 51) should always be > 50 (initial invocation only) -L0/1 Disable/Enable left-button brings window to front -A0-3 Disable/Enable AUTO-ACTIVATE. Bit 0 = mouse auto-activate 1 = keyboard auto-activate (def 3, which enables both) -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. RELEASE HISTORY: V1.07 -All intuition calls are made from an independant process rather than the input handler routine. This also fixes a couple of deadlock bugs, but not the workbench-icon deadlock bug. -Mouse response is no longer jerky when the system is loaded down. -Keyboard-Auto-Activate-Window independant of Mouse-Auto-Activate-Window (enhanced -A option) -No need to OR the -Q qualifier with 8000 anymore -WindowToFront() never called for backdrop windows, which ought to fix the workbench freeze bug and other problems. -Mouse automatically blanked when screen blanks, whether mouse blanking is enabled or not. -Can set input handler priority (initial invocation only). -New Timeouts go into effect immediately rather than after the next mouse/keyboard event. V1.00-V1.06 Before Written history !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'dmouse.h'" '(2038 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 REQ struct _REQ #define PORTNAME "DMouse" #define REQ_SCREENON -1 #define REQ_SCREENOFF -2 #define REQ_MOUSEON -3 #define REQ_MOUSEOFF -4 #define REQ_DOCMD -5 #define REQ_RAWMOUSE -6 #define REQ_RAWKEY -7 #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; char IPri; 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 */ char Reset; /* Option modified, reset tos */ }; REQ { MSG Msg; TS ie_TimeStamp; uword ie_Code; uword ie_Qualifier; }; 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'" '(10953 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`````````#``````````(```<5````IP````$```/I```'%4[Z"E1. M5?_V2.</,$AZ!8!.NAM<6$\F0"`+9P1R`6`"<@`[0?_^(`MF!'(!8`)R`#M! M__Q";?_Z0JR"EDIM__QG``"42'D``0`!2'@!8$ZZ&PQ03R9`%WP`,P$X-WP` M!P`B-WP``P`D)WP```$L`"@G?`````4`+#=\`$4`,#=\@$``,C=\0```-#=\ M``$!3C=K`4X!4$AZ!/U(:P`V3KH-I%!/%WP``0$V%WP``P$W2'D``0`#2'@` M#$ZZ&J!03R=``48@:P%&,+S^`"!K`48Q?/\```)X`6```J0P!$C`Y8`@;0`, M)'`(`$AZ!+`O"DZZ#2)03TJ`9Q!(>@2E+PI.N@T24$]*@&8..WP``?_Z0FW_ M_&```G0@2E2(+PA.N@BZ6$\N``P2`"UF``$V$"H``4B`2,!@``'L-T<`)&`` M`CR^O`````%L`GX!-T<!4#='`4Y@``(F%T<!.&```AXW1P`F8``"%B='`"A@ M``(.)T<`+&```@871P$V8``!_B!*5(@O"$ZZ"`!83S=``#1@``'J%T<!-V`` M`>(@2E2(+PA.N@?D6$\W0``P8``!SB!*5(@O"$ZZ!]!83PC```\W0``R8``! MMB!*5(@O"$ZZ$B!83U2`/``R!$C!4H$Z`4C!8!HP!4C`Y8`@;0`,+S`(`$ZZ M$?Q83U*`W$!213`%2,"PK0`(;=P@2E2(+PA(:P`V3KH,,%!/,`1(P%*`.@!@ M+DHK`#9G#DAZ`WQ(:P`V3KH+N%!/,`5(P.6`(&T`#"\P"`!(:P`V3KH+H%!/ M4D4P!4C`L*T`"&W(."T`"F```1Q(>@-$3KH+[%A/2'H#2DZZ"^)83TAX``=( M>@-W3KH,QE!/2'H#HTZZ"\I83TAZ`[Q.N@O`6$](>@/93KH+MEA/2'H#]DZZ M"ZQ83TAZ!!!.N@NB6$](>@0[3KH+F%A/2'H$54ZZ"XY83TAZ!'Q.N@N$6$]( M>@2G3KH+>EA/2'H$X4ZZ"W!83TAZ!01.N@MF6$](>@4M3KH+7%A/2'H%34ZZ M"U)83TAZ!7=.N@M(6$](>@5O3KH+/EA/0FW__#@M``I@6)"\````06<`_FA5 M@&<`_I91@&<`_F13@&<`_CI;@&<`_FQ3@&<`_C:0O`````]G`/WF58!G`/WH MD+P````*9P#^#%>`9P#][E>`9P#]^%.`9P#]ZF``_NA21#`$2,"PK0`(;0#] M5!=\``$!7DIM__YF``$N2FW__&<``29(>@4@3KH+H%A/2'C__TAL@*Q.NA&< M4$\7?``"``Y"*P`)%WP`!``(2'@``4AX``=.NA>*4$\G0``*2'H%`2\K``I. MN@I@4$](:P`43KH7T%A/2'H$\$ZZ%NA83R=``4I*JP%*9@Y(>@3M3KH6U%A/ M)T`!2DJK`4IF($AZ!.A.N@HT6$](>``'+RL`"DZZ%V103T)M__Q@``",+PM. MNA<&6$]"ITZZ%S183R=``3Y(>/__3KH6_%A/-T`!0DAX$``O*P%*2'@``2\K M``I.NA8J3^\`$"M`__8P*P%"2,!R`>&A+P%.NA>06$\P*P%"2,`O`$ZZ%Q)8 M3SM\``'__CMK`43_^DIM__IG#$AZ!'].N@FD6$]@#DAX``=(>@1]3KH*AE!/ M2FW_^F<``)Q*;?_^9P``C$AZ!)Q.N@IL6$](>/__2&R`K$ZZ$&A03T*G3KH6 MBEA/)T`!/DAX__].NA926$\W0`%"2'@0`"\K`3I.NA;V4$\P*P%"2,!R`>&A M+P%.NA;T6$\P*P%"2,`O`$ZZ%G983R\+3KH6J%A/2'@`!R\K``I.NA9,4$\O M*P%*3KH5LEA/2'H$+DZZ"/I83T)M__Y";?_\2FW__F8:2'@`#"\K`49.NA8< M4$](>`%@+PM.NA804$],WPSP3EU.=41-;W5S90!N97=C;&D`455)5`!Q=6ET M`"``1$U/55-%(%%5250@(&]R`$1-3U5312`M82,@+70C("US(R`M;2,@+4QN M("U2<7%Q<2`M06X@+4MC8V-C("U1<7%Q<2`M0R!C;60`5C$N)3`R9"!054), M24,@1$]-04E.+"!-871T:&5W($1I;&QO;BP@,3<@2G5N92`Q.3@X"@H`("`M M82,@("`@($%C8V5L97)A=&EO;B`H9&5F875L="`S*0`@("UT(R`@("`@06-C M96PN('1H<F5S:&]L9"`H9&5F875L="`P*0`@("US(R`@("`@4V-R965N('1I M;65O=70@*&1E9F%U;'0@,S`P*0`@("UM(R`@("`@36]U<V4@=&EM96]U="`H M9&5F875L="`U*0`@("UC(R`@("`@4V5T(",@;V8@8VQI8VMS(&9O<B!W:6YT M;V9R;VYT("AD969A=6QT(#$I`"`@+7`C("`@("`C(#T@:6YP=70@9&5V:6-E M('!R:6]R:71Y`"`@+4PP+S$@("!,34(@9&ES86)L92]E;F%B;&4@*&1E9F%U M;'0@,3UE;F%B;&5D*0`@("U2<7%Q<2`@4DU"('%U86QI9FEE<B!W:6YT;V)A M8VL@*&1E9F%U;'0@-#`P,#U,34(I`"`@+4$P+3,@("!!=71O+4%C=&EV871E M(%=I;F1O=R!D:7-A8FQE+V5N86)L92X@0C`];6]U<V4@0C$]:V5Y8F]A<F0` M("`M2V-C8V,@($-O;6UA;F0@2V5Y($-O9&4L(&1E9F%U;'0@-#4@/2!E<V,` M("`M47%Q<7$@($-O;6UA;F0@2V5Y(%%U86QI9FEE<B`H;75S="!\('=I=&@@ M.#`P,"D`("`M0R!C;60@(&-M9"!T;R!R=6XL(&UU<W0@8F4@;&%S="!O<'1I M;VX`3F]T93H@3$U"*&]R("U2('%U86QI9FEE<BDH:&]L9"DK4DU"(#T@5VEN M9&]W5&]"86-K``H`061D:71I;VYA;'DL($UO<W0@;W!T:6]N<R!M87D@8F4@ M;6]D:69I960@=VAI;&4@1$U/55-%(&ES(&%C=&EV90!);G-T86QL:6YG($1- M;W5S92P@`$1-;W5S90!$36]U<V4`;#I$36]U<V4M2&%N9&QE<@!$36]U<V4M M2&%N9&QE<@!5;F%B;&4@=&\@9FEN9"!,.D1-;W5S92U(86YD;&5R`$1-;W5S M90!(86YD;&5R(&5R<F]R`&]K+B`@1$UO=7-E(%8Q+B4P,F0L(&)Y($UA='1H M97<@1&EL;&]N+B`@4%5"3$E#($1/34%)3BX*`%)E;6]V:6YG+"``1$UO=7-E M`&]K``!.50``2.<,("1M``AX`!H29S;IA+H\`#!M%KH\`#EN$!`%2(!(P,"\ M````#XB`8!00!4B`2,#`O`````_0O`````F(@%**8,8@!$S?!#!.74YU3E4` M`$CG#"`D;0`(#!(`(&<&#!(`"68$4HI@\'H`#!(`+68&>@%2BF`(#!(`*V8" M4HIX`&`@($I2BA`02(!(P'(*+P`@!$ZZ$$8D']2`*`*8O````#`0$DB`2,!! M[(`5"#```@@`9LY*A6<&(`1$@&`"(`1,WP0P3EU.=6%P0^R"4D7L@E*UR68. M,CP`$FL(=``BPE')__PI3X)6+'@`!"E.@EI(YX"`""X`!`$I9Q!+^@`(3J[_ MXF`&0J?S7TYS0_H`($ZN_F@I0()>9@PN/``#@`=.KO^48`1.N@`:4$].=61O M<RYL:6)R87)Y`$GY``!__DYU3E4``"\*2'D``0``,"R"3L'\``8O`$ZZ$'A0 M3RE`@F)F%$*G2'D``0``3KH0(%!/+FR"5DYU(&R"8D)H``0@;()B,7P``0`0 M(FR"8C-\``$`"B!L@E8@+()6D*@`!%"`*4""9B!L@F8@O$U!3EA"ITZZ$#Q8 M3R1`2JH`K&<P+RT`#"\M``@O"DZZ`+1/[P`,*7P````!@I8@;()B`&B````$ M(&R"8@!H@```"F!$2&H`7$ZZ$)Y83TAJ`%Q.NA`D6$\I0()J(&R":DJH`"1G M$"!L@FHB:``D+Q%.N@\`6$\O+()J+PI.N@+:4$\I;()J@FY.N@\`(&R"8B"` M3KH/+"!L@F(A0``&9Q9(>`/M2'H`+$ZZ#PA03R!L@F(A0``,+RR";B\L@G). MNO0*4$]"ITZZ#0I83R1?3EU.=2H`3E4``$CG##`D;0`0(&T`""`H`*SE@"@` M($0@*``0Y8`F0!`32(!(P-"M``Q4@"E`@G9"IR\L@G9.N@\84$\I0()Z9@A, MWPPP3EU.=1`32(!(P"\`($M2B"\(+RR">DZZ`5I/[P`,2'H!4!`32(!(P-"L M@GHO`$ZZ`;Y03R\M``PO"B\L@GI.N@%:3^\`#$*L@G(F;()Z)$L0$TB`2,`J M`+"\````(&<@NKP````)9QBZO`````QG$+J\````#6<(NKP````*9@12BV#, M#!,`(&T``(P,$P`B9C)2BR!+4HL0$$B`2,`J`&<@($I2BA"%NKP````B9A`, M$P`B9@12BV`&0BK__V`"8-)@1"!+4HL0$$B`2,`J`&<PNKP````@9RBZO``` M``EG(+J\````#&<8NKP````-9Q"ZO`````IG""!*4HH0A6#"($I2BD(02H5F M`E.+4JR"<F``_SQ"$D*G("R"<E*`Y8`O`$ZZ#>103RE`@FYF"$*L@G)@`/[& M>@`F;()Z8!H@!>6`(&R";B&+"``O"TZZ!DI83U*`U\!2A;JL@G)MX"`%Y8`@ M;()N0K`(`&``_HX@`$SO`P``!"`((B\`#&`"$-E7R?_\9P9206`"0AA1R?_\ M3G4P/'__8`0P+P`.(&\`!$H89OQ32")O``A30!#95\C__&<"0A`@+P`$3G4P M/'__8`0P+P`.4T!K%"!O``0B;P`(L0EF#%-(2AA7R/_V<`!.=6,$<`%.=7#_ M3G4@;P`$(`@B;P`($-EF_$YU3E4``"\*)&T`"$H29R0@2E**$!!(@$C`+P!. MN@626$^PO/____]F"'#_)%].74YU8-A(>``*3KH%=EA/8.Q.50``2.<.,"1M M``A"ITAZ`(Y.N@TJ4$\I0(*:9@A,WPQP3EU.=2!M``PB:``D+RD`!$ZZ#8)8 M3R@`9U)(>@!M($0O*``V3KH-5%!/)D!*@&<T2'@#[2\+3KH,`%!/+`!G)"`& MY8`J`"!%)6@`"`"D)48`G$AX`^U(>@`X3KH+W%!/)4``H"\$3KH-(%A/+RR" MFDZZ#`Y83T*L@II@@&EC;VXN;&EB<F%R>0!724Y$3U<`*@!.50``2&T`#"\M M``A(>@2N3KH`D$_O``Q.74YU3E4``$CG""`D;0`0#*T````$`!1F""!M``@H M$&`42JT`#&\((&T`""@08`8@;0`(*!!"K0`42JT`#&P21*T`#$J$;`I$A"M\ M`````0`4(BT`#"`$3KH#TD'L@`)3BA2P"``B+0`,(`1.N@/**`!FWDJM`!1G M!E.*%+P`+2`*3-\$$$Y=3G5.5?\42.<(,"1M``@F;0`,0JW_^"MM`!#__"!+ M4HL0$$B`2,`H`&<``S"XO````"5F``,*0BW_(BM\`````?_T*WP````@__`K M?```)Q#_["!+4HL0$$B`2,`H`+"\````+6800JW_]"!+4HL0$$B`2,`H`+B\ M````,&84*WP````P__`@2U*+$!!(@$C`*`"XO````"IF&B!M__Q8K?_\*U#_ MZ"!+4HL0$$B`2,`H`&`T0JW_Z&`B<@H@+?_H3KH)P-"$D+P````P*T#_Z"!+ M4HL0$$B`2,`H`$'L@!4(,``"2`!FTKB\````+F9B($M2BQ`02(!(P"@`L+P` M```J9AH@;?_\6*W__"M0_^P@2U*+$!!(@$C`*`!@-$*M_^Q@(G(*("W_[$ZZ M"5;0A)"\````,"M`_^P@2U*+$!!(@$C`*`!![(`5"#```D@`9M(K?`````3_ MY+B\````;&86($M2BQ`02(!(P"@`*WP````$_^1@%+B\````:&8,($M2BQ`0 M2(!(P"@`(`1@?BM\````"/_@8!PK?`````K_X&`2*WP````0_^!@""M\____ M]O_@+RW_Y$AM_R(O+?_@+RW__$ZZ_;1/[P`0*T#_W"`M_^31K?_\8%H@;?_\ M6*W__"M0_]PO+?_<3KH"'%A/*T#_Y&!*(&W__%BM__PH$$'M_R$K2/_<$(1@ M*)"\````8V?B4X!GE)"\````"V<`_VY9@&>T58!G`/]N5X!G`/]R8,Q![?\B MD>W_W"M(_^0@+?_DL*W_[&\&*VW_[/_D2JW_]&=P(&W_W`P0`"UG"B)M_]P, M$0`K9C0,K0```##_\&8J4ZW_Z"!M_]Q2K?_<$!!(@$C`+P!.DEA/L+S_____ M9@IP_TS?#!!.74YU8!@O+?_P3I)83["\_____V8$</]@XE*M__@@+?_H4ZW_ MZ+"M_^1NVD*M_^!@)"!M_]Q2K?_<$!!(@$C`+P!.DEA/L+S_____9@1P_V"J M4JW_X"!M_]Q*$&<*("W_X+"M_^QMRB`M_^#1K?_X2JW_]&8J8!I(>``@3I)8 M3["\_____V8&</]@`/]P4JW_^"`M_^A3K?_HL*W_Y&[88!@O!$Z26$^PO/__ M__]F!G#_8`#_2%*M__A@`/S$("W_^&``_SA(YT@`0H1*@&H$1(!21$J!:@9$ M@0I$``%A/DI$9P)$@$S?`!)*@$YU2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`! M8-@O`6$2(`$B'TJ`3G4O`6$&(A]*@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"` MPR(`2$`R`H+#,`%"04A!3-\`#$YU2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($ MDH-20%'*__),WP`,3G4@;P`$(`A*&&;\D<`@"%.`3G5.50``2&R`K"\M``A. MN@`(4$].74YU3E4``"\$*"T`""\M``PO!$ZZ`#103[B\````"F8F(&T`#!`H M``Q(@$C`"```!V<42'C__R\M``Q.N@#^4$\H'TY=3G5@^$Y5```O"B1M``P@ M4K'J``1E&B`M``C`O````/\O`"\*3KH`T%!/)%].74YU(%)2DA`M``L0@$B` M2,#`O````/]@Y$Y5```O"D'L@)8D2"!*U?P````6+PAA$%A/0>R"3K7(9>HD M7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU2BH`#&=4""H``@`, M9PQ(>/__+PIA5E!/*``0*@`-2(!(P"\`3KH%"%A/B(`(*@`!``QG"B\J``A. MN@(\6$\(*@`%``QG%"\J`!).N@+86$\O*@`23KH"(%A/0I)"J@`$0JH`"$(J M``P@!&",3E7__DCG""`D;0`(0?K_0BE(@GX(*@`$``QG"G#_3-\$$$Y=3G4( M*@`"``QG,B@2F*H`""\$+RH`"!`J``U(@$C`+P!.N@*63^\`#+"$9Q`(Z@`$ M``Q"DD*J``1P_V"^#*W_____``QF$`BJ``(`#$*20JH`!'``8*1*J@`(9@@O M"DZZ`*183PQJ``$`$&8P&VT`#___2'@``4AM__\0*@`-2(!(P"\`3KH",D_O M``RPO`````%FF"`M``Q@`/]@)*H`"#`J`!!(P-"J``@E0``$".H``@`,(%)2 MDA`M``\0@$B`2,#`O````/]@`/\P3E4``"\*0>R`EB1(2BH`#&<8U?P````6 M0>R"3K7(90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(2'@$ M`$ZZ`,)83RM`__QF\``$`$"`*T+P````.)4``""1?3EU.=35\!```$`CJ M``$`#"5M__P`"!`J``U(@$C`+P!.N@#>6$]*@&<&`"H`@``,8,Q.50``2.<` M,"1L@E)@%"92("H`!%"`+P`O"DZZ!*)03R1+(`IFZ$*L@E),WPP`3EU.=4Y5 M```O"D'Z_\8I2(*"0J<@+0`(4(`O`$ZZ!#Q03R1`2H!F"'``)%].74YU)*R" M4B5M``@`!"E*@E(@"E"`8.9.50``+RT`"&&V6$].74YU3E4``$CG`#"7RR1L M@E)@#B!M``A1B+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2@E(@ M*@`$4(`O`"\*3KH#^%!/<`!@V$Y5```O"G(&("T`"$ZZ`K0D0-7L@F)*K0`( M;1(P+().2,`B+0`(LH!L!$J29A`I?`````*"AG#_)%].74YU<@8@+0`(3KH" M?"!L@F(O,`@`3KH"W%A/2H!G!'`!8`)P`?E4``"\M``A.N@*F6$]*@&8. M3KH"L"E`@H9P_TY=3G5P`Ϥ``$CG#"`H+0`(3KH`=G(&(`1.N@(F)$#5 M[()B2H1M#C`L@DY(P+B`;`1*DF82*7P````"@H9P_TS?!#!.74YU,"H`!,!\ M``-F#"E\````!8*&</]@XB\M`!`O+0`,+Q).N@)^3^\`#"H`L+S_____9@Q. MN@(J*4""AG#_8+H@!6"V3E7__$AX$`!"ITZZ`SQ03RM`__P(```,9Q)*K(*6 M9@@@+?_\3EU.=4ZZ``9P`&#T3E4``$AX``1(>@`>3KH"#"\`3KH"&D_O``Q( M>``!3KH`#%A/3EU.=5Y#"@!.50``2JR"?F<&(&R"?DZ0+RT`"$ZZ``A83TY= M3G5.5?_\+P0K;0`(__Q*K()B9RQX`&`*+P1.N@#.6$]2A#`L@DY(P+B`;>PP M+().P?P`!B\`+RR"8DZZ`C)03TJL@H)G!B!L@H).D$JL@HIG"B\L@HI.N@&X M6$]*K(*.9PHO+(*.3KH!J%A/2JR"DF<*+RR"DDZZ`9A83RQX``0(+@`$`2EG M%"\-2_H`"DZN_^(J7V`&0J?S7TYS2JR":F8J2JR">F<B+RR"=B\L@GI.N@&\ M4$\@+()R4H#E@"\`+RR";DZZ`:A03V`.3KH!E"\L@FI.N@'N6$\@+?_\+FR" M5DYU*!].74YU3E4``$CG#B`H+0`(<@8@!$ZZ`$0D0-7L@F)*A&T.,"R"3DC` MN(!L!$J29A(I?`````*"AG#_3-\$<$Y=3G4P*@`$P'R``&8(+Q).N@`N6$]" MDG``8.!(YW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`T(),WP`.3G4B+P`$ M+&R"7D[N_]PO!$SO`!X`""QL@EY.KO]V*!].=2(O``0L;()>3N[_@B(O``0L M;()>3N[_N"QL@EY.[O_*+&R"7D[N_WPB+P`$+&R"7D[N_R@B+P`$+&R"7D[N M_VI,[P`&``0L;()>3N[_XBQL@EY.[O_$(B\`!"QL@EY.[O]D3.\`#@`$+&R" M7D[N_]!(YP$$3.\@@``,+&R"6DZN_Y1,WR"`3G5.^@`"(F\`!"QL@EI.[OYB M(F\`!"QL@EI.[OZ>("\`!"QL@EI.[OZV3OH``DSO``,`!"QL@EI.[O\Z(F\` M!"QL@EI.[OYZ3OH``B)O``0L;():3N[^VBQL@EI.[O]\3OH``B)O``0@+P`( M+&R"6D[N_RX@+P`$+&R"6D[N_K`@;P`$+&R"6D[N_HP@;P`$((A8D$*H``0A M2``(3G4L;():(F\`!"`O``A.[OW8(F\`!"QL@EI.[OZ8(F\`!"QL@EI.[OZ& M3.\``P`$+&R"6D[N_LXB;P`$("\`""QL@EI.[OZ\("\`!"QL@EI.[O["(&\` M!"QL@EI.[OZ`3.\#```$+&R"FD[N_Z`@;P`$+&R"FD[N_Z8@;P`$+&R"FD[N M_[(```/L`````0````$```K*`````````_(```/J````E#`Q,C,T-38W.#EA M8F-D968````@("`@("`@("`P,#`P,"`@("`@("`@("`@("`@("`@()!`0$!` M0$!`0$!`0$!`0$`,#`P,#`P,#`P,0$!`0$!`0`D)"0D)"0$!`0$!`0$!`0$! M`0$!`0$!`0$!0$!`0$!`"@H*"@H*`@("`@("`@("`@("`@("`@("`@)`0$!` M(``````````````````!``````$``````````````````````0$````!```` M``````````````````$"`````0`````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````4``````/R ,```#ZP````$```/R ` end !Funky!Stuff! fi # end of overwriting check exit 0 # End of shell archive