/*
 * ReadPixel.c :
 * -------------
 * Auteur         : Xavier Mertens  
 * Version        : 1 
 * Révision       : 00 
 * Langage        : Lattice c v5.0
 * Compatibilité  : 1.3 - 2.x
 * Description    : Programme qui ouvre un requester lorsqu'on clique avec
 *                  la souris.Il donne des informations sur les coordonnées,
 *                  la couleur,etc...  
 *
 */

#include <exec/types.h>
#include <exec/execbase.h>
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>

#define MOUSE        0xBFE001
#define PRINT(x,y,z) Move(Window->RPort,x,y);Text(Window->RPort,z,strlen(z))
#define ABS(x)       ((x)>=0?(x):-(x))

extern struct ExecBase *SysBase;

struct IntuitionBase *IntuitionBase;
struct GfxBase       *GfxBase;
struct Task          *MyTask;
struct Window        *Window;

SHORT BorderVectors[] = {
  0,0,71,0,71,13,0,13,0,0
};
struct Border Border = {
  -1,-1,1,0,JAM1,5,BorderVectors,NULL
};

struct IntuiText IText = {
  2,0,JAM2,2,2,NULL,"Continue",NULL
};

struct Gadget Gadget = {
  NULL,124,61,70,12,NULL,RELVERIFY,BOOLGADGET,
  (APTR)&Border,NULL,&IText,NULL,NULL,NULL,NULL
};

struct NewWindow NewWindow = {
  0,0,320,80,0,1,GADGETUP+CLOSEWINDOW,
  WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+NOCAREREFRESH,
  &Gadget,NULL,"ReadPixel v1.0 par XM - Sep 92",NULL,NULL,-1,-1,-1,-1,CUSTOMSCREEN
};

char *Adresse;

_main(){
  ULONG Class;
  struct IntuiMessage *Message;

  char str1[80],
       str2[40],
       str3[40],
       str4[40];
  int OldMouseX=0,
      OldMouseY=0;

  MyTask=SysBase->ThisTask;
  SetTaskPri(MyTask,-5);
  if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",36)))
    Exit(5);
  if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",36))){
    DisplayBeep(NULL);
    CloseLibrary(IntuitionBase);
    Exit(5);
  }
  Adresse=MOUSE;
  for(;;){
    if(TestMouse()!=-1){
      sprintf(str1,"Ecran   : (%ld,%ld)",
          IntuitionBase->ActiveScreen->Width,
          IntuitionBase->ActiveScreen->Height);
      sprintf(str2,"Fenêtre : (%ld,%ld)-(%ld,%ld)",
          IntuitionBase->ActiveWindow->LeftEdge,
          IntuitionBase->ActiveWindow->TopEdge,
          IntuitionBase->ActiveWindow->Width,
          IntuitionBase->ActiveWindow->Height);
      sprintf(str3,"Pixel   : S=(%ld,%ld) W=(%ld,%ld) C=%ld",
          IntuitionBase->ActiveScreen->MouseX,
          IntuitionBase->ActiveScreen->MouseY,
          IntuitionBase->ActiveWindow->MouseX,
          IntuitionBase->ActiveWindow->MouseY,
          ReadPixel(IntuitionBase->ActiveWindow->RPort,
                    IntuitionBase->ActiveWindow->MouseX,
                    IntuitionBase->ActiveWindow->MouseY));
      sprintf(str4,"          Dx=%ld,Dy=%ld",
          ABS(OldMouseX-IntuitionBase->ActiveWindow->MouseX),
          ABS(OldMouseY-IntuitionBase->ActiveWindow->MouseY));
      OldMouseX=IntuitionBase->ActiveWindow->MouseX;
      OldMouseY=IntuitionBase->ActiveWindow->MouseY;
      NewWindow.Screen=IntuitionBase->ActiveScreen;
      if(!(Window=(struct Window *)OpenWindow(&NewWindow))){
        DisplayBeep(NULL);
        CloseLibrary(IntuitionBase);
        CloseLibrary(GfxBase);
        Exit(5);
      }
      SetAPen(Window->RPort,1);
      PRINT(10,20,str1);
      PRINT(10,30,str2);
      PRINT(10,40,str3);
      PRINT(10,50,str4);
      Wait(1<<Window->UserPort->mp_SigBit);
      Message=(struct IntuiMessage *)GetMsg(Window->UserPort);
      if(Message){
        Class=Message->Class;
        switch(Class){
          case CLOSEWINDOW:
            CloseWindow(Window);
            DisplayBeep(NULL);
            CloseLibrary(IntuitionBase);
            CloseLibrary(GfxBase);
            Exit(0);
          case GADGETUP:
            CloseWindow(Window);
            break;
        } 
      }
    }
  }
  CloseLibrary(IntuitionBase);
  CloseLibrary(GfxBase);
  Exit(0);
}
TestMouse(){
  if((*Adresse & 64) != 64)
    return(1);
  return(-1);
}

/* Eof */
