home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / programming / c / intuitionpp / ipp / cscreen.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-01  |  6.4 KB  |  364 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. ///////////////////////////////////////////////////////////////////////////////
  3. ///////////////////                                        ////////////////////
  4. ///////////////////           file : cscreen.cc            ////////////////////
  5. ///////////////////                                        ////////////////////
  6. ///////////////////////////////////////////////////////////////////////////////
  7. ///////////////////////////////////////////////////////////////////////////////
  8.  
  9.  
  10. #include <intuition/intuition.h>
  11. #include <intuition/intuitionbase.h>
  12. #include <graphics/gfxbase.h>
  13. #include <graphics/gfxmacros.h>
  14. #include <clib/graphics_protos.h>
  15. #include <clib/intuition_protos.h>
  16. #include <string.h>
  17.  
  18. //extern struct Library *OpenLibrary(char *, long);
  19. //extern void *CloseLibrary(struct Library *);
  20. //struct IntuitionBase *IntuitionBase=NULL;
  21. //struct GfxBase *GfxBase=NULL;
  22.  
  23.  
  24. struct ExtNewScreen ScreenData = {
  25.     0,0,
  26.     640,512,
  27.     4,
  28.     0,1,
  29.     LACE+HIRES,
  30.     CUSTOMSCREEN,
  31.     (struct TextAttr *)NULL,
  32.     (UBYTE *)"CScreen",
  33.     (struct Gadget *)NULL,
  34.     (struct BitMap *)NULL,
  35.     (struct TagItem *)NULL
  36. };
  37.  
  38.  
  39. #include "cscreen.h"
  40.  
  41.  
  42. CWNode :: CWNode()
  43. {
  44.     wn=NULL;
  45.     wasopen=FALSE;
  46.     nextwnode=NULL;
  47. }
  48.  
  49.  
  50. CWNode :: ~CWNode() {}
  51.  
  52.  
  53.  
  54. BOOL CScreen :: initlibs()
  55. {
  56. //    IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0);
  57. //    if (IntuitionBase == NULL) return FALSE;
  58. //    GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0);
  59. //    if (GfxBase == NULL)
  60. //    {
  61. //        CloseLibrary((struct Library *)IntuitionBase);
  62. //        return FALSE;
  63. //    }
  64.     return TRUE;
  65. }
  66.  
  67.  
  68. CScreen :: CScreen()
  69. {
  70.     if (!initlibs()) return;
  71.     newscr=NULL;
  72.     scr=NULL;
  73.     newscr=new ExtNewScreen;
  74.     if (newscr==NULL) return;
  75.     *newscr=ScreenData;
  76. }
  77.  
  78.  
  79. CScreen :: CScreen(struct NewScreen *news)
  80. {
  81.     if (!initlibs()) return;
  82.     newscr=NULL;
  83.     scr=NULL;
  84.     newscr=new ExtNewScreen;
  85.     if (newscr==NULL) return;
  86.     memcpy((void *)newscr,(void *)news,sizeof(struct NewScreen));
  87.     newscr->Extension=NULL;
  88. }
  89.  
  90. CScreen :: CScreen(struct ExtNewScreen *news)
  91. {
  92.     if (!initlibs()) return;
  93.     newscr=NULL;
  94.     scr=NULL;
  95.     newscr=new ExtNewScreen;
  96.     if (newscr==NULL) return;
  97.     *newscr=*news;
  98. }
  99.  
  100.  
  101. CScreen :: CScreen(struct NewScreen *news ,struct TagItem *tags)
  102. {
  103.     if (!initlibs()) return;
  104.     newscr=NULL;
  105.     scr=NULL;
  106.     newscr=new ExtNewScreen;
  107.     if (newscr==NULL) return;
  108.     if (news) memcpy((void *)newscr,(void *)news,sizeof(struct NewScreen));
  109.     else *newscr=ScreenData;
  110.     newscr->Extension=tags;
  111. }
  112.  
  113.  
  114. CScreen :: ~CScreen()
  115. {
  116.     rmwindows();
  117.     if (scr) CloseScreen(scr);
  118.     if (newscr) delete newscr;
  119. //    if (GfxBase) CloseLibrary((struct Library *)GfxBase);
  120. //    if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  121. }
  122.  
  123.  
  124. BOOL CScreen :: open()
  125. {
  126.     if (isopen()) return TRUE;
  127.     scr=(struct Screen *)OpenScreenTagList((struct NewScreen *)newscr, newscr->Extension);
  128.     if (isopen())
  129.     {
  130.         reopenwindows();
  131.         return TRUE;
  132.     }
  133.     else return FALSE;
  134. }
  135.  
  136.  
  137. BOOL CScreen :: isopen() { return (scr!=NULL); }
  138.  
  139.  
  140. void CScreen :: close()
  141. {
  142.     if (isopen())
  143.     {
  144.         closewindows();
  145.         newscr->LeftEdge=scr->LeftEdge;
  146.         newscr->TopEdge=scr->TopEdge;
  147.         newscr->Width=scr->Width;
  148.         newscr->Height=scr->Height;
  149.         CloseScreen(scr);
  150.         scr=NULL;
  151.     }
  152. }
  153.  
  154.  
  155. void CScreen :: update()
  156. {
  157.     if (isopen())
  158.     {
  159.         closewindows();
  160.         CloseScreen(scr);
  161.         scr=(struct Screen *)OpenScreenTagList((struct NewScreen *)newscr, newscr->Extension);
  162.         openwindows();
  163.     }    
  164. }
  165.  
  166. void CScreen :: resize(int x, int y)
  167. {
  168.     newscr->Width=x;
  169.     newscr->Height=y;
  170.     update();
  171. }
  172.  
  173.  
  174. void CScreen :: setviewmodes(UWORD modes)
  175. {
  176.     newscr->ViewModes=modes;
  177.     update();
  178. }
  179.  
  180.  
  181. void CScreen :: move(int x, int y)
  182. {
  183.     newscr->LeftEdge+=x;
  184.     newscr->TopEdge+=y;
  185.     if (isopen()) MoveScreen(scr,x,y);
  186. }
  187.  
  188.  
  189. void CScreen :: setpos(int x, int y)
  190. {
  191.     newscr->LeftEdge=x;
  192.     newscr->TopEdge=y;
  193.     if (isopen()) MoveScreen(scr,x-scr->LeftEdge,y-scr->TopEdge);
  194. }
  195.  
  196.  
  197. void CScreen :: tofront()
  198. {
  199.     if (!isopen()) ScreenToFront(scr);
  200. }
  201.  
  202.  
  203. void CScreen :: toback()
  204. {
  205.     if (!isopen()) ScreenToBack(scr);
  206. }
  207.  
  208.  
  209. void CScreen :: showtitle(BOOL ok)
  210. {
  211.     if (isopen()) ShowTitle(scr, ok);
  212. }
  213.  
  214.  
  215. void CScreen :: beep()
  216. {
  217.     if (isopen()) DisplayBeep(scr);
  218. }
  219.  
  220.  
  221. int CScreen :: leftedge() { return isopen()?scr->LeftEdge:newscr->LeftEdge; }
  222.  
  223. int CScreen :: topedge() { return isopen()?scr->TopEdge:newscr->TopEdge; }
  224.  
  225. int CScreen :: width() { return isopen()?scr->Width:newscr->Width; }
  226.  
  227. int CScreen :: height() { return isopen()?scr->Height:newscr->Height; }
  228.  
  229. int CScreen :: mousex()
  230. {
  231.     if (!isopen()) return 0;
  232.     return scr->MouseX;
  233. }
  234.  
  235. int CScreen :: mousey()
  236. {
  237.     if (!isopen()) return 0;
  238.     return scr->MouseY;
  239. }
  240.  
  241.  
  242. BOOL CScreen :: linkwindow(CWindow& window)
  243. {
  244. CWNode *node;
  245.     if ((node=new CWNode)==NULL) return FALSE;
  246.     if (node->wasopen=window.isopen()) window.close();
  247.     if (window.screen) window.screen->rmwindow(window);
  248.     window.screen=this;
  249.     node->wn=&window;
  250.     node->nextwnode=cwlist;
  251.     if (isopen() && node->wasopen) window.open();
  252.     cwlist=node;
  253.     return TRUE;
  254. }
  255.  
  256.  
  257. CWindow * CScreen :: rmwindow(CWindow& window)
  258. {
  259. CWNode *oldnode,*n;
  260.     if (cwlist==NULL) return NULL;
  261.     if (cwlist->wn==&window)
  262.     {
  263.         cwlist->wn->close();
  264.         cwlist->wn->screen=NULL;
  265.         oldnode=cwlist;
  266.         cwlist=cwlist->nextwnode;
  267.         delete oldnode;
  268.         return &window;
  269.     }
  270.     for (n=cwlist;n->nextwnode;n=n->nextwnode)
  271.     {
  272.         if (n->nextwnode->wn==&window)
  273.         {
  274.             n->wn->close();
  275.             n->wn->screen=NULL;
  276.             oldnode=n->nextwnode;
  277.             n->nextwnode=n->nextwnode->nextwnode;
  278.             delete oldnode;
  279.             return &window;
  280.         }
  281.     }
  282.     return NULL;
  283. }
  284.  
  285.  
  286. void CScreen :: rmwindows()
  287. {
  288. CWNode *nextnode;
  289.     while (cwlist)
  290.     {
  291.         cwlist->wn->close();
  292.         cwlist->wn->screen=NULL;
  293.         nextnode=cwlist->nextwnode;
  294.         delete cwlist;
  295.         cwlist=nextnode;
  296.     }
  297. }
  298.  
  299.  
  300. void CScreen :: openwindows()
  301. {
  302. CWNode *n;
  303.     if (!isopen()) return;
  304.     for (n=cwlist;n;n=n->nextwnode)
  305.     {
  306.         if (n->wn->isopen()) n->wn->close();
  307.         if (n->wasopen) n->wn->open();
  308.     }
  309. }
  310.  
  311.  
  312. void CScreen :: reopenwindows()
  313. {
  314. CWNode *n;
  315.     if (!isopen()) return;
  316.     for (n=cwlist;n;n=n->nextwnode)
  317.     {
  318.         if (n->wn->isopen())
  319.         {
  320.             n->wasopen=TRUE;
  321.             n->wn->close();
  322.         }
  323.         if (n->wasopen) n->wn->open();
  324.     }
  325. }
  326.  
  327.  
  328. void CScreen :: closewindows()
  329. {
  330. CWNode *n;
  331.     for (n=cwlist;n;n=n->nextwnode)
  332.         if (n->wasopen=n->wn->isopen()) n->wn->close();
  333. }
  334.  
  335.  
  336.  
  337. void CScreen :: openallwindows()
  338. {
  339. CWNode *n;
  340.     if (!isopen()) return;
  341.     for (n=cwlist;n;n=n->nextwnode)
  342.     {
  343.         if (n->wn->isopen()) n->wn->close();
  344.         n->wn->newwind->Screen=scr;
  345.         n->wn->newwind->Type=CUSTOMSCREEN;
  346.         n->wn->open();
  347.     }
  348. }
  349.  
  350.  
  351. void CScreen :: closeallwindows()
  352. {
  353. CWNode *n;
  354.     for (n=cwlist;n;n=n->nextwnode)
  355.     {
  356.         n->wn->close();
  357.         n->wn->newwind->Screen=NULL;
  358.         n->wn->newwind->Type=WBENCHSCREEN;
  359.     }
  360. }
  361.  
  362.  
  363.  
  364.