home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d3xx
/
d326
/
snap.lha
/
Snap
/
source
/
windows.c
< prev
Wrap
C/C++ Source or Header
|
1990-03-05
|
11KB
|
484 lines
/* Auto: make
*/
IMPORT struct ArpBase *ArpBase;
struct Window *ControlWindow = NULL;
IMPORT struct MsgPort *Sharedport;
IMPORT WORD Sharedrefs;
IMPORT LONG TitleBarHeight;
IMPORT LONG ContentsFontHeight;
IMPORT struct RastPort MyRP;
#define IDCMPFLAGS (MOUSEMOVE|NEWSIZE|CLOSEWINDOW|GADGETUP|ACTIVEWINDOW|INACTIVEWINDOW|MOUSEBUTTONS)
UBYTE *WindowTitle = (UBYTE *)"Snap (c) 1989 Mikael Karlsson";
struct Image DiskImage = {
0, -1,
16, 8, 1,
NULL,
0x01, 0x00,
NULL
};
struct Gadget DiskGad = {
NULL,
0, 1,
16, 8,
GADGIMAGE|GADGHCOMP|GRELRIGHT,
RELVERIFY,
BOOLGADGET,
(APTR)&DiskImage,
NULL,
NULL,
0L,
NULL,
DISKGAD,
NULL,
};
struct Gadget VProp = {
NULL,
-15, 10,
16, -10,
GADGHCOMP|GRELRIGHT|GRELHEIGHT,
GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY,
PROPGADGET,
NULL,
NULL,
NULL,
0L,
NULL,
VPROP,
NULL
};
struct Gadget HProp = {
NULL,
1, -8,
-15, 9,
GADGHCOMP|GRELBOTTOM|GRELWIDTH,
GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY,
PROPGADGET,
NULL,
NULL,
NULL,
0L,
NULL,
HPROP,
NULL
};
struct PropInfo VInfo = {
AUTOKNOB|FREEVERT,
0, 0,
MAXBODY, MAXBODY,
0, 0, 0, 0, 0, 0
};
struct PropInfo HInfo = {
AUTOKNOB|FREEHORIZ,
0, 0,
MAXBODY, MAXBODY,
0, 0, 0, 0, 0, 0
};
struct Image VImage = {
0, 0, 0, 0, 0, NULL, 0, 0, NULL
};
struct Image HImage = {
0, 0, 0, 0, 0, NULL, 0, 0, NULL
};
/* Window structure for snapped gfx */
struct NewWindow Nw = {
0, 1, /* LeftEdge, TopEdge */
0, 0, /* Width, Height */
-1, -1, /* DetailPen, BlockPen */
NULL, /* IDCMPFlags */
WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|WINDOWSIZING|SMART_REFRESH|NOCAREREFRESH|RMBTRAP,
NULL, NULL, /* FirstGadget, CheckMark */
NULL,
NULL, NULL, /* Screen, BitMap */
32, 32, /* MinWidth, MinHeight */
0, 0, /* MaxWidth, MaxHeight */
WBENCHSCREEN /* Type */
};
SHORT Coords3[5][2] = {
{ 0, 0},
{ 74, 0},
{ 74, 10},
{ 0, 10},
{ 0, 0}
};
SHORT Coords2[5][2] = {
{ 0, 0},
{ 74, 0},
{ 74, 10},
{ 0, 10},
{ 0, 0}
};
SHORT Coords1[5][2] = {
{ 0, 0},
{ 34, 0},
{ 34, 10},
{ 0, 10},
{ 0, 0}
};
struct Border Border3 = {
42, 0,
1, 0,
JAM1,
5,
(SHORT *)&Coords3,
NULL
};
struct Border Border2 = {
42, 0,
1, 0,
JAM1,
5,
(SHORT *)&Coords2,
&Border3
};
struct Border Border1 = {
4, 0,
1, 0,
JAM1,
5,
(SHORT *)&Coords1,
&Border2
};
UBYTE TranspBuf[5];
struct StringInfo TranspSI = {
TranspBuf, /* Buf */
NULL, /* UndoBuf */
0, /* BufferPos */
4, /* MaxChars */
0, /* DispPos */
0, /* UndoPos */
0, /* NumChars */
0, /* DispCount */
0, 0, /* CLeft, CTop */
NULL, /* Layer */
0L, /* LongInt */
NULL /* AltKeyMap */
};
struct Gadget TranspGad = {
NULL,
5, 16,
32, 8,
LONGINT,
RELVERIFY,
STRGADGET,
NULL,
NULL,
NULL,
0L,
(APTR)&TranspSI,
0,
NULL,
};
UBYTE SaveName[256] = "";
UBYTE SaveDirName[256] = "";
struct StringInfo NameSI = {
SaveName, /* Buf */
NULL, /* UndoBuf */
0, /* BufferPos */
255, /* MaxChars */
0, /* DispPos */
0, /* UndoPos */
0, /* NumChars */
0, /* DispCount */
0, 0, /* CLeft, CTop */
NULL, /* Layer */
0L, /* LongInt */
NULL /* AltKeyMap */
};
struct Gadget NameGad = {
&TranspGad,
5, 16,
32, 8,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
0L,
NULL,
NAMEGAD,
NULL,
};
struct Gadget SaveGad = {
&NameGad,
5, 16,
32, 8,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
NULL,
NULL,
NULL,
0L,
NULL,
SAVEGAD,
NULL,
};
/* Window structure for control window */
struct NewWindow NewCW = {
10, 10, /* LeftEdge, TopEdge */
320, 40, /* Width, Height */
-1, -1, /* DetailPen, BlockPen */
NULL, /* IDCMPFlags */
WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|SMART_REFRESH|ACTIVATE|NOCAREREFRESH,
NULL, NULL, /* FirstGadget, CheckMark */
(UBYTE *)"Snap Control Window",
NULL, NULL, /* Screen, BitMap */
32, 32, /* MinWidth, MinHeight */
-1, -1, /* MaxWidth, MaxHeight */
WBENCHSCREEN /* Type */
};
struct FileRequester NameFR = {
"Save picture as...",
(BYTE *)SaveName,
(BYTE *)SaveDirName,
NULL,
NULL,
NULL,
NULL,
NULL
};
struct Window *opensharedwindow(nw)
struct NewWindow *nw;
{
struct Window *win;
struct Screen scr;
if (Sharedport) {
nw->IDCMPFlags = NULL;
} else {
nw->IDCMPFlags = IDCMPFLAGS;
}
if (!GetScreenData((char *)&scr, (LONG)sizeof(struct Screen),
WBENCHSCREEN, NULL)) {
return NULL; /* No WB */
}
if (nw->TopEdge+nw->Height > scr.Height) {
nw->TopEdge = scr.Height-nw->Height;
}
if (nw->LeftEdge+nw->Width > scr.Width) {
nw->LeftEdge = scr.Width-nw->Width;
}
if (nw->TopEdge < 0) {
nw->TopEdge = 0;
}
if (nw->LeftEdge < 0) {
nw->LeftEdge = 0;
}
if (nw->TopEdge+nw->Height > scr.Height) {
nw->Height = scr.Height-nw->TopEdge;
}
if (nw->LeftEdge+nw->Width > scr.Width) {
nw->Width = scr.Width-nw->LeftEdge;
}
if (win = OpenWindow(nw)) {
if (Sharedport) {
win->UserPort = Sharedport;
ModifyIDCMP(win, IDCMPFLAGS);
} else {
Sharedport = win->UserPort;
}
++Sharedrefs;
}
return(win);
}
VOID closesharedwindow(win)
struct Window *win;
{
Forbid();
Sharedrefs--;
if (Sharedrefs > 0) {
REGISTER struct IntuiMessage *im, *succ;
im = (struct IntuiMessage *)win->UserPort->mp_MsgList.lh_Head;
while (succ = (struct IntuiMessage *)im->ExecMessage.mn_Node.ln_Succ) {
if (im->IDCMPWindow == win) {
Remove(im);
ReplyMsg(im);
}
im = succ;
}
win->UserPort = NULL;
ModifyIDCMP(win, MENUVERIFY); /* NEVER occurs */
} else
Sharedport = NULL;
Permit();
CloseWindow(win);
}
VOID SetUpBorder(Border, Gad)
struct Border *Border;
struct Gadget *Gad;
{
Border->LeftEdge = Gad->LeftEdge-1;
Border->TopEdge = Gad->TopEdge-1;
Border->XY[2] = Border->XY[4] = Gad->Width+1;
Border->XY[5] = Border->XY[7] = Gad->Height+1;
}
VOID AdjustSize(GS)
struct GfxSnap *GS;
{
ULONG w = GS->window->Width - 18;
ULONG h = GS->window->Height - GS->VProp.TopEdge - 9;
ULONG vb, hb;
vb = hb = MAXBODY;
if (w < GS->width) {
hb = w * (ULONG)MAXBODY / GS->width;
}
if (h < GS->height) {
vb = h * (ULONG)MAXBODY / GS->height;
}
NewModifyProp(&GS->VProp, GS->window, NULL, (ULONG)AUTOKNOB|FREEVERT,
0L, 0L, (ULONG)MAXBODY, vb, 1L);
NewModifyProp(&GS->HProp, GS->window, NULL, (ULONG)AUTOKNOB|FREEHORIZ,
0L, 0L, hb, (ULONG)MAXBODY, 1L);
InitRastPort(&MyRP);
MyRP.BitMap = &GS->BM;
ClipBlit(&MyRP, 0L, 0L, GS->window->RPort,
2L, (LONG)GS->VProp.TopEdge, w, h, 0xC0L);
}
VOID SyncGS(GS)
struct GfxSnap *GS;
{
ULONG w = GS->window->Width - 18;
ULONG h = GS->window->Height - GS->VProp.TopEdge - 9;
ULONG vpos, hpos;
LONG temp;
temp = GS->width - w;
if (temp <= 0) {
hpos = 0;
} else {
hpos = temp * (LONG)GS->HInfo.HorizPot / MAXBODY;
if (hpos > temp) {
hpos = temp;
}
}
temp = GS->height - h;
if (temp <= 0) {
vpos = 0;
} else {
vpos = temp * (LONG)GS->VInfo.VertPot / MAXBODY;
if (vpos > temp) {
vpos = temp;
}
}
InitRastPort(&MyRP);
MyRP.BitMap = &GS->BM;
ClipBlit(&MyRP, hpos, vpos, GS->window->RPort,
2L, (LONG)GS->VProp.TopEdge, w, h, 0xC0L);
}
SHORT OpenCW()
{
WORD temp;
FixHeights();
NewCW.Height = TitleBarHeight + ContentsFontHeight * 2 + 12;
ControlWindow = opensharedwindow(&NewCW);
if (!ControlWindow) {
return 0;
}
SaveGad.TopEdge = NameGad.TopEdge = TitleBarHeight + 2;
SaveGad.Height = NameGad.Height = TranspGad.Height = ContentsFontHeight+2;
TranspGad.TopEdge = SaveGad.TopEdge + SaveGad.Height + 3;
SaveGad.LeftEdge = 4L;
SaveGad.Width = TextLength(ControlWindow->RPort, "Save", 4L) + 1;
if (Sharedrefs == 1) { /* No snap window, just control window? */
SaveGad.Flags |= GADGDISABLED;
} else {
SaveGad.Flags &= ~GADGDISABLED;
}
NameGad.LeftEdge = SaveGad.LeftEdge +
TextLength(ControlWindow->RPort, "Save as ", 8L);
temp = ControlWindow->Width - 4 - NameGad.LeftEdge;
NameGad.Width =
temp - (temp % TextLength(ControlWindow->RPort, " ", 1L)) + 1;
TranspGad.LeftEdge = SaveGad.LeftEdge +
TextLength(ControlWindow->RPort, "Transparent color ", 18L);
TranspGad.Width = TextLength(ControlWindow->RPort, "0000", 4L);
SetUpBorder(&Border1, &SaveGad);
SetUpBorder(&Border2, &NameGad);
SetUpBorder(&Border3, &TranspGad);
++TranspGad.LeftEdge;
++TranspGad.TopEdge;
if (ArpBase) {
NameGad.Flags = GADGHCOMP;
NameGad.Activation = RELVERIFY;
NameGad.GadgetType = BOOLGADGET;
NameGad.SpecialInfo = NULL;
} else {
NameGad.Flags = SELECTED;
NameGad.Activation = NULL;
NameGad.GadgetType = STRGADGET;
NameGad.SpecialInfo = (APTR)&NameSI;
++NameGad.LeftEdge; /* Adjust string gadget position */
++NameGad.TopEdge; /* Adjust string gadget position */
}
strcpy(SaveName, "Snap.pic");
strcpy(TranspBuf, "0");
TranspSI.LongInt = 0L;
SetAPen(ControlWindow->RPort, 1L);
SetBPen(ControlWindow->RPort, 0L);
SetDrMd(ControlWindow->RPort, JAM2);
Move(ControlWindow->RPort,
5L, (LONG)SaveGad.TopEdge + 1 + ControlWindow->RPort->Font->tf_Baseline);
Text(ControlWindow->RPort, "Save as", 7L);
Move(ControlWindow->RPort,
5L, (LONG)TranspGad.TopEdge + ControlWindow->RPort->Font->tf_Baseline);
Text(ControlWindow->RPort, "Transparent color", 17L);
DrawBorder(ControlWindow->RPort, &Border1, 0L, 0L);
AddGList(ControlWindow, &SaveGad, -1L, 3L, NULL);
RefreshGList(&SaveGad, ControlWindow, NULL, 3L);
if (ArpBase) {
GadText(&NameGad, SaveName, 8L);
} else {
ActivateGadget(&NameGad, ControlWindow, NULL);
}
return 1;
}