
/*
    This little utility was written by the German Softcracking Group 9
    and intentionally left in the PUBLIC DOMAIN.

   Feel free to copy the program and this Lattice-C source file, but
   keep the name of the autor in it.

                     G.S.G. 9 (Cewy)  10-May-87

   If you'll do any changes (fix bugs or else) leave the new source
   (Lattice only !) at the BBS-BOX called 'Barrel-Burst-Box' and a
   message to me 'CEWY'. I'll check the box each week!

   Phone : (Germany) 06151/ 595240    (300 8N1 or 1200 8N1)

*/

/* executable (batch) file :
  .key name
  .def name MoveWindow
  stack 30000
  lc -v <name>
  BLink FROM LIB:c.o+<name>.o TO <name> LIBRARY LIB:lc.lib+LIB:amiga.lib NODEBUG
*/

/* -------------------------- include section ------------------------ */

#include <stdio.h>
#include <intuition/intuition.h>

/* -------------------------- define section ------------------------- */

#define DEFAULT_NAME "AmigaDOS"

/* -------------------- global variable section ---------------------- */

struct   IntuitionBase  *IntuitionBase = NULL; 

struct   Window         *MyWindow;
struct   NewWindow      MyWindowStruct = {
             0,0,1,1,1,1,0,0,
             NULL, NULL, NULL, NULL, NULL,0,0,0,0,WBENCHSCREEN
};

/* ---------------------- local function section --------------------- */
/* DESCRIPTION :
      print the usage of the program, so the user knows how to handle it.
   BUGS :
      none.
   COMMENT :
      uses puts instead of printf, cause puts is much shorter.
*/
void Usage()
{
   puts ("Usage: MoveWindow NewXpos [NewYpos [NewXSize [NewYSize [WindowTitle]]]]");
   puts ("written by G.S.G. 9 in May '87");
   exit (20);
}

/* ----------------------- main program section ----------------------- */
/* DESCRIPTION :
      Find the WorkbenchScreen and search requested window by it's Title.
      If the window was found : Size and drag the window with care!
   BUGS :
      sometimes the borders of the windows get hurt.
   COMMENT :
      none.
*/

main (argc,argv)
int argc;
char *argv[];
{
   SHORT         Xpos, Ypos, Xwide, Ywide;
   int           DeltaPosX, DeltaPosY, DeltaSizeX, DeltaSizeY;
   struct Screen *WBenchPtr;
   struct Window *Wind;
   UBYTE         *WindName;

   /* check the number of arguments */
   if (argc <2 || argc >6 || *argv[1] == '?') Usage ();

   /* open the intuition for OpenWindow */
   if (!(IntuitionBase = (struct IntuitionBase *) OpenLibrary
         ("intuition.library",0))) exit (100);

   /* open a New Window */
   if (!(MyWindow = (struct Window *) OpenWindow (&MyWindowStruct))) exit (200);

   /* Now we got a pointer to the WorkbenchScreen */
   WBenchPtr = MyWindow -> WScreen;

   /* we don't need this window any longer, so close it */
   CloseWindow (MyWindow);

   /* if a title is given by the user, use it */
   if (argc <6)
      WindName = DEFAULT_NAME;
   else
      WindName = argv[--argc];  /* decrement argc for later use */

   /* get a pointer the the first window on the WBScreen */
   Wind = WBenchPtr->FirstWindow;

   /* search the list of windows on the WBScreen for the one to be found */
   while (Wind && (strcmp (WindName,Wind->Title)))
      Wind = Wind->NextWindow;

   /* if the window isn't there, Wind will point to NULL (=FALSE) */

   if (Wind) {
      Ywide = Wind->Height;         /* get the previous values */
      Xwide = Wind->Width;
      Ypos  = Wind->TopEdge;
  /*  Xpos  = Wind->LeftEdge;    this one is changed each time */

      /* change current settings */
      switch (argc) {
         case 5: Ywide = (SHORT) atoi (argv[4]); /* remember that each */
         case 4: Xwide = (SHORT) atoi (argv[3]); /* case lower will be */
         case 3: Ypos  = (SHORT) atoi (argv[2]); /* executed !         */
         case 2: Xpos  = (SHORT) atoi (argv[1]);
      }

      /* if the user does too big things, we don't care.
         I won't get the ScreenLimits (640,256 or 704,276 (mine) or ....)
         for checking boundaries */
       /* This should be changed, anybody out there knows how? <CB> */	
	

      DeltaSizeY = Ywide - Wind->Height;     /* calculate Delta Values */
      DeltaSizeX = Xwide - Wind->Width;
      DeltaPosX  = Xpos  - Wind->LeftEdge;
      DeltaPosY  = Ypos  - Wind->TopEdge;

      /* it's a different thing to drag a big window down and
         size it before or after draging! */

      if (DeltaSizeY < 0) {
         SizeWindow (Wind, 0, DeltaSizeY);
         MoveWindow (Wind, 0, DeltaPosY);
      } else {
         MoveWindow (Wind, 0, DeltaPosY);
         SizeWindow (Wind, 0, DeltaSizeY);
      }

      if (DeltaSizeX < 0) {
         SizeWindow (Wind, DeltaSizeX, 0);
         MoveWindow (Wind, DeltaPosX,  0);
      } else {
         MoveWindow (Wind, DeltaPosX,  0);
         SizeWindow (Wind, DeltaSizeX, 0);
      }

   } else {

      /* let the user know that he typed something wrong */
      puts ("Sorry, didn't found that window\n");
   }

   /* close the opened library */
   CloseLibrary (IntuitionBase);

   /* say 'well done' the the system */
   return (0);
}

