home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD v1.2 / amidev_cd_12.iso / devcon / sanfrancisco_1989 / sf-devcon89.1 / commodities / aztec / examples / ivudu.c < prev    next >
C/C++ Source or Header  |  1992-08-27  |  4KB  |  174 lines

  1. /* vudu.c -- ihelp intuition voodoo    */
  2.  
  3. /*
  4. Copyright (c) 1987, 1988, 1989 Jim Mackraz and I&I Computing.
  5.  
  6. Executables based on this information may be used in software
  7. for Commodore Amiga computers.  All other rights reserved.
  8. This information is provided "as is"; no warranties are made.
  9. All use is at your own risk, and no liability or responsibility
  10. is assumed.
  11. */
  12.  
  13. /*** NOTICE: THIS IS BY NO MEANS A SUPPORTED BAG OF TRICKS
  14.  *** USE AT OWN RISK AND BE PREPARED TO THROW IT AWAY IF
  15.  *** A FUTURE VERSION OF THE OS CAUSES IT TO BREAK.
  16.  ***/
  17.  
  18. #include "ihelp.h"
  19.  
  20. #define D(x)    ;
  21.  
  22. struct IntuitionBase *IntuitionBase;
  23.  
  24. #define    IMINWIDTH    40
  25. #define    IMINHEIGHT    30
  26. #define    MIN(A,B)    (((A)<(B))?(A):(B))
  27. #define    MAX(A,B)    (((A)>(B))?(A):(B))
  28.  
  29. makesize(command)
  30. {
  31.     ULONG            ilock;
  32.     struct Window    *awindow;
  33.     struct Screen    *ascreen;
  34.     SHORT            deltaw;
  35.     SHORT            deltah;
  36.  
  37.     ilock = LockIBase(0L);
  38.     awindow = IntuitionBase->ActiveWindow;
  39.     ascreen = awindow->WScreen;
  40.  
  41.     switch (command)
  42.     {
  43.     case MAKESMALL:
  44.         deltaw = MAX(awindow->MinWidth, IMINWIDTH) - awindow->Width;
  45.         deltah = MAX(awindow->MinHeight, IMINHEIGHT) - awindow->Height;
  46.         break;
  47.  
  48.     case MAKEBIG:
  49.         deltaw =
  50.             MIN(ascreen->Width - awindow->LeftEdge, (unsigned) awindow->MaxWidth)
  51.             - awindow->Width;
  52.         deltah =
  53.             MIN(ascreen->Height-awindow->TopEdge, (unsigned) awindow->MaxHeight)
  54.             - awindow->Height;
  55.         break;
  56.     default:
  57.         deltaw = 0;
  58.         deltah = 0;
  59.     }
  60.  
  61. #if DEBUG
  62.     kprintf("current w/h: %d/%d\n", awindow->Width, awindow->Height);
  63.     kprintf("min w/h: %d/%d\n", awindow->MinWidth, awindow->MinHeight);
  64.     kprintf("delta w/h: %ld/%ld\n", deltaw, deltah);
  65. #endif
  66.  
  67.     SizeWindow(awindow, (LONG) deltaw, (LONG) deltah);
  68.  
  69.     UnlockIBase(ilock);
  70. }
  71.  
  72.  
  73. cyclebackward()
  74. {
  75.     ;
  76. #if PSEUDOCODE
  77.     lock intuition base
  78.     find active window
  79.     get its screen
  80.     get frontmost layer from layer info
  81.     get second layer too (not WBENCHWINDOW)
  82.     unlock ibase
  83.  
  84.     is active window frontmost?
  85.         if second is not backdrop
  86.             active window to back
  87.             activate second window
  88.         else
  89.             abort
  90.     else
  91.         activate frontmost
  92. #endif
  93. }
  94.  
  95. cycleforward()
  96. {
  97.     LONG            ilock;
  98.     struct Window    *awindow;
  99.     struct Screen    *ascreen;
  100.     struct Layer    *rearlayer;        /* rearmost so far        */
  101.     struct Layer    *layer;            /* runs through layers    */
  102.     struct Window    *lwindow;        /* layer->Window        */
  103.  
  104.  
  105.     ilock = LockIBase(0L);
  106.     awindow = IntuitionBase->ActiveWindow;
  107.     ascreen = awindow->WScreen;
  108.  
  109.     D( kprintf("active window/screen: %lx/%lx\n", awindow, ascreen) );
  110.  
  111.     /* for now, only pull this shit on the workbench    */
  112.     if ((ascreen->Flags & SCREENTYPE) != WBENCHSCREEN)
  113.     {
  114.         D( kprintf("not wbscreen\n") );
  115.         UnlockIBase(ilock);
  116.         goto OUT;
  117.     }
  118.  
  119.     /* find rearmost layer which is not a backdrop window,
  120.      * nor the bar layer, nor a WBENCHWINDOW
  121.      */
  122.     rearlayer = NULL;
  123.     for (layer = ascreen->LayerInfo.top_layer;layer; layer = layer->back)
  124.     {
  125.         lwindow = (struct Window *) layer->Window;
  126.         D( kprintf("layer %lx window %lx\n",layer, lwindow) );
  127.         if (layer == ascreen->BarLayer)    
  128.         {
  129.             D( kprintf("is bar layer\n") );
  130.             continue;
  131.         }
  132.         if (layer->Flags & LAYERBACKDROP)
  133.         {
  134.             D( kprintf("backdrop layer\n") );
  135.             continue;
  136.         }
  137.         if (lwindow->Flags & WBENCHWINDOW)
  138.         {
  139.             D( kprintf("skipping wbench window\n") );
  140.             continue;
  141.         }
  142.  
  143.         rearlayer = layer;
  144.     }
  145.     D( kprintf("let's try it\n") );
  146.     UnlockIBase(ilock);
  147.     D( kprintf("unlocked\n") );
  148.  
  149.     if (rearlayer)
  150.     {
  151.         lwindow = (struct Window *) rearlayer->Window;
  152.         D( kprintf("window of choice: %lx\n") );
  153.         WindowToFront(lwindow);
  154.         if (lwindow != awindow) ActivateWindow(lwindow);
  155.     }
  156.  
  157. OUT:
  158.     D( kprintf("cycleback done\n") );
  159.     return;
  160.  
  161. }
  162.  
  163. ihelp_init()
  164. {
  165.     /* returns 0 if problem    */
  166.     IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",33L);
  167.     if (!IntuitionBase) return (0);
  168.     return (1);
  169. }
  170. ihelp_shutdown()
  171. {
  172.     if (IntuitionBase) CloseLibrary(IntuitionBase);
  173. }
  174.