

 /*  input   ---   find out what that annoying user wants and deal with it  */


#include "stuff.h"

#define SMP     struct IntuiMessage *


    extern struct Screen   *scr      ;
    extern struct Window   *win, *seqwin, *clipWin;
    extern ST SW            SuperWindows [];  /*  cheap storage for dots    */
    extern  int             no_help  ;        /*  turn that thing off!      */
    extern USHORT           izDn     ;        /*  the mouse's pen condition */
    extern USHORT           Mx, My   ;        /*  My mouse Ex Yy'z here!    */
    extern ULONG            thisCol  ;        /*  where points the ">"?     */
    extern  int             bloking  ;
    extern  int             popping  ;
          ULONG             msgclass ;        /*  I only program for the    */
           USHORT           msgcode  ;        /*  mouse fetish...           */
           int              gadcode  ;
           UWORD            mrQ      ;
           int              picking  ;        /*  mousepen???               */

                        struct helperizer helps []
                                    =
 {
  {  0,  -1, 13, 11,(UB)  "-+*-!-|>  No Last Chance!  <|-!-*+-",    3 },
  { 33, 19,227,141,(UB)  "Draw Here",                              2 },
  {  1, 13, 33,127,(UB)  "Colors!  Also Use Pick or Arrow keys",   1 },
  { 42,161, 80,187,(UB)  "Hit Alternate Alternate Spots  ",        1 },
  {  4,161, 42,187,(UB)  "Only Hit Alternate Spots ",              1 },
  {281,162,319,188,(UB)  "Blast Current Color Everywhere",      0 },
  { 80,161,118,187,(UB)  "Select Color From Screen (anywhere)",    1 },
  {  1,188,999,999,(UB)  "User Befuddlement Enhancer ",            2 },
  {  4,144, 42,170,(UB)  "F; Fill a 3 x 3 Area (Ctrl == 9 x 9)",   1 },
  {204,161,242,187,(UB)  "S; Write a C Declaration",   1 },
  {242,161,280,187,(UB)  "L; Search File for DataName",   1 },
  {156,161,194,187,(UB)  "I; Add 1 to Name && FileName..try it!",     1 },
  {194,143,315,160,(UB)  "Name of the ImageData Declaration",      1 },
  {156,144,194,161,(UB)  "Save All or NorthWest Corner?",          1 },
  {276,121,311,141,(UB)  "C; Copy Into a New Little Window",     1 },
  {234,122,264,141,(UB)  "R; Flip thru All the Windows' Images",      1 },
  {194,161,204,161+26,(UB)  "Inc && Save (no stupid animations)",      1 },
  {118,161,118+38,161+26,(UB)  "F; Fill a Zone (Auto-BackUp)",             1 },
  {231,100,248,119,(UB)  "U; Jam This Back into Working Areas",       1 },
  {231, 81,248,100,(UB)  "Z; Copy Image Here where It's Safe",        1 },
  {250, 80,316,119,(UB)  "BackUp Copy for Dangerous Actions",      0 },
  {243, 22,307, 62,(UB)  "Your Favorite Little Picture",           0 },
  { 18,  -1, 39,  9,(UB)  "PopArt - art movement of 1950-60s...",   2 },
  { 40,  -1, 60,  9,(UB)  "...that used media symbols && common",    2 },
  { 61,  -1, 80,  9,(UB)  "...objects in exaggerated contexts",     2 },
  {126,  -1,145,  9,(UB)  "SciFi author, artist, programmer...",    2 },
  {146,  -1,165,  9,(UB)  "...from behind the Orange Curtain...",   2 },
  {166,  -1,185,  9,(UB)  "...at 714 641 7525 or 682 3783",         2 },
  {267,121,272,145,(UB)  "T; Put All Images under \"It\"",            1 },
  {227,121,233,145,(UB)  "Set Sequence of Images to Roll",         1 },
  {118,144,156,161,(UB)  "Clone && Load (no stupid animations)",1 },
  {80,144,80+38,161,(UB)  "Save w/ File Editing /* Comment? */",1 },

  {42,144,50,149,(UB)  "Ctrl-Save == Inc && Save",2 },
  {42,150,50,155,(UB)  "Click Window Image to Select",2 },
  {42,156,50,161,(UB)  "Ctrl-ColorTweaker == Save ColorMap",2 },

  {51,144,58,149,(UB)  "Ctrl-Load == Clone && Load",2 },
  {51,150,58,155,(UB)  "X; == KeyBoard Short-Cut",2 },
  {51,156,58,161,(UB)  "Alt-ColorTweaker == Load ColorMap",2 },

  {59,144,64,149,(UB)  "Right-Mouse == Pick Color",2 },
  {59,150,64,155,(UB)  "Ctrl-Click Image == See-Thru",2 },
  {59,156,64,161,(UB)  "Ctrl-Color == Search && Replace",2 },

  {65,144,71,149,(UB)  "L-Amiga-ColorTweaker == Default",2 },
  {65,150,71,155,(UB)  "Shift-Drag == Copy Area to ClipBoard",2 },
  {65,156,71,161,(UB)  "Click-Clip == Paste Clipped Area",2 },

  {72,144,80,149,(UB)  "Shift-Clip == All but Current Color",2 },
  {72,150,80,155,(UB)  "Alt-Clip == Only Current Color",2 },
  {72,156,80,161,(UB)  "Ctrl-Clip == Kill Clip Window",2 },

  {201, 10,233, 19,(UB)  "O; Toggle See-Thru Mode",   1 },
  {169, 10,200, 19,(UB)  "P; Toggle Pop-Thru Mode",   1 },
  {137, 10,168, 19,(UB)  "Close WorkBench && Free Memory",1 },
  {104, 10,135, 19,(UB)  "Write \"0xffff\" or \"65535\" in Array?",1 },
  {  2,128, 12,128+16,(UB)  "<Red> World's Smallest ColorTweaker",1 },
  { 13,128, 21,128+16,(UB)  "<Grn> World's Smallest ColorTweaker",1 },
  { 22,128, 34,128+16,(UB)  "<Blu> World's Smallest ColorTweaker",1 },

                         /*  add new help here  */

  {  0,  -1,999,999,(UB)  "no action",                              0}, {0}};


        void
help ()                                /*  Annoy All the Profficient Users  */
{
    extern struct Window *win;
    static UB lastHelp;
    REG SHORT  Mx = win->MouseX,  My = win->MouseY;
    REG int i = 0;


    if (My < -1)  My = -1;

    LOOP (;  helps [i].help;  ++i)
        IF (   Mx >= helps [i].xx  &&  Mx <= helps [i].xxx  &&
               My >= helps [i].yy  &&  My <= helps [i].yyy    )  {
             if (lastHelp == helps [i].help)  return;
             hotHelp ( lastHelp = helps [i].help, helps [i].heat, 0 );
             return;  }

    quit ("bug in program data arrays");

}


            UB
widen (flub)
 char *flub;
{
        static char stub [ 150 ];

          stub [ 0 ] = ' ';
          stub [ 1 ] =  0 ;
        strcat ( stub, flub );
        strcat ( stub, "                                   ");
          stub [ 37 ] = 0;
        return ( UB ) stub;

}                       /*  I thought "rpad ()" would be a little tacky...  */


                                   void
hotHelp (squeak, heat, persistence)   UB  squeak;
{
    extern ST RastPort *reep;
    extern ST Gadget TGads [];
    static long heats [] = { 3, 28, 1, 2 };
    static int lastpersistence;
    SS IntuiText blank = { 0, 0, JAM1 };
    UB god;
    long wasmode = reep->DrawMode, x;


    if (persistence == 0 && lastpersistence--)  return;
    lastpersistence = persistence;
    SetAPen (reep, heat == HHalert? 1L: 24L);
    SetDrMd (reep, JAM1);
    RectFill (reep, 0L, 187L, 319L, 199L);
    god = widen (squeak);

    if (heat != HHalert)  {  x = strlen (god);
        SetAPen (reep, 23L);  Move (reep,  7L, 199L);  Text (reep, god, x);
        SetAPen (reep, 22L);  Move (reep,  8L, 198L);  Text (reep, god, x);
        SetAPen (reep, 21L);  Move (reep,  9L, 197L);  Text (reep, god, x);
        SetAPen (reep, 20L);  Move (reep, 10L, 196L);  Text (reep, god, x);  }

    SetAPen (reep, heats [heat]);
    Move (reep,  11L, 195L);
    Text (reep, god, x);
    SetAPen (reep, thisCol);
    SetDrMd (reep, wasmode);

}


     /*  this stuff is here because art.c and init.c were too big  */

tweakColors ()
{
    int updn = My < 136? 1: -1;
    REG USHORT jack;
        USHORT rr, gg, bb;


    if izCtrl (mrQ)  {  saveColors ();  return;  }
    if izAlt  (mrQ)  {  loadColors ();  return;  }

    if (mrQ == LCOM)  {  extern UWORD ni_colCMAP [];
        Mess ("Default Colors Restored");
        LoadRGB4 (&(scr->ViewPort), ni_colCMAP, 32L);
        return;  }

    jack = GetRGB4 (scr->ViewPort.ColorMap, thisCol);
    rr =  jack >> 8;
    gg = (jack >> 4) & 0x000f;
    bb = (jack     ) & 0x000f;

    switch (Mx < 13? 0: Mx < 22? 1: 2)  {
        case 0:  if (tweak (&rr, updn))  return;  break;
        case 1:  if (tweak (&gg, updn))  return;  break;
        case 2:  if (tweak (&bb, updn))  return;  break;  }

    SetRGB4 (&(scr->ViewPort), thisCol, (long) rr, (long) gg, (long) bb);

}


tweak (victim, assassin)  USHORT *victim;
{

    *victim += assassin;

    if (*victim > 15 || *victim < 0)  {
        Mess ("Color Register at Limit");
        return 1;  }

    Mess ("Color Tweaked");
    return 0;

}


         unsigned int
input ()
{
    REG struct IntuiMessage *massage;
    ULONG signal;
    void clipWinput ();


    msgclass = msgcode = 0;
    if (massage = (SMP) GetMsg (win->UserPort))  goto splashdown;

    ifn (izDn)  {
        ifn (win->Flags & WINDOWACTIVE)  Delay (2L);
        smallinput ();
        if (seqwin)  if (GetMsg (seqwin->UserPort))  closeSeqWin ();
        if (clipWin)  clipWinput ();

        if (win->Flags & WINDOWACTIVE)  {
            extern int webefillin, CurrentWindow, curOnion;
            int boolshit;


            ifn (no_help)  help ();

            boolshit = ((bloking && !webefillin) || (popping && curOnion !=
                                                    CurrentWindow))&& !picking;

            if (boolshit)  flash_blok ();
            Wait (1L << win->UserPort->mp_SigBit);
            if (boolshit)  flash_blok ();  }
        else
            Delay (3L);        /*  okay, it's not a busy loop!  satisfied?  */

    }

    while (massage = (SMP) GetMsg (win->UserPort))  {
splashdown:
        msgclass   = massage->Class;
        msgcode    = massage->Code;
        Mx         = massage->MouseX;
        My         = massage->MouseY;
        mrQ        = massage->Qualifier & Qmask;

        gadcode    =  (msgclass == GADGETUP) ? ((struct Gadget *)
                        (massage->IAddress))->GadgetID : 0 ;

        ReplyMsg (massage);
        if (izDn && !bloking)  return 1;
        if (msgclass == MOUSEBUTTONS || msgclass == RAWKEY)  return 1;

    }

    return  msgclass != CLOSEWINDOW;

}                                            /*  end of life as we know it  */


smallinput ()
{
    REG int k = maxsupwin;
    REG ST IntuiMessage *msg;


    while (k--)
        if (swin (k))
            while (msg = (SMP) GetMsg (swin (k)->UserPort))  {
                dealwithit (k, msg);
                if (msg->Class == CLOSEWINDOW)  break;
                ReplyMsg (msg);  }

}                                       /*  end of life as we know it also  */


              void
clipWinput ()
{
    REG ST IntuiMessage *msg;


    while (msg = (SMP) GetMsg (clipWin->UserPort))  {  UWORD clipQ;
        clipQ = msg->Qualifier & Qmask;

        if izCtrl (clipQ)  {
            clozeClipWin ();  Mess ("Killed ClipBoard");  RET;  }

        if (msg->Class == MOUSEBUTTONS && msg->Code == SELECTUP)
            clipAction (clipQ);

        ReplyMsg (msg);  }

}                                 /*  REALLY the end of life as we know it  */

