home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 199.lha / GimmeLib / window.c < prev    next >
C/C++ Source or Header  |  1988-12-27  |  3KB  |  130 lines

  1. /*
  2.  *  FILE: window.c
  3.  *  Support routines for dynamic (de)allocation of (new)windows.
  4.  *
  5.  *  Public Domain, but keep my name in it as the original author.
  6.  *  31-Aug-88    Jan Sven Trabandt   first release version
  7.  */
  8.  
  9.  
  10. #define I_AM_WINDOW
  11. #include "gimmelib/gimmefuncs.h"
  12. #include "gimmelib/window.h"
  13. #include <graphics/gfxbase.h>
  14.  
  15. extern struct GfxBase *GfxBase;
  16.  
  17.  
  18. struct NewWindow *gimmeNewWindow( title, screen, leftedge, topedge,
  19.                     IDCMPflags, flags )
  20.     UBYTE        *title;
  21.     struct Screen   *screen;
  22.     SHORT        leftedge, topedge;
  23.     ULONG        IDCMPflags, flags;
  24. {
  25.     register struct NewWindow    *nw;
  26.  
  27.     nw = (struct NewWindow *) AllocMem( (ULONG)sizeof(struct NewWindow),
  28.                     MEMF_PUBLIC | MEMF_CLEAR );
  29.     if( !nw ) {
  30.     return( NULL );
  31.     }
  32.     nw->DetailPen = GNW_DETAIL_PEN;
  33.     nw->BlockPen  = GNW_BLOCK_PEN;
  34.     nw->IDCMPFlags= IDCMPflags;
  35.     nw->Flags      = flags;
  36.     nw->Title      = title;
  37.     nw->MinWidth  = GNW_MIN_WIDTH;
  38.     nw->MinHeight = GNW_MIN_HEIGHT;
  39.     nw->LeftEdge  = leftedge;
  40.     nw->TopEdge   = topedge;
  41.     if( screen ) {
  42.     nw->Type = CUSTOMSCREEN;
  43.     nw->Screen = screen;
  44.     nw->MaxWidth  = screen->Width;
  45.     nw->MaxHeight = screen->Height;
  46.     } else {
  47.     nw->Type = WBENCHSCREEN;
  48.     nw->MaxWidth  = GfxBase->NormalDisplayColumns;
  49.     nw->MaxHeight = GfxBase->NormalDisplayRows;
  50.     }
  51.     nw->Width  = nw->MaxWidth - nw->LeftEdge;
  52.     nw->Height = nw->MaxHeight - nw->TopEdge;
  53.     return( nw );
  54. } /* gimmeNewWindow */
  55.  
  56.  
  57. short getRidOfNewWindow( nw )
  58.     struct NewWindow    *nw;
  59. {
  60. #ifdef GIMME_WIMPY
  61.     if( !nw ) {
  62.     return( -1 );
  63.     }
  64. #endif
  65.     FreeMem( nw, (ULONG)sizeof(struct NewWindow) );
  66.     return( 0 );
  67. } /* getRidOfNewWindow */
  68.  
  69.  
  70. struct Window *gimmeWindow( nw, depth, width, height )
  71.     struct NewWindow    *nw;
  72.     SHORT   depth, width, height;
  73. {
  74.     struct Window    *window;
  75.     struct NewWindow    *mynw;
  76.  
  77.     if( !(mynw = nw) ) {
  78.     nw = gimmeNewWindow( NULL, NULL, 0, 1, IDCMP_DEFAULT, FLAGS_DEFAULT );
  79.     }
  80.     for( ;; ) {         /* dummy loop with break at end */
  81.     if( nw ) {
  82.         if( nw->Flags & SUPER_BITMAP ) {
  83.         if( !(nw->BitMap = gimmeBitMap(depth, width, height)) ) {
  84.             break;
  85.         }
  86.         }
  87.         window = OpenWindow( nw );
  88.         if( !window ) {
  89.         if( nw->Flags & SUPER_BITMAP ) {
  90.             getRidOfBitMap( nw->BitMap );
  91.         }
  92.         } else {
  93.         window->UserData = (BYTE *) nw->BitMap;
  94.         }
  95.     }
  96.     break;
  97.     } /* for */
  98.     if( !mynw && nw ) {
  99.     getRidOfNewWindow( nw );
  100.     }
  101.     return( window );
  102. } /* gimmeWindow */
  103.  
  104.  
  105. short getRidOfWindow( window )
  106.     struct Window   *window;
  107. {
  108.     struct BitMap    *bm = NULL;
  109.     struct IntuiMessage *imsg;
  110.  
  111. #ifdef GIMME_WIMPY
  112.     if( !window ) {
  113.     return( -1 );
  114.     }
  115. #endif
  116.     if( window->Flags & SUPER_BITMAP ) {
  117.     bm = (struct BitMap *) window->UserData;
  118.     }
  119.     if( window->MenuStrip ) {
  120.     ClearMenuStrip( window );
  121.     }
  122.     while( imsg = (struct IntuiMessage *) GetMsg(window->UserPort) ) {
  123.     ReplyMsg( imsg );
  124.     } /* while */
  125.     CloseWindow( window );
  126.     if( bm ) {
  127.     getRidOfBitMap( bm );
  128.     }
  129. } /* getRidOfWindow */
  130.