Annotation of OpenXM_contrib/gnuplot/term/apollo.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: apollo.trm,v 1.13 1998/04/14 00:17:30 drd Exp $
! 3: *
! 4: */
! 5:
! 6: /* GNUPLOT - apollo.trm */
! 7: /*
! 8: Apollo terminal driver for gnuplot.
! 9:
! 10: Open a pad for the graphics, and use GPR routines. For additional
! 11: speed, we do the graphics to a separate bitmap, and the blt the
! 12: entire bitmap to the display. When the user specifies an output
! 13: file name, however, we draw directly to the screen, so the graphics
! 14: are written to the file correctly. Thus, the user can save the
! 15: graphics in a file, to be viewed later. If we try the bitmap
! 16: trick, it looks funny.
! 17:
! 18: Ray Lischner (uunet!mntgfx!lisch)
! 19: 4 October 1989 file created for gnuplot 1.1
! 20: 26 March 1990 updated for gnuplot 2.0
! 21: 30 October 1991 fixed minor problem in apollo_tic_sizes
! 22:
! 23: As of 13 January 1999, this file has been placed in the
! 24: public domain by Ray Lischner.
! 25:
! 26: */
! 27:
! 28: /*
! 29: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
! 30: */
! 31:
! 32: #include "driver.h"
! 33:
! 34: #ifdef TERM_REGISTER
! 35: register_term(apollo)
! 36: #endif
! 37:
! 38: #ifdef TERM_PROTO
! 39: TERM_PUBLIC void APOLLO_init __PROTO((void));
! 40: TERM_PUBLIC void APOLLO_graphics __PROTO((void));
! 41: TERM_PUBLIC void APOLLO_linetype __PROTO((int ltype));
! 42: TERM_PUBLIC void APOLLO_move __PROTO((unsigned int x, unsigned int y));
! 43: TERM_PUBLIC void APOLLO_vector __PROTO((unsigned int x, unsigned int y));
! 44: TERM_PUBLIC void APOLLO_text __PROTO((void));
! 45: TERM_PUBLIC int APOLLO_text_angle __PROTO((int ang));
! 46: TERM_PUBLIC int APOLLO_justify_text __PROTO((enum JUSTIFY mode));
! 47: TERM_PUBLIC void APOLLO_put_text __PROTO((unsigned int x, unsigned int y, char str[]));
! 48: TERM_PUBLIC void APOLLO_reset __PROTO((void));
! 49: /* default tick sizes for small windows */
! 50: #define APOLLO_VTIC 6
! 51: #define APOLLO_HTIC 6
! 52: #endif
! 53:
! 54: #ifndef TERM_PROTO_ONLY
! 55: #ifdef TERM_BODY
! 56:
! 57: #include <apollo/base.h>
! 58: #include <apollo/error.h>
! 59: #include <apollo/pad.h>
! 60: #include <apollo/gpr.h>
! 61:
! 62: int apollo_isa_pad __PROTO((void));
! 63: static void apollo_font_info __PROTO((struct termentry * tbl, char *fname));
! 64: static void apollo_gpr_init __PROTO((struct termentry * tbl, pad_$window_desc_t * window));
! 65: static void apollo_tic_sizes __PROTO((struct termentry * tbl));
! 66: static void apollo_gpr_terminate __PROTO((void));
! 67: static void apollo_redo_window __PROTO((pad_$window_desc_t * window));
! 68: static void apollo_xy_error __PROTO((char *s, int x, int y, status_$t status));
! 69:
! 70: /* issue an error message, using additional text "s" */
! 71: #define apollo_error(s) error_$print_name(status, (s), strlen(s))
! 72:
! 73: /* if "status" indicates an error, then issue an error message */
! 74: #define apollo_check(s) if (status.all != status_$ok) apollo_error(s)
! 75:
! 76: static ios_$id_t stream = -1; /* the stream for the pad */
! 77: static gpr_$bitmap_desc_t screen_desc; /* the screen's bitmap */
! 78: static gpr_$bitmap_desc_t bitmap_desc; /* the graphics bitmap */
! 79: static gpr_$attribute_desc_t attr; /* attribute block for saved bitmap */
! 80: static int APOLLO_XMAX, APOLLO_YMAX; /* window size */
! 81: static short draw_width; /* default GPR draw width */
! 82: static name_$long_pname_t font_name; /* font path name */
! 83: static boolean use_bitmap; /* use a separate bitmap? */
! 84:
! 85: /* return whether stdout is a DM pad */
! 86: apollo_isa_pad()
! 87: {
! 88: status_$t status;
! 89: pad_$isa(1, &status);
! 90: return (status.all == status_$ok);
! 91: }
! 92:
! 93: /*
! 94: Find out what the default font is for the pad, and save the
! 95: character height and width information.
! 96:
! 97: Note that we must save the font file name because we need
! 98: to reload the font file everytime the window changes size.
! 99: */
! 100: static void apollo_font_info(struct termentry *tbl, char *fname)
! 101: {
! 102: short fwidth, fheight, flen;
! 103: status_$t status;
! 104:
! 105: /* get the font size & update the termentry table */
! 106: pad_$inq_font(stream, &fwidth, &fheight, fname, name_$long_pnamlen_max,
! 107: &flen, &status);
! 108: apollo_check("inq_font");
! 109: fname[flen] = NUL;
! 110:
! 111: tbl->v_char = fheight;
! 112: tbl->h_char = fwidth;
! 113: }
! 114:
! 115: /*
! 116: Initialize all the GPR stuff. To save time, we draw into a separate
! 117: bitmap, and then blt it onto the screen all at once. This results
! 118: in 5-10 times speed-up in the graphics, with only a little
! 119: complication. Most of the complication is right here, making sure
! 120: we allocate the right bitmaps, etc., in the right order. The rest
! 121: is in APOLLO_text(), where we actually BLT the bitmap onto the screen.
! 122: Everything else is the same.
! 123:
! 124: The bitmaps have the same size as the window. If the window changes
! 125: size, then the bitmaps retain the same size, so the user sees part
! 126: of the plot or a lot of space around the plot. Drawing a new plot,
! 127: or replotting the previous one causes APOLLO_graphics() to see if
! 128: the window has changed size, in which case the GPR is terminated,
! 129: and this routine is called again. Thus, make sure any changes
! 130: preserve this ability. Anything that should only be done once
! 131: to the pad should be handled by APOLLO_init().
! 132:
! 133: By the way, we save the current draw width, to be used later
! 134: for drawing extra wide lines. This way we don't need to know
! 135: anything about the current output device characteristics;
! 136: we can just draw the default width, or twice the default width, etc.
! 137: */
! 138: static void apollo_gpr_init(struct termentry *tbl, pad_$window_desc_t * window)
! 139: {
! 140: gpr_$offset_t size;
! 141: short fontid;
! 142: status_$t status;
! 143:
! 144: size.x_size = APOLLO_XMAX = tbl->xmax = window->width;
! 145: size.y_size = APOLLO_YMAX = tbl->ymax = window->height;
! 146:
! 147: /* now initialize GPR */
! 148: gpr_$init(gpr_$frame, stream, size, 1, &screen_desc, &status);
! 149: apollo_check("gpr_$init");
! 150:
! 151: if (use_bitmap) {
! 152: /* allocate the bitmap and its attribute block */
! 153: gpr_$allocate_attribute_block(&attr, &status);
! 154: apollo_check("allocate_attribute_block");
! 155:
! 156: gpr_$allocate_bitmap(size, 1, attr, &bitmap_desc, &status);
! 157: apollo_check("allocate_bitmap");
! 158:
! 159: gpr_$set_bitmap(bitmap_desc, &status);
! 160: apollo_check("set_bitmap");
! 161: }
! 162: /* set the font file */
! 163: gpr_$load_font_file(font_name, strlen(font_name), &fontid, &status);
! 164: apollo_check(font_name);
! 165:
! 166: gpr_$set_text_font(fontid, &status);
! 167: apollo_check("set_text_font");
! 168:
! 169: gpr_$inq_draw_width(&draw_width, &status);
! 170: apollo_check("inq_draw_width");
! 171: }
! 172:
! 173: /*
! 174: Determine the tick sizes to be used for labelling borders.
! 175: By default, we use 1/50 of the window size, which looks nice to me.
! 176: If this makes the ticks too small, however, we use a minimum
! 177: size, to make sure they are visible. The minimum size was also
! 178: determined experimentally.
! 179:
! 180: Feel free to changes the sizes to something you feel looks better.
! 181:
! 182: This routine must be called after apollo_gpr_init(), because we
! 183: need to know the window size, as stored in the termentry table.
! 184: */
! 185: static void apollo_tic_sizes(struct termentry *tbl)
! 186: {
! 187: /* base the tick size on the window size */
! 188: tbl->v_tic = tbl->ymax / 50;
! 189: if (tbl->v_tic < APOLLO_VTIC)
! 190: tbl->v_tic = APOLLO_VTIC;
! 191: tbl->h_tic = tbl->xmax / 50;
! 192: if (tbl->h_tic < APOLLO_HTIC)
! 193: tbl->h_tic = APOLLO_HTIC;
! 194: }
! 195:
! 196: /*
! 197: Terminate the GPR. This is called whenever the window size
! 198: changes, and we need to reinitialize the GPR. I assume that
! 199: calling gpr_$terminate() also deallocates the bitmaps and
! 200: attribute blocks because deallocating the screen's bitmap
! 201: causes terminate() to think GPR has already been terminated.
! 202:
! 203: Since this can be called many times, make sure nothing
! 204: drastic is done here, like closing the stream to the pad.
! 205: The only actions should be those that will be reinitialized
! 206: by apollo_gpr_init().
! 207: */
! 208: static void apollo_gpr_terminate()
! 209: {
! 210: status_$t status;
! 211:
! 212: gpr_$terminate(false, &status);
! 213: apollo_check("terminate");
! 214: }
! 215:
! 216: /*
! 217: Initialize the graphics. This is called once, so we do things
! 218: here that should be done exactly once, such as opening the window.
! 219: I like to give windows names, so it is obvious what the window's
! 220: contents are, but this causes a transcript to be kept in a file
! 221: whose name is the window's name. This might be nice in some
! 222: circumstances, but to me it is a nuisance, so the file is
! 223: deleted immediately. The name is unlikely to appear normally,
! 224: so there should be little interference with users' normal files.
! 225: If the user has explicitly set the output file, however, then
! 226: we use that name, and do not delete the file. Thus, the
! 227: user can get a metafile of the plot. We can tell if the
! 228: output file has been set because outstr is NULL. Otherwise,
! 229: outstr is the filename, in alloc-ed store.
! 230:
! 231: The DM defaults are used for window sizes and positions. If
! 232: the user doesn't like it, he or she can change is and issue
! 233: a replot command (assuming a plot has already been generated).
! 234:
! 235: Note, also, that we must call pad_$set_scale() or else
! 236: pad_$inq_windows() returns scaled values, which is not what
! 237: we want. Setting the scale to one (1) turns off the scaling,
! 238: so we get real pixel sizes.
! 239:
! 240: Finally, we get the name and size of the default font. The
! 241: name is kept, as explained earlier. Then we can initialize
! 242: the GPR stuff.
! 243:
! 244: Note that there is a way that APOLLO_init() gets called more
! 245: than once. If the user issues the "set terminal apollo" command
! 246: more than once, then this is called, so we need to make sure
! 247: that we do not keep creating windows.
! 248:
! 249: An alternative strategy would be to interpret multiple "set term
! 250: apollo"s to mean create multiple windows. The user could only
! 251: access the most recent window because gnuplot has no concept of
! 252: multiple terminals. The user would, in fact, have no way of
! 253: removing old windows because they are still active. We could try
! 254: catching keyboard events to see if the user presses EXIT, but I do
! 255: not want to start getting into that mess. If the user really
! 256: wants this kind of functionality, then he or she can run gnuplot
! 257: multiple times. I think that is a lot cleaner, don't you?
! 258: */
! 259: TERM_PUBLIC void APOLLO_init()
! 260: {
! 261: /* only initialize once */
! 262: if (stream == -1) {
! 263: struct termentry *tbl;
! 264: pad_$window_desc_t window;
! 265: name_$long_name_t wname;
! 266: short wnum; /* junk needed by pad_$inq_windows() */
! 267: boolean unlink_wname;
! 268: status_$t status;
! 269:
! 270: tbl = term;
! 271:
! 272: /* make the window name unique, with "gnuplot" in the label */
! 273: if (outstr == NULL) {
! 274: sprintf(wname, "gnuplot-%d", getpid());
! 275: unlink_wname = true;
! 276: } else {
! 277: strcpy(wname, outstr);
! 278: unlink_wname = false;
! 279: }
! 280:
! 281: use_bitmap = unlink_wname;
! 282:
! 283: /* use the default window position and size */
! 284: window.top = window.left = window.width = window.height = 0;
! 285: pad_$create_window(wname, strlen(wname), pad_$transcript, 1, window,
! 286: &stream, &status);
! 287: apollo_check("create_window");
! 288:
! 289: /* if this is not the user's name, then delete the file */
! 290: if (unlink_wname)
! 291: unlink(wname);
! 292:
! 293: /* remove all scaling, to revert to pixel units, not char. units */
! 294: pad_$set_scale(stream, 1, 1, &status);
! 295: apollo_check("set_scale");
! 296:
! 297: /* get rid of the window when the program exits */
! 298: pad_$set_auto_close(stream, 1, true, &status);
! 299: apollo_check("set_auto_close");
! 300:
! 301: /* now determine the window size & update the termentry table */
! 302: pad_$inq_windows(stream, &window, 1, &wnum, &status);
! 303: apollo_check("inq_windows");
! 304:
! 305: /* the order of the next three calls is important */
! 306: apollo_font_info(tbl, font_name);
! 307: apollo_gpr_init(tbl, &window);
! 308: apollo_tic_sizes(tbl);
! 309: }
! 310: }
! 311:
! 312: /*
! 313: Prepare for graphics output. Since this is what the user wants to
! 314: do when preparing a new plot, this is a meaningful time to see if
! 315: the window has changed size. Thus, we avoid mucking about with
! 316: asynchronous traps, and we avoid the bigger problem of dealing
! 317: with a half-finished plot when the window changes size.
! 318:
! 319: Simply put, get the current window size, and if it has changed,
! 320: then get rid of the old bitmaps, etc., and allocate new ones at
! 321: the new size. We also need to update the termentry table.
! 322: If the window stays the same size, then just clear it.
! 323: */
! 324: static void apollo_redo_window(pad_$window_desc_t * window)
! 325: {
! 326: struct termentry *tbl = term;
! 327: status_$t status;
! 328:
! 329: /* the order of the following calls is important */
! 330: apollo_gpr_terminate();
! 331: apollo_gpr_init(tbl, window);
! 332: apollo_tic_sizes(tbl);
! 333: }
! 334:
! 335: TERM_PUBLIC void APOLLO_graphics()
! 336: {
! 337: pad_$window_desc_t window;
! 338: short wnum;
! 339: status_$t status;
! 340:
! 341: pad_$inq_windows(stream, &window, 1, &wnum, &status);
! 342: apollo_check("inq_windows");
! 343:
! 344: if (window.width != APOLLO_XMAX || window.height != APOLLO_YMAX)
! 345: apollo_redo_window(&window);
! 346: else {
! 347: gpr_$clear(0, &status);
! 348: apollo_check("clear");
! 349: }
! 350: }
! 351:
! 352: /* set a line type:
! 353: -2 heavy, solid (border)
! 354: -1 heavy, dotted (axis)
! 355: 0 solid (normal)
! 356: 1 dots (other curves)
! 357: 2 short dash
! 358: 3 long dash
! 359: 4 dash dot
! 360:
! 361: Apparently, GPUplot draws a lot of short line segments, and each
! 362: one starts a new pattern. This makes the patterns somewhat useless,
! 363: but one can still tell the difference between solid, dotted, and
! 364: dashed lines. The utility of fancier styles is limited, however.
! 365:
! 366: On a color workstation, we should use different colors, but I
! 367: don't have one.
! 368: */
! 369:
! 370: /*
! 371: To draw different line styles on an Apollo, we use two different
! 372: parameters. One is a line thickness, which is just an integral
! 373: multiple of the default line thickness. The second is a 16-bit
! 374: pattern that is repeated. We could use fancier patterns, since
! 375: GPR supports up to 64-bits, but, as I explained earlier, this
! 376: really does not buy us anything.
! 377:
! 378: I used patterns that do not start with all bits on because
! 379: gnuplot seems to use lots of short line segments to draw
! 380: a curve, and this might make a very curvey plot seem like
! 381: a solid line, regardless of pattern. I don't want to start
! 382: with too many zeros, however, or else the curve might not
! 383: appear at all! All the patterns, therefore, start with one
! 384: bit on. The rest of the bits determine the true pattern.
! 385:
! 386: By examining graphics.c, we see that linetype -2 is used exclusively
! 387: for the border, -1 for the axes, and the non-negative integers for
! 388: the curves. We use heavy lines for the border and axes, and normal
! 389: width lines for the curves.
! 390:
! 391: Since C arrays start at zero, make sure all the offsets are correct,
! 392: so that it is easy to access the array with -2...n linetypes.
! 393: */
! 394:
! 395: typedef struct {
! 396: short width;
! 397: short pattern;
! 398: } APOLLO_LINE;
! 399:
! 400: static APOLLO_LINE apollo_lines[] =
! 401: {
! 402: {2, ~0}, /* heavy, solid */
! 403: {2, 0x6666}, /* heavy, dotted */
! 404: {1, ~0}, /* normal */
! 405: {1, 0xAAAA}, /* dotted */
! 406: {1, 0xC3C3}, /* short dash */
! 407: {1, 0xE01F}, /* long dash */
! 408: {1, 0x87F8}, /* dash dot */
! 409: {1, 0x6666}, /* big dots */
! 410: };
! 411:
! 412: #define BITS_PER_LINETYPE 16
! 413:
! 414: /* apollo_line(-2) is the border style, etc. */
! 415: #define apollo_line(x) apollo_lines[(x)+2]
! 416: #define apollo_pattern(x) &apollo_line(x).pattern
! 417: #define apollo_width(x) apollo_line(x).width
! 418:
! 419: #define APOLLO_MIN_LINE (-2)
! 420: #define APOLLO_MAX_LINE (sizeof(apollo_lines)/sizeof(*apollo_lines)-2)
! 421:
! 422: /* set the line style */
! 423: TERM_PUBLIC void APOLLO_linetype(ltype)
! 424: int ltype;
! 425: {
! 426: status_$t status;
! 427:
! 428: if (ltype < APOLLO_MIN_LINE)
! 429: ltype = APOLLO_MIN_LINE;
! 430: if (ltype >= APOLLO_MAX_LINE)
! 431: ltype %= APOLLO_MAX_LINE;
! 432:
! 433: gpr_$set_line_pattern(1, apollo_pattern(ltype), BITS_PER_LINETYPE, &status);
! 434: apollo_check("set_line_pattern");
! 435:
! 436: gpr_$set_draw_width(draw_width * apollo_width(ltype), &status);
! 437: apollo_check("set_draw_width");
! 438: }
! 439:
! 440: /* issue an error message that includes an (x, y) coordinate */
! 441: static void apollo_xy_error(char *s, int x, int y, status_$t status)
! 442: {
! 443: char buffer[128];
! 444:
! 445: sprintf(buffer, "%s(%d, %d)", s, x, y);
! 446: apollo_error(buffer);
! 447: }
! 448:
! 449: #define apollo_xy_check(s) \
! 450: if (status.all != status_$ok) apollo_xy_error((s), x, y, status)
! 451:
! 452: /*
! 453: Note that gnuplot and GPR have reversed ideas of where the Y origin is.
! 454: This means subtracting the Y coordinate from Y max.
! 455: */
! 456: #define plot_to_gpr(y) (APOLLO_YMAX - (y))
! 457:
! 458: /* move to a new position */
! 459: TERM_PUBLIC void APOLLO_move(unsigned int x, unsigned int y)
! 460: {
! 461: status_$t status;
! 462:
! 463: gpr_$move((gpr_$coordinate_t) x, plot_to_gpr(y), &status);
! 464: apollo_xy_check("move");
! 465: }
! 466:
! 467: /* draw a line to a new position */
! 468: TERM_PUBLIC void APOLLO_vector(unsigned int x, unsigned int y)
! 469: {
! 470: status_$t status;
! 471:
! 472: gpr_$line((gpr_$coordinate_t) x, plot_to_gpr(y), &status);
! 473: apollo_xy_check("line");
! 474: }
! 475:
! 476: /*
! 477: On terminals, this switches to text mode. The real meaning,
! 478: however, is that the graphics are finished. This means we can
! 479: now display the saved bitmap.
! 480: */
! 481: TERM_PUBLIC void APOLLO_text()
! 482: {
! 483: if (use_bitmap) {
! 484: static gpr_$position_t pos; /* always zero */
! 485: gpr_$window_t window;
! 486: status_$t status;
! 487:
! 488: /* bitblt the entire bitmap to the entire window */
! 489: window.window_base.x_coord = 0;
! 490: window.window_base.y_coord = 0;
! 491: window.window_size.x_size = APOLLO_XMAX;
! 492: window.window_size.y_size = APOLLO_YMAX;
! 493:
! 494: gpr_$set_bitmap(screen_desc, &status);
! 495: apollo_check("set_bitmap(screen_desc)");
! 496:
! 497: gpr_$pixel_blt(bitmap_desc, window, pos, &status);
! 498: apollo_check("bitblt");
! 499:
! 500: gpr_$set_bitmap(bitmap_desc, &status);
! 501: apollo_check("set_bitmap(bitmap_desc)");
! 502: }
! 503: }
! 504:
! 505: TERM_PUBLIC int APOLLO_text_angle(ang)
! 506: int ang;
! 507: {
! 508: status_$t status;
! 509:
! 510: gpr_$set_text_path(ang ? gpr_$up : gpr_$right, &status);
! 511: apollo_check("set_text_path");
! 512: return TRUE;
! 513: }
! 514:
! 515: static enum JUSTIFY apollo_text_mode;
! 516:
! 517: TERM_PUBLIC int APOLLO_justify_text(mode)
! 518: enum JUSTIFY mode;
! 519: {
! 520: apollo_text_mode = mode;
! 521: return TRUE;
! 522: }
! 523:
! 524: /*
! 525: Write "str" right justified on row "row". A row is assumed to
! 526: have whatever height the current text has. Make sure the
! 527: text does not cover the tick marks.
! 528: */
! 529: TERM_PUBLIC void APOLLO_put_text(x, y, str)
! 530: unsigned int x, y;
! 531: char str[];
! 532: {
! 533: gpr_$offset_t size;
! 534: status_$t status;
! 535:
! 536: gpr_$inq_text_extent(str, strlen(str), &size, &status);
! 537: apollo_check("inq_text_extent");
! 538:
! 539: y -= size.y_size / 2; /* center around "y" */
! 540: switch (apollo_text_mode) {
! 541: case LEFT:
! 542: break;
! 543: case CENTRE:
! 544: x -= size.x_size / 2;
! 545: break;
! 546: case RIGHT:
! 547: x -= size.x_size;
! 548: break;
! 549: }
! 550: APOLLO_move(x, y);
! 551:
! 552: gpr_$text(str, strlen(str), &status);
! 553: apollo_check("put_text");
! 554: }
! 555:
! 556: /* reset the graphics state and terminate */
! 557: TERM_PUBLIC void APOLLO_reset()
! 558: {
! 559: if (stream != -1) {
! 560: apollo_gpr_terminate();
! 561: stream = -1;
! 562: }
! 563: }
! 564:
! 565: #endif /* TERM_BODY */
! 566:
! 567: #ifdef TERM_TABLE
! 568: TERM_TABLE_START(apollo_driver)
! 569: "apollo",
! 570: "Apollo Graphics Primitive Resource, rescaling of subsequent plots after window resizing",
! 571: 0, 0, 0, 0, /* APOLLO_XMAX, APOLLO_YMAX, APOLLO_VCHAR, APOLLO_HCHAR, are filled in at run-time */
! 572: APOLLO_VTIC, APOLLO_HTIC, options_null, APOLLO_init, APOLLO_reset,
! 573: APOLLO_text, null_scale, APOLLO_graphics, APOLLO_move, APOLLO_vector,
! 574: APOLLO_linetype, APOLLO_put_text, APOLLO_text_angle,
! 575: APOLLO_justify_text, line_and_point, do_arrow, set_font_null
! 576: TERM_TABLE_END(apollo_driver)
! 577:
! 578: #undef LAST_TERM
! 579: #define LAST_TERM apollo_driver
! 580:
! 581: #endif /* TERM_TABLE */
! 582: #endif /* TERM_PROTO_ONLY */
! 583:
! 584: #ifdef TERM_HELP
! 585: START_HELP(apollo)
! 586: "1 apollo",
! 587: "?commands set terminal apollo",
! 588: "?set terminal apollo",
! 589: "?set term apollo",
! 590: "?terminal apollo",
! 591: "?term apollo",
! 592: "?apollo",
! 593: " The `apollo` terminal driver supports the Apollo Graphics Primitive Resource",
! 594: " with rescaling after window resizing. It has no options.",
! 595: "",
! 596: " If a fixed-size window is desired, the `gpr` terminal may be used instead."
! 597: END_HELP(apollo)
! 598: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>