Annotation of OpenXM_contrib/gnuplot/term/amiga.trm, Revision 1.1.1.1
1.1 maekawa 1: /*
2: * $Id: amiga.trm,v 1.18 1998/04/14 00:17:29 drd Exp $
3: *
4: */
5:
6: /* GNUPLOT - amiga.trm */
7:
8: /*[
9: * Copyright 1991, 1992, 1993, 1998
10: *
11: * Permission to use, copy, and distribute this software and its
12: * documentation for any purpose with or without fee is hereby granted,
13: * provided that the above copyright notice appear in all copies and
14: * that both that copyright notice and this permission notice appear
15: * in supporting documentation.
16: *
17: * Permission to modify the software is granted, but not the right to
18: * distribute the complete modified source code. Modifications are to
19: * be distributed as patches to the released version. Permission to
20: * distribute binaries produced by compiling modified sources is granted,
21: * provided you
22: * 1. distribute the corresponding source modifications from the
23: * released version in the form of a patch file along with the binaries,
24: * 2. add special version identification to distinguish your version
25: * in addition to the base release version number,
26: * 3. provide your name and address as the primary contact for the
27: * support of your modified version, and
28: * 4. retain our contact information in regard to use of the base
29: * software.
30: * Permission to distribute the released version of the source code along
31: * with corresponding source modifications in the form of a patch file is
32: * granted with same provisions 2 through 4 for binary distributions.
33: *
34: * This software is provided "as is" without express or implied warranty
35: * to the extent permitted by applicable law.
36: ]*/
37:
38: /*
39: * This file is included by ../term.c.
40: *
41: * This terminal driver supports:
42: * Amiga Custom Screen
43: *
44: * AUTHORS
45: * Carsten Steger
46: *
47: * Pat R. Empleo Slightly modified for Aztec C v5.2a (beta); sort of
48: * 08/27/91 supports overscan; for large WB 2.0 virtual screens,
49: * we limit the plot size so we don't have to scroll
50: * around (not fun).
51: *
52: * Carsten Steger Modified to support Kickstart 2.0.
53: * 09/11/91 Opens a text overscan screen when used with WB 2.0.
54: * Discerns between NTSC and PAL Amigas when used with
55: * WB 1.3 and lower.
56: *
57: * Pat R. Empleo Defined some 2.0 stuff in order to get Aztec C to
58: * 09/20/91 work with Carsten's new code (see above). When
59: * KS/WB 2.0 support gets implemented in Aztec C, this
60: * kludge will get deleted!
61: * (Aztec C release 5.2 beta)
62: *
63: * Carsten Steger Converted to new terminal layout.
64: * 10/01/95
65: *
66: * Lars Hecking Add code from George Coulouris <glc5@cornell.edu> to
67: * 06/20/97 implement window option, requires AmigaOS 3.0+.
68: * General cleanup, better readability.
69: *
70: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
71: *
72: */
73:
74: #include "driver.h"
75:
76: #ifdef TERM_REGISTER
77: register_term(amiga)
78: #endif
79:
80: #ifdef TERM_PROTO
81:
82: #define AMIGA_XMAX 640
83: #define AMIGA_YMAX 512
84:
85: #define AMIGA_VCHAR 12
86: #define AMIGA_HCHAR 8
87: #define AMIGA_VTIC 5
88: #define AMIGA_HTIC 5
89:
90: TERM_PUBLIC void AMIGA_reset __PROTO((void));
91: TERM_PUBLIC void AMIGA_init __PROTO((void));
92: TERM_PUBLIC void AMIGA_options __PROTO((void));
93: TERM_PUBLIC void AMIGA_text __PROTO((void));
94: TERM_PUBLIC void AMIGA_graphics __PROTO((void));
95: TERM_PUBLIC void AMIGA_move __PROTO((unsigned int x, unsigned int y));
96: TERM_PUBLIC void AMIGA_vector __PROTO((unsigned int x, unsigned int y));
97: TERM_PUBLIC void AMIGA_linetype __PROTO((int linetype));
98: TERM_PUBLIC void AMIGA_put_text __PROTO((unsigned int x, unsigned int y, char *str));
99: TERM_PUBLIC int AMIGA_justify_text __PROTO((enum JUSTIFY mode));
100: TERM_PUBLIC int AMIGA_set_font __PROTO((char *font));
101: TERM_PUBLIC void AMIGA_suspend __PROTO((void));
102: TERM_PUBLIC void AMIGA_resume __PROTO((void));
103:
104: #define GOT_AMIGA_PROTO
105:
106: #endif /* TERM_PROTO */
107:
108:
109: #ifndef TERM_PROTO_ONLY
110:
111: #ifdef TERM_BODY
112:
113: #ifdef AMIGA_AC_5
114: #include <intuition/intuitionbase.h>
115: #include <intuition/screens.h>
116: #include <graphics/text.h>
117: #include <graphics/gfxbase.h>
118: #else
119: /* You will have to use the Kickstart 2.0 header files for this to compile */
120: #include <exec/types.h>
121: #include <dos/dos.h>
122: #include <intuition/intuitionbase.h>
123: #include <graphics/gfxbase.h>
124: #include <proto/intuition.h>
125: #include <proto/graphics.h>
126: #include <proto/exec.h>
127: #include <proto/diskfont.h>
128: #endif /* !AMIGA_AC_5 */
129:
130: #ifndef NO_ATEXIT
131: void AMIGA_exit(void);
132: # define ATEXIT(x) (atexit(x) != 0)
133: # ifdef AMIGA_SC_6_1
134: /* # define ATEXIT(x) (onexit(x) == 0) */
135: # define RAWCON(x) rawcon(x)
136: # else
137: # define RAWCON(x) /* nought */
138: # endif /* SAS */
139: #else
140: # define ATEXIT(x) 0
141: #endif /* NO_ATEXIT */
142:
143: #ifndef RETURN_FAIL
144: # define RETURN_FAIL 20
145: #endif
146:
147: #define LIB_VERSION(LibBase) ((LibBase)->LibNode.lib_Version)
148:
149: #define AMIGA_ERROR(string,rc) {fprintf (stderr,"%s\n",string);\
150: AMIGA_reset (); exit (rc);}
151:
152: /* from plot.c */
153: extern TBOOLEAN interactive;
154:
155: /* The origin is in the upper left hand corner, so we have to translate */
156: /* and flip the coordinates: */
157: #define AMIGA_VTF(y) (AMIGA_ymax-1-(y))
158:
159:
160: /* Libraries */
161: struct IntuitionBase *IntuitionBase;
162: struct GfxBase *GfxBase;
163: struct Library *DiskfontBase;
164:
165:
166: /* Name of font, size in pts */
167: static char AMIGA_FontName[MAX_ID_LEN+1] = "";
168: static int AMIGA_FontSize;
169:
170:
171: /* Font stuff */
172: static struct TextAttr AMIGA_Font =
173: {
174: "topaz.font", TOPAZ_EIGHTY, FS_NORMAL, FPF_ROMFONT
175: };
176: static struct TextFont *AMIGA_TextFont;
177:
178:
179: /* Screen stuff */
180: static struct NewScreen AMIGA_NewScreen =
181: {
182: 0, 0, AMIGA_XMAX, AMIGA_YMAX, 4, 15, 0, HIRES | LACE,
183: CUSTOMSCREEN | SCREENBEHIND | SCREENQUIET, NULL, NULL, NULL, NULL
184: };
185: static struct Screen *AMIGA_Screen;
186: static struct TagItem AMIGA_ScrTagList[] =
187: {
188: { SA_Overscan, OSCAN_TEXT },
189: { TAG_DONE, 0 }
190: };
191:
192:
193: /* Window stuff */
194: /* FALSE: plot to screen; TRUE: plot to window */
195: static TBOOLEAN AMIGA_window_mode = FALSE;
196:
197: #define AMIGA_WIN_XMAX 512
198: #define AMIGA_WIN_YMAX 320
199:
200: static struct Window *AMIGA_Window;
201: static struct TagItem AMIGA_WinTagList[] =
202: {
203: { WA_InnerWidth, AMIGA_WIN_XMAX },
204: { WA_InnerHeight, AMIGA_WIN_YMAX },
205: { WA_Title, (ULONG) "gnuplot" },
206: { WA_DragBar, TRUE },
207: { WA_DepthGadget, TRUE },
208: { WA_WBenchWindow, TRUE },
209: { WA_SmartRefresh, TRUE },
210: { WA_GimmeZeroZero, TRUE },
211: { WA_AutoAdjust, TRUE },
212: { TAG_DONE, 0 }
213: };
214:
215: /*
216: * This is the palette. Values are stored as 0xrrggbb, where rr, gg, and, bb
217: * are big-endian 8-bit intensities for red, green, and blue, respectively.
218: */
219: static unsigned int palette[] =
220: {
221: 0xffffff, /* white */
222: 0x000000, /* black */
223: 0xff0000, /* red */
224: 0x00ff00, /* green */
225: 0x0000ff, /* blue */
226: 0x00ffff, /* cyan */
227: 0xff00ff, /* magenta */
228: 0xffff00, /* yellow */
229: 0x7f007f, /* purple */
230: 0xff7f00, /* orange */
231: };
232:
233: #define PALETTE_SIZE (sizeof (palette) / sizeof (unsigned int))
234:
235: /* This is the color look-up table, indexed in the same order as
236: * the above palette. The values stored in this table are pen numbers;
237: * e.g clut[2] is the pen which represents the color "red".
238: */
239: static unsigned int clut[PALETTE_SIZE];
240:
241:
242: /* Colors */
243: static UWORD AMIGA_Colors[] =
244: {
245: 0x000, 0xfff, 0xbbb, 0x0f0, 0xf00, 0x00f, 0x3ca, 0xf0f,
246: 0x94d, 0x0ff, 0x82f, 0xff0, 0x0af, 0xc5e, 0xfa2, 0xf44
247: };
248:
249:
250: /* Misc */
251: static int AMIGA_slinetype;
252: static enum JUSTIFY AMIGA_justify = LEFT;
253: static unsigned int AMIGA_ymax, AMIGA_xmax;
254: static WORD AMIGA_cwd, AMIGA_cht, AMIGA_bsl, AMIGA_vadj;
255: /* Common RastPort */
256: static struct RastPort *AMIGA_RastPort;
257:
258: /*
259: * Close open font, screen and libraries.
260: */
261: TERM_PUBLIC void AMIGA_reset()
262: {
263: if (AMIGA_window_mode == TRUE) {
264: int i = 0;
265:
266: /* Free the pens */
267: while (i < PALETTE_SIZE) {
268: if (clut[i] != -1)
269: ReleasePen(AMIGA_Window->WScreen->ViewPort.ColorMap, clut[i]);
270:
271: i++;
272: }
273:
274: /* Close the window */
275: if (AMIGA_Window != NULL)
276: CloseWindow(AMIGA_Window);
277:
278: AMIGA_Window = NULL;
279: AMIGA_window_mode = FALSE;
280: }
281: if (AMIGA_TextFont != NULL)
282: CloseFont(AMIGA_TextFont);
283:
284: if (DiskfontBase != NULL)
285: CloseLibrary(DiskfontBase);
286:
287: if (AMIGA_Screen != NULL)
288: CloseScreen(AMIGA_Screen);
289:
290: if (IntuitionBase != NULL)
291: CloseLibrary((struct Library *) IntuitionBase);
292:
293: if (GfxBase != NULL)
294: CloseLibrary((struct Library *) GfxBase);
295:
296: AMIGA_TextFont = NULL;
297: DiskfontBase = NULL;
298: AMIGA_Screen = NULL;
299: IntuitionBase = NULL;
300: GfxBase = NULL;
301:
302: AMIGA_RastPort = NULL;
303: }
304:
305:
306: /*
307: * Init terminal.
308: */
309: TERM_PUBLIC void AMIGA_init()
310: {
311: char name[MAX_ID_LEN + 1];
312:
313: /* Install exit trap in case of abnormal termination (see below). */
314: if (ATEXIT(AMIGA_exit))
315: AMIGA_ERROR("Couldn't set exit trap", RETURN_FAIL);
316:
317: /* Open needed libraries */
318: GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 0);
319: if (GfxBase == NULL)
320: AMIGA_ERROR("No Graphics-Library", RETURN_FAIL);
321:
322: IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0);
323: if (IntuitionBase == NULL)
324: AMIGA_ERROR("No Intuition-Library", RETURN_FAIL);
325:
326: if (AMIGA_window_mode == TRUE) {
327: int i = 0;
328:
329: /* Initialize the clut */
330: while (i < PALETTE_SIZE)
331: clut[i++] = -1;
332: }
333: if (LIB_VERSION(IntuitionBase) <= 34) {
334: /* We compute the vertical resolution for those poor NTSC-souls :-) */
335: if (GfxBase->DisplayFlags & PAL)
336: AMIGA_ymax = 512;
337: else
338: AMIGA_ymax = 400;
339:
340: AMIGA_xmax = 640;
341: AMIGA_NewScreen.Width = AMIGA_xmax;
342: AMIGA_NewScreen.Height = AMIGA_ymax;
343:
344: AMIGA_Screen = OpenScreen(&AMIGA_NewScreen);
345:
346: if (AMIGA_Screen == NULL)
347: AMIGA_ERROR("No Screen", RETURN_FAIL);
348:
349: AMIGA_RastPort = &AMIGA_Screen->RastPort;
350:
351: } else { /* Intuition version > 34 */
352: /* Kickstart 2.0 support */
353: AMIGA_NewScreen.Width = STDSCREENWIDTH;
354: AMIGA_NewScreen.Height = STDSCREENHEIGHT;
355:
356: if (AMIGA_window_mode != TRUE) {
357:
358: AMIGA_Screen = OpenScreenTagList(&AMIGA_NewScreen, AMIGA_ScrTagList);
359:
360: if (AMIGA_Screen == NULL)
361: AMIGA_ERROR("No Screen", RETURN_FAIL);
362:
363: AMIGA_RastPort = &AMIGA_Screen->RastPort;
364:
365: AMIGA_xmax = AMIGA_Screen->Width;
366: AMIGA_ymax = AMIGA_Screen->Height;
367: } else if (LIB_VERSION(GfxBase) >= 39) { /* AMIGA_window_mode == TRUE */
368: /* Open the plot window */
369:
370: AMIGA_Window = (struct Window *)OpenWindowTagList(NULL, AMIGA_WinTagList);
371:
372: /* Don't do this: fall back to screen */
373: if (AMIGA_Window == NULL)
374: AMIGA_ERROR("Could not open plot window", RETURN_FAIL);
375:
376: AMIGA_RastPort = AMIGA_Window->RPort;
377:
378: AMIGA_xmax = AMIGA_WIN_XMAX;
379: AMIGA_ymax = AMIGA_WIN_YMAX;
380:
381: } /* Gfx version >= 39 */
382: } /* Intuition version <= 34 */
383:
384: term->xmax = AMIGA_xmax;
385: term->ymax = AMIGA_ymax;
386:
387: if (AMIGA_window_mode != TRUE) {
388: sprintf(name, "%s,%d", AMIGA_FontName, AMIGA_FontSize);
389: AMIGA_set_font(name);
390:
391: LoadRGB4(&AMIGA_Screen->ViewPort, AMIGA_Colors, 16);
392: RemakeDisplay();
393: AMIGA_slinetype = 1;
394: SetAPen(&AMIGA_Screen->RastPort, AMIGA_slinetype);
395: } else {
396: int i, r, g, b;
397:
398: AMIGA_bsl = AMIGA_Window->RPort->TxBaseline; /* Reference line */
399: AMIGA_cht = AMIGA_Window->RPort->TxHeight; /* Height of characters */
400:
401: /* Allocate pens */
402: for (i = 0; i < PALETTE_SIZE; i++) {
403: r = (palette[i] << 8) & 0xFF000000;
404: g = (palette[i] << 16) & 0xFF000000;
405: b = (palette[i] << 24) & 0xFF000000;
406: clut[i] = ObtainBestPenA(AMIGA_Window->WScreen->ViewPort.ColorMap, r, g, b, NULL);
407: }
408:
409: }
410:
411: SetDrMd(AMIGA_RastPort, JAM1);
412:
413: }
414:
415:
416: /*
417: * Scan terminal options
418: */
419: TERM_PUBLIC void AMIGA_options()
420: {
421:
422: /* Screen/Window mode */
423: if (!END_OF_COMMAND) {
424: if (almost_equals(c_token, "scr$een")) {
425: AMIGA_window_mode = FALSE;
426: c_token++;
427: } else if (almost_equals(c_token, "win$dow")) {
428: AMIGA_window_mode = TRUE;
429: c_token++;
430: }
431: }
432: /* Font name */
433: if (!END_OF_COMMAND && isstring(c_token)) {
434: quote_str(AMIGA_FontName, c_token, MAX_ID_LEN);
435: c_token++;
436: }
437: /* Font size */
438: if (!END_OF_COMMAND) {
439: /* We have font size specified */
440: struct value a;
441: AMIGA_FontSize = (int) real(const_express(&a));
442: }
443: if (strcmp(AMIGA_FontName, "") == 0 && AMIGA_FontSize != 0)
444: strcpy(AMIGA_FontName, "topaz");
445:
446: if (strcmp(AMIGA_FontName, "") != 0 && AMIGA_FontSize == 0)
447: AMIGA_FontSize = 8;
448:
449: if (strcmp(AMIGA_FontName, "") != 0 && AMIGA_FontSize != 0) {
450: sprintf(default_font, "%s,%d", AMIGA_FontName, AMIGA_FontSize);
451: sprintf(term_options, "%s \"%s\" %d", \
452: (AMIGA_window_mode != TRUE ? "screen" : "window"), \
453: AMIGA_FontName, AMIGA_FontSize);
454: } else
455: sprintf(term_options, "%s", (AMIGA_window_mode != TRUE ? "screen" : "window"));
456: }
457:
458:
459: /*
460: *
461: */
462: TERM_PUBLIC void AMIGA_text()
463: {
464: if (AMIGA_window_mode != TRUE) {
465: if (interactive == TRUE) {
466: FILE *fp;
467:
468: if ((fp = fopen("*", "r")) != NULL) {
469: int c = getc(fp);
470:
471: ungetc(c, stdin);
472: fclose(fp);
473: }
474: ScreenToBack(AMIGA_Screen);
475: }
476: }
477: }
478:
479:
480: /*
481: *
482: */
483: TERM_PUBLIC void AMIGA_graphics()
484: {
485:
486: SetRast(AMIGA_RastPort, 0);
487:
488: if (AMIGA_window_mode == TRUE) {
489: /* clear the window */
490: SetAPen(AMIGA_Window->RPort, clut[0]);
491: RectFill(AMIGA_Window->RPort, 0, 0, 640, 400);
492: AMIGA_slinetype = clut[1];
493: }
494: SetAPen(AMIGA_RastPort, AMIGA_slinetype);
495: AMIGA_resume();
496: }
497:
498:
499: /*
500: *
501: */
502: TERM_PUBLIC void AMIGA_move(x, y)
503: unsigned int x, y;
504: {
505: if ((x >= AMIGA_xmax) || (y >= AMIGA_ymax))
506: return;
507:
508: Move(AMIGA_RastPort, x, AMIGA_VTF(y));
509: }
510:
511:
512: /*
513: *
514: */
515: TERM_PUBLIC void AMIGA_vector(x, y)
516: unsigned int x, y;
517: {
518: if ((x >= AMIGA_xmax) || (y >= AMIGA_ymax))
519: return;
520:
521: Draw(AMIGA_RastPort, x, AMIGA_VTF(y));
522: }
523:
524:
525: /*
526: *
527: */
528: TERM_PUBLIC void AMIGA_linetype(linetype)
529: int linetype;
530: {
531: if (AMIGA_window_mode != TRUE) {
532: if (linetype >= 13)
533: linetype %= 13;
534:
535: if (linetype < -2)
536: linetype = -2;
537:
538: AMIGA_slinetype = linetype + 3;
539: } else {
540: if (linetype >= 0)
541: linetype = (linetype % 9) + 1;
542:
543: if (linetype < 0)
544: linetype = 1;
545:
546: AMIGA_slinetype = clut[linetype];
547: }
548: SetAPen(AMIGA_RastPort, AMIGA_slinetype);
549: }
550:
551:
552: /*
553: *
554: */
555: TERM_PUBLIC void AMIGA_put_text(x, y, str)
556: unsigned int x, y;
557: char *str;
558: {
559: LONG len, tx_len;
560: WORD x_min, x_max, y_min, y_max;
561:
562: len = strlen(str);
563:
564: tx_len = TextLength(AMIGA_RastPort, str, len);
565:
566: switch (AMIGA_justify) {
567: case LEFT:
568: x_min = x;
569: x_max = x + tx_len;
570: break;
571: case CENTRE:
572: x_min = x - tx_len / 2;
573: x_max = x + tx_len - tx_len / 2; /* avoid roundoff errors ! */
574: break;
575: default: /* does this make sense ?? */
576: case RIGHT:
577: x_min = x - tx_len;
578: x_max = x;
579: break;
580: }
581:
582: y_min = AMIGA_VTF(y) - AMIGA_vadj;
583: y_max = y_min + AMIGA_cht;
584:
585: /* Check if character-string lies completely within the screen: */
586: /* What about clipping? */
587: if ((x_max >= AMIGA_xmax) || (y_min < 0) || (y_max >= AMIGA_ymax))
588: return;
589:
590: Move(AMIGA_RastPort, x_min, y_min + AMIGA_bsl);
591: Text(AMIGA_RastPort, str, len);
592: }
593:
594:
595: /*
596: *
597: */
598: TERM_PUBLIC int AMIGA_justify_text(mode)
599: enum JUSTIFY mode;
600: {
601: AMIGA_justify = mode;
602: return TRUE;
603: }
604:
605:
606: /*
607: *
608: */
609: TERM_PUBLIC int AMIGA_set_font(font)
610: char *font;
611: {
612: static char test_str[] =
613: " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
614: static WORD test_len, test_pxl;
615: char name[MAX_ID_LEN+1];
616: int size, sep;
617:
618: /* Disable for window mode */
619: if (AMIGA_window_mode != TRUE) {
620: sep = strcspn(font, ",");
621: strncpy(name, font, sep);
622: name[sep] = NUL;
623: size = AMIGA_FontSize;
624: sscanf(&(font[sep + 1]), "%d", &size);
625:
626: if (strcmp(name, "") != 0) {
627: strncat(name, ".font", MAX_ID_LEN+1);
628:
629: /* Avoid opening "diskfont.library" if a built-in font is desired */
630: if ((strcmp("topaz.font", name) == 0) &&
631: ((size == TOPAZ_EIGHTY) || (size == TOPAZ_SIXTY))) {
632: AMIGA_Font.ta_Name = name;
633: AMIGA_Font.ta_YSize = size;
634: AMIGA_Font.ta_Style = FS_NORMAL;
635: AMIGA_Font.ta_Flags = FPF_ROMFONT;
636: AMIGA_TextFont = OpenFont(&AMIGA_Font);
637:
638: if (AMIGA_TextFont != NULL)
639: SetFont(&AMIGA_Screen->RastPort, AMIGA_TextFont);
640:
641: } else {
642: DiskfontBase = OpenLibrary("diskfont.library", 0);
643:
644: if (DiskfontBase != NULL) {
645: AMIGA_Font.ta_Name = name;
646: AMIGA_Font.ta_YSize = size;
647: AMIGA_Font.ta_Style = FS_NORMAL;
648: AMIGA_Font.ta_Flags = FPF_ROMFONT | FPF_DISKFONT;
649: AMIGA_TextFont = OpenDiskFont(&AMIGA_Font);
650:
651: if (AMIGA_TextFont != NULL)
652: SetFont(&AMIGA_Screen->RastPort, AMIGA_TextFont);
653: }
654: }
655: }
656: /* Width of characters: This works better for proportional fonts than */
657: /* AMIGA_Screen->RastPort.TxWidth + AMIGA_Screen->RastPort.TxSpacing */
658: test_len = strlen(test_str);
659: test_pxl = TextLength(&AMIGA_Screen->RastPort, test_str, test_len);
660:
661: AMIGA_cwd = test_pxl / test_len;
662: AMIGA_cht = AMIGA_Screen->RastPort.TxHeight; /* Height of characters */
663: AMIGA_bsl = AMIGA_Screen->RastPort.TxBaseline; /* Reference line */
664:
665: /* Amount by which characters have to be shifted upwards to be */
666: /* vertically justified: */
667: AMIGA_vadj = AMIGA_bsl / 2;
668: term->v_char = AMIGA_cht + 4; /* So lines won't be too close */
669: term->h_char = AMIGA_cwd;
670:
671: } /* !window_mode */
672: return TRUE;
673: }
674:
675:
676: /*
677: *
678: */
679: TERM_PUBLIC void AMIGA_suspend()
680: {
681: if (AMIGA_window_mode != TRUE) {
682: if (interactive == TRUE) {
683: FILE *fp;
684:
685: if ((fp = fopen("*", "r")) != NULL) {
686: int c = getc(fp);
687:
688: ungetc(c, stdin);
689: fclose(fp);
690: }
691: ScreenToBack(AMIGA_Screen);
692: }
693: }
694: }
695:
696:
697: /*
698: *
699: */
700: TERM_PUBLIC void AMIGA_resume()
701: {
702: if (AMIGA_window_mode != TRUE)
703: ScreenToFront(AMIGA_Screen);
704: else
705: WindowToFront(AMIGA_Window);
706: }
707:
708:
709: #ifndef NO_ATEXIT
710: /* This function is mainly included if the program terminates abnormally
711: * and the screen and libraries are still open. It closes down all opened
712: * libraries and screens. This happens e.g. when loading "bivariat.demo"
713: * and the stack is smaller than 120000 bytes.
714: */
715: void AMIGA_exit(void)
716: {
717: AMIGA_reset();
718: RAWCON(0);
719: }
720:
721: #endif /* NO_ATEXIT */
722:
723:
724: #endif /* TERM_BODY */
725:
726: #ifdef TERM_TABLE
727:
728: TERM_TABLE_START(amiga_driver)
729: "amiga", "Amiga Custom Screen/Window [screen window]",
730: AMIGA_XMAX, AMIGA_YMAX, AMIGA_VCHAR, AMIGA_HCHAR,
731: AMIGA_VTIC, AMIGA_HTIC, AMIGA_options, AMIGA_init, AMIGA_reset,
732: AMIGA_text, null_scale, AMIGA_graphics, AMIGA_move, AMIGA_vector,
733: AMIGA_linetype, AMIGA_put_text, null_text_angle,
734: AMIGA_justify_text, do_point, do_arrow, AMIGA_set_font,
735: 0, /* pointsize */
736: TERM_CAN_MULTIPLOT, AMIGA_suspend, AMIGA_resume
737: TERM_TABLE_END(amiga_driver)
738:
739: #undef LAST_TERM
740: #define LAST_TERM amiga_driver
741:
742: #endif /* TERM_TABLE */
743: #endif /* TERM_PROTO_ONLY */
744:
745:
746: #ifdef TERM_HELP
747: START_HELP(amiga)
748: "1 amiga",
749: "?commands set terminal amiga",
750: "?set terminal amiga",
751: "?set term amiga",
752: "?terminal amiga",
753: "?term amiga",
754: "?amiga",
755: " The `amiga` terminal, for Commodore Amiga computers, allows the user to",
756: " plot either to a screen (default), or, if Kickstart 3.0 or higher is",
757: " installed, to a window on the current public screen. The font and its size",
758: " can also be selected.",
759: "",
760: " Syntax:",
761: " set terminal amiga {screen | window} {\"<fontname>\"} {<fontsize>}",
762: "",
763: " The default font is 8-point \"topaz\".",
764: "",
765: " The screen option uses a virtual screen, so it is possible that the graph",
766: " will be larger than the screen."
767: END_HELP(amiga)
768: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>