/***************************************************************/
/* ReplaceGadgets...                                           */
/* If you want no drag bar, you need only to compile this with */
/* the -dNOBAR option                                          */
/* First assembly searcharrows.o with "asm searcharrows"       */
/* Then lc -O -v [-dNOBAR] -Lt+searcharrows.o replacegadgets   */
/* NOTE: stack size must be >10000 in order to compile!        */
/*                                                             */
/* ...Enjoy!                                                   */
/***************************************************************/



#define INTUITIONPRIVATE
#include <string.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <intuition/intuitionbase.h>
#include <exec/memory.h>
#include <exec/execbase.h>

#define BANNER "\n\x1b[1m\x1b[33mReplaceGadgets V1.21\x1b[0m - The System Gadget Improver\nŠ 1988 Sebastiano Vigna\n"

extern struct IntuitionBase *IntuitionBase;
extern struct ExecBase *SysBase;
#define ExecBase SysBase

extern USHORT *Search();

USHORT *HiResSizeGadgetImageData;

USHORT SearchPattern[8]={ 0xFFFF,
                          0xFC7F,
                          0xF1FF,
                          0xC7FF,
                          0xC003,
                          0xC7FF,
                          0xF1FF,
                          0xFC7F };



USHORT NewArrows[4][8]={ 0xFFFC,
                         0xFF3C,
                         0xFC04,
                         0xF004,
                         0xC004,
                         0xF004,
                         0xFC04,
                         0xFF3C,

                         0xFFF0,
                         0xE7F0,
                         0x01F0,
                         0x0070,
                         0x0010,
                         0x0070,
                         0x01F0,
                         0xE7F0,

                         0xFE7F,
                         0xF81F,
                         0xE007,
                         0x8001,
                         0xE007,
                         0xE007,
                         0x0000,
                         0x0000,

                         0xE007,
                         0xE007,
                         0x8001,
                         0xE007,
                         0xF81F,
                         0xFE7F,
                         0x0000,
                         0x0000  };



static USHORT HCloseGadgetData[40]={ 0xFFFF,0xFF00,
                                     0xF000,0x3F00,
                                     0xF3FF,0x3F00,
                                     0xF3FF,0x3F00,
                                     0xF3FF,0x3F00,
                                     0xF3FF,0x3F00,
                                     0xF3FF,0x3F00,
                                     0xF000,0x3F00,
                                     0xFFFF,0xFF00,
                                     0xFFFF,0xFF00,

                                     0x0000,0x0000,
                                     0x0FFF,0xC000,
                                     0x0FFF,0xC000,
                                     0x0FFF,0xC000,
                                     0x0FFF,0xC000,
                                     0x0FFF,0xC000,
                                     0x0FFF,0xC000,
                                     0x0FFF,0xC000,
                                     0x0000,0x0000,
                                     0x0000,0x0000 };



static USHORT HUpFrontGadgetData[40]={ 0xFFFF,0xFFFF,
                                       0xC000,0x7FFF,
                                       0xCFFE,0x7FFF,
                                       0xC800,0x0FFF,
                                       0xC9FF,0xCFFF,
                                       0xC9FF,0xCFFF,
                                       0xC1FF,0xCFFF,
                                       0xF9FF,0xCFFF,
                                       0xF800,0x0FFF,
                                       0xFFFF,0xFFFF,

                                       0x0000,0x0000,
                                       0x3FFF,0x8000,
                                       0x3FFF,0x8000,
                                       0x3FFF,0xF000,
                                       0x3E00,0x3000,
                                       0x3E00,0x3000,
                                       0x3E00,0x3000,
                                       0x0600,0x3000,
                                       0x07FF,0xF000,
                                       0x0000,0x0000  };



static USHORT HDownBackGadgetData[40]={ 0xFFFF,0xFFC0,
                                        0xFC00,0x07C0,
                                        0xFCFF,0xE7C0,
                                        0xFC80,0x00C0,
                                        0xFC9F,0xFCC0,
                                        0xFC9F,0xFCC0,
                                        0xFC1F,0xFCC0,
                                        0xFF9F,0xFCC0,
                                        0xFF80,0x00C0,
                                        0xFFFF,0xFFC0,

                                        0x0000,0x0000,
                                        0x03FF,0xF800,
                                        0x0300,0x1800,
                                        0x037F,0xFF00,
                                        0x037F,0xFF00,
                                        0x037F,0xFF00,
                                        0x03FF,0xFF00,
                                        0x007F,0xFF00,
                                        0x007F,0xFF00,
                                        0x0000,0x0000  };



static USHORT HSUpFrontGadgetData[40]={ 0xFFFF,0xFFFF,
                                        0xF000,0x1FFF,
                                        0xF3FF,0x9FFF,
                                        0xF200,0x03FF,
                                        0xF27F,0xF3FF,
                                        0xF27F,0xF3FF,
                                        0xF07F,0xF3FF,
                                        0xFE7F,0xF3FF,
                                        0xFE00,0x03FF,
                                        0xFFFF,0xFFFF,

                                        0x0000,0x0000,
                                        0x0FFF,0xE000,
                                        0x0FFF,0xE000,
                                        0x0FFF,0xFC00,
                                        0x0F80,0x0C00,
                                        0x0F80,0x0C00,
                                        0x0F80,0x0C00,
                                        0x0180,0x0C00,
                                        0x01FF,0xFC00,
                                        0x0000,0x0000  };



static USHORT HSDownBackGadgetData[40]={ 0xFFFF,0xFF00,
                                         0xF000,0x1F00,
                                         0xF3FF,0x9F00,
                                         0xF200,0x0300,
                                         0xF27F,0xF300,
                                         0xF27F,0xF300,
                                         0xF07F,0xF300,
                                         0xFE7F,0xF300,
                                         0xFE00,0x0300,
                                         0xFFFF,0xFF00,

                                         0x0000,0x0000,
                                         0x0FFF,0xE000,
                                         0x0C00,0x6000,
                                         0x0DFF,0xFC00,
                                         0x0DFF,0xFC00,
                                         0x0DFF,0xFC00,
                                         0x0FFF,0xFC00,
                                         0x01FF,0xFC00,
                                         0x01FF,0xFC00,
                                         0x0000,0x0000  };



static USHORT HSizeGadgetData[18]={ 0xFFFF,
                                    0xC03F,
                                    0xCF03,
                                    0xCF33,
                                    0xC033,
                                    0xF3F3,
                                    0xF3F3,
                                    0xF003,
                                    0xFFFF,

                                    0x0000,
                                    0x3FC0,
                                    0x3FFC,
                                    0x3FFC,
                                    0x3FFC,
                                    0x0FFC,
                                    0x0FFC,
                                    0x0FFC,
                                    0x0000  };




static USHORT LCloseGadgetData[20]={ 0xFFFC,
                                     0xFFFC,
                                     0xE03C,
                                     0xEFBC,
                                     0xEFBC,
                                     0xEFBC,
                                     0xEFBC,
                                     0xE03C,
                                     0xFFFC,
                                     0xFFFC,

                                     0x0000,
                                     0x0000,
                                     0x1FC0,
                                     0x1FC0,
                                     0x1FC0,
                                     0x1FC0,
                                     0x1FC0,
                                     0x1FC0,
                                     0x0000,
                                     0x0000 };



static USHORT LUpFrontGadgetData[40]={ 0xFFFF,0x8000,
                                       0x807F,0x8000,
                                       0xBF7F,0x8000,
                                       0xA01F,0x8000,
                                       0xAFDF,0x8000,
                                       0xAFDF,0x8000,
                                       0x8FDF,0x8000,
                                       0xEFDF,0x8000,
                                       0xE01F,0x8000,
                                       0xFFFF,0x8000,

                                       0x0000,0x0000,
                                       0x7F80,0x0000,
                                       0x7F80,0x0000,
                                       0x7FE0,0x0000,
                                       0x7020,0x0000,
                                       0x7020,0x0000,
                                       0x7020,0x0000,
                                       0x1020,0x0000,
                                       0x1FE0,0x0000,
                                       0x0000,0x0000  };



static USHORT LDownBackGadgetData[40]={ 0xFFFF,0x8000,
                                        0xFC03,0x8000,
                                        0xFDFB,0x8000,
                                        0xFD00,0x8000,
                                        0xFD7E,0x8000,
                                        0xFD7E,0x8000,
                                        0xFC7E,0x8000,
                                        0xFF7E,0x8000,
                                        0xFF00,0x8000,
                                        0xFFFF,0x8000,

                                        0x0000,0x0000,
                                        0x03FC,0x0000,
                                        0x0204,0x0000,
                                        0x02FF,0x0000,
                                        0x02FF,0x0000,
                                        0x02FF,0x0000,
                                        0x03FF,0x0000,
                                        0x00FF,0x0000,
                                        0x00FF,0x0000,
                                        0x0000,0x0000  };



static USHORT LSUpFrontGadgetData[40]={ 0xFFFF,0x8000,
                                        0x807F,0x8000,
                                        0xBF7F,0x8000,
                                        0xA01F,0x8000,
                                        0xAFDF,0x8000,
                                        0xAFDF,0x8000,
                                        0x8FDF,0x8000,
                                        0xEFDF,0x8000,
                                        0xE01F,0x8000,
                                        0xFFFF,0x8000,

                                        0x0000,0x0000,
                                        0x7F80,0x0000,
                                        0x7F80,0x0000,
                                        0x7FE0,0x0000,
                                        0x7020,0x0000,
                                        0x7020,0x0000,
                                        0x7020,0x0000,
                                        0x1020,0x0000,
                                        0x1FE0,0x0000,
                                        0x0000,0x0000  };



static USHORT LSDownBackGadgetData[40]={ 0xFFFF,0x8000,
                                         0xFC03,0x8000,
                                         0xFDFB,0x8000,
                                         0xFD00,0x8000,
                                         0xFD7E,0x8000,
                                         0xFD7E,0x8000,
                                         0xFC7E,0x8000,
                                         0xFF7E,0x8000,
                                         0xFF00,0x8000,
                                         0xFFFF,0x8000,

                                         0x0000,0x0000,
                                         0x03FC,0x0000,
                                         0x0204,0x0000,
                                         0x02FF,0x0000,
                                         0x02FF,0x0000,
                                         0x02FF,0x0000,
                                         0x03FF,0x0000,
                                         0x00FF,0x0000,
                                         0x00FF,0x0000,
                                         0x0000,0x0000  };



static USHORT LSizeGadgetData[20]={ 0xFFE0,
                                    0x83E0,
                                    0xB820,
                                    0xBBA0,
                                    0xBBA0,
                                    0x83A0,
                                    0xEFA0,
                                    0xEFA0,
                                    0xE020,
                                    0xFFE0,

                                    0x0000,
                                    0x7C00,
                                    0x7FC0,
                                    0x7FC0,
                                    0x7FC0,
                                    0x7FC0,
                                    0x1FC0,
                                    0x1FC0,
                                    0x1FC0,
                                    0x0000 };


void MemCleanup(void){}


void ChangeGadget(struct Gadget *g, USHORT Type) {

   struct Gadget *t;

   t=g->NextGadget;
   switch(g->GadgetType & 0x00F0) {
      case SIZING:      *g=*(IntuitionBase->SysGadgets[Type][SIZEGADGET]);
                        break;
      case WUPFRONT:    *g=*(IntuitionBase->SysGadgets[Type][UPFRONTGADGET]);
                        break;
      case WDOWNBACK:   *g=*(IntuitionBase->SysGadgets[Type][DOWNBACKGADGET]);
                        break;
      case CLOSE:       *g=*(IntuitionBase->SysGadgets[Type][CLOSEGADGET]);
                        break;
      case SUPFRONT:    *g=*(IntuitionBase->SysGadgets[Type][SUPFRONTGADGET]);
                        break;
      case SDOWNBACK:   *g=*(IntuitionBase->SysGadgets[Type][SDOWNBACKGADGET]);
                        break;
      default:          break;
   }

   g->NextGadget=t;
}


void ReplaceGadgets(struct Gadget *g,USHORT Type) {
   while(g) {
      if ( (((g->GadgetType & 0x00F0) >> 4)==1) ||
           (((g->GadgetType & 0x00F0) >> 4)>3) )
         ChangeGadget(g,Type);
      g=g->NextGadget;
   }
}



void _main(char *l) {

   register int i;
   register USHORT *p;
   register struct Screen *s;
   register struct Window *w;
   register struct Gadget *(*SysGadgets)[GADGETCOUNT];
   USHORT Type;

   Write(Output(),BANNER,strlen(BANNER));

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

   if ((HiResSizeGadgetImageData=(USHORT *)AllocMem(36,MEMF_CHIP|MEMF_CLEAR))==NULL) {
      CloseLibrary((struct Library *)IntuitionBase);
      return;
   }

   Forbid();

   SysGadgets=IntuitionBase->SysGadgets;

   CopyMem((char *)HUpFrontGadgetData,(char *)((struct Image *)SysGadgets[HIRESGADGET][UPFRONTGADGET]->GadgetRender)->ImageData,40*sizeof(USHORT));
   CopyMem((char *)HDownBackGadgetData,(char *)((struct Image *)SysGadgets[HIRESGADGET][DOWNBACKGADGET]->GadgetRender)->ImageData,40*sizeof(USHORT));
   CopyMem((char *)HCloseGadgetData,(char *)((struct Image *)SysGadgets[HIRESGADGET][CLOSEGADGET]->GadgetRender)->ImageData,40*sizeof(USHORT));
   CopyMem((char *)HSUpFrontGadgetData,(char *)((struct Image *)SysGadgets[HIRESGADGET][SUPFRONTGADGET]->GadgetRender)->ImageData,40*sizeof(USHORT));
   CopyMem((char *)HSDownBackGadgetData,(char *)((struct Image *)SysGadgets[HIRESGADGET][SDOWNBACKGADGET]->GadgetRender)->ImageData,40*sizeof(USHORT));
   CopyMem((char *)HSizeGadgetData,(char *)HiResSizeGadgetImageData,18*sizeof(USHORT));

   CopyMem((char *)LUpFrontGadgetData,(char *)((struct Image *)SysGadgets[LOWRESGADGET][UPFRONTGADGET]->GadgetRender)->ImageData,40*sizeof(USHORT));
   CopyMem((char *)LDownBackGadgetData,(char *)((struct Image *)SysGadgets[LOWRESGADGET][DOWNBACKGADGET]->GadgetRender)->ImageData,40*sizeof(USHORT));
   CopyMem((char *)LCloseGadgetData,(char *)((struct Image *)SysGadgets[LOWRESGADGET][CLOSEGADGET]->GadgetRender)->ImageData,20*sizeof(USHORT));
   CopyMem((char *)LSUpFrontGadgetData,(char *)((struct Image *)SysGadgets[LOWRESGADGET][SUPFRONTGADGET]->GadgetRender)->ImageData,40*sizeof(USHORT));
   CopyMem((char *)LSDownBackGadgetData,(char *)((struct Image *)SysGadgets[LOWRESGADGET][SDOWNBACKGADGET]->GadgetRender)->ImageData,40*sizeof(USHORT));
   CopyMem((char *)LSizeGadgetData,(char *)((struct Image *)SysGadgets[LOWRESGADGET][SIZEGADGET]->GadgetRender)->ImageData,20*sizeof(USHORT));

   ((struct Image *)SysGadgets[HIRESGADGET][SIZEGADGET]->GadgetRender)->ImageData=HiResSizeGadgetImageData;

   SysGadgets[HIRESGADGET][CLOSEGADGET]->LeftEdge=7;
   SysGadgets[HIRESGADGET][CLOSEGADGET]->TopEdge=1;
   SysGadgets[HIRESGADGET][CLOSEGADGET]->Width=14;
   SysGadgets[HIRESGADGET][CLOSEGADGET]->Height=7;

   SysGadgets[HIRESGADGET][UPFRONTGADGET]->LeftEdge=-27;
   SysGadgets[HIRESGADGET][UPFRONTGADGET]->Width=22;

   SysGadgets[HIRESGADGET][DOWNBACKGADGET]->LeftEdge=-49;
   SysGadgets[HIRESGADGET][DOWNBACKGADGET]->Width=22;

   SysGadgets[HIRESGADGET][SDOWNBACKGADGET]->Width=26;

   SysGadgets[LOWRESGADGET][CLOSEGADGET]->LeftEdge=3;
   SysGadgets[LOWRESGADGET][CLOSEGADGET]->TopEdge=2;
   SysGadgets[LOWRESGADGET][CLOSEGADGET]->Width=7;
   SysGadgets[LOWRESGADGET][CLOSEGADGET]->Height=6;

   SysGadgets[LOWRESGADGET][UPFRONTGADGET]->LeftEdge=-16;
   SysGadgets[LOWRESGADGET][UPFRONTGADGET]->Width=12;

   SysGadgets[LOWRESGADGET][DOWNBACKGADGET]->LeftEdge=-28;
   SysGadgets[LOWRESGADGET][DOWNBACKGADGET]->Width=12;

   SysGadgets[LOWRESGADGET][SUPFRONTGADGET]->LeftEdge=-16;
   SysGadgets[LOWRESGADGET][SUPFRONTGADGET]->Width=12;

   SysGadgets[LOWRESGADGET][SDOWNBACKGADGET]->LeftEdge=-28;
   SysGadgets[LOWRESGADGET][SDOWNBACKGADGET]->Width=12;

   ((struct Image *)SysGadgets[HIRESGADGET][UPFRONTGADGET]->GadgetRender)->LeftEdge=0;
   ((struct Image *)SysGadgets[HIRESGADGET][DOWNBACKGADGET]->GadgetRender)->LeftEdge=-4;
   ((struct Image *)SysGadgets[HIRESGADGET][DOWNBACKGADGET]->GadgetRender)->Width=26;
   ((struct Image *)SysGadgets[HIRESGADGET][UPFRONTGADGET]->GadgetRender)->Width=28;

   ((struct Image *)SysGadgets[HIRESGADGET][SIZEGADGET]->GadgetRender)->PlanePick=3;
   ((struct Image *)SysGadgets[HIRESGADGET][SIZEGADGET]->GadgetRender)->Depth=2;

   ((struct Image *)SysGadgets[HIRESGADGET][CLOSEGADGET]->GadgetRender)->LeftEdge=-4;
   ((struct Image *)SysGadgets[HIRESGADGET][CLOSEGADGET]->GadgetRender)->TopEdge=-1;
   ((struct Image *)SysGadgets[HIRESGADGET][CLOSEGADGET]->GadgetRender)->Width=24;
   ((struct Image *)SysGadgets[HIRESGADGET][CLOSEGADGET]->GadgetRender)->Height=10;

   ((struct Image *)SysGadgets[LOWRESGADGET][CLOSEGADGET]->GadgetRender)->LeftEdge=-3;
   ((struct Image *)SysGadgets[LOWRESGADGET][CLOSEGADGET]->GadgetRender)->TopEdge=-2;

   ((struct Image *)SysGadgets[LOWRESGADGET][DOWNBACKGADGET]->GadgetRender)->LeftEdge=-5;

   ((struct Image *)SysGadgets[LOWRESGADGET][SDOWNBACKGADGET]->GadgetRender)->LeftEdge=-5;

#if defined(NOBAR)
   for(i=0; i<8; i++) IntuitionBase->apattern[i]=0;
#else
   for(i=0; i<8; i++) IntuitionBase->apattern[i]=0xFFFF*(i%2);
#endif

   if (p=Search()) CopyMem((char *)NewArrows,(char *)p,32*sizeof(USHORT));

   s=IntuitionBase->FirstScreen;
   while(s) {
      if (s->ViewPort.Modes & HIRES) Type=HIRESGADGET; else Type=LOWRESGADGET;
      ReplaceGadgets(s->FirstGadget,Type);
      w=s->FirstWindow;
      while(w) {
            ReplaceGadgets(w->FirstGadget,Type);
            w=w->NextWindow;
      }
      s=s->NextScreen;
   }

   CloseLibrary((struct Library *)IntuitionBase);


   Permit();
   return;
}
