Annotation of OpenXM_contrib/gnuplot/term/win.trm, Revision 1.1.1.2
1.1 maekawa 1: /*
1.1.1.2 ! maekawa 2: * $Id: win.trm,v 1.8 1998/12/14 18:41:54 lhecking Exp $
1.1 maekawa 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>