home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 2.1 / Amiga Developer CD v2.1.iso / Reference / DevCon / Milan_1991 / Devcon91.1 / Libraries / Intuition / other_examples / PubSc / pubsc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-01  |  4.1 KB  |  209 lines

  1. /* pubsc.c -- public screen "meat" routines :ts=4    */
  2.  
  3. /*
  4. Copyright (c) 1989 Commodore-Amiga, Inc.
  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. #include "sysall.h"
  14. #include "pubsc.h"
  15.  
  16. #define D(x)    ;
  17.  
  18. /* globals for messages to user    */
  19. extern UBYTE            currname[];
  20. extern UBYTE            defname[];
  21.  
  22. extern struct Screen            *lockedscreen;
  23. extern struct Window            *window;
  24.  
  25. struct Screen    *LockPubScreen();
  26.  
  27. /*
  28.  * process command messages
  29.  */
  30. doCommand( id )
  31. int        id;        /* already has high byte masked off    */
  32. {
  33.     struct Screen    *currscreen;
  34.     ULONG            openPubScreen();
  35.     ULONG            oserror;
  36.  
  37.     switch ( id )
  38.     {
  39.     case    c_close:
  40.         currscreen = window->WScreen;
  41.         if ( ( currscreen->Flags & SCREENTYPE ) == WBENCHSCREEN )
  42.         {
  43.             psstatus( "Can't close Workbench screen.");
  44.         }
  45.         else
  46.         {
  47.             downWindow();    /* get off current screen    */
  48.             if ( ! CloseScreen( currscreen ) )
  49.             {
  50.                 lockPubScreen();
  51.                 upWindow();        /* come back    */
  52.                 psstatus( "Can't close screen." );
  53.             }
  54.             else
  55.             {
  56.                 currname[0] = '\0';
  57.                 lockPubScreen();
  58.                 upWindow();
  59.             }
  60.         }
  61.         break;
  62.  
  63.     case    c_default:
  64.         SetDefaultPubScreen( currname );
  65.         strcpy( defname, currname );
  66.         updateMessages();
  67.         psstatus( "New default pubscreen set." );
  68.         break;
  69.  
  70.     case    c_open:
  71.         if ( oserror = openPubScreen() )
  72.         {    
  73.             D( printf("oPS failed, error %lx\n", oserror ) );
  74.             if ( oserror == OSERR_PUBNOTUNIQUE )
  75.                 psstatus( "Public screen already open." );
  76.             else
  77.                 psstatus( "Public screen failed to open." );
  78.         }
  79.         else    /* successful open    */
  80.         {
  81.             /* open on the new screen    */
  82.             downWindow();
  83.             /* we open our screen locked    */
  84.             upWindow();
  85.         }
  86.         break;
  87.     case    c_jump:
  88.         lockNextScreen( window->WScreen );
  89.         downWindow();
  90.         upWindow();
  91.         break;
  92.  
  93.     default:
  94.         psstatus( "Unknown doCommand" );
  95.     }
  96. }
  97.  
  98. /*
  99.  * try to get ones hands on the next public screen
  100.  * Only call this if window is open.
  101.  */
  102. lockNextScreen( screen )
  103. struct Screen    *screen;
  104. {
  105.     D( printf("lNextScreen, screen %lx\n", screen ) );
  106.  
  107.     /* set up new currname    */
  108.     if ( ! NextPubScreen( screen, currname ) )
  109.     {
  110.         D( printf("NextPubScreen failed.\n") );
  111.         currname[0] = '\0';
  112.     }
  113.     D( printf("new currname: %s\n", currname ) );
  114.  
  115.     lockPubScreen();
  116. }
  117.  
  118. /*
  119.  * locks currname, else WB
  120.  */
  121. lockPubScreen()
  122. {
  123.     UBYTE    *psname;
  124.  
  125.     D( if ( lockedscreen ) printf("!!!locking second! ! !\n") );
  126.  
  127.     psname = currname[0]? currname: NULL;
  128.     D( printf( "lPS: lock with pointer %lx\n", psname ) );
  129.  
  130.     lockedscreen = LockPubScreen( currname[0]? currname: NULL );
  131.     D( printf("lPS: LockPubScreen returned %lx\n", lockedscreen ));
  132. }
  133.  
  134. unlockScreen()
  135. {
  136.     if ( lockedscreen ) UnlockPubScreen( currname );
  137.     lockedscreen = NULL;
  138. }
  139.  
  140.  
  141. #define PSNAME    "Phred"
  142.  
  143. struct ColorSpec colorspecs[] = {
  144.     {0, 11, 9, 7},
  145.     {1, 3,  2,  2 },
  146.     {2, 15, 14, 13},
  147.     {3, 12, 2, 0 },
  148.     {-1,},
  149. };
  150.  
  151. ULONG                oserror;
  152.  
  153. /* I accept the default pens, but have to
  154.  * pass something to get the new look.
  155.  */
  156. UWORD                mypens[] = {
  157.     0, 1, ~0                /* just detail and block    */
  158. };
  159.  
  160. struct TagItem    nsext[] = {
  161.     { SA_PubName, (ULONG) PSNAME },
  162.     { SA_ErrorCode, (ULONG) &oserror },
  163.     { SA_Colors, (ULONG) colorspecs },
  164.     { SA_Pens, (ULONG) mypens },
  165.     { TAG_DONE,}
  166. };
  167.  
  168.  
  169. /*
  170.  * returns error from OpenScreen
  171.  * uses hardcoded name
  172.  * ZZZ: if FALLBACK: should reset currname.
  173.  */
  174. ULONG
  175. openPubScreen()
  176. {
  177.     struct ExtNewScreen    ns;
  178.     struct Screen        *pubscreen;
  179.     struct Screen        *OpenScreenTagList();
  180.  
  181.     ns.ViewModes =    HIRES;
  182.     ns.LeftEdge    =    0;
  183.     ns.TopEdge    =    0;
  184.     ns.Width    =    STDSCREENWIDTH;
  185.     ns.Height    =    STDSCREENHEIGHT;
  186.     ns.Depth    =    2;
  187.     ns.DefaultTitle    = NULL;                /* use pubname    */
  188.  
  189.     ns.DetailPen =    0;
  190.     ns.BlockPen    =    1;
  191.     ns.Gadgets    =    NULL;
  192.     ns.CustomBitMap    =    NULL;
  193.     ns.Font        =    NULL;
  194.     ns.Type        =    CUSTOMSCREEN;
  195.  
  196.     if ( pubscreen = OpenScreenTagList( &ns, nsext ) )
  197.     {
  198.         /* set up new currname, assuming we want to open
  199.          * our window on this new screen
  200.          */
  201.         strcpy( currname, PSNAME );
  202.         PubScreenStatus( pubscreen, 0L );    /* make it public */
  203.         D( if (lockedscreen) printf("!!!!!! locking aa second!!\n") );
  204.         lockPubScreen();
  205.         return ( 0 );
  206.     }
  207.     else return ( oserror );
  208. }
  209.