|
|
1.1 root 1: /*
2: * tkCmds.c --
3: *
4: * This file contains a collection of Tk-related Tcl commands
5: * that didn't fit in any particular file of the toolkit.
6: *
7: * Copyright 1990-1992 Regents of the University of California
8: * Permission to use, copy, modify, and distribute this
9: * software and its documentation for any purpose and without
10: * fee is hereby granted, provided that the above copyright
11: * notice appear in all copies. The University of California
12: * makes no representations about the suitability of this
13: * software for any purpose. It is provided "as is" without
14: * express or implied warranty.
15: */
16:
17: #ifndef lint
18: static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCmds.c,v 1.32 92/06/03 14:21:14 ouster Exp $ SPRITE (Berkeley)";
19: #endif /* not lint */
20:
21: #include "tkconfig.h"
22: #include "tkint.h"
23:
24: /*
25: * The data structure below is used by the "after" command to remember
26: * the command to be executed later.
27: */
28:
29: typedef struct {
30: Tcl_Interp *interp; /* Interpreter in which to execute command. */
31: char *command; /* Command to execute. Malloc'ed, so must
32: * be freed when structure is deallocated.
33: * NULL means nothing to execute. */
34: int *donePtr; /* If non-NULL indicates address of word to
35: * set to 1 when command has finally been
36: * executed. */
37: } AfterInfo;
38:
39: /*
40: * Forward declarations for procedures defined later in this file:
41: */
42:
43: static void AfterProc _ANSI_ARGS_((ClientData clientData));
44: static char * WaitVariableProc _ANSI_ARGS_((ClientData clientData,
45: Tcl_Interp *interp, char *name1, char *name2,
46: int flags));
47: static void WaitWindowProc _ANSI_ARGS_((ClientData clientData,
48: XEvent *eventPtr));
49:
50: /*
51: *----------------------------------------------------------------------
52: *
53: * Tk_AfterCmd --
54: *
55: * This procedure is invoked to process the "after" Tcl command.
56: * See the user documentation for details on what it does.
57: *
58: * Results:
59: * A standard Tcl result.
60: *
61: * Side effects:
62: * See the user documentation.
63: *
64: *----------------------------------------------------------------------
65: */
66:
67: /* ARGSUSED */
68: int
69: Tk_AfterCmd(clientData, interp, argc, argv)
70: ClientData clientData; /* Main window associated with
71: * interpreter. Not used.*/
72: Tcl_Interp *interp; /* Current interpreter. */
73: int argc; /* Number of arguments. */
74: char **argv; /* Argument strings. */
75: {
76: int ms;
77: AfterInfo *afterPtr;
78: int done;
79:
80: if (argc < 2) {
81: Tcl_AppendResult(interp, "wrong # args: should be \"",
82: argv[0], " milliseconds ?command? ?arg arg ...?\"",
83: (char *) NULL);
84: return TCL_ERROR;
85: }
86:
87: if ((Tcl_GetInt(interp, argv[1], &ms) != TCL_OK) || (ms <= 0)) {
88: Tcl_AppendResult(interp, "bad milliseconds value \"",
89: argv[1], "\"", (char *) NULL);
90: return TCL_ERROR;
91: }
92: afterPtr = (AfterInfo *) ckalloc((unsigned) (sizeof(AfterInfo)));
93: afterPtr->interp = interp;
94: if (argc == 2) {
95: afterPtr->command = (char *) NULL;
96: done = 0;
97: afterPtr->donePtr = &done;
98: } else if (argc == 3) {
99: afterPtr->command = (char *) ckalloc((unsigned) (strlen(argv[2]) + 1));
100: strcpy(afterPtr->command, argv[2]);
101: afterPtr->donePtr = (int *) NULL;
102: } else {
103: afterPtr->command = Tcl_Concat(argc-2, argv+2);
104: afterPtr->donePtr = (int *) NULL;
105: }
106: Tk_CreateTimerHandler(ms, AfterProc, (ClientData) afterPtr);
107: if (argc == 2) {
108: while (!done) {
109: Tk_DoOneEvent(0);
110: }
111: }
112:
113: /*
114: * Must reset interpreter result because it could have changed as
115: * part of events processed by Tk_DoOneEvent.
116: */
117:
118: Tcl_ResetResult(interp);
119: return TCL_OK;
120: }
121:
122: /*
123: *----------------------------------------------------------------------
124: *
125: * AfterProc --
126: *
127: * Timer callback to execute commands registered with the
128: * "after" command.
129: *
130: * Results:
131: * None.
132: *
133: * Side effects:
134: * Executes whatever command was specified. If the command
135: * returns an error, then the command "tkerror" is invoked
136: * to process the error; if tkerror fails then information
137: * about the error is output on stderr.
138: *
139: *----------------------------------------------------------------------
140: */
141:
142: static void
143: AfterProc(clientData)
144: ClientData clientData; /* Describes command to execute. */
145: {
146: AfterInfo *afterPtr = (AfterInfo *) clientData;
147: int result;
148:
149: if (afterPtr->command != NULL) {
150: result = Tcl_GlobalEval(afterPtr->interp, afterPtr->command);
151: if (result != TCL_OK) {
152: TkBindError(afterPtr->interp);
153: }
154: ckfree(afterPtr->command);
155: }
156: if (afterPtr->donePtr != NULL) {
157: *afterPtr->donePtr = 1;
158: }
159: ckfree((char *) afterPtr);
160: }
161:
162: /*
163: *----------------------------------------------------------------------
164: *
165: * Tk_BindCmd --
166: *
167: * This procedure is invoked to process the "bind" Tcl command.
168: * See the user documentation for details on what it does.
169: *
170: * Results:
171: * A standard Tcl result.
172: *
173: * Side effects:
174: * See the user documentation.
175: *
176: *----------------------------------------------------------------------
177: */
178:
179: int
180: Tk_BindCmd(clientData, interp, argc, argv)
181: ClientData clientData; /* Main window associated with
182: * interpreter. */
183: Tcl_Interp *interp; /* Current interpreter. */
184: int argc; /* Number of arguments. */
185: char **argv; /* Argument strings. */
186: {
187: Tk_Window tkwin = (Tk_Window) clientData;
188: TkWindow *winPtr;
189: ClientData object;
190:
191: if ((argc < 2) || (argc > 4)) {
192: Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
193: " window ?pattern? ?command?\"", (char *) NULL);
194: return TCL_ERROR;
195: }
196: if (argv[1][0] == '.') {
197: winPtr = (TkWindow *) Tk_NameToWindow(interp, argv[1], tkwin);
198: if (winPtr == NULL) {
199: return TCL_ERROR;
200: }
201: object = (ClientData) winPtr->pathName;
202: } else {
203: winPtr = (TkWindow *) clientData;
204: object = (ClientData) Tk_GetUid(argv[1]);
205: }
206:
207: if (argc == 4) {
208: int append = 0;
209: unsigned long mask;
210:
211: if (argv[3][0] == 0) {
212: return Tk_DeleteBinding(interp, winPtr->mainPtr->bindingTable,
213: object, argv[2]);
214: }
215: if (argv[3][0] == '+') {
216: argv[3]++;
217: append = 1;
218: }
219: mask = Tk_CreateBinding(interp, winPtr->mainPtr->bindingTable,
220: object, argv[2], argv[3], append);
221: if (mask == 0) {
222: return TCL_ERROR;
223: }
224: } else if (argc == 3) {
225: char *command;
226:
227: command = Tk_GetBinding(interp, winPtr->mainPtr->bindingTable,
228: object, argv[2]);
229: if (command == NULL) {
230: Tcl_ResetResult(interp);
231: return TCL_OK;
232: }
233: interp->result = command;
234: } else {
235: Tk_GetAllBindings(interp, winPtr->mainPtr->bindingTable, object);
236: }
237: return TCL_OK;
238: }
239:
240: /*
241: *----------------------------------------------------------------------
242: *
243: * TkBindEventProc --
244: *
245: * This procedure is invoked by Tk_HandleEvent for each event; it
246: * causes any appropriate bindings for that event to be invoked.
247: *
248: * Results:
249: * None.
250: *
251: * Side effects:
252: * Depends on what bindings have been established with the "bind"
253: * command.
254: *
255: *----------------------------------------------------------------------
256: */
257:
258: void
259: TkBindEventProc(winPtr, eventPtr)
260: TkWindow *winPtr; /* Pointer to info about window. */
261: XEvent *eventPtr; /* Information about event. */
262: {
263: ClientData objects[3];
264: static Tk_Uid allUid = NULL;
265:
266: if ((winPtr->mainPtr == NULL) || (winPtr->mainPtr->bindingTable == NULL)) {
267: return;
268: }
269: objects[0] = (ClientData) winPtr->pathName;
270: objects[1] = (ClientData) winPtr->classUid;
271: if (allUid == NULL) {
272: allUid = Tk_GetUid("all");
273: }
274: objects[2] = (ClientData) allUid;
275: Tk_BindEvent(winPtr->mainPtr->bindingTable, eventPtr,
276: (Tk_Window) winPtr, 3, objects);
277: }
278:
279: /*
280: *----------------------------------------------------------------------
281: *
282: * Tk_DestroyCmd --
283: *
284: * This procedure is invoked to process the "destroy" Tcl command.
285: * See the user documentation for details on what it does.
286: *
287: * Results:
288: * A standard Tcl result.
289: *
290: * Side effects:
291: * See the user documentation.
292: *
293: *----------------------------------------------------------------------
294: */
295:
296: int
297: Tk_DestroyCmd(clientData, interp, argc, argv)
298: ClientData clientData; /* Main window associated with
299: * interpreter. */
300: Tcl_Interp *interp; /* Current interpreter. */
301: int argc; /* Number of arguments. */
302: char **argv; /* Argument strings. */
303: {
304: Tk_Window window;
305: Tk_Window tkwin = (Tk_Window) clientData;
306:
307: if (argc != 2) {
308: Tcl_AppendResult(interp, "wrong # args: should be \"",
309: argv[0], " pathName\"", (char *) NULL);
310: return TCL_ERROR;
311: }
312:
313: window = Tk_NameToWindow(interp, argv[1], tkwin);
314: if (window == NULL) {
315: return TCL_ERROR;
316: }
317: Tk_DestroyWindow(window);
318: return TCL_OK;
319: }
320:
321: /*
322: *----------------------------------------------------------------------
323: *
324: * Tk_UpdateCmd --
325: *
326: * This procedure is invoked to process the "update" Tcl command.
327: * See the user documentation for details on what it does.
328: *
329: * Results:
330: * A standard Tcl result.
331: *
332: * Side effects:
333: * See the user documentation.
334: *
335: *----------------------------------------------------------------------
336: */
337:
338: /* ARGSUSED */
339: int
340: Tk_UpdateCmd(clientData, interp, argc, argv)
341: ClientData clientData; /* Main window associated with
342: * interpreter. */
343: Tcl_Interp *interp; /* Current interpreter. */
344: int argc; /* Number of arguments. */
345: char **argv; /* Argument strings. */
346: {
347: Tk_Window tkwin = (Tk_Window) clientData;
348: int flags;
349:
350: if (argc == 1) {
351: flags = TK_DONT_WAIT;
352: } else if (argc == 2) {
353: if (strncmp(argv[1], "idletasks", strlen(argv[1])) != 0) {
354: Tcl_AppendResult(interp, "bad argument \"", argv[1],
355: "\": must be idletasks", (char *) NULL);
356: return TCL_ERROR;
357: }
358: flags = TK_IDLE_EVENTS;
359: } else {
360: Tcl_AppendResult(interp, "wrong # args: should be \"",
361: argv[0], " ?idletasks?\"", (char *) NULL);
362: return TCL_ERROR;
363: }
364:
365: /*
366: * Handle all pending events, sync the display, and repeat over
367: * and over again until all pending events have been handled.
368: */
369:
370: while (1) {
371: while (Tk_DoOneEvent(flags) != 0) {
372: /* Empty loop body */
373: }
374: XSync(Tk_Display(tkwin), False);
375: if (Tk_DoOneEvent(flags) == 0) {
376: break;
377: }
378: }
379:
380: /*
381: * Must clear the interpreter's result because event handlers could
382: * have executed commands.
383: */
384:
385: Tcl_ResetResult(interp);
386: return TCL_OK;
387: }
388:
389: /*
390: *----------------------------------------------------------------------
391: *
392: * Tk_TkwaitCmd --
393: *
394: * This procedure is invoked to process the "wait" Tcl command.
395: * See the user documentation for details on what it does.
396: *
397: * Results:
398: * A standard Tcl result.
399: *
400: * Side effects:
401: * See the user documentation.
402: *
403: *----------------------------------------------------------------------
404: */
405:
406: /* ARGSUSED */
407: int
408: Tk_TkwaitCmd(clientData, interp, argc, argv)
409: ClientData clientData; /* Main window associated with
410: * interpreter. */
411: Tcl_Interp *interp; /* Current interpreter. */
412: int argc; /* Number of arguments. */
413: char **argv; /* Argument strings. */
414: {
415: Tk_Window tkwin = (Tk_Window) clientData;
416: int c, length;
417: int done;
418:
419: if (argc != 3) {
420: Tcl_AppendResult(interp, "wrong # args: should be \"",
421: argv[0], " variable|window name\"", (char *) NULL);
422: return TCL_ERROR;
423: }
424: c = argv[1][0];
425: length = strlen(argv[1]);
426: if ((c == 'v') && (strncmp(argv[1], "variable", length) == 0)) {
427: Tcl_TraceVar(interp, argv[2],
428: TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
429: WaitVariableProc, (ClientData) &done);
430: done = 0;
431: while (!done) {
432: Tk_DoOneEvent(0);
433: }
434: Tcl_UntraceVar(interp, argv[2],
435: TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
436: WaitVariableProc, (ClientData) &done);
437: } else if ((c == 'w') && (strncmp(argv[1], "window", length) == 0)) {
438: Tk_Window window;
439:
440: window = Tk_NameToWindow(interp, argv[2], tkwin);
441: if (window == NULL) {
442: return TCL_ERROR;
443: }
444: Tk_CreateEventHandler(window, StructureNotifyMask,
445: WaitWindowProc, (ClientData) &done);
446: done = 0;
447: while (!done) {
448: Tk_DoOneEvent(0);
449: }
450: Tk_DeleteEventHandler(window, StructureNotifyMask,
451: WaitWindowProc, (ClientData) &done);
452: } else {
453: Tcl_AppendResult(interp, "bad option \"", argv[1],
454: "\": must be variable or window", (char *) NULL);
455: return TCL_ERROR;
456: }
457:
458: /*
459: * Clear out the interpreter's result, since it may have been set
460: * by event handlers.
461: */
462:
463: Tcl_ResetResult(interp);
464: return TCL_OK;
465: }
466:
467: /* ARGSUSED */
468: static char *
469: WaitVariableProc(clientData, interp, name1, name2, flags)
470: ClientData clientData; /* Pointer to integer to set to 1. */
471: Tcl_Interp *interp; /* Interpreter containing variable. */
472: char *name1; /* Name of variable. */
473: char *name2; /* Second part of variable name. */
474: int flags; /* Information about what happened. */
475: {
476: int *donePtr = (int *) clientData;
477:
478: *donePtr = 1;
479: return (char *) NULL;
480: }
481:
482: static void
483: WaitWindowProc(clientData, eventPtr)
484: ClientData clientData; /* Pointer to integer to set to 1. */
485: XEvent *eventPtr; /* Information about event. */
486: {
487: int *donePtr = (int *) clientData;
488:
489: if (eventPtr->type == DestroyNotify) {
490: *donePtr = 1;
491: }
492: }
493:
494: /*
495: *----------------------------------------------------------------------
496: *
497: * Tk_WinfoCmd --
498: *
499: * This procedure is invoked to process the "winfo" Tcl command.
500: * See the user documentation for details on what it does.
501: *
502: * Results:
503: * A standard Tcl result.
504: *
505: * Side effects:
506: * See the user documentation.
507: *
508: *----------------------------------------------------------------------
509: */
510:
511: int
512: Tk_WinfoCmd(clientData, interp, argc, argv)
513: ClientData clientData; /* Main window associated with
514: * interpreter. */
515: Tcl_Interp *interp; /* Current interpreter. */
516: int argc; /* Number of arguments. */
517: char **argv; /* Argument strings. */
518: {
519: Tk_Window tkwin = (Tk_Window) clientData;
520: int length;
521: char c, *argName;
522: Tk_Window window;
523: register TkWindow *winPtr;
524:
525: #define SETUP(name) \
526: if (argc != 3) {\
527: argName = name; \
528: goto wrongArgs; \
529: } \
530: window = Tk_NameToWindow(interp, argv[2], tkwin); \
531: if (window == NULL) { \
532: return TCL_ERROR; \
533: }
534:
535: if (argc < 2) {
536: Tcl_AppendResult(interp, "wrong # args: should be \"",
537: argv[0], " option ?arg?\"", (char *) NULL);
538: return TCL_ERROR;
539: }
540: c = argv[1][0];
541: length = strlen(argv[1]);
542: if ((c == 'a') && (strcmp(argv[1], "atom") == 0)) {
543: if (argc != 3) {
544: Tcl_AppendResult(interp, "wrong # args: should be \"",
545: argv[0], " atom name\"", (char *) NULL);
546: return TCL_ERROR;
547: }
548: sprintf(interp->result, "%d", Tk_InternAtom(tkwin, argv[2]));
549: } else if ((c == 'a') && (strncmp(argv[1], "atomname", length) == 0)
550: && (length >= 5)) {
551: Atom atom;
552: char *name;
553:
554: if (argc != 3) {
555: Tcl_AppendResult(interp, "wrong # args: should be \"",
556: argv[0], " atomname id\"", (char *) NULL);
557: return TCL_ERROR;
558: }
559: if (Tcl_GetInt(interp, argv[2], (int *) &atom) != TCL_OK) {
560: return TCL_ERROR;
561: }
562: name = Tk_GetAtomName(tkwin, atom);
563: if (strcmp(name, "?bad atom?") == 0) {
564: Tcl_AppendResult(interp, "no atom exists with id \"",
565: argv[2], "\"", (char *) NULL);
566: return TCL_ERROR;
567: }
568: interp->result = name;
569: } else if ((c == 'c') && (strncmp(argv[1], "children", length) == 0)
570: && (length >= 2)) {
571: char *separator, *childName;
572:
573: SETUP("children");
574: separator = "";
575: for (winPtr = ((TkWindow *) window)->childList; winPtr != NULL;
576: winPtr = winPtr->nextPtr) {
577: childName = Tcl_Merge(1, &winPtr->pathName);
578: Tcl_AppendResult(interp, separator, childName, (char *) NULL);
579: ckfree(childName);
580: separator = " ";
581: }
582: } else if ((c == 'c') && (strncmp(argv[1], "class", length) == 0)
583: && (length >= 2)) {
584: SETUP("class");
585: interp->result = Tk_Class(window);
586: } else if ((c == 'c') && (strncmp(argv[1], "containing", length) == 0)
587: && (length >= 2)) {
588: int rootX, rootY;
589:
590: if (argc != 4) {
591: Tcl_AppendResult(interp, "wrong # args: should be \"",
592: argv[0], " containing rootX rootY\"", (char *) NULL);
593: return TCL_ERROR;
594: }
595: if ((Tk_GetPixels(interp, tkwin, argv[2], &rootX) != TCL_OK)
596: || (Tk_GetPixels(interp, tkwin, argv[3], &rootY) != TCL_OK)) {
597: return TCL_ERROR;
598: }
599: window = Tk_CoordsToWindow(rootX, rootY, tkwin);
600: if (window != NULL) {
601: interp->result = Tk_PathName(window);
602: }
603: } else if ((c == 'f') && (strncmp(argv[1], "fpixels", length) == 0)
604: && (length >= 2)) {
605: double mm, pixels;
606:
607: if (argc != 4) {
608: Tcl_AppendResult(interp, "wrong # args: should be \"",
609: argv[0], " fpixels window number\"", (char *) NULL);
610: return TCL_ERROR;
611: }
612: window = Tk_NameToWindow(interp, argv[2], tkwin);
613: if (window == NULL) {
614: return TCL_ERROR;
615: }
616: if (Tk_GetScreenMM(interp, window, argv[3], &mm) != TCL_OK) {
617: return TCL_ERROR;
618: }
619: pixels = mm * WidthOfScreen(Tk_Screen(window))
620: / WidthMMOfScreen(Tk_Screen(window));
621: sprintf(interp->result, "%g", pixels);
622: } else if ((c == 'g') && (strncmp(argv[1], "geometry", length) == 0)) {
623: SETUP("geometry");
624: sprintf(interp->result, "%dx%d+%d+%d", Tk_Width(window),
625: Tk_Height(window), Tk_X(window), Tk_Y(window));
626: } else if ((c == 'h') && (strncmp(argv[1], "height", length) == 0)) {
627: SETUP("height");
628: sprintf(interp->result, "%d", Tk_Height(window));
629: } else if ((c == 'i') && (strcmp(argv[1], "id") == 0)) {
630: SETUP("id");
631: sprintf(interp->result, "0x%x", Tk_WindowId(window));
632: } else if ((c == 'i') && (strncmp(argv[1], "interps", length) == 0)
633: && (length >= 2)) {
634: if (argc != 2) {
635: Tcl_AppendResult(interp, "wrong # args: should be \"",
636: argv[1], " interps\"", (char *) NULL);
637: return TCL_ERROR;
638: }
639: return TkGetInterpNames(interp, tkwin);
640: } else if ((c == 'i') && (strncmp(argv[1], "ismapped", length) == 0)
641: && (length >= 2)) {
642: SETUP("ismapped");
643: interp->result = Tk_IsMapped(window) ? "1" : "0";
644: } else if ((c == 'n') && (strncmp(argv[1], "name", length) == 0)) {
645: SETUP("geometry");
646: interp->result = Tk_Name(window);
647: } else if ((c == 'p') && (strncmp(argv[1], "parent", length) == 0)) {
648: SETUP("geometry");
649: winPtr = (TkWindow *) window;
650: if (winPtr->parentPtr != NULL) {
651: interp->result = winPtr->parentPtr->pathName;
652: }
653: } else if ((c == 'p') && (strncmp(argv[1], "pathname", length) == 0)
654: && (length >= 2)) {
655: Window id;
656:
657: if (argc != 3) {
658: argName = "pathname";
659: goto wrongArgs;
660: }
661: if (Tcl_GetInt(interp, argv[2], (int *) &id) != TCL_OK) {
662: return TCL_ERROR;
663: }
664: if ((XFindContext(Tk_Display(tkwin), id, tkWindowContext,
665: (void *) &window) != 0) || (((TkWindow *) window)->mainPtr
666: != ((TkWindow *) tkwin)->mainPtr)) {
667: Tcl_AppendResult(interp, "window id \"", argv[2],
668: "\" doesn't exist in this application", (char *) NULL);
669: return TCL_ERROR;
670: }
671: interp->result = Tk_PathName(window);
672: } else if ((c == 'p') && (strncmp(argv[1], "pixels", length) == 0)
673: && (length >= 2)) {
674: int pixels;
675:
676: if (argc != 4) {
677: Tcl_AppendResult(interp, "wrong # args: should be \"",
678: argv[0], " pixels window number\"", (char *) NULL);
679: return TCL_ERROR;
680: }
681: window = Tk_NameToWindow(interp, argv[2], tkwin);
682: if (window == NULL) {
683: return TCL_ERROR;
684: }
685: if (Tk_GetPixels(interp, window, argv[3], &pixels) != TCL_OK) {
686: return TCL_ERROR;
687: }
688: sprintf(interp->result, "%d", pixels);
689: } else if ((c == 'r') && (strncmp(argv[1], "reqheight", length) == 0)
690: && (length >= 4)) {
691: SETUP("reqheight");
692: sprintf(interp->result, "%d", Tk_ReqHeight(window));
693: } else if ((c == 'r') && (strncmp(argv[1], "reqwidth", length) == 0)
694: && (length >= 4)) {
695: SETUP("reqwidth");
696: sprintf(interp->result, "%d", Tk_ReqWidth(window));
697: } else if ((c == 'r') && (strcmp(argv[1], "rootx") == 0)) {
698: int x, y;
699:
700: SETUP("rootx");
701: Tk_GetRootCoords(window, &x, &y);
702: sprintf(interp->result, "%d", x);
703: } else if ((c == 'r') && (strcmp(argv[1], "rooty") == 0)) {
704: int x, y;
705:
706: SETUP("rooty");
707: Tk_GetRootCoords(window, &x, &y);
708: sprintf(interp->result, "%d", y);
709: } else if ((c == 's') && (strcmp(argv[1], "screen") == 0)) {
710: char string[20];
711:
712: SETUP("screen");
713: sprintf(string, "%d", Tk_ScreenNumber(window));
714: Tcl_AppendResult(interp, Tk_DisplayName(window), ".", string,
715: (char *) NULL);
716: } else if ((c == 's') && (strncmp(argv[1], "screencells", length) == 0)
717: && (length >= 7)) {
718: SETUP("screencells");
719: sprintf(interp->result, "%d", Tk_DefaultVisual(Tk_Screen(window))->map_entries);
720: } else if ((c == 's') && (strncmp(argv[1], "screendepth", length) == 0)
721: && (length >= 7)) {
722: SETUP("screendepth");
723: sprintf(interp->result, "%d", Tk_DefaultDepth(Tk_Screen(window)));
724: } else if ((c == 's') && (strncmp(argv[1], "screenheight", length) == 0)
725: && (length >= 7)) {
726: SETUP("screenheight");
727: sprintf(interp->result, "%d", HeightOfScreen(Tk_Screen(window)));
728: } else if ((c == 's') && (strncmp(argv[1], "screenmmheight", length) == 0)
729: && (length >= 9)) {
730: SETUP("screenmmheight");
731: sprintf(interp->result, "%d", HeightMMOfScreen(Tk_Screen(window)));
732: } else if ((c == 's') && (strncmp(argv[1], "screenmmwidth", length) == 0)
733: && (length >= 9)) {
734: SETUP("screenmmwidth");
735: sprintf(interp->result, "%d", WidthMMOfScreen(Tk_Screen(window)));
736: } else if ((c == 's') && (strncmp(argv[1], "screenvisual", length) == 0)
737: && (length >= 7)) {
738: SETUP("screenvisual");
739: switch (Tk_DefaultVisual(Tk_Screen(window))->class) {
740: case PseudoColor: interp->result = "pseudocolor"; break;
741: case GrayScale: interp->result = "grayscale"; break;
742: case DirectColor: interp->result = "directcolor"; break;
743: case TrueColor: interp->result = "truecolor"; break;
744: case StaticColor: interp->result = "staticcolor"; break;
745: case StaticGray: interp->result = "staticgray"; break;
746: default: interp->result = "unknown"; break;
747: }
748: } else if ((c == 's') && (strncmp(argv[1], "screenwidth", length) == 0)
749: && (length >= 7)) {
750: SETUP("screenwidth");
751: sprintf(interp->result, "%d", WidthOfScreen(Tk_Screen(window)));
752: } else if ((c == 's') && (strcmp(argv[1], "server") == 0)) {
753: SETUP("server");
754: Tcl_AppendResult(interp, Tk_DisplayName(window), (char *) NULL);
755: } else if ((c == 't') && (strncmp(argv[1], "toplevel", length) == 0)) {
756: SETUP("toplevel");
757: for (winPtr = (TkWindow *) window; !(winPtr->flags & TK_TOP_LEVEL);
758: winPtr = winPtr->parentPtr) {
759: /* Empty loop body. */
760: }
761: interp->result = winPtr->pathName;
762: } else if ((c == 'w') && (strncmp(argv[1], "width", length) == 0)) {
763: SETUP("width");
764: sprintf(interp->result, "%d", Tk_Width(window));
765: } else if ((c == 'x') && (argv[1][1] == '\0')) {
766: SETUP("x");
767: sprintf(interp->result, "%d", Tk_X(window));
768: } else if ((c == 'y') && (argv[1][1] == '\0')) {
769: SETUP("y");
770: sprintf(interp->result, "%d", Tk_Y(window));
771: } else {
772: Tcl_AppendResult(interp, "bad option \"", argv[1],
773: "\": must be atom, atomname, children, class, fpixels, geometry, height, ",
774: "id, interps, ismapped, name, parent, pathname, ",
775: "pixels, reqheight, reqwidth, rootx, rooty, ",
776: "screen, screencells, screendepth, screenheight, ",
777: "screenmmheight, screenmmwidth, screenvisual, ",
778: "screenwidth, toplevel, width, x, or y", (char *) NULL);
779: return TCL_ERROR;
780: }
781: return TCL_OK;
782:
783: wrongArgs:
784: Tcl_AppendResult(interp, "wrong # arguments: must be \"",
785: argv[0], " ", argName, " window\"", (char *) NULL);
786: return TCL_ERROR;
787: }
788:
789: /*
790: *----------------------------------------------------------------------
791: *
792: * TkDeadAppCmd --
793: *
794: * If an application has been deleted then all Tk commands will be
795: * re-bound to this procedure.
796: *
797: * Results:
798: * A standard Tcl error is reported to let the user know that
799: * the application is dead.
800: *
801: * Side effects:
802: * See the user documentation.
803: *
804: *----------------------------------------------------------------------
805: */
806:
807: /* ARGSUSED */
808: int
809: TkDeadAppCmd(clientData, interp, argc, argv)
810: ClientData clientData; /* Dummy. */
811: Tcl_Interp *interp; /* Current interpreter. */
812: int argc; /* Number of arguments. */
813: char **argv; /* Argument strings. */
814: {
815: Tcl_AppendResult(interp, "can't invoke \"", argv[0],
816: "\" command: application has been destroyed", (char *) NULL);
817: return TCL_ERROR;
818: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.