/**********************************************
* Preferences                                 *
* Autor: Andreas Krämer                       *
* Copyright KICKSTART 2.88                    *
* Erstellt auf dem Lattice C Compiler         *
***********************************************
* Scherz Programm                             *
**********************************************/

/* Zwei Dateien werden eingebunden */

#include <exec/types.h>
#include <intuition/intuition.h>

/* Zuweisung von verschiedenen Strukturen mit *
*  einem Zeiger. Die Zeiger werden später im  *
*  Hauptprogramm benötigt.                   */

struct IntuitionBase *IntuitionBase;
struct IntuiMessage *Nachricht;
struct Window *Window;

/* Die Preferences Struktur */

struct Preferences Pref;

/* Definition von einigen Variablen */

UWORD *Maus;
WORD Mausdaten;
WORD Mausdatenalt;
ULONG NachrichtenArt;
USHORT code;
LONG ViewX, ViewY;

/* Integer */
int a;

/* Die NewWindow Struktur */

struct NewWindow Fenster =
{
 0, 0,
 6, 6,/* Das Fenster ist sehr klein gehalten, *
       * 6*6 Pixel. Oben, rechts in der Ecke.*/
 0, 1,
 CLOSEWINDOW,
 WINDOWCLOSE,
 NULL, NULL, 0, NULL, NULL,
 0, 0, 0, 0,
 WBENCHSCREEN
};

/***********************************************
* Beginn des Hauptprogrammes                   *
***********************************************/

main()
{

/* Zusätzlicher Zeiger auf eine Struktur */

struct Message *GetMsg();

/* Leider eine effektive Adresse */

Maus = (UWORD *)0xdff00a;

/* Wertzuweisung von zwei Variablen */

Mausdatenalt = 0;
a = 0;

/* Öffnen der Intuition Library */

IntuitionBase=(struct IntuitionBase *)
     OpenLibrary("intuition.library",0);
if(IntuitionBase==NULL)exit(FALSE);

/* Öffnen des Fensters */

if((Window=(struct Window *)
     OpenWindow(&Fenster))==NULL)
exit(FALSE);

/***********************************************
* List die Werte der momentan eingestellten    *
* Preferences                                  *
***********************************************/

GetPrefs(&Pref,sizeof(struct Preferences));

/* Rettet die Werte der Bildsschirmkoordinaten*/

ViewX = Pref.ViewXOffset;
ViewY = Pref.ViewYOffset;

/**********************************************
* Die Endlosschleife fragt bestimmte          *
* Ereignisse ab und zaehlt die Mausbewegungen.*
**********************************************/

for(;;)
 {
   if(Nachricht=(struct IntuiMessage *)
     GetMsg(Window->UserPort))
   {
    NachrichtenArt=Nachricht ->Class;
    code=Nachricht->Code;
    ReplyMsg(Nachricht);
    switch (NachrichtenArt)
       {
        /* Sprung in das Unterprogramm *
         * Reaktion, wenn das Gadget   *
         * angewaehlt wird.           */ 
        case CLOSEWINDOW : Ende();
                           break;
       } /* switch */
    } /* if */

/* Wert der effektiven Adresse wird ausgelesen*/

    Mausdatenalt = *Maus;

/* Kleine Warteschleife, ist notwendig,        *
*  weil in dieser Warteschleife der Wert der   *
*  effektiven Adresse bei einer Mausbewegung   *
*  geaendert wird.                            */

    Delay(10);

/* Wiederholtes einlesen der Adresse */

    Mausdaten = *Maus;

/* Hochzaehlen der Variablen a */

    if(Mausdaten != Mausdatenalt) a++;

/* Wenn a > 15 dann wird in der Unterprogramm  *
*  Sprung() verzweigt.                        */
  
    if(a > 15)
      {
       Mausdatenalt = Mausdaten;
       Sprung();
      }
 } /* Ende for */
 return(0);
} /* Ende main */

/***********************************************
* Unterprogramm zum Schliessen aller           *
* Einrichtungen.                               *
***********************************************/

Ende()
{
/* Zuruecksetzen des Bildschirms in die        *
*  Ausgangsposition.                          */

  Pref.ViewXOffset = ViewX;
  Pref.ViewYOffset = ViewY;
  SetPrefs(&Pref,sizeof(struct Preferences),
                                     FALSE);

/* Schliessen des Fensters und der Library */

  CloseWindow(Window);
  CloseLibrary(IntuitionBase);
  exit(TRUE);
 return (0);
}

/***********************************************
* Zweites  Unterprogramm. Verschiebt den       *
* Bildschirm in verschiedene Richtungen.       *
***********************************************/

Sprung()
{
/* Kleiner Zuffallssprung */

  Pref.ViewXOffset = Mausdaten/1000;
  Pref.ViewYOffset = Mausdaten/1000;
  SetPrefs(&Pref,sizeof(struct Preferences),
                                     FALSE);

/* Warteschleife */

  Delay(50);

/* Setzt den Bildschirm in die alte Position */

  Pref.ViewXOffset = ViewX;
  Pref.ViewYOffset = ViewY;
  SetPrefs(&Pref,sizeof(struct Preferences),
                                     FALSE);

/* Die Variable a wird Null gesetzt. */

  a = 0;
  return(0);
}
/* LISTING ENDE */
