mcinerny@rochester.ARPA (Michael McInerny) (10/28/86)
Bugs! Argh! Immediately after I posted the last version of SetFont, I realized that I was not CloseFont()-ing the right font. The fix is pretty simple: get the old font from the raster_port->Font field, and if the setfont is successful, then CloseFont(oldfont). Also, the code was gross, so I cleaned it up a little. I also tracked down the spurious warning messages (I hate warning 30!), so it compiles cleanly. The executable is about 17k using lc.lib and Lstartup through BLink. Have fun! -Michael P.S. Has anyone noticed that some stripped gamma .h files are broken? ---------------*clip*---*snip*--------------- /* Find CON: window pointer and set its font by A. Finkel, R. Burns, and M. McInerny )1986 by Commodore-Amiga and M. McInerny. */ #include "exec/types.h" #include "exec/nodes.h" #include "exec/ports.h" #include "exec/io.h" #include "exec/memory.h" #include "devices/console.h" #include "devices/conunit.h" #include "libraries/dos.h" #include "libraries/dosextens.h" #include "intuition/intuitionbase.h" #include "workbench/startup.h" #include "workbench/workbench.h" #include "graphics/rastport.h" #include "graphics/text.h" #include "libraries/diskfont.h" extern struct Library *OpenLibrary(); extern struct TextFont *OpenDiskFont(); struct IntuitionBase *IntuitionBase = 0; long GfxBase = 0; long DiskfontBase = 0; struct TextFont *font; struct MsgPort iorp = { {0, 0, NT_MSGPORT, 0, 0}, 0, -1, /* initialize signal to -1 */ 0, /* start with empty list */ {(struct Node *)&iorp.mp_MsgList.lh_Tail, 0, (struct Node *)&iorp.mp_MsgList.lh_Head, 0, 0} }; struct IOStdReq ior = { {{0, 0, 0, 0, 0}, &iorp, 0}, 0 /* device is zero */ }; void OpenLibs() { GfxBase = (long)OpenLibrary("graphics.library", 0); if (GfxBase == NULL) { printf("Graphics library open failed.\n"); cleanup(20); } if ((IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0)) == 0) { cleanup(21); } DiskfontBase = (long)OpenLibrary("diskfont.library", 0); if (DiskfontBase == NULL) { printf("Diskfont library open failed.\n"); cleanup(25); } } struct Window *GetWindow() { struct MsgPort *con; struct StandardPacket *packet = 0; struct InfoData *id = 0; struct Window *windw = 0; /* open the console device, returns address of device handler */ if ((OpenDevice("console.device", -1, &ior, 0)) != 0) { cleanup(30); } /* set up the message port in the I/O request */ if ((iorp.mp_SigBit = AllocSignal(-1)) < 0) { cleanup(35); } /* which task am I? */ iorp.mp_SigTask = (struct Task *) FindTask((char *) NULL); /* Try to find the console associated with calling process */ if (iorp.mp_SigTask->tc_Node.ln_Type == NT_PROCESS) { con = (struct MsgPort *) ((struct Process *) iorp.mp_SigTask)->pr_ConsoleTask; if (con != 0) { if (packet = (struct StandardPacket *) AllocMem(sizeof(*packet), MEMF_CLEAR)) { if (id = (struct InfoData *)AllocMem(sizeof(*id), MEMF_CLEAR)) { /* This is the console handlers packet port. */ packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt); packet->sp_Pkt.dp_Link = (struct Message *)&(packet->sp_Pkt); packet->sp_Pkt.dp_Port = &iorp; packet->sp_Pkt.dp_Type = ACTION_DISK_INFO; packet->sp_Pkt.dp_Arg1 = ((ULONG) id) >> 2; /* #@!% BPTR! */ PutMsg(con, packet); WaitPort(&iorp); windw = (struct Window *) (id->id_VolumeNode); FreeMem(id, sizeof(*id)); } FreeMem(packet, sizeof(*packet)); } } } ior.io_Unit = (struct Unit *) -1; return(windw); } cleanup(code) int code; { if (ior.io_Device != 0) { if (iorp.mp_SigBit != -1) { FreeSignal(iorp.mp_SigBit); } CloseDevice(&ior); } if (font) CloseFont(font); if (DiskfontBase) CloseLibrary(DiskfontBase); if (IntuitionBase) CloseLibrary(IntuitionBase); if (GfxBase) CloseLibrary(GfxBase); exit(code); } main(argc, argv) int argc; char *argv[]; { struct TextAttr ta; struct TextFont *oldfont; struct Window *win; struct RastPort *rp; int fontsize = 8; char *fontname = "topaz.font\0\0\0\0\0\0\0\0\0\0"; /* twenty chars */ if (*argv[1] == '?') { printf("Usage: %s [fontname=topaz [fontsize=8]].\n",argv[0]); cleanup(10); } if (argc>1) { char *extension = ".font"; char *s, *t; /* copy name into buffer and add '.font' extension */ s = fontname; t = argv[1]; while ((*s++ = *t++) && ((s - fontname) < 15)); --s; /* exclude '\0' */ t = extension; while (*s++ = *t++); } if (argc>2) fontsize = atoi(argv[2]); OpenLibs(); ta.ta_Name = fontname; ta.ta_YSize = fontsize; ta.ta_Style = 0; ta.ta_Flags = FPF_DISKFONT; font = OpenDiskFont(&ta); if (font == 0) { printf("OpenDiskFont failed--font not found?\n"); cleanup(27); } win = GetWindow(); if (!win) cleanup(40); rp = win->RPort; oldfont = rp->Font; /* If the SetFont() works, on cleanup, CloseFont(oldfont) */ if (SetFont(rp, font) == 0) font = oldfont; printf("\033c"); cleanup(0); }