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