home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 10 / Fresh_Fish_10_2352.bin / useful / util / edit / mg / src.lzh / amiga / iconify.c < prev    next >
C/C++ Source or Header  |  1990-05-23  |  5KB  |  229 lines

  1. /*
  2.  * :ts=8 bk=0
  3.  * 
  4.  * iconify.c:    You asked for it, you got it.
  5.  * 
  6.  * Copyright 1987 by Leo L. Schwab. Permission is hereby granted for use in any
  7.  * and all programs, both Public Domain and commercial in nature, provided
  8.  * this Copyright notice is left intact.  Purveyors of programs, at their
  9.  * option, may wish observe the following conditions (in the spirit of
  10.  * hackerdom): 1: You send me a free, registered copy of the program that
  11.  * uses the iconify feature, 2: If you're feeling really nice, a mention in
  12.  * the program's documentation of my name would be neat.
  13.  * 
  14.  * 8712.10        (415) 456-3960
  15.  */
  16. #include "do_iconify.h"
  17. #ifdef    DO_ICONIFY
  18.  
  19. #include <exec/types.h>
  20. #include <devices/timer.h>
  21. #include <intuition/intuition.h>
  22. #ifdef LATTICE
  23. #include <proto/all.h>
  24. #else
  25. #include <functions.h>
  26. #endif
  27.  
  28. #undef TRUE
  29. #undef FALSE
  30. #include "def.h"
  31. #include "iconify.h"
  32.  
  33. #ifndef    NO_PROTO
  34. static int openstuff PROTO((VOID));
  35. static VOID closestuff PROTO((VOID));
  36. #else
  37. static int openstuff();
  38. static VOID closestuff();
  39. #endif
  40.  
  41. /*
  42.  * It is recommended that the tick rate not be made too rapid to avoid
  43.  * bogging down the system.
  44.  */
  45. #define    TPS    10
  46.  
  47. /*
  48.  * Some programmers may not wish to have the added functionality of the
  49.  * ICON_FUNCTION feature.  If you're such a programmer, you may comment out
  50.  * the following #define, which will eliminate the code to handle function
  51.  * calls, and make iconify() even smaller.
  52.  */
  53. /*
  54.  * mg doesn't use this, so we turn it off. #define    USE_FUNCTIONS
  55.  */
  56. /*
  57.  * Jim Mackraz suggested making icons easily identifiable by outside
  58.  * programs, so this constant gets stuffed into the UserData field.
  59.  */
  60. #define    ICON    0x49434f4eL    /* 'ICON'  */
  61.  
  62. static struct Gadget gadget = {
  63.     NULL,
  64.     0, 0, 0, 0,
  65.     NULL,            /* Set later  */
  66.     GADGIMMEDIATE,
  67.     WDRAGGING,        /* Observe the Magic!  */
  68.     NULL,            /* Set later  */
  69.     NULL, NULL, NULL, NULL,
  70.     0, 0
  71. };
  72.  
  73. static struct NewWindow windef = {
  74.     0, 0, 0, 0,        /* Set later  */
  75.     -1, -1,
  76.     GADGETDOWN,
  77.     BORDERLESS | SMART_REFRESH | NOCAREREFRESH,
  78.     &gadget,
  79.     NULL, NULL, NULL, NULL,    /* Lotsa these  */
  80.     0, 0, 0, 0,
  81.     WBENCHSCREEN
  82. };
  83.  
  84. static struct Window *win;
  85.  
  86. #ifdef USE_FUNCTIONS
  87. static struct timerequest *tr;
  88. static struct MsgPort *reply;
  89. #endif
  90.  
  91.  
  92. iconify(left, top, width, height, screen, ptr, type)
  93.     UWORD          *left, *top, width, height;
  94.     struct Screen  *screen;
  95.     APTR            ptr;
  96.     int             type;
  97. {
  98.     register struct IntuiMessage *msg;
  99.     long            secs = 0, mics = 0, cs, cm, class, sigmask;
  100.  
  101.     windef.LeftEdge = *left;
  102.     windef.TopEdge = *top;
  103.     windef.Width = width;
  104.     windef.Height = height;
  105.     windef.Type = (windef.Screen = screen) ? CUSTOMSCREEN : WBENCHSCREEN;
  106.  
  107.     gadget.Flags = GADGHCOMP | GRELWIDTH | GRELHEIGHT;
  108.  
  109.     switch (type & 3) {
  110.     case ICON_IMAGE:
  111.         gadget.Flags |= GADGIMAGE;
  112.     case ICON_BORDER:
  113.         gadget.GadgetRender = ptr;
  114.         break;
  115.  
  116.     case ICON_FUNCTION:
  117. #ifdef USE_FUNCTIONS
  118.         gadget.GadgetRender = NULL;
  119. #else
  120.         return (0);
  121. #endif
  122.         break;
  123.  
  124.     default:
  125.         return (0);
  126.     }
  127.  
  128.     if (!openstuff())
  129.         return (0);
  130.     sigmask = 1L << win->UserPort->mp_SigBit;
  131.  
  132. #ifdef USE_FUNCTIONS
  133.     if (type == ICON_FUNCTION) {
  134.         sigmask |= 1L << reply->mp_SigBit;
  135.         tr->tr_node.io_Command = TR_ADDREQUEST;
  136.         tr->tr_time.tv_secs = 0;
  137.         tr->tr_time.tv_micro = (1000000L / TPS);
  138.         SendIO((struct IORequest *) tr);
  139.         /*
  140.          * Make initialization call to user's function. Isn't
  141.          * typecasting wonderful?  :-|
  142.          */
  143.         (*((void (*) ()) ptr)) (win, (WORD) 1);
  144.     }
  145. #endif
  146.  
  147.     while (1) {
  148.         Wait(sigmask);
  149.  
  150. #ifdef USE_FUNCTIONS
  151.         if (GetMsg(reply)) {
  152.             /*
  153.              * Call user's function to do something to the icon.
  154.              */
  155.             (*((void (*) ()) ptr)) (win, (WORD) 0);
  156.             tr->tr_time.tv_secs = 0;
  157.             tr->tr_time.tv_micro =
  158.                 (1000000L / TPS);
  159.             SendIO((struct IORequest *) tr);
  160.         }
  161. #endif
  162.  
  163.         if (msg = (struct IntuiMessage *) GetMsg(win->UserPort)) {
  164.             class = msg->Class;
  165.             cs = msg->Seconds;
  166.             cm = msg->Micros;
  167.             ReplyMsg((struct Message *) msg);
  168.  
  169.             if (class == GADGETDOWN) {
  170.                 if (DoubleClick(secs, mics, cs, cm))
  171.                     break;
  172.                 secs = cs;
  173.                 mics = cm;
  174.             }
  175.         }
  176.     }
  177.  
  178. #ifdef USE_FUNCTIONS
  179.     if (type == ICON_FUNCTION) {
  180.         AbortIO((struct IORequest *) tr);
  181.         WaitIO((struct IORequest *) tr);
  182.     }
  183. #endif
  184.  
  185.     *left = win->LeftEdge;
  186.     *top = win->TopEdge;
  187.     closestuff();
  188.     return (1);
  189. }
  190.  
  191. static
  192. openstuff()
  193. {
  194.     if (!(win = OpenWindow(&windef)))
  195.         return (0);
  196.     win->UserData = (BYTE *) ICON;
  197.  
  198. #ifdef USE_FUNCTIONS
  199.     if (!(reply = CreatePort(NULL, NULL)) ||
  200.         !(tr = (struct timerequest *) CreateExtIO(reply, (long) sizeof(*tr))) ||
  201.         OpenDevice(TIMERNAME, (long) UNIT_VBLANK, (struct IORequest *) tr, 0L)) {
  202.         closestuff();
  203.         return (0);
  204.     }
  205. #endif
  206.  
  207.     return (1);
  208. }
  209.  
  210. static          VOID
  211. closestuff()
  212. {
  213. #ifdef USE_FUNCTIONS
  214.     if (tr) {
  215.         if (tr->tr_node.io_Device)
  216.             CloseDevice((struct IORequest *) tr);
  217.         DeleteExtIO((struct IORequest *) tr, (long) sizeof(*tr));
  218.     }
  219.     if (reply)
  220.         DeletePort(reply);
  221. #endif
  222.  
  223.     if (win)
  224.         CloseWindow(win);
  225. }
  226. #else
  227. #include "nullfile.h"
  228. #endif
  229.