home *** CD-ROM | disk | FTP | other *** search
- /*----------------------------------------------------------------------------
- File : InputHandler.c
- Projekt: InputView ab V0.24
- Inhalt : ProudHandler (mein erster Input-Handler!!)
- LaunchPHandler (setzt den ProudHandler in die Handlerliste ein)
- KillerHandler (der 'Alles-Wegfreß-Inputhandler')
- LaunchKHandler (setzt meinen KillerHandler ab)
- CatchHandler (und hier hole ich ihn wieder raus)
- InInput (setzt die gespeicherten IEvents wieder ein)
- LoadEvents (lade eine Events-Datei in den Buffer)
- SaveEvents (sichere den Events-Buffer als File ab)
-
- Version: 0.18
- Autor : Uwe Röhm
- Adresse: Auber Str. 25, W-6209 Hohenstein 4
- (Semester) Wörthstr. 18 W-8390 Passau
- Bemerkung:
- ACHTUNG:
- Der Inputhandler muß mit einer Priorität >50 (und <127!!!) gestartet
- werden, da er sonst keine Tiner-Ticks erhält und somit nie abbricht.
- ----------------------------------------------------------------------------*/
-
- #include <exec/Types.h>
- #include <exec/io.h>
- #include <exec/ports.h>
- #include <libraries/dos.h>
- #include <exec/interrupts.h>
- #include <devices/inputevent.h>
- #include <devices/timer.h>
- #include <devices/input.h>
- #include <dos.h>
- #include "InputHandy.h"
-
- #ifndef LATTICE
- #include <functions.h>
- #else
- #include <proto/exec.h>
- #include <proto/dos.h>
- #include <proto/timer.h>
- #include <stdio.h>
- #endif
-
- extern struct Interrupt *InputInt;
- extern struct IOStdReq *InputDev;
- extern struct timerequest *TimeRequest;
- extern struct IEZahlen *Numbers;
- extern int Priority;
- extern BOOL Sperre;
- extern struct Library *TimerBase;
- extern char * FileName;
-
- /* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- Funktion : ProudHandler
- Parameter : struct InputEvent *ie1 (Zeiger auf Events...)
- struct IEZahlen *n (Zeiger auf Zahlenliste...)
- Rückgabe : struct InputEvent *(wie genommen, so zeronnen)
-
- Aufruf von: InputDevice (im ROM !)
- UnterFunks: --
- Autor : Uwe Röhm (Floyd)
- Datum : ???
- Bemerkung:
- Mein erster Input-Handler. Mal sehen, ob alles klappt.
- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
- struct InputEvent* __regargs ProudHandler(struct InputEvent *ie1,struct IEZahlen *n)
- {
- struct InputEvent *iez;
-
- for (iez=ie1; iez; iez= iez->ie_NextEvent)
- {
- switch (iez->ie_Class)
- {
- case IECLASS_RAWKEY:
- case IECLASS_RAWMOUSE:
- if (n->BufferMarke != n->BufferEnde)
- {
- CopyMem (iez, n->BufferMarke, sizeof (struct InputEvent));
- if (iez->ie_Class == IECLASS_RAWKEY)
- n->BufferMarke->ie_Class = IECLASS_GADGETDOWN;
- else
- n->BufferMarke->ie_Class = IECLASS_GADGETUP;
- n->BufferMarke->ie_NextEvent = NULL;
- n->BufferMarke++;
- }
- else
- Signal (n->MyPort->mp_SigTask, n->IESignal);
- break;
- case IECLASS_TIMER:
- n->Timer++;
- if (n->Timer > n->TimerMax)
- { n->Timer = 0;
- Signal (n->MyPort->mp_SigTask, n->IESignal);
- }
- break;
- default:
- break;
- }
- }
- return ie1;
- }
-
-
- /* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- Funktion : LaunchPHandler
- Parameter : --
- Rückgabe : --
-
- Aufruf von: main (InputMain.c)
- UnterFunks: --
- Autor : Floyd
- Datum : ??
- Bemerkung:
- startet meine ProudHandler und setzt den Pointer auf die linke obere Ecke.
- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
- VOID LaunchPHandler ()
- {
- struct InputEvent ie = {
- NULL, IECLASS_POINTERPOS, 0, IECODE_NOBUTTON, 0, 0, 0, 0, 0};
-
- InputInt->is_Code = (VOID *) ProudHandler;
- InputInt->is_Data = (APTR) Numbers;
- InputInt->is_Node.ln_Pri = Priority;
- InputInt->is_Node.ln_Name = PHANDLERNAME;
-
- InputDev->io_Data = (APTR) InputInt;
- InputDev->io_Command = IND_ADDHANDLER;
- DoIO ((struct IORequest *) InputDev);
-
- /* jetzt noch schnell den Pointer auf eine fest definierte Position*/
- InputDev->io_Data = (APTR) &ie;
- InputDev->io_Length = sizeof (struct InputEvent);
- InputDev->io_Flags = 0;
- InputDev->io_Command = IND_WRITEEVENT;
- DoIO ((struct IORequest *) InputDev);
- }
-
-
- /* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- Funktion : KillerHandler
- Parameter : struct InputEvent *ie1 (Zeiger auf Events...)
- struct IEZahlen noull (Zeiger auf nichts, denn ich brauch nix)
- Rückgabe : struct InputEvent *(wie genommen, so zeronnen)
-
- Aufruf von: InputDevice (im ROM !)
- UnterFunks: --
- Autor : Uwe
- Datum : ??
- Bemerkung:
- Hehehe. Hier werden alle User-Eingaben radikal vernichtet. Nur die eigenen
- eingesetzten Events lasse ich durch. Wie ich die erkenne? Na, ich gehe
- davon aus, daß ich über der Intuition sitze (WICHTIG!!) und codiere nun
- meine eingesetzten Events in solche um, die eigentlich erst die Intuition
- erzeugt. Damit ist die Sachlage klar. Ich brauch sie nur zurückzukonver-
- tieren und passieren zu lassen.
- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
- struct InputEvent* __regargs KillerHandler(struct InputEvent *ie1, APTR noull)
- {
- struct InputEvent *iez;
-
- for (iez=ie1; iez; iez = iez->ie_NextEvent)
- {
- switch (iez->ie_Class)
- {
- /* Der ganze restliche Klimbatsch kommt raus.... */
- case IECLASS_RAWKEY:
- case IECLASS_RAWMOUSE:
- iez->ie_Class = IECLASS_NULL;
- iez->ie_SubClass = 0;
- iez->ie_Code = 0;
- iez->ie_Qualifier = 0;
- break;
-
- /* Diese Classes kommen sonst nur von der Intuition */
- case IECLASS_GADGETDOWN:
- iez->ie_Class = IECLASS_RAWKEY;
- break;
- case IECLASS_GADGETUP:
- iez->ie_Class = IECLASS_RAWMOUSE;
- break;
-
- default:
- break;
- }
- }
-
- return ie1;
- }
-
-
- /* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- Funktion : LaunchKHandler
- Parameter : --
- Rückgabe : --
-
- Aufruf von: InInput (s.u.)
- UnterFunks: --
- Autor : Floyd (that's me)
- Datum : ??
- Bemerkung:
- Und hier starte ich den KillerHandler (s.o.)
- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
- VOID LaunchKHandler ()
- {
- InputInt->is_Code = (VOID*) KillerHandler;
- InputInt->is_Data = NULL;
- InputInt->is_Node.ln_Pri = Priority;
- InputInt->is_Node.ln_Name = KHANDLERNAME;
-
- InputDev->io_Data = (APTR) InputInt;
- InputDev->io_Command = IND_ADDHANDLER;
- DoIO ((struct IORequest *) InputDev);
- }
-
-
- /* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- Funktion : CatchHandler
- Parameter : --
- Rückgabe : --
-
- Aufruf von: main (InputMain.c)
- UnterFunks: --
- Autor : Uwe Röhm
- Datum : ??
- Bemerkung:
- Der gerade laufende InputHandler (KillerH. oder ProudH.) wird beendet.
- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
- VOID CatchHandler ()
- {
- InputDev->io_Data = (APTR) InputInt;
- InputDev->io_Command = IND_REMHANDLER;
- DoIO ((struct IORequest *) InputDev);
- }
-
-
- /*---------------------------------------------------------------------------
- Funktion : InInput
- Parameter : struct VictimIno v (Zeiger auf - na du weisst schon)
- Rückgabe : --
-
- Aufruf von: SendLoop <s.u.>
- UnterFunks: LaunchKHandler (s.o.)
- CatchHandler (s.o.)
- Autor : Uwe Röhm
- Datum : ??
- Beschreibung:
- "InInput" mischt die gespeicherten InputEvents unter die des Systems
- (Input-Device sollte ja längst offen sein....). Dabei beachte ich die
- Zeitverzögerung zwischen den einzelnen Events (per Timer-Device). Die
- Trägheit der Workbench ist damit z.B. kein Problem mehr!!!!
- Außerdem sperre ich währenddessen alle anderen Events.
- ---------------------------------------------------------------------------*/
- void InInput ()
- {
- struct timeval *oldtime;
- struct InputEvent *i;
- struct InputEvent ie = {
- NULL, IECLASS_POINTERPOS, 0, IECODE_NOBUTTON, 0, 0, 0, 0, 0};
-
- if (Sperre)
- LaunchKHandler ();
-
- /* jetzt noch schnell den Pointer auf die erste gespeicherte Maus-Position */
- InputDev->io_Length = sizeof (struct InputEvent);
- InputDev->io_Flags = 0;
- InputDev->io_Command = IND_WRITEEVENT;
- InputDev->io_Data = (APTR) &ie;
- DoIO ((struct IORequest *) InputDev);
-
- oldtime = &Numbers->BufferAnfang->ie_TimeStamp;
- TimeRequest->tr_node.io_Command = TR_ADDREQUEST;
-
- for (i = Numbers->BufferAnfang; i < Numbers->BufferMarke; i++)
- {
- TimeRequest->tr_time.tv_secs = i->ie_TimeStamp.tv_secs;
- TimeRequest->tr_time.tv_micro= i->ie_TimeStamp.tv_micro;
- SubTime ((struct timerequest *) &TimeRequest->tr_time,
- (struct timerequest *)oldtime);
- DoIO ((struct IORequest *)TimeRequest);
- oldtime = &i->ie_TimeStamp;
-
- InputDev->io_Data = (APTR) i;
- DoIO ((struct IORequest *) InputDev);
- }
-
- if (Sperre)
- CatchHandler ();
- }
-
-
- /* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- Funktion : SaveEvents
- Parameter : --
- Rückgabe : eventueller DOS-Error!
-
- Aufruf von: main (InputMain.c)
- UnterFunks: --
- Autor : Floyd
- Datum : ??
- Bemerkung :
- Diese Funktion speichert meinen Events-Buffer in eine Datei.
- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
- int SaveEvents ()
- {
- char FileBuffer[108];
- int fh;
- int error;
- long size;
- unsigned int count;
-
- if (FileName == NULL)
- { printf ("Aufgezeichnete Events abspeichern in Datei:\n");
- FileName = gets (FileBuffer);
- }
-
- fh = _dopen (FileName, MODE_READWRITE);
- if (fh == -1)
- {
- fh = _dcreatx(FileName,0);
- if (fh == -1)
- return (-1);
- }
-
- size = (Numbers->BufferMarke - Numbers->BufferAnfang);
- count = _dwrite (fh,(char *)&size, sizeof (long));
- count = _dwrite (fh,(char *)Numbers->BufferAnfang,size * sizeof(struct InputEvent));
-
- if (count < 1)
- {
- error = _dclose (fh);
- return (-1);
- }
- error = _dclose (fh);
-
- return (error);
- }
-
-
- /* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- Funktion : LoadEvents
- Parameter : --
- Rückgabe : eventueller DOS-Error!
- gefüllter Events-Buffer
-
- Aufruf von: main (InputMain.c)
- UnterFunks: --
- Autor : Floyd
- Datum : -?-
- Bemerkung :
- Diese Funktion lädt einen Events-Buffer aus einer Datei.
- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
- int LoadEvents ()
- {
- char FileBuffer [108];
- int fh;
- int error;
- long size;
- unsigned int count;
-
- if (FileName == NULL)
- { printf ("Dateiname der aufgezeichneten Events: \n");
- FileName = gets (FileBuffer);
- }
-
- fh = _dopen ((char *)FileName,MODE_READWRITE);
- if (fh == -1)
- return (-1);
-
- count = _dread (fh, (char *) &size, sizeof(long));
- count = _dread (fh, (char *)Numbers->BufferAnfang, size * sizeof(struct InputEvent));
- if (count < 1)
- {
- error = _dclose (fh);
- return (-1);
- }
- Numbers->BufferMarke = Numbers->BufferAnfang + size;
- error = _dclose (fh);
-
- return (error);
- }
-