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