home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
354.lha
/
SmartIcon_v2.0
/
src
/
patch.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-02-27
|
4KB
|
166 lines
#include <intuition/intuisup.h>
#include <intuition/intuitionbase.h>
#include "patch.h"
extern USHORT GadgetsData[];
extern struct WindowPatch PList;
extern struct IntuitionBase *IntuitionBase;
extern struct MsgPort *DefaultPort;
/* Global Read-Only data */
struct Image GadgetsImage = { -1,0, 50,10, 2, GadgetsData, 0x3,0x0, NULL };
struct Gadget NewGadgets[NEWGADGETS] =
{
{ NULL, -36,0, 15,10, GRELRIGHT, RELVERIFY, BOOLGADGET,
NULL, NULL, NULL, NULL, NULL, ICONGADGET, NULL },
{ NULL, -19,0, 14,10, GRELRIGHT, RELVERIFY, SYSGADGET | WUPFRONT,
NULL, NULL, NULL, NULL, NULL, 0, NULL },
{ NULL, -51,0, 14,10, GADGIMAGE | GRELRIGHT, RELVERIFY, SYSGADGET | WDOWNBACK,
(APTR)&GadgetsImage, NULL, NULL, NULL, NULL, 0, NULL },
};
struct WindowPatch
*AddPatch()
{
register struct WindowPatch *patch;
if (patch = New(struct WindowPatch, 1))
{
patch->NextPatch = PList.NextPatch;
PList.NextPatch = patch;
return(patch);
}
return(NULL);
}
VOID
RemovePatch(patch)
register struct WindowPatch *patch;
{
register struct WindowPatch *p = PList.NextPatch, *previous = NULL;
#ifdef DEBUG
printf("removing patch [%s], ", patch->Window->Title);
#endif
while(p != patch) { previous = p; p = p->NextPatch; }
if (previous) previous->NextPatch = patch->NextPatch;
else PList.NextPatch = patch->NextPatch;
CheckDelete(patch, 1);
}
struct WindowPatch
*FindWPatch(window)
register struct Window *window;
{
register struct WindowPatch *p = PList.NextPatch;
while (p)
{
if (p->Window == window) return(p);
p = p->NextPatch;
}
return(NULL);
}
VOID
UnPatchWindow(patch, refresh)
register struct WindowPatch *patch;
register BOOL refresh;
{
register struct Window *w = patch->Window;
#ifdef DEBUG
printf("unpatching window [%s]: ", w->Title);
#endif
RemoveGList(w, patch->Gadgets, NEWGADGETS);
if (patch->BackGadget && patch->FrontGadget)
{
#ifdef DEBUG
printf("restoring depth, ");
#endif
AddGadget(w, patch->FrontGadget, 0);
if (refresh) RefreshGList(patch->FrontGadget, w, NULL, 1);
AddGadget(w, patch->BackGadget, 0);
if (refresh) RefreshGList(patch->BackGadget, w, NULL, 1);
}
if (w->UserPort==DefaultPort) w->UserPort = NULL;
RemovePatch(patch);
#ifdef DEBUG
printf("done\n");
#endif
}
VOID
PatchWindow(window)
register struct Window *window;
{
register USHORT i;
register struct Gadget *g;
register struct WindowPatch *patch = AddPatch();
#ifdef DEBUG
printf("patching window [%s]: ", window->Title);
#endif
if (patch)
{
patch->Window = window;
CopyMemQuick(NewGadgets, patch->Gadgets, NEWGADGETS*sizeof(struct Gadget));
for(i=0; i<NEWGADGETS; i++)
{
patch->Gadgets[i].NextGadget = &patch->Gadgets[i+1];
if (window->Flags & GIMMEZEROZERO) patch->Gadgets[i].GadgetType |= GZZGADGET;
}
patch->Gadgets[NEWGADGETS-1].NextGadget = NULL;
for(g=window->FirstGadget; g; g=g->NextGadget)
{
if ((g->GadgetType & SYSGADGET) && (g->GadgetType &~GADGETTYPE)==WDOWNBACK) patch->BackGadget = g;
if ((g->GadgetType & SYSGADGET) && (g->GadgetType &~GADGETTYPE)==WUPFRONT) patch->FrontGadget = g;
}
if (patch->BackGadget && patch->FrontGadget)
{
#ifdef DEBUG
printf("adding depth, ");
#endif
RemoveGadget(window, patch->BackGadget);
RemoveGadget(window, patch->FrontGadget);
AddGList(window, patch->Gadgets, 0, NEWGADGETS, NULL);
RefreshGList(patch->Gadgets, window, NULL, NEWGADGETS);
/* This window has no port: let's give it one, */
/* otherwise Intuition wont send msgs to it. */
if (!window->UserPort) window->UserPort = DefaultPort;
/* Add GADGETUP/GADGETDOWN to the window IDCMPs */
/* trough our patched version of ModifyIDCMP(). */
ModifyIDCMP(window, window->IDCMPFlags);
}
}
#ifdef DEBUG
printf("done\n");
#endif
}
VOID
PatchCurrentWindows()
{
register struct Screen *screen = IntuitionBase->FirstScreen;
register struct Window *window;
while (screen)
{
for(window=screen->FirstWindow; window; window=window->NextWindow) PatchWindow(window);
screen = screen->NextScreen;
}
}