home *** CD-ROM | disk | FTP | other *** search
- #include "defs.h"
- #include <stdarg.h>
-
- char prefFontName[128] = "grn.font"; // name of preference font (defaults to grn.font)
- UWORD prefFontSize = 8; // defaults to 8
- UWORD prefWidth = 640, prefHeight = 400; // 640x400 or whatever is in tooltypes
- UWORD prefTop = 0, prefLeft = 0; // defaults to top right edge of screen!
-
- /*
- * List of libraries used
- */
- IBASE *IntuitionBase = 0;
- LIBRARY *GfxBase = 0;
- LIBRARY *DiskfontBase = 0;
- LIBRARY *AslBase = 0;
- LIBRARY *GadToolsBase = 0;
- LIBRARY *WorkbenchBase = 0;
- LIBRARY *IconBase = 0;
- LIBRARY *CxBase = 0;
-
- /*
- * Array of library names/base pointers. To open an additional library, define
- * the base above and add a line here.
- */
- LIBDEFS libDefs[] = {
- "intuition.library",(APTR *)&IntuitionBase,
- "graphics.library",(APTR *)&GfxBase,
- "diskfont.library",(APTR *)&DiskfontBase,
- "asl.library",(APTR *)&AslBase,
- "gadtools.library",(APTR *)&GadToolsBase,
- "workbench.library", (APTR *)&WorkbenchBase,
- "icon.library", (APTR *)&IconBase,
- "commodities.library", (APTR *)&CxBase,
- 0,0
- };
-
- /*
- * Global variables
- */
- VINFO *vi = 0;
- SCREEN *screen = 0;
- VPORT *vp;
- RPORT *rp;
-
- RPORT topazRastPort, *topazRP = &topazRastPort;
-
- BOOL customScreenFlag = 0;
-
- /*
- * This text attribute is the default text attribute used for various
- * features. It should be openable via OpenFont(), which implies an
- * OpenDiskFont() call to load it into memory. In this case, defaultFontAttr
- * is a ROM font, so I don't bother. BEWARE if you choose another !!!
- */
- TATTR topaz80 = { "topaz.font", 8, 0,0 };
- TATTR defaultFontAttr = { "grn.font", 8, 0,0 };
- FONT *defaultFont = 0, *topaz80Font = 0;
-
- /*
- * Without this look3D array passed to the OpenScreenTags() call, you
- * don't get the 3D effect. Why this isn't the default, only CBM knows :)
- */
- UWORD look3D[] = { ~0, };
-
- /*
- * This rect structure contains the overscan info for what size the screen
- * should be!
- */
- RECT oscanRect;
- short screenWidth, screenHeight; /* computed width and height of screen */
- short screenTop; /* computed below title bar */
-
- /************************************************************************/
-
- /*
- * These might be the shortest open/close library routines ever :)
- */
- void CloseLibs(LIBDEFS libDefs[]) {
- short i;
-
- for (i=0; libDefs[i+1].name; i++);
- while (i >= 0) {
- if (*libDefs[i].base) CloseLibrary((LIBRARY *)*libDefs[i].base);
- *libDefs[i--].base = 0;
- }
- }
-
- void OpenLibs(LIBDEFS libDefs[]) {
- short i;
-
- for (i=0; libDefs[i].name; i++) {
- *libDefs[i].base = (APTR)OpenLibrary(libDefs[i].name, 0);
- panic0(*libDefs[i].base, "Can't open %s", libDefs[i].name);
- }
- }
-
- /************************************************************************/
-
- /*
- * gadgetList = CreateGadgets(gadDefs);
- * GADGET *gadgetList; list of created gadgets
- * GADDEF gadDefs[]; array of gadget initializations
- *
- * Synopsis:
- * Pass in a gadDefs, and you get an initialized list of gadgets,
- * suitable for linking to a window for GadTools.
- */
- GADGET *CreateGadgets(GADGET *gadArray[], GADDEF gadDefs[]) {
- GADGET *gadget, *glist = 0;
- short i;
- NEWGAD ng;
-
- gadget = CreateContext(&glist);
- panic0(gadget, "Can't CreateContext");
- for (i=0; gadDefs[i].tags; i++) {
- ng.ng_GadgetID = i;
- if (gadDefs[i].kind != LISTVIEW_KIND)
- ng.ng_TextAttr = &topaz80;
- else
- ng.ng_TextAttr = &defaultFontAttr;
- ng.ng_VisualInfo = vi;
- ng.ng_LeftEdge = gadDefs[i].left;
- ng.ng_TopEdge = gadDefs[i].top;
- ng.ng_Width = gadDefs[i].width;
- ng.ng_Height = gadDefs[i].height;
- ng.ng_GadgetText = gadDefs[i].text;
- ng.ng_Flags = gadDefs[i].flags;
- gadArray[i] = gadget = CreateGadgetA(gadDefs[i].kind, gadget, &ng, gadDefs[i].tags);
- panic0(gadget, "Can't CreateGadget");
- }
- return glist;
- }
-
- /************************************************************************/
-
- short TextLen(rp, txt)
- RPORT *rp;
- char *txt;
- {
- return TextLength(rp, txt, strlen(txt));
- }
-
- static int
- _swrite(buf, n1, n2, sst)
- const char *buf;
- size_t n1;
- size_t n2;
- const char **sst;
- {
- size_t n;
-
- if (n1 == 1)
- n = n2;
- else if (n2 == 1)
- n = n1;
- else
- n = n1 * n2;
-
- _slow_bcopy(buf, *sst, n);
- *sst += n;
- return(n2);
- }
-
- /*
- * void t_printf(fmt, ...);
- * char *fmt;
- *
- * Synopsis:
- * Similar to printf, except the results end up at the end of the
- * "event" listview. Only 4 args supported to printf...
- */
- void t_printf(WINDOW *win, const char *fmt, ...) {
- static char buf[128];
- extern WINDOW *mainWindow;
- char *ptr = &buf[0];
- va_list va;
-
- va_start(va, fmt);
- if (!win) win = mainWindow;
- _pfmt(fmt, va, _swrite, &ptr);
- *ptr = 0;
- SetWindowTitles(win, buf, GRN_VERSION);
- va_end(va);
- }
-
- /************************************************************************/
-
- /*
- * void GadgetUp(m);
- * IMSG *m; ptr to IntuiMessage received
- *
- * Synopsis:
- * Handles Gadtools/Intuition GADGETUP events. For 2.0 and GadTools, the TAB and HELP
- * keys are special. This routine handles these events, also.
- *
- * NOTES:
- * STRINGA_ExitHelp is not defined in any of the headers I got with SAS 5.10a, so the
- * HELP feature doesn't work.
- */
- static void GadgetUp(void (*func)(), IMSG *m) {
- GADGET *gad = (GADGET *)m->IAddress;
-
- (*func)(gad->GadgetID, m->Code);
- }
-
- /*
- * void GadgetDown(m);
- * IMSG *m; ptr to IntuiMessage received
- *
- * Synopsis:
- * Handles Gadtools/Intuition GADGETDOWN events.
- */
- static void GadgetDown(void (*func)(), IMSG *m) {
- GADGET *gad = (GADGET *)m->IAddress;
-
- (*func)(gad->GadgetID, m->Code);
- }
-
- /*
- * void MouseMove(m);
- * IMSG *m; ptr to IntuiMessage received
- *
- * Synopsis:
- * Handles Gadtools/Intuition MOUSEMOVE events.
- */
- static void MouseMove(void (*func)(), IMSG *m) {
- GADGET *gad = (GADGET *)m->IAddress;
-
- (*func)(gad->GadgetID, m->Code);
- }
-
- /************************************************************************/
-
- void InitSystem() {
- ULONG modeID;
-
- OpenLibs(&libDefs[0]);
-
- defaultFontAttr.ta_Name = (STRPTR)&prefFontName[0];
- defaultFontAttr.ta_YSize = prefFontSize;
-
- defaultFont = OpenDiskFont(&defaultFontAttr);
- panic0(defaultFont, "Can't OpenDiskFont(%s)", prefFontName);
- topaz80Font = OpenDiskFont(&topaz80);
- panic0(topaz80Font, "Can't open topaz80 font");
- InitRastPort(topazRP);
- SetFont(topazRP, topaz80Font);
-
- #ifdef MYKE_REMOVED_THIS
- From Peter Cherna!
-
- if ( wbscreen = LockPubScreen("Workbench") )
- {
- if ( ( modeID = GetVPModeID( &wbscreen->ViewPort ) ) != INVALID_ID )
- {
- if ( QueryOverscan( modeID, &rect, OSCAN_TEXT ) )
- {
- /* got it */
- }
- }
- UnlockPubScreen( NULL, wbscreen );
- }
- #endif
-
- screen = LockPubScreen(NULL);
- panic0(screen, "Can't lockpubscreen");
- if ((modeID = GetVPModeID( &screen->ViewPort)) == INVALID_ID) panic("Can'g GetVPModeID()");
- panic0(QueryOverscan(modeID, &oscanRect, OSCAN_TEXT), "Can't QueryOverscan()");
- screenWidth = (oscanRect.MaxX - oscanRect.MinX + 1);
- screenHeight = (oscanRect.MaxY - oscanRect.MinY + 1);
-
- if (screenHeight < prefHeight || screenWidth < prefWidth) {
- UnlockPubScreen(NULL, screen);
-
- modeID = (prefHeight < 400) ? HIRES_KEY : HIRESLACE_KEY;
- panic0(QueryOverscan(modeID, &oscanRect, OSCAN_TEXT), "Can't QueryOverScan()");
-
- screenWidth = (oscanRect.MaxX - oscanRect.MinX + 1);
- screenHeight = (oscanRect.MaxY - oscanRect.MinY + 1);
- screen = OpenScreenTags(NULL,
- SA_DClip, &oscanRect,
- #ifdef MYKE_REMOVED_THIS
- SA_SysFont, 1,
- #endif
- SA_Left,0,
- SA_Top,0,
- SA_Width,screenWidth,
- SA_Height,screenHeight,
- SA_Depth,2,
- SA_DetailPen,0,
- SA_BlockPen,1,
- SA_Title, GRN_VERSION,
- SA_ErrorCode,0,
- #ifdef MYKE_REMOVED_THIS
- SA_SysFont,0,
- #endif
- SA_Type,CUSTOMSCREEN,
- SA_ShowTitle,TRUE,
- SA_Pens,&look3D[0],
- SA_DisplayID,HIRESLACE_KEY,
- TAG_DONE
- );
- panic0(screen, "Can't open screen");
- customScreenFlag = !0;
- }
-
- screenTop = screen->BarHeight+1;
- screenWidth = screen->Width;
- screenHeight = screen->Height;
-
- rp = &screen->RastPort;
- vp = &screen->ViewPort;
- vi = GetVisualInfo(screen, TAG_DONE);
- panic0(vi, "Can't GetVisualInfo");
- }
-
-
- void CloseSystem() {
- if (topaz80Font) {
- CloseFont(topaz80Font);
- topaz80Font = 0;
- }
- if (defaultFont) {
- CloseFont(defaultFont);
- defaultFont = 0;
- }
- if (screen) {
- if (customScreenFlag) {
- CloseScreen(screen);
- }
- else {
- UnlockPubScreen(NULL, screen);
- }
- screen = 0;
- }
- if (vi) {
- FreeVisualInfo(vi);
- vi = 0;
- }
- CloseLibs(&libDefs[0]);
- }
-
- WINDOW *CreateWindow(gList, left, top, width, height, title)
- GADGET *gList;
- short left, top, width, height;
- char *title;
- {
- WINDOW *window;
-
- if (!top) top = screenTop+1;
-
- if (customScreenFlag) {
- window = OpenWindowTags(NULL,
- WA_Left,left,
- WA_Top,top,
- WA_Width,width,
- WA_Height,height,
- WA_DetailPen,0,
- WA_BlockPen,1,
- WA_IDCMP,MYIDCMP,
- WA_Gadgets,gList,
- WA_Title,0,
- WA_CustomScreen,screen,
- WA_SuperBitMap,0,
- WA_MinWidth,30,
- WA_MinHeight,30,
- WA_MaxWidth,-1,
- WA_MaxHeight,-1,
- WA_SizeGadget,FALSE,
- WA_DragBar,TRUE,
- WA_DepthGadget,TRUE,
- WA_CloseGadget,TRUE,
- WA_Backdrop,FALSE,
- WA_ReportMouse,FALSE,
- WA_Borderless,FALSE,
- WA_Activate,TRUE,
- WA_RMBTrap,FALSE,
- WA_SimpleRefresh,TRUE,
- TAG_DONE
- );
- }
- else {
- window = OpenWindowTags(NULL,
- WA_Left,left,
- WA_Top,top,
- WA_Width,width,
- WA_Height,height,
- WA_DetailPen,0,
- WA_BlockPen,1,
- WA_IDCMP,MYIDCMP,
- WA_Gadgets,gList,
- WA_Title,title,
- WA_SuperBitMap,0,
- WA_MinWidth,30,
- WA_MinHeight,30,
- WA_MaxWidth,-1,
- WA_MaxHeight,-1,
- WA_SizeGadget,FALSE,
- WA_DragBar,TRUE,
- WA_DepthGadget,TRUE,
- WA_CloseGadget,TRUE,
- WA_Backdrop,FALSE,
- WA_ReportMouse,FALSE,
- WA_Borderless,FALSE,
- WA_Activate,TRUE,
- WA_RMBTrap,FALSE,
- WA_SimpleRefresh,TRUE,
- TAG_DONE
- );
- }
- if (window) GT_RefreshWindow(window, NULL);
- return window;
- }
-
- void DefaultIDCMPFunc(window, m)
- WINDOW *window;
- IMSG *m;
- {
- switch (m->Class) {
- case IDCMP_RAWKEY:
- if (m->Code & 0x80) break;
- t_printf(window, "RAWKEY Class = %x Code = %x", m->Class, m->Code);
- break;
-
- case IDCMP_VANILLAKEY:
- t_printf(window, "VANILLAKEY Class = %x Code = %x", m->Class, m->Code);
- break;
-
- case IDCMP_MOUSEBUTTONS:
- if (m->Code == MENUUP || m->Code == SELECTUP) break;
- t_printf(window, "MouseButtons Code = %x, x,y = %d,%d", m->Code, m->MouseX, m->MouseY);
- break;
-
- default:
- t_printf(window, "Class = %x Code = %x", m->Class, m->Code);
- break;
- }
- }
-
-
- void EventHandler(window, handleFunc, idcmpFunc, refreshFunc)
- WINDOW *window;
- void (*handleFunc)();
- void (*idcmpFunc)();
- void (*refreshFunc)();
- {
- IMSG *m, msg;
-
- while (m = GT_GetIMsg(window->UserPort)) {
- msg = *m;
- GT_ReplyIMsg(m);
-
- switch (msg.Class) {
- case IDCMP_INTUITICKS:
- break;
-
- case IDCMP_MOUSEMOVE:
- MouseMove(handleFunc, &msg);
- break;
-
- case IDCMP_GADGETUP:
- GadgetUp(handleFunc, &msg);
- break;
-
- case IDCMP_GADGETDOWN:
- GadgetDown(handleFunc, &msg);
- break;
-
- case IDCMP_REFRESHWINDOW:
- GT_BeginRefresh(window);
- if (refreshFunc)(*refreshFunc)();
- GT_EndRefresh(window, TRUE);
- break;
- default:
- if (idcmpFunc)
- (*idcmpFunc)(&msg);
- else
- DefaultIDCMPFunc(window, &msg);
- break;
- }
- }
- }
-