Annotation of OpenXM_contrib/gnuplot/term/win.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: $
! 3: */
! 4:
! 5: /* GNUPLOT - win.trm */
! 6:
! 7: /*[
! 8: * Copyright 1992 - 1993, 1998
! 9: *
! 10: * Permission to use, copy, and distribute this software and its
! 11: * documentation for any purpose with or without fee is hereby granted,
! 12: * provided that the above copyright notice appear in all copies and
! 13: * that both that copyright notice and this permission notice appear
! 14: * in supporting documentation.
! 15: *
! 16: * Permission to modify the software is granted, but not the right to
! 17: * distribute the complete modified source code. Modifications are to
! 18: * be distributed as patches to the released version. Permission to
! 19: * distribute binaries produced by compiling modified sources is granted,
! 20: * provided you
! 21: * 1. distribute the corresponding source modifications from the
! 22: * released version in the form of a patch file along with the binaries,
! 23: * 2. add special version identification to distinguish your version
! 24: * in addition to the base release version number,
! 25: * 3. provide your name and address as the primary contact for the
! 26: * support of your modified version, and
! 27: * 4. retain our contact information in regard to use of the base
! 28: * software.
! 29: * Permission to distribute the released version of the source code along
! 30: * with corresponding source modifications in the form of a patch file is
! 31: * granted with same provisions 2 through 4 for binary distributions.
! 32: *
! 33: * This software is provided "as is" without express or implied warranty
! 34: * to the extent permitted by applicable law.
! 35: ]*/
! 36:
! 37: /*
! 38: *
! 39: * AUTHORS
! 40: *
! 41: * Gnuplot for Windows:
! 42: * Maurice Castro, Russell Lang
! 43: *
! 44: * There is a mailing list for gnuplot users. Note, however, that the
! 45: * newsgroup
! 46: * comp.graphics.apps.gnuplot
! 47: * is identical to the mailing list (they
! 48: * both carry the same set of messages). We prefer that you read the
! 49: * messages through that newsgroup, to subscribing to the mailing list.
! 50: * (If you can read that newsgroup, and are already on the mailing list,
! 51: * please send a message to majordomo@dartmouth.edu, asking to be
! 52: * removed from the mailing list.)
! 53: *
! 54: * The address for mailing to list members is
! 55: * info-gnuplot@dartmouth.edu
! 56: * and for mailing administrative requests is
! 57: * majordomo@dartmouth.edu
! 58: * The mailing list for bug reports is
! 59: * bug-gnuplot@dartmouth.edu
! 60: * The list of those interested in beta-test versions is
! 61: * info-gnuplot-beta@dartmouth.edu
! 62: */
! 63:
! 64:
! 65: /* This file implements the terminal and printer display for gnuplot */
! 66: /* under Microsoft Windows. The code currently compiles only with the */
! 67: /* Borland C++ 3.1 compiler. */
! 68: /* */
! 69: /* The modifications to allow Gnuplot to run under Windows were made */
! 70: /* by Maurice Castro (maurice@bruce.cs.monash.edu.au) */
! 71: /* and Russell Lang (rjl@monu1.cc.monash.edu.au) 19 Nov 1992 */
! 72: /* */
! 73:
! 74: /* Edit this file with tabstop=4 (vi :se ts=4) */
! 75:
! 76: /*
! 77: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
! 78: */
! 79:
! 80: #include "driver.h"
! 81:
! 82: #ifdef TERM_REGISTER
! 83: register_term(windows)
! 84: #endif
! 85:
! 86: #ifdef TERM_PROTO
! 87: TERM_PUBLIC void WIN_options __PROTO((void));
! 88: TERM_PUBLIC int WIN_scale __PROTO((void));
! 89: TERM_PUBLIC void WIN_init __PROTO((void));
! 90: TERM_PUBLIC void WIN_reset __PROTO((void));
! 91: TERM_PUBLIC void WIN_text __PROTO((void));
! 92: TERM_PUBLIC void WIN_graphics __PROTO((void));
! 93: TERM_PUBLIC void WIN_move __PROTO((unsigned int x, unsigned int y));
! 94: TERM_PUBLIC void WIN_vector __PROTO((unsigned int x, unsigned int y));
! 95: TERM_PUBLIC void WIN_linetype __PROTO((int lt));
! 96: TERM_PUBLIC void WIN_put_text __PROTO((unsigned int x, unsigned int y, char *str));
! 97: TERM_PUBLIC int WIN_justify_text __PROTO((enum JUSTIFY mode));
! 98: TERM_PUBLIC int WIN_text_angle __PROTO((int ang));
! 99: TERM_PUBLIC void WIN_point __PROTO((unsigned int x, unsigned int y, int number));
! 100: TERM_PUBLIC void WIN_resume __PROTO((void));
! 101: TERM_PUBLIC void WIN_set_pointsize __PROTO((double));
! 102:
! 103:
! 104: /* Initialization values - Guess Now Scale later */
! 105: #define WIN_XMAX (24000)
! 106: #define WIN_YMAX (18000)
! 107: #define WIN_HCHAR (WIN_XMAX/75)
! 108: #define WIN_VCHAR (WIN_YMAX/25)
! 109: #define WIN_HTIC (WIN_XMAX/160)
! 110: #define WIN_VTIC WIN_HTIC
! 111: #endif /* TERM_PROTO */
! 112:
! 113: #ifndef TERM_PROTO_ONLY
! 114: #ifdef TERM_BODY
! 115:
! 116: #include <windows.h>
! 117: #include "../win/wgnuplib.h"
! 118:
! 119: #ifdef __MSC__
! 120: #include <io.h> /* for mktemp() */
! 121: #endif
! 122:
! 123: extern GW graphwin;
! 124:
! 125: #define WIN_POINT_TYPES 12
! 126:
! 127: /* Interface routines - create list of actions for Windows */
! 128:
! 129: TERM_PUBLIC void WIN_options()
! 130: {
! 131: if (!END_OF_COMMAND) {
! 132: if (almost_equals(c_token, "d$efault")) {
! 133: graphwin.color = TRUE;
! 134: strcpy(graphwin.fontname, WINFONT);
! 135: graphwin.fontsize = WINFONTSIZE;
! 136: c_token++;
! 137: }
! 138: }
! 139: if (!END_OF_COMMAND) {
! 140: if (almost_equals(c_token, "m$onochrome")) {
! 141: graphwin.color = FALSE;
! 142: c_token++;
! 143: } else if (almost_equals(c_token, "c$olor")
! 144: || almost_equals(c_token, "c$olour")) {
! 145: graphwin.color = TRUE;
! 146: c_token++;
! 147: }
! 148: }
! 149: if (!END_OF_COMMAND && isstring(c_token)) {
! 150: quote_str(graphwin.fontname, c_token, MAX_ID_LEN);
! 151: c_token++;
! 152: }
! 153: if (!END_OF_COMMAND) {
! 154: /* We have font size specified */
! 155: struct value a;
! 156: graphwin.fontsize = (int) real(const_express(&a));
! 157: }
! 158: if (graphwin.fontname[0] == '\0')
! 159: sprintf(term_options, "%s", graphwin.color ? "color" : "monochrome");
! 160: else
! 161: sprintf(term_options, "%s \"%s\" %d", graphwin.color ? "color" : "monochrome",
! 162: graphwin.fontname, graphwin.fontsize);
! 163: if (IsWindow(graphwin.hWndGraph) && IsIconic(graphwin.hWndGraph)) {
! 164: ShowWindow(graphwin.hWndGraph, SW_SHOWNORMAL);
! 165: }
! 166: GraphRedraw(&graphwin);
! 167: }
! 168:
! 169: /* We don't actually do scaling, but we need to fix up the text size
! 170: * if the user has resized the window */
! 171: int WIN_scale()
! 172: {
! 173: term->h_char = graphwin.hchar;
! 174: term->v_char = graphwin.vchar;
! 175: term->h_tic = graphwin.htic;
! 176: term->v_tic = graphwin.vtic;
! 177: sprintf(term_options, "%s \"%s\" %d",
! 178: graphwin.color ? "color" : "monochrome",
! 179: graphwin.fontname, graphwin.fontsize);
! 180: return FALSE; /* can't be done */
! 181: }
! 182:
! 183: TERM_PUBLIC void WIN_init()
! 184: {
! 185: if (!graphwin.hWndGraph) {
! 186: graphwin.xmax = WIN_XMAX;
! 187: graphwin.ymax = WIN_YMAX;
! 188: graphwin.htic = WIN_HTIC;
! 189: graphwin.vtic = WIN_VTIC;
! 190: GraphInit(&graphwin);
! 191: #ifdef WIN32
! 192: SetClassLong(graphwin.hWndGraph, GCL_HICON, (LONG) LoadIcon(graphwin.hInstance, "GRPICON"));
! 193: #else
! 194: SetClassWord(graphwin.hWndGraph, GCW_HICON, LoadIcon(graphwin.hInstance, "GRPICON"));
! 195: #endif
! 196: graphwin.resized = FALSE;
! 197: }
! 198: }
! 199:
! 200:
! 201: TERM_PUBLIC void WIN_reset()
! 202: {
! 203: }
! 204:
! 205: TERM_PUBLIC void WIN_text()
! 206: {
! 207: GraphEnd(&graphwin);
! 208: }
! 209:
! 210: TERM_PUBLIC void WIN_graphics()
! 211: {
! 212: GraphStart(&graphwin, pointsize);
! 213: }
! 214:
! 215: TERM_PUBLIC void WIN_move(x, y)
! 216: unsigned int x, y;
! 217: {
! 218: GraphOp(&graphwin, W_move, x, y, NULL);
! 219: }
! 220:
! 221: TERM_PUBLIC void WIN_vector(x, y)
! 222: unsigned int x, y;
! 223: {
! 224: GraphOp(&graphwin, W_vect, x, y, NULL);
! 225: }
! 226:
! 227: TERM_PUBLIC void WIN_linetype(lt)
! 228: int lt;
! 229: {
! 230: GraphOp(&graphwin, W_line_type, lt, 0, NULL);
! 231: }
! 232:
! 233: TERM_PUBLIC void WIN_put_text(x, y, str)
! 234: unsigned int x, y;
! 235: char *str;
! 236: {
! 237: GraphOp(&graphwin, W_put_text, x, y, str);
! 238: }
! 239:
! 240: TERM_PUBLIC int WIN_justify_text(mode)
! 241: enum JUSTIFY mode;
! 242: {
! 243: GraphOp(&graphwin, W_justify, mode, 0, NULL);
! 244: return (TRUE);
! 245: }
! 246:
! 247: TERM_PUBLIC int WIN_text_angle(ang)
! 248: int ang;
! 249: {
! 250: if (graphwin.rotate)
! 251: GraphOp(&graphwin, W_text_angle, ang, 0, NULL);
! 252: return graphwin.rotate;
! 253: }
! 254:
! 255: TERM_PUBLIC void WIN_point(x, y, number)
! 256: unsigned int x, y;
! 257: int number;
! 258: {
! 259: /* draw point shapes later to save memory */
! 260: /* size of point symbols */
! 261: graphwin.htic = pointsize * term->h_tic / 2;
! 262: graphwin.vtic = pointsize * term->v_tic / 2;
! 263: if (number >= 0)
! 264: number %= WIN_POINT_TYPES;
! 265: number += 1;
! 266: GraphOp(&graphwin, W_dot + number, x, y, NULL);
! 267: }
! 268:
! 269: TERM_PUBLIC void WIN_resume(void)
! 270: {
! 271: GraphResume(&graphwin);
! 272: }
! 273:
! 274: TERM_PUBLIC void WIN_set_pointsize(s)
! 275: double s;
! 276: {
! 277: /* Save new pointsize as string */
! 278: char scale[30];
! 279: sprintf(scale, "%.15g", s);
! 280: #if 1
! 281: /* HBB 980309: it seems passing it as a string is a bad idea
! 282: * in Win16: it means the wgnuplot.dll has to parse the string
! 283: * via sscanf(), leading to crash (by stack overflow?). Alternative:
! 284: * pass it as a scaled-up integer. For the sake of compatibility,
! 285: * pass the string as well. */
! 286: GraphOp(&graphwin, W_pointsize, (int) 100 * s, 0, scale);
! 287: #else
! 288: GraphOp(&graphwin, W_pointsize, 0, 0, scale);
! 289: #endif
! 290: }
! 291:
! 292: #endif /* TERM_BODY */
! 293:
! 294: #ifdef TERM_TABLE
! 295:
! 296: TERM_TABLE_START(win_driver)
! 297: "windows", "Microsoft Windows",
! 298: WIN_XMAX, WIN_YMAX, WIN_VCHAR, WIN_HCHAR,
! 299: WIN_VTIC, WIN_HTIC, WIN_options, WIN_init, WIN_reset,
! 300: WIN_text, null_scale, WIN_graphics, WIN_move, WIN_vector,
! 301: WIN_linetype, WIN_put_text, WIN_text_angle,
! 302: WIN_justify_text, WIN_point, do_arrow, set_font_null,
! 303: WIN_set_pointsize, TERM_CAN_MULTIPLOT,
! 304: WIN_text /* suspend */ , WIN_resume, 0 /*boxfill */
! 305: TERM_TABLE_END(win_driver)
! 306:
! 307: #undef LAST_TERM
! 308: #define LAST_TERM win_driver
! 309:
! 310: #endif /* TERM_TABLE */
! 311: #endif /* TERM_PROTO_ONLY */
! 312:
! 313: #ifdef TERM_HELP
! 314: START_HELP(windows)
! 315: "1 windows",
! 316: "?commands set terminal windows",
! 317: "?set terminal windows",
! 318: "?set term windows",
! 319: "?terminal windows",
! 320: "?term windows",
! 321: "?windows",
! 322: " Three options may be set in the `windows` terminal driver.",
! 323: "",
! 324: " Syntax:",
! 325: " set terminal windows {<color>} {\"<fontname>\"} {<fontsize>}",
! 326: "",
! 327: " where `<color>` is either `color` or `monochrome`, `\"<fontname>\"` is the",
! 328: " name of a valid Windows font, and `<fontsize>` is the size of the font in",
! 329: " points.",
! 330: "",
! 331: " Other options may be set with the graph-menu, the initialization file,",
! 332: " and `set linestyle`.",
! 333: /* Does this really belong here? If not, someone move it where it does. */
! 334: "",
! 335: " The Windows version normally terminates immediately as soon as the end of",
! 336: " any files given as command line arguments is reached (i.e. in non-interactive",
! 337: " mode). It will also not show the text-window at all, in this mode, only",
! 338: " the plot. By giving the optional argument",
! 339: " `/noend` or `-noend`, you can disable this behaviour.",
! 340: "2 graph-menu",
! 341: "?commands set terminal windows graph-menu",
! 342: "?set terminal windows graph-menu",
! 343: "?set term windows graph-menu",
! 344: "?windows graph-menu",
! 345: "?graph-menu",
! 346: " The `gnuplot graph` window has the following options on a pop-up menu",
! 347: " accessed by pressing the right mouse button or selecting `Options` from the",
! 348: " system menu:",
! 349: "",
! 350: " `Bring to Top` when checked brings the graph window to the top after every",
! 351: " plot.",
! 352: "",
! 353: " `Color` when checked enables color linestyles. When unchecked it forces",
! 354: " monochrome linestyles.",
! 355: "",
! 356: " `Copy to Clipboard` copies a bitmap and a Metafile picture.",
! 357: "",
! 358: " `Background...` sets the window background color.",
! 359: "",
! 360: " `Choose Font...` selects the font used in the graphics window.",
! 361: "",
! 362: " `Line Styles...` allows customization of the line colors and styles.",
! 363: "",
! 364: " `Print...` prints the graphics windows using a Windows printer driver and",
! 365: " allows selection of the printer and scaling of the output. The output",
! 366: " produced by `Print` is not as good as that from `gnuplot`'s own printer",
! 367: " drivers.",
! 368: "",
! 369: " `Update wgnuplot.ini` saves the current window locations, window sizes, text",
! 370: " window font, text window font size, graph window font, graph window font",
! 371: " size, background color and linestyles to the initialization file",
! 372: " `WGNUPLOT.INI`.",
! 373: "2 printing",
! 374: "?commands set terminal windows printing",
! 375: "?set terminal windows printing",
! 376: "?set term windows printing",
! 377: "?windows printing",
! 378: "?printing",
! 379: " In order of preference, graphs may be be printed in the following ways.",
! 380: "",
! 381: " `1.` Use the `gnuplot` command `set terminal` to select a printer and `set",
! 382: " output` to redirect output to a file.",
! 383: "",
! 384: " `2.` Select the `Print...` command from the `gnuplot graph` window. An extra",
! 385: " command `screendump` does this from the text window.",
! 386: "",
! 387: " `3.` If `set output \"PRN\"` is used, output will go to a temporary file. When",
! 388: " you exit from `gnuplot` or when you change the output with another `set",
! 389: " output` command, a dialog box will appear for you to select a printer port.",
! 390: " If you choose OK, the output will be printed on the selected port, passing",
! 391: " unmodified through the print manager. It is possible to accidentally (or",
! 392: " deliberately) send printer output meant for one printer to an incompatible",
! 393: " printer.",
! 394: "2 text-menu",
! 395: "?commands set terminal windows text-menu",
! 396: "?set terminal windows text-menu",
! 397: "?set term windows text-menu",
! 398: "?windows text-menu",
! 399: "?text-menu",
! 400: " The `gnuplot text` window has the following options on a pop-up menu accessed",
! 401: " by pressing the right mouse button or selecting `Options` from the system",
! 402: " menu:",
! 403: "",
! 404: " `Copy to Clipboard` copies marked text to the clipboard.",
! 405: "",
! 406: " `Paste` copies text from the clipboard as if typed by the user.",
! 407: "",
! 408: " `Choose Font...` selects the font used in the text window.",
! 409: "",
! 410: " `System Colors` when selected makes the text window honor the System Colors",
! 411: " set using the Control Panel. When unselected, text is black or blue on a",
! 412: " white background.",
! 413: "",
! 414: " `Update wgnuplot.ini` saves the current text window location, text window",
! 415: " size, text window font and text window font size to the initialisation file",
! 416: " `WGNUPLOT.INI`.",
! 417: "",
! 418: " `MENU BAR`",
! 419: "",
! 420: " If the menu file `WGNUPLOT.MNU` is found in the same directory as",
! 421: " WGNUPLOT.EXE, then the menu specified in `WGNUPLOT.MNU` will be loaded.",
! 422: " Menu commands:",
! 423: "",
! 424: " [Menu] starts a new menu with the name on the following line.",
! 425: "",
! 426: " [EndMenu] ends the current menu.",
! 427: "",
! 428: " [--] inserts a horizontal menu separator.",
! 429: "",
! 430: " [|] inserts a vertical menu separator.",
! 431: "",
! 432: " [Button] puts the next macro on a push button instead of a menu.",
! 433: "",
! 434: " Macros take two lines with the macro name (menu entry) on the first line and",
! 435: " the macro on the second line. Leading spaces are ignored. Macro commands:",
! 436: "",
! 437: " [INPUT] --- Input string with prompt terminated by [EOS] or {ENTER}",
! 438: "",
! 439: " [EOS] --- End Of String terminator. Generates no output.",
! 440: "",
! 441: " [OPEN] --- Get name of file to open from list box, with title of list box",
! 442: " terminated by [EOS], followed by default filename terminated by [EOS] or",
! 443: " {ENTER}. This uses COMMDLG.DLL from Windows 3.1.",
! 444: "",
! 445: " [SAVE] --- Get name of file to save. Similar to [OPEN]",
! 446: "",
! 447: " Macro character substitutions:",
! 448: "",
! 449: " {ENTER} --- Carriage Return '\\r'",
! 450: "",
! 451: " {TAB} --- Tab '\\011'",
! 452: "",
! 453: " {ESC} --- Escape '\\033'",
! 454: "",
! 455: " {^A} --- '\\001'",
! 456: "",
! 457: " ...",
! 458: "",
! 459: " {^_} --- '\\031'",
! 460: "",
! 461: " Macros are limited to 256 characters after expansion.",
! 462: "2 wgnuplot.ini",
! 463: "?commands set terminal windows wgnuplot.ini",
! 464: "?set terminal windows wgnuplot.ini",
! 465: "?set term windows wgnuplot.ini",
! 466: "?windows wgnuplot.ini",
! 467: "?wgnuplot.ini",
! 468: " Windows `gnuplot` will read some of its options from the `[WGNUPLOT]` section",
! 469: " of `WGNUPLOT.INI` in the Windows directory. A sample `WGNUPLOT.INI` file:",
! 470: "",
! 471: " [WGNUPLOT]",
! 472: " TextOrigin=0 0",
! 473: " TextSize=640 150",
! 474: " TextFont=Terminal,9",
! 475: " GraphOrigin=0 150",
! 476: " GraphSize=640 330",
! 477: " GraphFont=Arial,10",
! 478: " GraphColor=1",
! 479: " GraphToTop=1",
! 480: " GraphBackground=255 255 255",
! 481: " Border=0 0 0 0 0",
! 482: " Axis=192 192 192 2 2",
! 483: " Line1=0 0 255 0 0",
! 484: " Line2=0 255 0 0 1",
! 485: " Line3=255 0 0 0 2",
! 486: " Line4=255 0 255 0 3",
! 487: " Line5=0 0 128 0 4",
! 488: "",
! 489: " The `GraphFont` entry specifies the font name and size in points. The five",
! 490: " numbers given in the `Border`, `Axis` and `Line` entries are the `Red`",
! 491: " intensity (0--255), `Green` intensity, `Blue` intensity, `Color Linestyle`",
! 492: " and `Mono Linestyle`. `Linestyles` are 0=SOLID, 1=DASH, 2=DOT, 3=DASHDOT,",
! 493: " 4=DASHDOTDOT. In the sample `WGNUPLOT.INI` file above, Line 2 is a green",
! 494: " solid line in color mode, or a dashed line in monochrome mode. The default",
! 495: " line width is 1 pixel. If `Linestyle` is negative, it specifies the width of",
! 496: " a SOLID line in pixels. Line1 and any linestyle used with the `points` style",
! 497: " must be SOLID with unit width.",
! 498: "2 windows3.0",
! 499: "?commands set terminal windows windows3.0",
! 500: "?set terminal windows windows3.0",
! 501: "?set term windows windows3.0",
! 502: "?windows windows3.0",
! 503: "?windows3.0",
! 504: " Windows 3.1 is preferred, but WGNUPLOT will run under Windows 3.0 with the",
! 505: " following restrictions:",
! 506: " `1.` COMMDLG.DLL and SHELL.DLL (available with Windows 3.1 or Borland C++",
! 507: " 3.1) must be in the windows directory.",
! 508: "",
! 509: " `2.` WGNUPLOT.HLP produced by Borland C++ 3.1 is in Windows 3.1 format.",
! 510: " You need to use the WINHELP.EXE supplied with Borland C++ 3.1.",
! 511: "",
! 512: " `3.` It will not run in real mode due to lack of memory.",
! 513: "",
! 514: " `4.` TrueType fonts are not available in the graph window.",
! 515: "",
! 516: " `5.` Drag-drop does not work."
! 517: END_HELP(windows)
! 518: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>