|
|
1.1 root 1: /*
2: * main.c --
3: *
4: * A simple program to test the toolkit facilities.
5: *
6: * Copyright 1990-1992 Regents of the University of California.
7: * Permission to use, copy, modify, and distribute this
8: * software and its documentation for any purpose and without
9: * fee is hereby granted, provided that the above copyright
10: * notice appear in all copies. The University of California
11: * makes no representations about the suitability of this
12: * software for any purpose. It is provided "as is" without
13: * express or implied warranty.
14: */
15:
16: #ifndef lint
17: static char rcsid[] = "$Header: /user6/ouster/wish/RCS/main.c,v 1.68 92/05/07 08:52:02 ouster Exp $ SPRITE (Berkeley)";
18: #endif
19:
20: #include "tkconfig.h"
21: #include "tkint.h"
22:
23: /*
24: * Declarations for library procedures:
25: */
26:
27: extern int isatty();
28:
29: /*
30: * Command used to initialize wish:
31: */
32:
33: char initCmd[] = "source $tk_library/wish.tcl";
34:
35: Tk_Window w; /* NULL means window has been deleted. */
36: Tk_TimerToken timeToken = 0;
37: int idleHandler = 0;
38: Tcl_Interp *interp;
39: int x, y;
40: Tcl_CmdBuf buffer;
41: int tty;
42: extern int Tk_SquareCmd _ANSI_ARGS_((ClientData clientData,
43: Tcl_Interp *interp, int argc, char **argv));
44:
45: /*
46: * Information for testing out command-line options:
47: */
48:
49: int synchronize = 0;
50: char *fileName = NULL;
51: char *name = NULL;
52: char *display = NULL;
53: char *geometry = NULL;
54:
55: Tk_ArgvInfo argTable[] = {
56: {"-file", TK_ARGV_STRING, (char *) NULL, (char *) &fileName,
57: "File from which to read commands"},
58: {"-geometry", TK_ARGV_STRING, (char *) NULL, (char *) &geometry,
59: "Initial geometry for window"},
60: {"-display", TK_ARGV_STRING, (char *) NULL, (char *) &display,
61: "Display to use"},
62: {"-name", TK_ARGV_STRING, (char *) NULL, (char *) &name,
63: "Name to use for application"},
64: {"-sync", TK_ARGV_CONSTANT, (char *) 1, (char *) &synchronize,
65: "Use synchronous mode for display server"},
66: {(char *) NULL, TK_ARGV_END, (char *) NULL, (char *) NULL,
67: (char *) NULL}
68: };
69:
70: /* ARGSUSED */
71: void
72: StdinProc(clientData, mask)
73: ClientData clientData; /* Not used. */
74: int mask;
75: {
76: char line[200];
77: static int gotPartial = 0;
78: char *cmd;
79: int result;
80:
81: if (mask & TK_READABLE) {
82: if (fgets(line, 200, stdin) == NULL) {
83: if (!gotPartial) {
84: if (tty) {
85: Tcl_Eval(interp, "destroy .", 0, (char **) NULL);
86: exit(0);
87: } else {
88: Tk_DeleteFileHandler(0);
89: }
90: return;
91: } else {
92: line[0] = 0;
93: }
94: }
95: cmd = Tcl_AssembleCmd(buffer, line);
96: if (cmd == NULL) {
97: gotPartial = 1;
98: return;
99: }
100: gotPartial = 0;
101: result = Tcl_RecordAndEval(interp, cmd, 0);
102: if (*interp->result != 0) {
103: if ((result != TCL_OK) || (tty)) {
104: printf("%s\n", interp->result);
105: }
106: }
107: if (tty) {
108: printf("wish: ");
109: fflush(stdout);
110: }
111: }
112: }
113:
114: /* ARGSUSED */
115: static void
116: StructureProc(clientData, eventPtr)
117: ClientData clientData; /* Information about window. */
118: XEvent *eventPtr; /* Information about event. */
119: {
120: if (eventPtr->type == DestroyNotify) {
121: w = NULL;
122: }
123: }
124:
125: /*
126: * Procedure to map initial window. This is invoked as a do-when-idle
127: * handler. Wait for all other when-idle handlers to be processed
128: * before mapping the window, so that the window's correct geometry
129: * has been determined.
130: */
131:
132: /* ARGSUSED */
133: static void
134: DelayedMap(clientData)
135: ClientData clientData; /* Not used. */
136: {
137:
138: while (Tk_DoOneEvent(TK_IDLE_EVENTS) != 0) {
139: /* Empty loop body. */
140: }
141: if (w == NULL) {
142: return;
143: }
144: Tk_MapWindow(w);
145: }
146:
147: /* ARGSUSED */
148: int
149: DotCmd(dummy, interp, argc, argv)
150: ClientData dummy; /* Not used. */
151: Tcl_Interp *interp; /* Current interpreter. */
152: int argc; /* Number of arguments. */
153: char **argv; /* Argument strings. */
154: {
155: int x, y;
156:
157: if (argc != 3) {
158: Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
159: " x y\"", (char *) NULL);
160: return TCL_ERROR;
161: }
162: x = strtol(argv[1], (char **) NULL, 0);
163: y = strtol(argv[2], (char **) NULL, 0);
164: Tk_MakeWindowExist(w);
165: XDrawPoint(Tk_Display(w), Tk_WindowId(w),
166: DefaultGCOfScreen(Tk_Screen(w)), x, y);
167: return TCL_OK;
168: }
169:
170: /* ARGSUSED */
171: int
172: MovetoCmd(dummy, interp, argc, argv)
173: ClientData dummy; /* Not used. */
174: Tcl_Interp *interp; /* Current interpreter. */
175: int argc; /* Number of arguments. */
176: char **argv; /* Argument strings. */
177: {
178: if (argc != 3) {
179: Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
180: " x y\"", (char *) NULL);
181: return TCL_ERROR;
182: }
183: x = strtol(argv[1], (char **) NULL, 0);
184: y = strtol(argv[2], (char **) NULL, 0);
185: return TCL_OK;
186: }
187: /* ARGSUSED */
188: int
189: LinetoCmd(dummy, interp, argc, argv)
190: ClientData dummy; /* Not used. */
191: Tcl_Interp *interp; /* Current interpreter. */
192: int argc; /* Number of arguments. */
193: char **argv; /* Argument strings. */
194: {
195: int newX, newY;
196:
197: if (argc != 3) {
198: Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
199: " x y\"", (char *) NULL);
200: return TCL_ERROR;
201: }
202: newX = strtol(argv[1], (char **) NULL, 0);
203: newY = strtol(argv[2], (char **) NULL, 0);
204: Tk_MakeWindowExist(w);
205: XDrawLine(Tk_Display(w), Tk_WindowId(w),
206: DefaultGCOfScreen(Tk_Screen(w)), x, y, newX, newY);
207: x = newX;
208: y = newY;
209: return TCL_OK;
210: }
211:
212: int
213: main(argc, argv)
214: int argc;
215: char **argv;
216: {
217: char *args, *p, *msg;
218: char buf[20];
219: int result;
220: Tk_3DBorder border;
221:
222: { extern char *TCL_Library, *TK_Library;
223: extern int TK_CreateColormap;
224: char *tcllib = getenv("TCL_LIBRARY");
225: char *tklib = getenv("TK_LIBRARY");
226: char *create = getenv("CREATE_COLORMAP");
227: if (tklib != NULL)
228: TK_Library = tklib;
229: if (tcllib != NULL)
230: TCL_Library = tcllib;
231: if (create != NULL)
232: TK_CreateColormap = 1;
233: }
234:
235: interp = Tcl_CreateInterp();
236: #ifdef TCL_MEM_DEBUG
237: Tcl_InitMemory(interp);
238: #endif
239: if (Tk_ParseArgv(interp, (Tk_Window) NULL, &argc, argv, argTable, 0)
240: != TCL_OK) {
241: fprintf(stderr, "%s\n", interp->result);
242: exit(1);
243: }
244: if (name == NULL) {
245: if (fileName != NULL) {
246: p = fileName;
247: } else {
248: p = argv[0];
249: }
250: name = strrchr(p, '/');
251: if (name != NULL) {
252: name++;
253: } else {
254: name = p;
255: }
256: }
257: w = Tk_CreateMainWindow(interp, display, name);
258: if (w == NULL) {
259: fprintf(stderr, "%s\n", interp->result);
260: exit(1);
261: }
262: Tk_SetClass(w, "Tk");
263: Tk_CreateEventHandler(w, StructureNotifyMask, StructureProc,
264: (ClientData) NULL);
265: Tk_DoWhenIdle(DelayedMap, (ClientData) NULL);
266: tty = isatty(0);
267:
268: args = Tcl_Merge(argc-1, argv+1);
269: Tcl_SetVar(interp, "argv", args, TCL_GLOBAL_ONLY);
270: ckfree(args);
271: sprintf(buf, "%d", argc-1);
272: Tcl_SetVar(interp, "argc", buf, TCL_GLOBAL_ONLY);
273:
274: if (synchronize) {
275: XSynchronize(Tk_Display(w), True);
276: }
277: Tk_GeometryRequest(w, 200, 200);
278: border = Tk_Get3DBorder(interp, w, None, "#4eee94");
279: if (border == NULL) {
280: Tcl_SetResult(interp, (char *) NULL, TCL_STATIC);
281: Tk_SetWindowBackground(w, WhitePixelOfScreen(Tk_Screen(w)));
282: } else {
283: Tk_SetBackgroundFromBorder(w, border);
284: }
285: XSetForeground(Tk_Display(w), DefaultGCOfScreen(Tk_Screen(w)),
286: BlackPixelOfScreen(Tk_Screen(w)));
287: Tcl_CreateCommand(interp, "dot", DotCmd, (ClientData) w,
288: (void (*)()) NULL);
289: Tcl_CreateCommand(interp, "lineto", LinetoCmd, (ClientData) w,
290: (void (*)()) NULL);
291: Tcl_CreateCommand(interp, "moveto", MovetoCmd, (ClientData) w,
292: (void (*)()) NULL);
293: #ifdef SQUARE_DEMO
294: Tcl_CreateCommand(interp, "square", Tk_SquareCmd, (ClientData) w,
295: (void (*)()) NULL);
296: #endif
297: if (geometry != NULL) {
298: Tcl_SetVar(interp, "geometry", geometry, TCL_GLOBAL_ONLY);
299: }
300: result = Tcl_Eval(interp, initCmd, 0, (char **) NULL);
301: if (result != TCL_OK) {
302: goto error;
303: }
304: if (fileName != NULL) {
305: result = Tcl_VarEval(interp, "source ", fileName, (char *) NULL);
306: if (result != TCL_OK) {
307: goto error;
308: }
309: tty = 0;
310: } else {
311: tty = isatty(0);
312: Tk_CreateFileHandler(0, TK_READABLE, StdinProc, (ClientData) 0);
313: if (tty) {
314: printf("wish: ");
315: }
316: }
317: fflush(stdout);
318: buffer = Tcl_CreateCmdBuf();
319: (void) Tcl_Eval(interp, "update", 0, (char **) NULL);
320:
321: Tk_MainLoop();
322: Tcl_DeleteInterp(interp);
323: Tcl_DeleteCmdBuf(buffer);
324: exit(0);
325:
326: error:
327: msg = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);
328: if (msg == NULL) {
329: msg = interp->result;
330: }
331: fprintf(stderr, "%s\n", msg);
332: Tcl_Eval(interp, "destroy .", 0, (char **) NULL);
333: exit(1);
334: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.