/***************************************************************************/ /* Programm : EasyMouse V1.0 (c)1989 Oliver Enseling */ /* Funktion : Screenblanker,SunMouse,usw. */ /* Version : 01.000 */ /* */ /* Autor Datum Kommentar */ /* Boller 10.7.89 Erstversion Beginn */ /* Boller 02.9.89 Erstversion testfertig für Lattice 5.02 */ /* Boller 05.10.89 noch im debugging */ /***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEUTSCH #include "easymouse.i" extern struct Custom far custom; /* HotKeys + Qualifier Keys */ #define LEFT (0x4f | 0x80) #define RIGHT (0x4e | 0x80) #define UP (0x4c | 0x80) #define DOWN (0x4d | 0x80) #define Q (0x10 | 0x80) #define F (0x23 | 0x80) #define B (0x35 | 0x80) #define A (0x20 | 0x80) #define MINUS (0x3a | 0x80) #define KOMMA (0x38 | 0x80) #define PUNKT (0x39 | 0x80) #define DEL (0x46 | 0x80) #define LSHIFT 0x60 #define RSHIFT 0x61 #define CTRL 0x63 #define LALT 0x64 #define RALT 0x65 #define CAPS 0x62 #define COMMODORE 0x66 #define RAMIGA 0x67 /* Konstante Werte */ #define MY_QUALIFIER (IEQUALIFIER_LCOMMAND | IEQUALIFIER_LSHIFT) #define OPTION_NAME "s:EasyMouse.config" /* Struktur mit den veränderbaren Einstellungen des Programmes */ struct Options { WORD MinMem, MouseDelay, ScreenDelay, MouseAccel, MouseTresh, FrontClicks, WindowX, WindowY; BOOL Flag_Click2Back, Flag_CollectQuals, Flag_AutoActivate, Flag_ClockFront, Out_Time, Out_Mem, Out_Chip, Out_Fast; } Options = { 1, 4, 5, 3, 2, 1, 0, 0, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }; LONG MouseDelay[] = {0x7fffffff, 1, 2, 3, 5, 10, 15, 30, 60}; LONG ScreenDelay[] = {0x7fffffff, 30, 60, 120, 180, 300, 600, 900, 1800}; LONG MinMem[] = {25 * 1024, 50 * 1024, 75 * 1024, 100 * 1024, 150 * 1024, 200 * 1024, 250 * 1024, 500 * 1025, 1024 * 1024}; BOOL EndIt = FALSE; char OutputStr[80]; /* Menudefinition */ #include "menu.c" /* globale Variablen zur Auswertung einer IntuiMessage */ ULONG class; USHORT code, qualifier; APTR iaddress; struct IntuitionBase *IntuitionBase; struct DOSLibrary *DOSBase; struct LayersBase *LayersBase; extern struct ExecBase *SysBase; struct Window *Window; struct NewWindow NW = {0, 0, 500, 10, 0, 1, CLOSEWINDOW | MENUPICK, SMART_REFRESH, NULL, NULL, (UBYTE *) "EasyMouse V1.0", NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN}; struct Screen *myscreen; struct NewScreen NS = {0, 0, 320, 200, 1, 1, 0, NULL, CUSTOMSCREEN | SCREENQUIET}; /* globale Vars */ LONG MouseTimer, ScreenTimer; struct IOStdReq *InputBlock; /* * TestMsg: Testen, ob eine Message da ist und ggf Werte * bereitstellen */ BOOL TestMsg(win) struct Window *win; { struct IntuiMessage *msg; if (msg = (struct IntuiMessage *) GetMsg(win->UserPort)) { class = msg->Class; code = msg->Code; iaddress = msg->IAddress; ReplyMsg((struct Message *) msg); return (TRUE); } return (FALSE); } /* GetDeviceBlock: Device-Block anlegen und initialisieren */ void * GetDeviceBlock(size) ULONG size; { struct MsgPort *device_port = NULL; APTR device_request = NULL; device_port = (struct MsgPort *) CreatePort(0L, 0L); if (device_port == 0L) return (NULL); device_request = (APTR) CreateExtIO(device_port, size); if (device_request == 0L) { DeletePort(device_port); return (NULL); } return (device_request); } /* FreeDeviceBlock: Device-Block freigeben */ void FreeDeviceBlock(iorequest) struct IORequest *iorequest; { if (iorequest != 0L) { if (iorequest->io_Message.mn_ReplyPort != 0L) DeletePort(iorequest->io_Message.mn_ReplyPort); DeleteExtIO(iorequest); } } /* Open_A_Device: Device öffnen */ BOOL Open_A_Device(name, unit, device_request, flags, size) char *name; ULONG unit; struct IORequest **device_request; ULONG flags, size; { UWORD error; if (size != 0L) if (!(*device_request = GetDeviceBlock(size))) return (FALSE); error = OpenDevice(name, unit, *device_request, flags); if (error != 0L) { return (FALSE); } return (TRUE); } /* Close_A_Device: Device schließen und Device-Block freigeben */ void Close_A_Device(iorequest) struct IORequest *iorequest; { if (iorequest != 0L) { if (iorequest->io_Message.mn_ReplyPort != 0L) DeletePort(iorequest->io_Message.mn_ReplyPort); if (iorequest->io_Device != 0L) CloseDevice(iorequest); DeleteExtIO(iorequest); } } /* Do_Command: Device-Kommando ausführen */ void Do_Command(deviceblock, command) struct IORequest *deviceblock; UWORD command; { deviceblock->io_Command = command; DoIO(deviceblock); } struct Interrupt Input_Handler; /* Input_AddHandler: Eigene C-Routine in Input-Handler einbinden */ void Input_AddHandler(ireq, handler, data) struct IOStdReq *ireq; void *handler; APTR data; { Input_Handler.is_Data = data; Input_Handler.is_Code = handler; Input_Handler.is_Node.ln_Pri = 51; ireq->io_Data = (APTR) & Input_Handler; Do_Command(ireq, (UWORD) IND_ADDHANDLER); } /* Input_RemHandler: Input-Handler ausschalten */ void Input_RemHandler(ireq) struct IOStdReq *ireq; { ireq->io_Data = (APTR) & Input_Handler; Do_Command(ireq, (UWORD) IND_REMHANDLER); } /* CloseAll: Alles ordnungsgemäß schließen */ void CloseAll(str) register char *str; { char buffer[80]; if (str) { if (IntuitionBase) { strcpy(buffer + 3, str); buffer[0] = 0; buffer[1] = 40; buffer[2] = 20; DisplayAlert(RECOVERY_ALERT, buffer, 50L); } else puts(str); } if (InputBlock) { Input_RemHandler(InputBlock); Close_A_Device(InputBlock); } if (Window) { ClearMenuStrip(Window); CloseWindow(Window); } if (GfxBase) CloseLibrary(GfxBase); if (LayersBase) CloseLibrary(LayersBase); if (DOSBase) CloseLibrary(DOSBase); if (IntuitionBase) CloseLibrary((struct Library *) IntuitionBase); Exit(TRUE); } /* Optionen im Menu einstellen */ void SetOptions() { MinMemSub[8 - Options.MinMem].Flags |= CHECKED; MouseDelaySub[8 - Options.MouseDelay].Flags |= CHECKED; ScreenDelaySub[8 - Options.ScreenDelay].Flags |= CHECKED; MouseAccelSub[8 - Options.MouseAccel].Flags |= CHECKED; MouseTreshSub[8 - Options.MouseTresh].Flags |= CHECKED; FrontClicksSub[2 - Options.FrontClicks].Flags |= CHECKED; if (Options.Flag_Click2Back) Click2BackItem.Flags |= CHECKED; if (Options.Flag_CollectQuals) CollectQualsItem.Flags |= CHECKED; if (Options.Flag_AutoActivate) AutoActivateItem.Flags |= CHECKED; if (Options.Flag_ClockFront) ClockFrontItem.Flags |= CHECKED; if (Options.Out_Time) TimeSub.Flags |= CHECKED; if (Options.Out_Mem) MemSub.Flags |= CHECKED; if (Options.Out_Chip) ChipSub.Flags |= CHECKED; if (Options.Out_Fast) FastSub.Flags |= CHECKED; } /* Fenster schließen, an Werte aus Options anpassen und wieder öffnen */ void SetWindow() { if (Window) { Options.WindowX = Window->LeftEdge; Options.WindowY = Window->TopEdge; ClearMenuStrip(Window); CloseWindow(Window); } NW.LeftEdge = Options.WindowX; NW.TopEdge = Options.WindowY; NW.Width = 38; if (Options.Out_Time) NW.Width += 15 * 8; if (Options.Out_Mem) NW.Width += 17 * 8; if (Options.Out_Chip) NW.Width += 13 * 8; if (Options.Out_Fast) NW.Width += 13 * 8; NW.Width = max(NW.Width, 142); NW.Flags = WINDOWCLOSE | WINDOWDRAG | SMART_REFRESH; if (!Options.Flag_ClockFront) { NW.Flags |= WINDOWDEPTH; NW.Width += 52; } if (!(Window = OpenWindow(&NW))) #ifdef DEUTSCH CloseAll("EasyMouse kann kein Fenster öffnen !!!"); #else CloseAll("Unable to open window\n"); #endif SetMenuStrip(Window, &Menu1); } /* Window unter der Maus ermitteln */ struct Window * MouseWindow() { SHORT x, y; struct Layer_Info *li; struct Layer *l; li = &IntuitionBase->FirstScreen->LayerInfo; x = IntuitionBase->FirstScreen->MouseX; y = IntuitionBase->FirstScreen->MouseY; l = WhichLayer(li, (LONG) x, (LONG) y); return ((struct Window *) l->Window); } /* Bildschirm ein- und ausschalten */ void BlackScreen() { if (myscreen == 0) { myscreen = OpenScreen(&NS); SetRGB4(&(myscreen->ViewPort), 0, 0, 0, 0); } OFF_DISPLAY OFF_SPRITE } void NormalScreen() { ON_DISPLAY if (myscreen) CloseScreen(myscreen); myscreen = 0; } /* IHandler: Input-Handler */ struct InputEvent *__saveds __interrupt IHandler() { struct InputEvent *masterevent = (struct InputEvent *) getreg(REG_A0), **event = &masterevent; static ULONG extraquals; static LONG nmics, nsecs, omics, osecs; struct Window *w = MouseWindow(); struct Screen *s = IntuitionBase->FirstScreen; ULONG ilock = LockIBase(0); while (*event) { USHORT iecode = (*event)->ie_Code, iequal = (*event)->ie_Qualifier, ieclass = (*event)->ie_Class; static USHORT lastcode; BOOL deleteevent = FALSE; switch (ieclass) { case IECLASS_RAWKEY: if (iecode >= 0x80) { if (iecode == lastcode | 0x80) { deleteevent = TRUE; lastcode = 0; } } else { ScreenTimer = ScreenDelay[Options.ScreenDelay]; if (Options.Flag_CollectQuals) { if (iecode >= LSHIFT && iecode <= RAMIGA) { lastcode = iecode; deleteevent = TRUE; switch (iecode) { case LSHIFT: extraquals |= IEQUALIFIER_LSHIFT; break; case RSHIFT: extraquals |= IEQUALIFIER_RSHIFT; break; case CTRL: extraquals |= IEQUALIFIER_CONTROL; break; case LALT: extraquals |= IEQUALIFIER_LALT; break; case RALT: extraquals |= IEQUALIFIER_RALT; break; case COMMODORE: extraquals |= IEQUALIFIER_LCOMMAND; break; case RAMIGA: extraquals |= IEQUALIFIER_RCOMMAND; break; default: lastcode = 0; deleteevent = FALSE; extraquals = NULL; break; } } else { iequal |= extraquals; (*event)->ie_Qualifier |= extraquals; extraquals = 0; } } } if ((iequal & MY_QUALIFIER) == MY_QUALIFIER) { deleteevent = TRUE; switch (iecode) { case LEFT: MoveWindow(w, -w->LeftEdge, 0); break; case RIGHT: MoveWindow(w, s->Width - w->LeftEdge - w->Width, 0); break; case UP: MoveWindow(w, 0, -w->TopEdge); break; case DOWN: MoveWindow(w, 0, s->Height - w->TopEdge - w->Height); break; case F: if (!(w->Flags & BACKDROP)) WindowToFront(w); break; case B: WindowToBack(w); break; case A: if (w = MouseWindow()) ActivateWindow(w); break; case Q: EndIt = TRUE; break; case MINUS: ScreenToBack(s); break; case KOMMA: if (w->Flags & WINDOWSIZING) SizeWindow(w, w->MinWidth - w->Width, w->MinHeight - w->Height); break; case PUNKT: if (w->Flags & WINDOWSIZING) SizeWindow(w, min(w->MaxWidth - w->Width, s->Width - w->Width - w->LeftEdge), min(w->MaxHeight - w->Height, s->Height - w->Height - w->TopEdge)); break; case DEL: MouseTimer = ScreenTimer = 0; } /* switch */ } /* if */ break; /* Bei Mausbewegung Maus einschalten und Maustimer zurücksetzen */ /* evtl. ClickToFront/Back oder SunMouse + beschleunigen */ case IECLASS_RAWMOUSE: MouseTimer = MouseDelay[Options.MouseDelay]; ScreenTimer = ScreenDelay[Options.ScreenDelay]; switch (iecode) { case IECODE_RBUTTON: if ((iequal & IEQUALIFIER_LEFTBUTTON) && Options.Flag_Click2Back) if (w) WindowToBack(w); break; case IECODE_LBUTTON: if (w) switch (Options.FrontClicks) { case 1: if (!(w->Flags & BACKDROP)) WindowToFront(w); break; case 2: osecs = nsecs; omics = nmics; CurrentTime(&nsecs, &nmics); if (DoubleClick(osecs, omics, nsecs, nmics)) if (!(w->Flags & BACKDROP)) WindowToFront(w); } /* switch */ break; case IECODE_NOBUTTON: if ((abs((*event)->ie_X) > Options.MouseTresh) || (abs((*event)->ie_Y) > Options.MouseTresh)) { (*event)->ie_X *= Options.MouseAccel; (*event)->ie_Y *= Options.MouseAccel; } /* if */ if (Options.Flag_AutoActivate) if (!(iequal & IEQUALIFIER_LEFTBUTTON)) if (w != IntuitionBase->ActiveWindow) ActivateWindow(w); } /* switch */ break; case IECLASS_TIMER: if (((*event)->ie_TimeStamp.tv_micro % 10) == 0) { MouseTimer--; ScreenTimer--; } /* if */ } /* switch */ if (ScreenTimer <= 0) BlackScreen(); else NormalScreen(); if (MouseTimer <= 0) OFF_SPRITE else ON_SPRITE if (deleteevent) *event = (*event)->ie_NextEvent; else event = &((*event)->ie_NextEvent); } /* while */ UnlockIBase(ilock); return (masterevent); } /* function */ /* OpenAll: Alles ordnungsgemäß öffnen */ void OpenAll() { BPTR fh; if (!(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0L))) #ifdef DEUTSCH CloseAll("Intuition.Library kann nicht geöffnet werden !!!"); #else CloseAll("Unable to open intuition.library\n"); #endif if (!(DOSBase = (struct DOSLibrary *) OpenLibrary("dos.library", 0))) #ifdef DEUTSCH CloseAll("Dos.Library kann nicht geöffnet werden !!!"); #else CloseAll("Unable to open dos.library\n"); #endif if (!(LayersBase = (struct LayersBase *) OpenLibrary("layers.library", 0))) #ifdef DEUTSCH CloseAll("Layers.Library kann nicht geöffnet werden !!!"); #else CloseAll("Unable to open layers.library\n"); #endif if (!(GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 0))) #ifdef DEUTSCH CloseAll("Graphics.Library kann nicht geöffnet werden !!!"); #else CloseAll("Unable to open graphics.library\n"); #endif if (fh = Open(OPTION_NAME, MODE_OLDFILE)) { Read(fh, (char *) &Options, sizeof(Options)); Close(fh); } SetOptions(); SetWindow(); if (!(Open_A_Device("input.device", 0L, &InputBlock, 0L, sizeof(*InputBlock)))) #ifdef DEUTSCH CloseAll("Input.Device kann nicht geöffnet werden !!!"); #else CloseAll("Unable to open input.device\n"); #endif Input_AddHandler(InputBlock, IHandler, NULL); } /* * Main: Hauptprogramm,Menüabfrage,Update von Uhr- und * Speicheranzeige */ void main(argc, argv) int argc; char **argv; { LONG fast, chipmem, mem; BPTR fh; OpenAll(); MouseTimer = MouseDelay[Options.MouseDelay]; ScreenTimer = ScreenDelay[Options.ScreenDelay]; FOREVER { struct Window *w = IntuitionBase->ActiveWindow; struct Screen *s = IntuitionBase->FirstScreen; char buffer[40]; if (EndIt) CloseAll(NULL); Delay(50); if (Options.Flag_ClockFront) UpfrontLayer(&Window->WScreen->LayerInfo, Window->WLayer); fast = AvailMem(MEMF_FAST); chipmem = AvailMem(MEMF_CHIP); mem = chipmem + fast; OutputStr[0] = 0; if (Options.Out_Time) { long sec, mic; CurrentTime(&sec, &mic); #ifdef DEUTSCH sprintf(buffer, " Zeit %2d:%2d:%2d ", sec / 3600 % 24, sec / 60 % 60, sec % 60); #else sprintf(buffer, " Time %2d:%2d:%2d ", sec / 3600 % 24, sec / 60 % 60, sec % 60); #endif strcat(OutputStr, buffer); } if (Options.Out_Mem) { #ifdef DEUTSCH sprintf(buffer, " Speicher %-7d", mem); #else sprintf(buffer, " Memory %-7d", mem); #endif strcat(OutputStr, buffer); } if (Options.Out_Chip) { sprintf(buffer, " CHIP %-7d", chipmem); strcat(OutputStr, buffer); } if (Options.Out_Fast) { sprintf(buffer, " FAST %-7d ", fast); strcat(OutputStr, buffer); } OutputText.FrontPen = mem < MinMem[Options.MinMem] ? 3 : 1; PrintIText(Window->RPort, &OutputText, Window->WScreen->ViewPort.Modes & HIRES ? 0 : -14, 0); if (TestMsg(Window)) { switch (class) { case CLOSEWINDOW: CloseAll(NULL); case MENUPICK: switch (MENUNUM(code)) { case 0: /* Aktionen */ switch (ITEMNUM(code)) { case 0: /* Display off */ ScreenTimer = 0; break; case 1: /* Screen2Back */ ScreenToBack(s); break; case 6: /* Window links */ WindowToFront(w); MoveWindow(w, -w->LeftEdge, 0); break; case 7: /* Window rechts */ WindowToFront(w); MoveWindow(w, s->Width - w->LeftEdge - w->Width, 0); break; case 8: /* Window oben */ WindowToFront(w); MoveWindow(w, 0, -w->TopEdge); break; case 9: /* Window unten */ WindowToFront(w); MoveWindow(w, 0, s->Height - w->TopEdge - w->Height); break; case 12: /* Ende */ CloseAll(NULL); } break; case 1: /* Optionen */ switch (ITEMNUM(code)) { case 1: /* Number of Clicks-To-Front */ if ((SUBNUM(code) >= 0) && (SUBNUM(code) <= 2)) Options.FrontClicks = SUBNUM(code); break; case 4: /* Mindestspeicher */ if ((SUBNUM(code) >= 0) && (SUBNUM(code) <= 8)) Options.MinMem = SUBNUM(code); break; case 5: /* Anzeige */ Options.Out_Time = TimeSub.Flags & CHECKED; Options.Out_Mem = MemSub.Flags & CHECKED; Options.Out_Chip = ChipSub.Flags & CHECKED; Options.Out_Fast = FastSub.Flags & CHECKED; break; case 6: /* ScreenBlank */ if ((SUBNUM(code) >= 0) && (SUBNUM(code) <= 8)) Options.ScreenDelay = SUBNUM(code); break; case 7: /* N]ouseBlank */ if ((SUBNUM(code) >= 0) && (SUBNUM(code) <= 8)) Options.MouseDelay = SUBNUM(code); break; case 8: /* Mouse-Acceleration */ if ((SUBNUM(code) >= 0) && (SUBNUM(code) <= 8)) Options.MouseAccel = SUBNUM(code) + 1; break; case 9: /* Mouse-Acceleration-Treshhold * */ if ((SUBNUM(code) >= 0) && (SUBNUM(code) <= 8)) Options.MouseTresh = SUBNUM(code); break; case 11: /* Save Options */ if (fh = Open(OPTION_NAME, MODE_NEWFILE)) { Options.WindowX = Window->LeftEdge; Options.WindowY = Window->TopEdge; Write(fh, (char *) &Options, sizeof(Options)); Close(fh); } else DisplayBeep(NULL); } Options.Flag_Click2Back = Click2BackItem.Flags & CHECKED; Options.Flag_CollectQuals = CollectQualsItem.Flags & CHECKED; Options.Flag_AutoActivate = AutoActivateItem.Flags & CHECKED; Options.Flag_ClockFront = ClockFrontItem.Flags & CHECKED; SetWindow(); break; } break; } } } }