home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 1 / GoldFishApril1994_CD2.img / d4xx / d418 / psx / src / screens.c < prev   
C/C++ Source or Header  |  1990-12-17  |  6KB  |  297 lines

  1. /**********************************************************************/
  2. /*    Public screen Opening code, for creating new public screens     */
  3. /**********************************************************************/
  4. #include "psx.h"
  5.  
  6. /*
  7. struct ColorSpec ColourSpecs[] = 
  8.     {
  9.     {0, 11, 9, 7},
  10.     {1, 3,  2,  2 },
  11.     {2, 15, 14, 13},
  12.     {3, 12, 2, 0 },
  13.     {-1,},
  14.     };
  15. */
  16.  
  17. ULONG OpenErr;
  18.  
  19. char *OpenErrors[] = 
  20.     {
  21.     "Unknown Error",
  22.     "Named monitor not available",
  23.     "Proper chips not available",
  24.     "Not enough memory",
  25.     "Not enough chip memory",
  26.     "Screen name in use",
  27.     "Unknown screen mode",
  28.     };
  29.  
  30.  
  31. /* I accept the default pens, but have to
  32.  * pass something to get the new look.
  33.  */
  34. UWORD    Pens[] = 
  35.     {
  36.     0, 1, ~0                /* just detail and block    */
  37.     };
  38.  
  39. char NewPubScreenName[MAXPUBSCREENNAME];
  40.  
  41. ULONG NewScreenTags[] = 
  42.     {
  43.     SA_PubName, (ULONG) NewPubScreenName,
  44.     SA_ErrorCode, (ULONG) &OpenErr,
  45.     SA_Pens, (ULONG) Pens,
  46.     TAG_DONE,
  47.     };
  48.  
  49.  
  50.  
  51. /**********************************************************************/
  52. /*            Get the parameters for the new public screen            */
  53. /**********************************************************************/
  54. int
  55. GetScreenParameters(struct NewScreen *NS)
  56. {
  57. ULONG TopBorder;
  58. int WinHeight, WinWidth;
  59. struct Window *ReqWindow;
  60. struct IntuiMessage *Message;
  61. ULONG Class, Code;
  62. int AllOkay=TRUE;
  63. int KG;
  64. int XDim=0, YDim=0, Depth=0;
  65.  
  66. TopBorder=Screen->WBorTop;
  67. strcpy(NewPubScreenName, "PSX_Screen");
  68.  
  69. SGadList=NULL;
  70. WinHeight=CreateScreenGadgets(&SGadList, VI, TopBorder, TAttr, &WinWidth);
  71. if (WinHeight==0)
  72.     {
  73.     SetMessage("Unable to create gadgets.");
  74.     return(FALSE);
  75.     };
  76.  
  77. ReqWindow = (struct Window *)OpenWindowTags( NULL,
  78.         WA_Left,    WIN_LEFT+10,
  79.         WA_Top,        WIN_TOP+5,
  80.         WA_Width,    WinWidth,
  81.         WA_Height,    WinHeight,
  82.         WA_IDCMP,      GADGETUP|CLOSEWINDOW|BUTTONIDCMP|LISTVIEWIDCMP|REFRESHWINDOW,
  83.         WA_Activate,    TRUE,
  84.         WA_DepthGadget,    TRUE,
  85.         WA_DragBar,    TRUE,
  86.         WA_RMBTrap,     TRUE,
  87.         WA_Title,    "Select Screen Style",
  88.         WA_SimpleRefresh, TRUE,
  89.         WA_PubScreen,    Window->WScreen,
  90.         TAG_END
  91.         );
  92.  
  93. if (!ReqWindow) return(FALSE);
  94.  
  95. /** Set screen font **/
  96.  
  97. SetFont(ReqWindow->RPort, ScreenFont);
  98.  
  99. /** GadTools Init **/
  100.  
  101. AddGList(ReqWindow, SGadList, -1, -1, NULL);
  102. RefreshGList(SGadList, ReqWindow, NULL, -1);
  103. GT_RefreshWindow(ReqWindow, NULL);
  104.  
  105. KG=TRUE;
  106.  
  107. while (KG)
  108.     {
  109.     struct Gadget *Gad;
  110.     ULONG GadID;
  111.  
  112.     Message=(struct IntuiMessage *)GT_GetIMsg(ReqWindow->UserPort);
  113.     if (Message==FALSE)
  114.         {
  115.         WaitPort(ReqWindow->UserPort);
  116.         continue;
  117.         };
  118.  
  119.     Class=Message->Class;
  120.     Code=Message->Code;
  121.     Gad=Message->IAddress;
  122.     GadID=Gad->GadgetID;
  123.  
  124.     GT_ReplyIMsg((struct IntuiMessage *)Message);
  125.  
  126.     switch (Class)
  127.         {
  128.         case GADGETUP:
  129.             switch (GadID)
  130.                 {
  131.                 case SGID_NAME:
  132.                     strcpy(NewPubScreenName, ((struct StringInfo *)Gad->SpecialInfo)->Buffer);
  133.                     break;
  134.  
  135.                 case SGID_CANCEL:
  136.                     KG=FALSE;
  137.                     AllOkay=FALSE;
  138.                     break;
  139.  
  140.                 case SGID_XDIM:
  141.                     XDim=Code;
  142.                     break;
  143.  
  144.                 case SGID_YDIM:
  145.                     YDim=Code;
  146.                     break;
  147.  
  148.                 case SGID_DEPTH:
  149.                     Depth=Code;
  150.                     break;
  151.  
  152.                 case SGID_OPEN:
  153.                     KG=FALSE;
  154.  
  155.                 default:
  156.                     break;
  157.                 };
  158.             break;
  159.  
  160.         case REFRESHWINDOW:
  161.             GT_BeginRefresh(ReqWindow);
  162.             GT_EndRefresh(ReqWindow, TRUE);
  163.             break;
  164.         default:
  165.             break;
  166.         };        
  167.     };
  168.  
  169. NS->ViewModes=0;
  170.  
  171. if (XDim==0)
  172.     NS->ViewModes|=HIRES;
  173.  
  174. if (YDim==1)
  175.     NS->ViewModes|=LACE;
  176.  
  177. NS->Depth=Depth+1;
  178.  
  179. CloseWindow(ReqWindow);
  180. return(AllOkay);
  181. }
  182.  
  183.  
  184. /**********************************************************************/
  185. /*                      Open screen base routine                      */
  186. /**********************************************************************/
  187. void
  188. OpenNewPublicScreen(void)
  189. {
  190. struct Screen *PubScreen;
  191. struct ExtNewScreen    NS;
  192.  
  193. setmem(&NS, sizeof(NS), 0);
  194.  
  195. if (GetScreenParameters(&NS)==FALSE)
  196.     return;
  197.  
  198. NS.Width    =    -1;        // Set Non-Zero items
  199. NS.Height    =    -1;
  200. NS.BlockPen    =    1;
  201. NS.Type        =    CUSTOMSCREEN;
  202.  
  203. PubScreen=(struct Screen *)OpenScreenTagList(&NS, (struct TagItem *)&NewScreenTags[0]);
  204.  
  205. if (PubScreen==0)
  206.     SetMessage("Error opening screen.");
  207.     else 
  208.     {
  209.     PubScreenStatus(PubScreen, 0L);
  210.     strcpy(CurPubScreenName, NewPubScreenName);
  211.     ClosePSXWindow();
  212.     ReleasePublicScreen();
  213.     FindPublicScreen();
  214.     OpenPSXWindow();
  215.     ScreenToFront(PubScreen);
  216.     SetMessage("Public screen opened.");
  217.     };
  218.  
  219. }
  220.  
  221.  
  222. /**********************************************************************/
  223. /*                   CLI-driven open public screen                    */
  224. /**********************************************************************/
  225. void
  226. CLIOpenNewPublicScreen(char *Name, long HiresFlag, long LaceFlag, long *DepthPtr, long DefaultFlag)
  227. {
  228. struct Screen *PubScreen;
  229. struct NewScreen    NS;
  230.  
  231. setmem(&NS, sizeof(NS), 0);
  232.  
  233. NS.Depth    =    2;
  234. NS.Width    =    -1;        // Set Non-Zero items
  235. NS.Height    =    -1;
  236. NS.BlockPen    =    1;
  237. NS.Type        =    CUSTOMSCREEN;
  238.  
  239. strcpy(NewPubScreenName, Name);
  240.  
  241. // Check args for HIRES, LORES, LACE, NOLACE, and DEPTH # arguments
  242. if (HiresFlag) NS.ViewModes|=HIRES;
  243. if (LaceFlag) NS.ViewModes|=LACE;
  244. if (DepthPtr) NS.Depth=*DepthPtr;
  245.  
  246. PubScreen=(struct Screen *)OpenScreenTagList(&NS, (struct TagItem *)&NewScreenTags[0]);
  247. if (PubScreen==0)
  248.     {
  249.     int ShowErr;
  250.  
  251.     if (OpenErr>6) ShowErr=0;
  252.         else ShowErr=OpenErr;
  253.     printf("Public screen open error: %s (%d).\n", OpenErrors[ShowErr], OpenErr);
  254.     } else 
  255.     {
  256.     PubScreenStatus(PubScreen, 0L);
  257.     if (DefaultFlag)
  258.         SetDefaultPubScreen(NewPubScreenName);
  259.     };
  260.  
  261. return;
  262. }
  263.  
  264.  
  265. /**********************************************************************/
  266. /*              Close a named public screen from the CLI              */
  267. /**********************************************************************/
  268. void
  269. CLIClosePublicScreen(char *Name)
  270. {
  271. struct Screen *ToClose;
  272. long Result;
  273.  
  274. ToClose=LockPubScreen(Name);
  275.  
  276. if (ToClose==0) 
  277.     {
  278.     printf("Unable to lock screen.\n");
  279.     return;
  280.     };
  281.  
  282. if ((ToClose->Flags&SCREENTYPE)==WBENCHSCREEN)
  283.     {
  284.     printf("Cannot close the Workbench screen!\n");
  285.     UnlockPubScreen(Name, ToClose);
  286.     return;
  287.     };
  288.  
  289. UnlockPubScreen(Name, ToClose);
  290.  
  291. Result=CloseScreen(ToClose);
  292.  
  293. if (Result==FALSE)
  294.     printf("Unable to close screen.\n");
  295.     else printf("Screen successfully closed.\n");
  296. }
  297.