home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / comms / network / grn1asrc.lha / system.c < prev    next >
C/C++ Source or Header  |  1992-05-20  |  11KB  |  483 lines

  1. #include    "defs.h"
  2. #include    <stdarg.h>
  3.  
  4. char    prefFontName[128] = "grn.font";        // name of preference font (defaults to grn.font)
  5. UWORD    prefFontSize = 8;            // defaults to 8 
  6. UWORD    prefWidth = 640, prefHeight = 400;    // 640x400 or whatever is in tooltypes
  7. UWORD    prefTop = 0, prefLeft = 0;        // defaults to top right edge of screen!
  8.  
  9. /*
  10.  * List of libraries used
  11.  */
  12. IBASE    *IntuitionBase = 0;
  13. LIBRARY    *GfxBase = 0;
  14. LIBRARY    *DiskfontBase = 0;
  15. LIBRARY    *AslBase = 0;
  16. LIBRARY    *GadToolsBase = 0;
  17. LIBRARY    *WorkbenchBase = 0;
  18. LIBRARY    *IconBase = 0;
  19. LIBRARY    *CxBase = 0;
  20.  
  21. /*
  22.  * Array of library names/base pointers.  To open an additional library, define
  23.  * the base above and add a line here.
  24.  */
  25. LIBDEFS    libDefs[] = {
  26.     "intuition.library",(APTR *)&IntuitionBase,
  27.     "graphics.library",(APTR *)&GfxBase,
  28.     "diskfont.library",(APTR *)&DiskfontBase,
  29.     "asl.library",(APTR *)&AslBase,
  30.     "gadtools.library",(APTR *)&GadToolsBase,
  31.     "workbench.library", (APTR *)&WorkbenchBase,
  32.     "icon.library", (APTR *)&IconBase,
  33.     "commodities.library", (APTR *)&CxBase,
  34.     0,0
  35. };
  36.  
  37. /*
  38.  * Global variables
  39.  */
  40. VINFO    *vi = 0;
  41. SCREEN    *screen = 0;
  42. VPORT    *vp;
  43. RPORT    *rp;
  44.  
  45. RPORT    topazRastPort, *topazRP = &topazRastPort;
  46.  
  47. BOOL    customScreenFlag = 0;
  48.  
  49. /*
  50.  * This text attribute is the default text attribute used for various
  51.  * features.  It should be openable via OpenFont(), which implies an
  52.  * OpenDiskFont() call to load it into memory.  In this case, defaultFontAttr
  53.  * is a ROM font, so I don't bother.  BEWARE if you choose another !!!
  54.  */
  55. TATTR    topaz80 = { "topaz.font", 8, 0,0 };
  56. TATTR    defaultFontAttr = { "grn.font", 8, 0,0 };
  57. FONT    *defaultFont = 0, *topaz80Font = 0;
  58.  
  59. /*
  60.  * Without this look3D array passed to the OpenScreenTags() call, you
  61.  * don't get the 3D effect.  Why this isn't the default, only CBM knows :)
  62.  */
  63. UWORD    look3D[] = { ~0, };
  64.  
  65. /*
  66.  * This rect structure contains the overscan info for what size the screen
  67.  * should be!
  68.  */
  69. RECT    oscanRect;
  70. short    screenWidth, screenHeight;    /* computed width and height of screen */
  71. short    screenTop;            /* computed below title bar */
  72.  
  73. /************************************************************************/
  74.  
  75. /*
  76.  * These might be the shortest open/close library routines ever :)
  77.  */
  78. void    CloseLibs(LIBDEFS libDefs[]) {
  79.     short    i;
  80.  
  81.     for (i=0; libDefs[i+1].name; i++);
  82.     while (i >= 0) {
  83.         if (*libDefs[i].base) CloseLibrary((LIBRARY *)*libDefs[i].base);
  84.         *libDefs[i--].base = 0;
  85.     }
  86. }
  87.  
  88. void    OpenLibs(LIBDEFS libDefs[]) {
  89.     short    i;
  90.  
  91.     for (i=0; libDefs[i].name; i++) {
  92.         *libDefs[i].base = (APTR)OpenLibrary(libDefs[i].name, 0);
  93.         panic0(*libDefs[i].base, "Can't open %s", libDefs[i].name);
  94.     }
  95. }
  96.  
  97. /************************************************************************/
  98.  
  99. /*
  100.  * gadgetList = CreateGadgets(gadDefs);
  101.  * GADGET    *gadgetList;        list of created gadgets
  102.  * GADDEF    gadDefs[];        array of gadget initializations
  103.  *
  104.  * Synopsis:
  105.  *    Pass in a gadDefs, and you get an initialized list of gadgets,
  106.  *    suitable for linking to a window for GadTools.
  107.  */
  108. GADGET    *CreateGadgets(GADGET *gadArray[], GADDEF gadDefs[]) {
  109.     GADGET    *gadget, *glist = 0;
  110.     short    i;
  111.     NEWGAD    ng;
  112.  
  113.     gadget = CreateContext(&glist);
  114.     panic0(gadget, "Can't CreateContext");
  115.     for (i=0; gadDefs[i].tags; i++) {
  116.         ng.ng_GadgetID = i;
  117.         if (gadDefs[i].kind != LISTVIEW_KIND)
  118.             ng.ng_TextAttr = &topaz80;
  119.         else
  120.             ng.ng_TextAttr = &defaultFontAttr;
  121.         ng.ng_VisualInfo = vi;
  122.         ng.ng_LeftEdge = gadDefs[i].left;
  123.         ng.ng_TopEdge = gadDefs[i].top;
  124.         ng.ng_Width = gadDefs[i].width;
  125.         ng.ng_Height = gadDefs[i].height;
  126.         ng.ng_GadgetText = gadDefs[i].text;
  127.         ng.ng_Flags = gadDefs[i].flags;
  128.         gadArray[i] = gadget = CreateGadgetA(gadDefs[i].kind, gadget, &ng, gadDefs[i].tags);
  129.         panic0(gadget, "Can't CreateGadget");
  130.     }
  131.     return glist;
  132. }
  133.  
  134. /************************************************************************/
  135.  
  136. short    TextLen(rp, txt)
  137. RPORT    *rp;
  138. char    *txt;
  139. {
  140.     return TextLength(rp, txt, strlen(txt));
  141. }
  142.  
  143. static int
  144. _swrite(buf, n1, n2, sst)
  145. const char *buf;
  146. size_t n1;
  147. size_t n2;
  148. const char **sst;
  149. {
  150.     size_t n;
  151.  
  152.     if (n1 == 1)
  153.     n = n2;
  154.     else if (n2 == 1)
  155.     n = n1;
  156.     else
  157.     n = n1 * n2;
  158.  
  159.     _slow_bcopy(buf, *sst, n);
  160.     *sst += n;
  161.     return(n2);
  162. }
  163.  
  164. /*
  165.  * void    t_printf(fmt, ...);
  166.  * char        *fmt;
  167.  *
  168.  * Synopsis:
  169.  *    Similar to printf, except the results end up at the end of the
  170.  *    "event" listview.  Only 4 args supported to printf...
  171.  */
  172. void    t_printf(WINDOW *win, const char *fmt, ...) {
  173.     static char    buf[128];
  174.     extern WINDOW    *mainWindow;
  175.     char         *ptr = &buf[0];
  176.     va_list        va;
  177.  
  178.     va_start(va, fmt);
  179.     if (!win) win = mainWindow;
  180.     _pfmt(fmt, va, _swrite, &ptr);
  181.     *ptr = 0;
  182.     SetWindowTitles(win, buf, GRN_VERSION);
  183.     va_end(va);
  184. }
  185.  
  186. /************************************************************************/
  187.  
  188. /*
  189.  * void    GadgetUp(m);
  190.  * IMSG    *m;        ptr to IntuiMessage received
  191.  *
  192.  * Synopsis:
  193.  *    Handles Gadtools/Intuition GADGETUP events.  For 2.0 and GadTools, the TAB and HELP
  194.  *    keys are special.  This routine handles these events, also.
  195.  *
  196.  * NOTES:
  197.  *    STRINGA_ExitHelp is not defined in any of the headers I got with SAS 5.10a, so the
  198.  *    HELP feature doesn't work.
  199.  */
  200. static void    GadgetUp(void (*func)(), IMSG *m) {
  201.     GADGET    *gad = (GADGET *)m->IAddress;
  202.  
  203.     (*func)(gad->GadgetID, m->Code);
  204. }
  205.  
  206. /*
  207.  * void    GadgetDown(m);
  208.  * IMSG    *m;        ptr to IntuiMessage received
  209.  *
  210.  * Synopsis:
  211.  *    Handles Gadtools/Intuition GADGETDOWN events.
  212.  */
  213. static void    GadgetDown(void (*func)(), IMSG *m) {
  214.     GADGET    *gad = (GADGET *)m->IAddress;
  215.  
  216.     (*func)(gad->GadgetID, m->Code);
  217. }
  218.  
  219. /*
  220.  * void    MouseMove(m);
  221.  * IMSG    *m;        ptr to IntuiMessage received
  222.  *
  223.  * Synopsis:
  224.  *    Handles Gadtools/Intuition MOUSEMOVE events.
  225.  */
  226. static void    MouseMove(void (*func)(), IMSG *m) {
  227.     GADGET    *gad = (GADGET *)m->IAddress;
  228.  
  229.     (*func)(gad->GadgetID, m->Code);
  230. }
  231.  
  232. /************************************************************************/
  233.  
  234. void    InitSystem() {
  235.     ULONG    modeID;
  236.  
  237.     OpenLibs(&libDefs[0]);
  238.  
  239.     defaultFontAttr.ta_Name = (STRPTR)&prefFontName[0];
  240.     defaultFontAttr.ta_YSize = prefFontSize;
  241.  
  242.     defaultFont = OpenDiskFont(&defaultFontAttr);
  243.     panic0(defaultFont, "Can't OpenDiskFont(%s)", prefFontName);
  244.     topaz80Font = OpenDiskFont(&topaz80);
  245.     panic0(topaz80Font, "Can't open topaz80 font");
  246.     InitRastPort(topazRP);
  247.     SetFont(topazRP, topaz80Font);
  248.  
  249. #ifdef MYKE_REMOVED_THIS
  250.     From Peter Cherna!
  251.  
  252.     if ( wbscreen = LockPubScreen("Workbench") )
  253.     {
  254.         if ( ( modeID = GetVPModeID( &wbscreen->ViewPort ) ) != INVALID_ID )
  255.         {
  256.         if ( QueryOverscan( modeID, &rect, OSCAN_TEXT ) )
  257.         {
  258.            /* got it */
  259.         }
  260.         }
  261.         UnlockPubScreen( NULL, wbscreen );
  262.     }
  263. #endif
  264.     
  265.     screen = LockPubScreen(NULL);
  266.     panic0(screen, "Can't lockpubscreen");
  267.     if ((modeID = GetVPModeID( &screen->ViewPort)) == INVALID_ID) panic("Can'g GetVPModeID()");
  268.     panic0(QueryOverscan(modeID, &oscanRect, OSCAN_TEXT), "Can't QueryOverscan()");
  269.     screenWidth = (oscanRect.MaxX - oscanRect.MinX + 1);
  270.     screenHeight = (oscanRect.MaxY - oscanRect.MinY + 1);
  271.  
  272.     if (screenHeight < prefHeight || screenWidth < prefWidth) {
  273.         UnlockPubScreen(NULL, screen);
  274.  
  275.         modeID = (prefHeight < 400) ? HIRES_KEY : HIRESLACE_KEY;
  276.         panic0(QueryOverscan(modeID, &oscanRect, OSCAN_TEXT), "Can't QueryOverScan()");
  277.  
  278.         screenWidth = (oscanRect.MaxX - oscanRect.MinX + 1);
  279.         screenHeight = (oscanRect.MaxY - oscanRect.MinY + 1);
  280.         screen = OpenScreenTags(NULL, 
  281.             SA_DClip, &oscanRect,
  282. #ifdef MYKE_REMOVED_THIS
  283.             SA_SysFont, 1,
  284. #endif
  285.             SA_Left,0,
  286.             SA_Top,0,
  287.             SA_Width,screenWidth,
  288.             SA_Height,screenHeight,
  289.             SA_Depth,2,
  290.             SA_DetailPen,0,
  291.             SA_BlockPen,1,
  292.             SA_Title, GRN_VERSION,
  293.             SA_ErrorCode,0,
  294. #ifdef MYKE_REMOVED_THIS
  295.             SA_SysFont,0,
  296. #endif
  297.             SA_Type,CUSTOMSCREEN,
  298.             SA_ShowTitle,TRUE,
  299.             SA_Pens,&look3D[0],
  300.             SA_DisplayID,HIRESLACE_KEY,
  301.             TAG_DONE
  302.         );
  303.         panic0(screen, "Can't open screen");
  304.         customScreenFlag = !0;
  305.     }
  306.  
  307.     screenTop = screen->BarHeight+1;
  308.     screenWidth = screen->Width;
  309.     screenHeight = screen->Height;
  310.  
  311.     rp = &screen->RastPort;
  312.     vp = &screen->ViewPort;
  313.     vi = GetVisualInfo(screen, TAG_DONE);
  314.     panic0(vi, "Can't GetVisualInfo");
  315. }
  316.  
  317.  
  318. void    CloseSystem() {
  319.     if (topaz80Font) {
  320.         CloseFont(topaz80Font);
  321.         topaz80Font = 0;
  322.     }
  323.     if (defaultFont) {
  324.         CloseFont(defaultFont);
  325.         defaultFont = 0;
  326.     }
  327.     if (screen) {
  328.         if (customScreenFlag) {
  329.             CloseScreen(screen);
  330.         }
  331.         else {
  332.             UnlockPubScreen(NULL, screen);
  333.         }
  334.         screen = 0;
  335.     }
  336.     if (vi) {
  337.         FreeVisualInfo(vi);
  338.         vi = 0;
  339.     }
  340.     CloseLibs(&libDefs[0]);
  341. }
  342.  
  343. WINDOW    *CreateWindow(gList, left, top, width, height, title)
  344. GADGET    *gList;
  345. short    left, top, width, height;
  346. char    *title;
  347. {
  348.     WINDOW    *window;
  349.  
  350.     if (!top) top = screenTop+1;
  351.  
  352.     if (customScreenFlag) {
  353.         window = OpenWindowTags(NULL, 
  354.             WA_Left,left,
  355.             WA_Top,top,
  356.             WA_Width,width,
  357.             WA_Height,height,
  358.             WA_DetailPen,0,
  359.             WA_BlockPen,1,
  360.             WA_IDCMP,MYIDCMP,
  361.             WA_Gadgets,gList,
  362.             WA_Title,0,
  363.             WA_CustomScreen,screen,
  364.             WA_SuperBitMap,0,
  365.             WA_MinWidth,30,
  366.             WA_MinHeight,30,
  367.             WA_MaxWidth,-1,
  368.             WA_MaxHeight,-1,
  369.             WA_SizeGadget,FALSE,
  370.             WA_DragBar,TRUE,
  371.             WA_DepthGadget,TRUE,
  372.             WA_CloseGadget,TRUE,
  373.             WA_Backdrop,FALSE,
  374.             WA_ReportMouse,FALSE,
  375.             WA_Borderless,FALSE,
  376.             WA_Activate,TRUE,
  377.             WA_RMBTrap,FALSE,
  378.             WA_SimpleRefresh,TRUE,
  379.             TAG_DONE
  380.         );
  381.     }
  382.     else {
  383.         window = OpenWindowTags(NULL, 
  384.             WA_Left,left,
  385.             WA_Top,top,
  386.             WA_Width,width,
  387.             WA_Height,height,
  388.             WA_DetailPen,0,
  389.             WA_BlockPen,1,
  390.             WA_IDCMP,MYIDCMP,
  391.             WA_Gadgets,gList,
  392.             WA_Title,title,
  393.             WA_SuperBitMap,0,
  394.             WA_MinWidth,30,
  395.             WA_MinHeight,30,
  396.             WA_MaxWidth,-1,
  397.             WA_MaxHeight,-1,
  398.             WA_SizeGadget,FALSE,
  399.             WA_DragBar,TRUE,
  400.             WA_DepthGadget,TRUE,
  401.             WA_CloseGadget,TRUE,
  402.             WA_Backdrop,FALSE,
  403.             WA_ReportMouse,FALSE,
  404.             WA_Borderless,FALSE,
  405.             WA_Activate,TRUE,
  406.             WA_RMBTrap,FALSE,
  407.             WA_SimpleRefresh,TRUE,
  408.             TAG_DONE
  409.         );
  410.     }
  411.     if (window) GT_RefreshWindow(window, NULL);
  412.     return window;
  413. }
  414.  
  415. void    DefaultIDCMPFunc(window, m)
  416. WINDOW    *window;
  417. IMSG    *m;
  418. {
  419.     switch (m->Class) {
  420.         case IDCMP_RAWKEY:
  421.             if (m->Code & 0x80) break;
  422.             t_printf(window, "RAWKEY Class = %x Code = %x", m->Class, m->Code);
  423.             break;
  424.  
  425.         case IDCMP_VANILLAKEY:
  426.             t_printf(window, "VANILLAKEY Class = %x Code = %x", m->Class, m->Code);
  427.             break;
  428.  
  429.         case IDCMP_MOUSEBUTTONS:
  430.             if (m->Code == MENUUP || m->Code == SELECTUP) break;
  431.             t_printf(window, "MouseButtons Code = %x, x,y = %d,%d", m->Code, m->MouseX, m->MouseY);
  432.             break;
  433.  
  434.         default:
  435.             t_printf(window, "Class = %x Code = %x", m->Class, m->Code);
  436.             break;
  437.     }
  438. }
  439.  
  440.  
  441. void    EventHandler(window, handleFunc, idcmpFunc, refreshFunc) 
  442. WINDOW    *window;
  443. void    (*handleFunc)();
  444. void    (*idcmpFunc)();
  445. void    (*refreshFunc)();
  446. {
  447.     IMSG    *m, msg;
  448.  
  449.     while (m = GT_GetIMsg(window->UserPort)) {
  450.         msg = *m;
  451.         GT_ReplyIMsg(m);
  452.  
  453.         switch (msg.Class) {
  454.             case IDCMP_INTUITICKS:
  455.                 break;
  456.  
  457.             case IDCMP_MOUSEMOVE:
  458.                 MouseMove(handleFunc, &msg);
  459.                 break;
  460.  
  461.             case IDCMP_GADGETUP:
  462.                 GadgetUp(handleFunc, &msg);
  463.                 break;
  464.  
  465.             case IDCMP_GADGETDOWN:
  466.                 GadgetDown(handleFunc, &msg);
  467.                 break;
  468.  
  469.             case IDCMP_REFRESHWINDOW:
  470.                 GT_BeginRefresh(window);
  471.                 if (refreshFunc)(*refreshFunc)();
  472.                 GT_EndRefresh(window, TRUE);
  473.                 break;
  474.             default:
  475.                 if (idcmpFunc) 
  476.                     (*idcmpFunc)(&msg);
  477.                 else
  478.                     DefaultIDCMPFunc(window, &msg);
  479.                 break;
  480.         }
  481.     }
  482. }
  483.