home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d01xx
/
d0151.lha
/
Surveyor
/
surveyor.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-06-15
|
7KB
|
256 lines
/* char *Cr="Surveyor 1.0 13 April 1988 by Dirk Reisig\n"; */
/* Surveyor displays the pointer position relative to the screens
* upperleftmost and to a free postionable point and it shows the
* color the pointer is on. It does it on all intuition screens
* that are frontmost. (and somtimes trashing them).
*
* This program may be freely distributed.
*/
#include "exec/types.h"
#include "intuition/intuition.h"
#include "intuition/intuitionbase.h"
#include "graphics/rastport.h"
#define HWEXTRA 8
#define VWEXTRA 4
#define MOUSESPEED 4
#define IB IntuitionBase
/* I tried a higher value (8) for the mouse speed. It resulted in a
* very strange behavior. The pointer was attracted by the
* lower right corner. A interference problem?
*/
typedef struct mousepointerdescriptor{
USHORT *Pointer;
int Height, Width, XOffset, YOffset;
} MousePtr;
extern void PutWindowAway(), ChangePrefs(), ChangePointer();
extern char *RAdCi_d();
extern struct Window *OpenWindow();
extern short EmptyData[], CrossData[];
extern struct IntuiMessage *GetMsg();
struct IB *IB;
struct Window *W;
MousePtr Empty={ EmptyData, 0, 0, 0, 0 };
MousePtr Cross={ CrossData,15,15,-8,-7 };
char TxAbs[]="A ";
char TxRel[]="R ";
char TxCol[]="Color ";
char TxWTtl[]="Q X Y";
struct IntuiText ITAbs={ 1,0,JAM2,HWEXTRA/2,0,0,TxAbs, 0 };
struct IntuiText ITRel={ 1,0,JAM2,HWEXTRA/2,0,0,TxRel,&ITAbs };
struct IntuiText ITCol={ 1,0,JAM2,HWEXTRA/2,0,0,TxCol,&ITRel };
struct IntuiText ITWTtl={ 1,0,JAM2,0,0,0,TxWTtl,0 };
struct Gadget GClose={
0,0,0,0,10,GADGHCOMP,TOGGLESELECT,BOOLGADGET,0,0,0,0,0,0,0
};
struct NewWindow NW={
0,0,0,0,-1,-1,
MOUSEBUTTONS,
WINDOWDRAG | NOCAREREFRESH | RMBTRAP ,
0,0,TxWTtl,0,0,0,0,0,0,0
};
_main()
{
register short NowX, NowY, DynaCol, StatX, StatY, DynaX, DynaY;
short StatCol, MouseButton;
short PrintX=-1, PrintY=-1, PrintCol=-1, PrintStat=-1;
short Cycle=0, DisplayDots=0, WP=0;
register struct Screen *FS=0;
register struct IntuiMessage *Mesg; /* No register as promised */
if (!(IB=(struct IB *)OpenLibrary("intuition.library",0))) return(0);
while (1){
if (FS!=IB->FirstScreen){
Forbid();
FS=IB->FirstScreen;
if (!GetNewWindow(FS)) break;
Permit();
StatX=0; StatY=0;
DisplayDots=0;
ChangePrefs(0);
}
if (IB->FirstScreen->LayerInfo.top_layer!=W->WLayer){
Forbid(); /* Our window is not firstmost */
if (FS==IB->FirstScreen) WindowToFront(W);
Permit();
}
NowX=FS->MouseX; NowY=FS->MouseY;
MouseButton=0;
if (Mesg=GetMsg(W->UserPort)){
if (Mesg->Class==MOUSEBUTTONS) MouseButton=Mesg->Code;
ReplyMsg(Mesg);
}
if (MouseButton==MENUDOWN){ /* From spritepointer to dot? */
DynaCol=GetDotColor(NowX,NowY);
StatCol=GetDotColor(StatX,StatY);
DynaX=NowX; DynaY=NowY;
ChangePrefs(1);
DisplayDots=1;
}
if (DisplayDots){
if (MouseButton==SELECTDOWN){ /* Replace relative point? */
SetDotColor(StatX,StatY,StatCol);
StatX=NowX; StatY=NowY;
StatCol=DynaCol;
PrintStat=1;
}
if ((NowX!=DynaX)||(NowY!=DynaY)){ /* Pointer moved? */
SetDotColor(DynaX,DynaY,DynaCol);
DynaX=NowX; DynaY=NowY;
DynaCol=GetDotColor(DynaX,DynaY);
}
/* (++Cycle)%=(1<<FS->BitMap.Depth); should be, but is inherent */
++Cycle;
SetDotColor(DynaX,DynaY,Cycle);
SetDotColor(StatX,StatY,Cycle);
if (MouseButton==MENUUP){ /* Back to spritepointer? */
SetDotColor(DynaX,DynaY,DynaCol);
SetDotColor(StatX,StatY,StatCol);
ChangePrefs(0);
DisplayDots=0;
}
} else{ /* !DisplayDots */
DynaCol=GetDotColor(NowX,NowY); /* Did color change under pointer? */
if ((W->Flags&WINDOWACTIVE)&&!WP){
ChangePointer(&Cross);
WP=1;
} else WP=0;
if (GClose.Flags&SELECTED) break;
} /* DisplayDots */
if ((NowX!=PrintX)||(NowY!=PrintY)||(DynaCol!=PrintCol)||PrintStat){
PrintX=NowX; PrintY=NowY; PrintCol=DynaCol; PrintStat=0;
strcpy(&TxCol[7],RAdCi_d(4,DynaCol));
strcpy(&TxRel[2],RAdCi_d(4,NowX-StatX));
strcpy(&TxRel[6],RAdCi_d(5,NowY-StatY));
strcpy(&TxAbs[2],RAdCi_d(4,NowX));
strcpy(&TxAbs[6],RAdCi_d(5,NowY));
Forbid();
if (FS==IB->FirstScreen) PrintIText(W->RPort,&ITCol,0,0);
Permit();
}
/* Most of the time, this program blocks intuition. So give the
* system some more time by delaying this loop. That even increases
* this programs performance. Isn't that peculiar?
*/
Delay(1);
}
ChangePrefs(0);
if (W) PutWindowAway(W);
CloseLibrary(IB);
return(0);
}
GetNewWindow(FS)
register struct Screen *FS;
{
static short VFact=0, HFact=0;
register short TxLen_d;
if (W){
NW.LeftEdge=W->LeftEdge<<HFact; /* scale from */
NW.TopEdge=W->TopEdge<<VFact;
PutWindowAway(W);
}
ITAbs.TopEdge=1*FS->Font->ta_YSize+((VWEXTRA*3)/4); /* set text pos's */
ITRel.TopEdge=2*FS->Font->ta_YSize+((VWEXTRA*3)/4);
ITCol.TopEdge=3*FS->Font->ta_YSize+((VWEXTRA*3)/4);
ITWTtl.ITextFont=FS->Font;
TxLen_d=IntuiTextLength(&ITWTtl);
GClose.Width=TxLen_d/11+(HWEXTRA/2);
NW.LeftEdge>>=HFact=(FS->ViewPort.Modes&HIRES)?0:1; /* scale to */
NW.TopEdge>>= VFact=(FS->ViewPort.Modes&LACE)?0:1;
NW.Width=TxLen_d+HWEXTRA;
NW.Height=4*FS->Font->ta_YSize+VWEXTRA;
NW.Screen=FS;
NW.Type=FS->Flags&SCREENTYPE;
while ((NW.LeftEdge+NW.Width)>FS->Width) --NW.LeftEdge; /* inside screen? */
while ((NW.TopEdge+NW.Height)>FS->Height) --NW.TopEdge;
if (W=(struct Window *)OpenWindow(&NW)) AddGadget(W,&GClose,0);
return(W);
}
/*
* We donot want to close a window on a non existing screen, do we?
*/
void PutWindowAway(window)
register struct Window *window;
{
extern struct IntuitionBase *IntuitionBase;
register struct Screen *S;
for (S=IntuitionBase->FirstScreen;S;S=S->NextScreen){
if (S==window->WScreen){
CloseWindow(window);
break;
}
}
}
/*
* Here we change the pointer speed. And the pointer.
*/
void ChangePrefs(yn)
short yn;
{
static short ItsSpeed;
struct Preferences Prefs;
Forbid();
if (yn){
ChangePointer(&Empty);
GetPrefs(&Prefs,sizeof(struct Preferences));
ItsSpeed=Prefs.PointerTicks;
Prefs.PointerTicks=MOUSESPEED;
SetPrefs(&Prefs,sizeof(struct Preferences),FALSE);
} else{
ChangePointer(&Cross);
GetPrefs(&Prefs,sizeof(struct Preferences));
if (Prefs.PointerTicks==MOUSESPEED){
Prefs.PointerTicks=ItsSpeed;
SetPrefs(&Prefs,sizeof(struct Preferences),FALSE);
} else ItsSpeed=Prefs.PointerTicks;
}
Permit();
}
/*
* Some simple formatting routine ( return ("%<size>d",number)
*/
char *RAdCi_d(size,number)
{
static char buffer[32];
register short i;
for (i=0;i<32;++i) buffer[i]=' ';
return(&buffer[15-size+stci_d(&buffer[15],number)]);
}
void MemCleanup(){} /* This really cleans up a lot! */
/*
* Some trivial function, but saving code. It is possible to pass a
* structure. Why not use it once? It shurely will produce a warning!
*/
void ChangePointer(Ptr)
MousePtr *Ptr;
{
SetPointer(W,*Ptr);
}