4 * This file contains a collection of Tk-related Tcl commands
5 * that didn't fit in any particular file of the toolkit.
7 * Copyright (c) 1990-1994 The Regents of the University of California.
8 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
9 * Copyright (c) 2000 Scriptics Corporation.
11 * See the file "license.terms" for information on usage and redistribution
12 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
23 #elif defined(MAC_TCL)
25 #elif defined(MAC_OSX_TK)
26 #include "tkMacOSXInt.h"
28 #include "tkUnixInt.h"
32 * Forward declarations for procedures defined later in this file:
35 static TkWindow * GetToplevel _ANSI_ARGS_((Tk_Window tkwin));
36 static char * WaitVariableProc _ANSI_ARGS_((ClientData clientData,
37 Tcl_Interp *interp, CONST char *name1,
38 CONST char *name2, int flags));
39 static void WaitVisibilityProc _ANSI_ARGS_((ClientData clientData,
41 static void WaitWindowProc _ANSI_ARGS_((ClientData clientData,
45 *----------------------------------------------------------------------
49 * This procedure is invoked to process the "bell" Tcl command.
50 * See the user documentation for details on what it does.
53 * A standard Tcl result.
56 * See the user documentation.
58 *----------------------------------------------------------------------
62 Tk_BellObjCmd(clientData, interp, objc, objv)
63 ClientData clientData; /* Main window associated with interpreter. */
64 Tcl_Interp *interp; /* Current interpreter. */
65 int objc; /* Number of arguments. */
66 Tcl_Obj *CONST objv[]; /* Argument objects. */
68 static CONST char *bellOptions[] = {"-displayof", "-nice", (char *) NULL};
69 enum options { TK_BELL_DISPLAYOF, TK_BELL_NICE };
70 Tk_Window tkwin = (Tk_Window) clientData;
71 int i, index, nice = 0;
74 Tcl_WrongNumArgs(interp, 1, objv, "?-displayof window? ?-nice?");
78 for (i = 1; i < objc; i++) {
79 if (Tcl_GetIndexFromObj(interp, objv[i], bellOptions, "option", 0,
83 switch ((enum options) index) {
84 case TK_BELL_DISPLAYOF:
86 Tcl_WrongNumArgs(interp, 1, objv,
87 "?-displayof window? ?-nice?");
90 tkwin = Tk_NameToWindow(interp, Tcl_GetString(objv[i]), tkwin);
100 XBell(Tk_Display(tkwin), 0);
102 XForceScreenSaver(Tk_Display(tkwin), ScreenSaverReset);
104 XFlush(Tk_Display(tkwin));
109 *----------------------------------------------------------------------
113 * This procedure is invoked to process the "bind" Tcl command.
114 * See the user documentation for details on what it does.
117 * A standard Tcl result.
120 * See the user documentation.
122 *----------------------------------------------------------------------
126 Tk_BindObjCmd(clientData, interp, objc, objv)
127 ClientData clientData; /* Main window associated with interpreter. */
128 Tcl_Interp *interp; /* Current interpreter. */
129 int objc; /* Number of arguments. */
130 Tcl_Obj *CONST objv[]; /* Argument objects. */
132 Tk_Window tkwin = (Tk_Window) clientData;
137 if ((objc < 2) || (objc > 4)) {
138 Tcl_WrongNumArgs(interp, 1, objv, "window ?pattern? ?command?");
141 string = Tcl_GetString(objv[1]);
144 * Bind tags either a window name or a tag name for the first argument.
145 * If the argument starts with ".", assume it is a window; otherwise, it
149 if (string[0] == '.') {
150 winPtr = (TkWindow *) Tk_NameToWindow(interp, string, tkwin);
151 if (winPtr == NULL) {
154 object = (ClientData) winPtr->pathName;
156 winPtr = (TkWindow *) clientData;
157 object = (ClientData) Tk_GetUid(string);
161 * If there are four arguments, the command is modifying a binding. If
162 * there are three arguments, the command is querying a binding. If there
163 * are only two arguments, the command is querying all the bindings for
164 * the given tag/window.
170 char *sequence, *script;
171 sequence = Tcl_GetString(objv[2]);
172 script = Tcl_GetString(objv[3]);
175 * If the script is null, just delete the binding.
178 if (script[0] == 0) {
179 return Tk_DeleteBinding(interp, winPtr->mainPtr->bindingTable,
184 * If the script begins with "+", append this script to the existing
188 if (script[0] == '+') {
192 mask = Tk_CreateBinding(interp, winPtr->mainPtr->bindingTable,
193 object, sequence, script, append);
197 } else if (objc == 3) {
200 command = Tk_GetBinding(interp, winPtr->mainPtr->bindingTable,
201 object, Tcl_GetString(objv[2]));
202 if (command == NULL) {
203 Tcl_ResetResult(interp);
206 Tcl_SetResult(interp, (char *) command, TCL_STATIC);
208 Tk_GetAllBindings(interp, winPtr->mainPtr->bindingTable, object);
214 *----------------------------------------------------------------------
218 * This procedure is invoked by Tk_HandleEvent for each event; it
219 * causes any appropriate bindings for that event to be invoked.
225 * Depends on what bindings have been established with the "bind"
228 *----------------------------------------------------------------------
232 TkBindEventProc(winPtr, eventPtr)
233 TkWindow *winPtr; /* Pointer to info about window. */
234 XEvent *eventPtr; /* Information about event. */
237 ClientData objects[MAX_OBJS], *objPtr;
243 if ((winPtr->mainPtr == NULL) || (winPtr->mainPtr->bindingTable == NULL)) {
248 if (winPtr->numTags != 0) {
250 * Make a copy of the tags for the window, replacing window names
251 * with pointers to the pathName from the appropriate window.
254 if (winPtr->numTags > MAX_OBJS) {
255 objPtr = (ClientData *) ckalloc((unsigned)
256 (winPtr->numTags * sizeof(ClientData)));
258 for (i = 0; i < winPtr->numTags; i++) {
259 p = (char *) winPtr->tagPtr[i];
261 hPtr = Tcl_FindHashEntry(&winPtr->mainPtr->nameTable, p);
263 p = ((TkWindow *) Tcl_GetHashValue(hPtr))->pathName;
268 objPtr[i] = (ClientData) p;
270 count = winPtr->numTags;
272 objPtr[0] = (ClientData) winPtr->pathName;
273 objPtr[1] = (ClientData) winPtr->classUid;
274 for (topLevPtr = winPtr;
275 (topLevPtr != NULL) && !(topLevPtr->flags & TK_TOP_HIERARCHY);
276 topLevPtr = topLevPtr->parentPtr) {
277 /* Empty loop body. */
279 if ((winPtr != topLevPtr) && (topLevPtr != NULL)) {
281 objPtr[2] = (ClientData) topLevPtr->pathName;
285 objPtr[count-1] = (ClientData) Tk_GetUid("all");
287 Tk_BindEvent(winPtr->mainPtr->bindingTable, eventPtr, (Tk_Window) winPtr,
289 if (objPtr != objects) {
290 ckfree((char *) objPtr);
295 *----------------------------------------------------------------------
297 * Tk_BindtagsObjCmd --
299 * This procedure is invoked to process the "bindtags" Tcl command.
300 * See the user documentation for details on what it does.
303 * A standard Tcl result.
306 * See the user documentation.
308 *----------------------------------------------------------------------
312 Tk_BindtagsObjCmd(clientData, interp, objc, objv)
313 ClientData clientData; /* Main window associated with interpreter. */
314 Tcl_Interp *interp; /* Current interpreter. */
315 int objc; /* Number of arguments. */
316 Tcl_Obj *CONST objv[]; /* Argument objects. */
318 Tk_Window tkwin = (Tk_Window) clientData;
319 TkWindow *winPtr, *winPtr2;
322 Tcl_Obj *listPtr, **tags;
324 if ((objc < 2) || (objc > 3)) {
325 Tcl_WrongNumArgs(interp, 1, objv, "window ?taglist?");
328 winPtr = (TkWindow *) Tk_NameToWindow(interp, Tcl_GetString(objv[1]),
330 if (winPtr == NULL) {
334 listPtr = Tcl_NewObj();
335 Tcl_IncrRefCount(listPtr);
336 if (winPtr->numTags == 0) {
337 Tcl_ListObjAppendElement(interp, listPtr,
338 Tcl_NewStringObj(winPtr->pathName, -1));
339 Tcl_ListObjAppendElement(interp, listPtr,
340 Tcl_NewStringObj(winPtr->classUid, -1));
342 while ((winPtr2 != NULL) && !(Tk_TopWinHierarchy(winPtr2))) {
343 winPtr2 = winPtr2->parentPtr;
345 if ((winPtr != winPtr2) && (winPtr2 != NULL)) {
346 Tcl_ListObjAppendElement(interp, listPtr,
347 Tcl_NewStringObj(winPtr2->pathName, -1));
349 Tcl_ListObjAppendElement(interp, listPtr,
350 Tcl_NewStringObj("all", -1));
352 for (i = 0; i < winPtr->numTags; i++) {
353 Tcl_ListObjAppendElement(interp, listPtr,
354 Tcl_NewStringObj((char *)winPtr->tagPtr[i], -1));
357 Tcl_SetObjResult(interp, listPtr);
358 Tcl_DecrRefCount(listPtr);
361 if (winPtr->tagPtr != NULL) {
362 TkFreeBindingTags(winPtr);
364 if (Tcl_ListObjGetElements(interp, objv[2], &length, &tags) != TCL_OK) {
371 winPtr->numTags = length;
372 winPtr->tagPtr = (ClientData *) ckalloc((unsigned)
373 (length * sizeof(ClientData)));
374 for (i = 0; i < length; i++) {
375 p = Tcl_GetString(tags[i]);
380 * Handle names starting with "." specially: store a malloc'ed
381 * string, rather than a Uid; at event time we'll look up the
382 * name in the window table and use the corresponding window,
386 copy = (char *) ckalloc((unsigned) (strlen(p) + 1));
388 winPtr->tagPtr[i] = (ClientData) copy;
390 winPtr->tagPtr[i] = (ClientData) Tk_GetUid(p);
397 *----------------------------------------------------------------------
399 * TkFreeBindingTags --
401 * This procedure is called to free all of the binding tags
402 * associated with a window; typically it is only invoked where
403 * there are window-specific tags.
409 * Any binding tags for winPtr are freed.
411 *----------------------------------------------------------------------
415 TkFreeBindingTags(winPtr)
416 TkWindow *winPtr; /* Window whose tags are to be released. */
421 for (i = 0; i < winPtr->numTags; i++) {
422 p = (char *) (winPtr->tagPtr[i]);
425 * Names starting with "." are malloced rather than Uids, so
426 * they have to be freed.
432 ckfree((char *) winPtr->tagPtr);
434 winPtr->tagPtr = NULL;
438 *----------------------------------------------------------------------
440 * Tk_DestroyObjCmd --
442 * This procedure is invoked to process the "destroy" Tcl command.
443 * See the user documentation for details on what it does.
446 * A standard Tcl result.
449 * See the user documentation.
451 *----------------------------------------------------------------------
455 Tk_DestroyObjCmd(clientData, interp, objc, objv)
456 ClientData clientData; /* Main window associated with
458 Tcl_Interp *interp; /* Current interpreter. */
459 int objc; /* Number of arguments. */
460 Tcl_Obj *CONST objv[]; /* Argument objects. */
463 Tk_Window tkwin = (Tk_Window) clientData;
466 for (i = 1; i < objc; i++) {
467 window = Tk_NameToWindow(interp, Tcl_GetString(objv[i]), tkwin);
468 if (window == NULL) {
469 Tcl_ResetResult(interp);
472 Tk_DestroyWindow(window);
473 if (window == tkwin) {
475 * We just deleted the main window for the application! This
476 * makes it impossible to do anything more (tkwin isn't
487 *----------------------------------------------------------------------
491 * This procedure is invoked to process the "lower" Tcl command.
492 * See the user documentation for details on what it does.
495 * A standard Tcl result.
498 * See the user documentation.
500 *----------------------------------------------------------------------
505 Tk_LowerObjCmd(clientData, interp, objc, objv)
506 ClientData clientData; /* Main window associated with
508 Tcl_Interp *interp; /* Current interpreter. */
509 int objc; /* Number of arguments. */
510 Tcl_Obj *CONST objv[]; /* Argument objects. */
512 Tk_Window mainwin = (Tk_Window) clientData;
513 Tk_Window tkwin, other;
515 if ((objc != 2) && (objc != 3)) {
516 Tcl_WrongNumArgs(interp, 1, objv, "window ?belowThis?");
520 tkwin = Tk_NameToWindow(interp, Tcl_GetString(objv[1]), mainwin);
527 other = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), mainwin);
532 if (Tk_RestackWindow(tkwin, Below, other) != TCL_OK) {
533 Tcl_AppendResult(interp, "can't lower \"", Tcl_GetString(objv[1]),
534 "\" below \"", (other ? Tcl_GetString(objv[2]) : ""),
535 "\"", (char *) NULL);
542 *----------------------------------------------------------------------
546 * This procedure is invoked to process the "raise" Tcl command.
547 * See the user documentation for details on what it does.
550 * A standard Tcl result.
553 * See the user documentation.
555 *----------------------------------------------------------------------
560 Tk_RaiseObjCmd(clientData, interp, objc, objv)
561 ClientData clientData; /* Main window associated with
563 Tcl_Interp *interp; /* Current interpreter. */
564 int objc; /* Number of arguments. */
565 Tcl_Obj *CONST objv[]; /* Argument objects. */
567 Tk_Window mainwin = (Tk_Window) clientData;
568 Tk_Window tkwin, other;
570 if ((objc != 2) && (objc != 3)) {
571 Tcl_WrongNumArgs(interp, 1, objv, "window ?aboveThis?");
575 tkwin = Tk_NameToWindow(interp, Tcl_GetString(objv[1]), mainwin);
582 other = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), mainwin);
587 if (Tk_RestackWindow(tkwin, Above, other) != TCL_OK) {
588 Tcl_AppendResult(interp, "can't raise \"", Tcl_GetString(objv[1]),
589 "\" above \"", (other ? Tcl_GetString(objv[2]) : ""),
590 "\"", (char *) NULL);
597 *----------------------------------------------------------------------
601 * This procedure is invoked to process the "tk" Tcl command.
602 * See the user documentation for details on what it does.
605 * A standard Tcl result.
608 * See the user documentation.
610 *----------------------------------------------------------------------
614 Tk_TkObjCmd(clientData, interp, objc, objv)
615 ClientData clientData; /* Main window associated with interpreter. */
616 Tcl_Interp *interp; /* Current interpreter. */
617 int objc; /* Number of arguments. */
618 Tcl_Obj *CONST objv[]; /* Argument objects. */
622 static CONST char *optionStrings[] = {
623 "appname", "caret", "scaling", "useinputmethods",
624 "windowingsystem", NULL
627 TK_APPNAME, TK_CARET, TK_SCALING, TK_USE_IM,
631 tkwin = (Tk_Window) clientData;
634 Tcl_WrongNumArgs(interp, 1, objv, "option ?arg?");
637 if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
642 switch ((enum options) index) {
647 if (Tcl_IsSafe(interp)) {
648 Tcl_SetResult(interp,
649 "appname not accessible in a safe interpreter",
654 winPtr = (TkWindow *) tkwin;
657 Tcl_WrongNumArgs(interp, 2, objv, "?newName?");
661 string = Tcl_GetStringFromObj(objv[2], NULL);
662 winPtr->nameUid = Tk_GetUid(Tk_SetAppName(tkwin, string));
664 Tcl_AppendResult(interp, winPtr->nameUid, NULL);
671 static CONST char *caretStrings[]
672 = { "-x", "-y", "-height", NULL };
674 { TK_CARET_X, TK_CARET_Y, TK_CARET_HEIGHT };
676 if ((objc < 3) || ((objc > 4) && !(objc & 1))) {
677 Tcl_WrongNumArgs(interp, 2, objv,
678 "window ?-x x? ?-y y? ?-height height?");
681 window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin);
682 if (window == NULL) {
685 caretPtr = &(((TkWindow *) window)->dispPtr->caret);
688 * Return all the current values
690 objPtr = Tcl_NewObj();
691 Tcl_ListObjAppendElement(interp, objPtr,
692 Tcl_NewStringObj("-height", 7));
693 Tcl_ListObjAppendElement(interp, objPtr,
694 Tcl_NewIntObj(caretPtr->height));
695 Tcl_ListObjAppendElement(interp, objPtr,
696 Tcl_NewStringObj("-x", 2));
697 Tcl_ListObjAppendElement(interp, objPtr,
698 Tcl_NewIntObj(caretPtr->x));
699 Tcl_ListObjAppendElement(interp, objPtr,
700 Tcl_NewStringObj("-y", 2));
701 Tcl_ListObjAppendElement(interp, objPtr,
702 Tcl_NewIntObj(caretPtr->y));
703 Tcl_SetObjResult(interp, objPtr);
704 } else if (objc == 4) {
707 * Return the current value of the selected option
709 if (Tcl_GetIndexFromObj(interp, objv[3], caretStrings,
710 "caret option", 0, &index) != TCL_OK) {
713 if (index == TK_CARET_X) {
715 } else if (index == TK_CARET_Y) {
717 } else /* if (index == TK_CARET_HEIGHT) -- last case */ {
718 value = caretPtr->height;
720 Tcl_SetIntObj(Tcl_GetObjResult(interp), value);
722 int i, value, x = 0, y = 0, height = -1;
724 for (i = 3; i < objc; i += 2) {
725 if ((Tcl_GetIndexFromObj(interp, objv[i], caretStrings,
726 "caret option", 0, &index) != TCL_OK) ||
727 (Tcl_GetIntFromObj(interp, objv[i+1], &value)
731 if (index == TK_CARET_X) {
733 } else if (index == TK_CARET_Y) {
735 } else /* if (index == TK_CARET_HEIGHT) -- last case */ {
740 height = Tk_Height(window);
742 Tk_SetCaretPos(window, x, y, height);
748 int skip, width, height;
751 if (Tcl_IsSafe(interp)) {
752 Tcl_SetResult(interp,
753 "scaling not accessible in a safe interpreter",
758 screenPtr = Tk_Screen(tkwin);
760 skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
764 if (objc - skip == 2) {
766 d *= WidthOfScreen(screenPtr);
767 d /= WidthMMOfScreen(screenPtr);
768 Tcl_SetDoubleObj(Tcl_GetObjResult(interp), d);
769 } else if (objc - skip == 3) {
770 if (Tcl_GetDoubleFromObj(interp, objv[2+skip], &d) != TCL_OK) {
774 width = (int) (d * WidthOfScreen(screenPtr) + 0.5);
778 height = (int) (d * HeightOfScreen(screenPtr) + 0.5);
782 WidthMMOfScreen(screenPtr) = width;
783 HeightMMOfScreen(screenPtr) = height;
785 Tcl_WrongNumArgs(interp, 2, objv,
786 "?-displayof window? ?factor?");
792 TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
795 if (Tcl_IsSafe(interp)) {
796 Tcl_SetResult(interp,
797 "useinputmethods not accessible in a safe interpreter",
802 skip = TkGetDisplayOf(interp, objc-2, objv+2, &tkwin);
806 dispPtr = ((TkWindow *) tkwin)->dispPtr;
808 if ((objc - skip) == 3) {
810 * In the case where TK_USE_INPUT_METHODS is not defined,
811 * this will be ignored and we will always return 0.
812 * That will indicate to the user that input methods
813 * are just not available.
816 if (Tcl_GetBooleanFromObj(interp, objv[2+skip], &boolVal)
820 #ifdef TK_USE_INPUT_METHODS
822 dispPtr->flags |= TK_DISPLAY_USE_IM;
824 dispPtr->flags &= ~TK_DISPLAY_USE_IM;
826 #endif /* TK_USE_INPUT_METHODS */
827 } else if ((objc - skip) != 2) {
828 Tcl_WrongNumArgs(interp, 2, objv,
829 "?-displayof window? ?boolean?");
832 Tcl_SetBooleanObj(Tcl_GetObjResult(interp),
833 (int) (dispPtr->flags & TK_DISPLAY_USE_IM));
836 case TK_WINDOWINGSYSTEM: {
837 CONST char *windowingsystem;
840 Tcl_WrongNumArgs(interp, 2, objv, NULL);
844 windowingsystem = "win32";
845 #elif defined(MAC_TCL)
846 windowingsystem = "classic";
847 #elif defined(MAC_OSX_TK)
848 windowingsystem = "aqua";
850 windowingsystem = "x11";
852 Tcl_SetStringObj(Tcl_GetObjResult(interp), windowingsystem, -1);
860 *----------------------------------------------------------------------
864 * This procedure is invoked to process the "tkwait" Tcl command.
865 * See the user documentation for details on what it does.
868 * A standard Tcl result.
871 * See the user documentation.
873 *----------------------------------------------------------------------
878 Tk_TkwaitObjCmd(clientData, interp, objc, objv)
879 ClientData clientData; /* Main window associated with
881 Tcl_Interp *interp; /* Current interpreter. */
882 int objc; /* Number of arguments. */
883 Tcl_Obj *CONST objv[]; /* Argument objects. */
885 Tk_Window tkwin = (Tk_Window) clientData;
887 static CONST char *optionStrings[] = { "variable", "visibility", "window",
889 enum options { TKWAIT_VARIABLE, TKWAIT_VISIBILITY, TKWAIT_WINDOW };
892 Tcl_WrongNumArgs(interp, 1, objv, "variable|visibility|window name");
896 if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
901 switch ((enum options) index) {
902 case TKWAIT_VARIABLE: {
903 if (Tcl_TraceVar(interp, Tcl_GetString(objv[2]),
904 TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
905 WaitVariableProc, (ClientData) &done) != TCL_OK) {
912 Tcl_UntraceVar(interp, Tcl_GetString(objv[2]),
913 TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
914 WaitVariableProc, (ClientData) &done);
918 case TKWAIT_VISIBILITY: {
921 window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin);
922 if (window == NULL) {
925 Tk_CreateEventHandler(window,
926 VisibilityChangeMask|StructureNotifyMask,
927 WaitVisibilityProc, (ClientData) &done);
934 * Note that we do not delete the event handler because it
935 * was deleted automatically when the window was destroyed.
938 Tcl_ResetResult(interp);
939 Tcl_AppendResult(interp, "window \"", Tcl_GetString(objv[2]),
940 "\" was deleted before its visibility changed",
944 Tk_DeleteEventHandler(window,
945 VisibilityChangeMask|StructureNotifyMask,
946 WaitVisibilityProc, (ClientData) &done);
950 case TKWAIT_WINDOW: {
953 window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin);
954 if (window == NULL) {
957 Tk_CreateEventHandler(window, StructureNotifyMask,
958 WaitWindowProc, (ClientData) &done);
964 * Note: there's no need to delete the event handler. It was
965 * deleted automatically when the window was destroyed.
972 * Clear out the interpreter's result, since it may have been set
976 Tcl_ResetResult(interp);
982 WaitVariableProc(clientData, interp, name1, name2, flags)
983 ClientData clientData; /* Pointer to integer to set to 1. */
984 Tcl_Interp *interp; /* Interpreter containing variable. */
985 CONST char *name1; /* Name of variable. */
986 CONST char *name2; /* Second part of variable name. */
987 int flags; /* Information about what happened. */
989 int *donePtr = (int *) clientData;
992 return (char *) NULL;
997 WaitVisibilityProc(clientData, eventPtr)
998 ClientData clientData; /* Pointer to integer to set to 1. */
999 XEvent *eventPtr; /* Information about event (not used). */
1001 int *donePtr = (int *) clientData;
1003 if (eventPtr->type == VisibilityNotify) {
1006 if (eventPtr->type == DestroyNotify) {
1012 WaitWindowProc(clientData, eventPtr)
1013 ClientData clientData; /* Pointer to integer to set to 1. */
1014 XEvent *eventPtr; /* Information about event. */
1016 int *donePtr = (int *) clientData;
1018 if (eventPtr->type == DestroyNotify) {
1024 *----------------------------------------------------------------------
1026 * Tk_UpdateObjCmd --
1028 * This procedure is invoked to process the "update" Tcl command.
1029 * See the user documentation for details on what it does.
1032 * A standard Tcl result.
1035 * See the user documentation.
1037 *----------------------------------------------------------------------
1042 Tk_UpdateObjCmd(clientData, interp, objc, objv)
1043 ClientData clientData; /* Main window associated with
1045 Tcl_Interp *interp; /* Current interpreter. */
1046 int objc; /* Number of arguments. */
1047 Tcl_Obj *CONST objv[]; /* Argument objects. */
1049 static CONST char *updateOptions[] = {"idletasks", (char *) NULL};
1054 flags = TCL_DONT_WAIT;
1055 } else if (objc == 2) {
1056 if (Tcl_GetIndexFromObj(interp, objv[1], updateOptions, "option", 0,
1057 &index) != TCL_OK) {
1060 flags = TCL_IDLE_EVENTS;
1062 Tcl_WrongNumArgs(interp, 1, objv, "?idletasks?");
1067 * Handle all pending events, sync all displays, and repeat over
1068 * and over again until all pending events have been handled.
1069 * Special note: it's possible that the entire application could
1070 * be destroyed by an event handler that occurs during the update.
1071 * Thus, don't use any information from tkwin after calling
1076 while (Tcl_DoOneEvent(flags) != 0) {
1077 /* Empty loop body */
1079 for (dispPtr = TkGetDisplayList(); dispPtr != NULL;
1080 dispPtr = dispPtr->nextPtr) {
1081 XSync(dispPtr->display, False);
1083 if (Tcl_DoOneEvent(flags) == 0) {
1089 * Must clear the interpreter's result because event handlers could
1090 * have executed commands.
1093 Tcl_ResetResult(interp);
1098 *----------------------------------------------------------------------
1102 * This procedure is invoked to process the "winfo" Tcl command.
1103 * See the user documentation for details on what it does.
1106 * A standard Tcl result.
1109 * See the user documentation.
1111 *----------------------------------------------------------------------
1115 Tk_WinfoObjCmd(clientData, interp, objc, objv)
1116 ClientData clientData; /* Main window associated with
1118 Tcl_Interp *interp; /* Current interpreter. */
1119 int objc; /* Number of arguments. */
1120 Tcl_Obj *CONST objv[]; /* Argument objects. */
1122 int index, x, y, width, height, useX, useY, class, skip;
1128 static TkStateMap visualMap[] = {
1129 {PseudoColor, "pseudocolor"},
1130 {GrayScale, "grayscale"},
1131 {DirectColor, "directcolor"},
1132 {TrueColor, "truecolor"},
1133 {StaticColor, "staticcolor"},
1134 {StaticGray, "staticgray"},
1137 static CONST char *optionStrings[] = {
1138 "cells", "children", "class", "colormapfull",
1139 "depth", "geometry", "height", "id",
1140 "ismapped", "manager", "name", "parent",
1141 "pointerx", "pointery", "pointerxy", "reqheight",
1142 "reqwidth", "rootx", "rooty", "screen",
1143 "screencells", "screendepth", "screenheight", "screenwidth",
1144 "screenmmheight","screenmmwidth","screenvisual","server",
1145 "toplevel", "viewable", "visual", "visualid",
1146 "vrootheight", "vrootwidth", "vrootx", "vrooty",
1149 "atom", "atomname", "containing", "interps",
1152 "exists", "fpixels", "pixels", "rgb",
1158 WIN_CELLS, WIN_CHILDREN, WIN_CLASS, WIN_COLORMAPFULL,
1159 WIN_DEPTH, WIN_GEOMETRY, WIN_HEIGHT, WIN_ID,
1160 WIN_ISMAPPED, WIN_MANAGER, WIN_NAME, WIN_PARENT,
1161 WIN_POINTERX, WIN_POINTERY, WIN_POINTERXY, WIN_REQHEIGHT,
1162 WIN_REQWIDTH, WIN_ROOTX, WIN_ROOTY, WIN_SCREEN,
1163 WIN_SCREENCELLS,WIN_SCREENDEPTH,WIN_SCREENHEIGHT,WIN_SCREENWIDTH,
1164 WIN_SCREENMMHEIGHT,WIN_SCREENMMWIDTH,WIN_SCREENVISUAL,WIN_SERVER,
1165 WIN_TOPLEVEL, WIN_VIEWABLE, WIN_VISUAL, WIN_VISUALID,
1166 WIN_VROOTHEIGHT,WIN_VROOTWIDTH, WIN_VROOTX, WIN_VROOTY,
1167 WIN_WIDTH, WIN_X, WIN_Y,
1169 WIN_ATOM, WIN_ATOMNAME, WIN_CONTAINING, WIN_INTERPS,
1172 WIN_EXISTS, WIN_FPIXELS, WIN_PIXELS, WIN_RGB,
1173 WIN_VISUALSAVAILABLE
1176 tkwin = (Tk_Window) clientData;
1179 Tcl_WrongNumArgs(interp, 1, objv, "option ?arg?");
1182 if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
1183 &index) != TCL_OK) {
1187 if (index < WIN_ATOM) {
1189 Tcl_WrongNumArgs(interp, 2, objv, "window");
1192 string = Tcl_GetStringFromObj(objv[2], NULL);
1193 tkwin = Tk_NameToWindow(interp, string, tkwin);
1194 if (tkwin == NULL) {
1198 winPtr = (TkWindow *) tkwin;
1199 resultPtr = Tcl_GetObjResult(interp);
1201 switch ((enum options) index) {
1203 Tcl_SetIntObj(resultPtr, Tk_Visual(tkwin)->map_entries);
1206 case WIN_CHILDREN: {
1209 winPtr = winPtr->childList;
1210 for ( ; winPtr != NULL; winPtr = winPtr->nextPtr) {
1211 if (!(winPtr->flags & TK_ANONYMOUS_WINDOW)) {
1212 strPtr = Tcl_NewStringObj(winPtr->pathName, -1);
1213 Tcl_ListObjAppendElement(NULL, resultPtr, strPtr);
1219 Tcl_SetStringObj(resultPtr, Tk_Class(tkwin), -1);
1222 case WIN_COLORMAPFULL: {
1223 Tcl_SetBooleanObj(resultPtr,
1224 TkpCmapStressed(tkwin, Tk_Colormap(tkwin)));
1228 Tcl_SetIntObj(resultPtr, Tk_Depth(tkwin));
1231 case WIN_GEOMETRY: {
1232 char buf[16 + TCL_INTEGER_SPACE * 4];
1234 sprintf(buf, "%dx%d+%d+%d", Tk_Width(tkwin), Tk_Height(tkwin),
1235 Tk_X(tkwin), Tk_Y(tkwin));
1236 Tcl_SetStringObj(resultPtr, buf, -1);
1240 Tcl_SetIntObj(resultPtr, Tk_Height(tkwin));
1244 char buf[TCL_INTEGER_SPACE];
1246 Tk_MakeWindowExist(tkwin);
1247 TkpPrintWindowId(buf, Tk_WindowId(tkwin));
1248 Tcl_SetStringObj(resultPtr, buf, -1);
1251 case WIN_ISMAPPED: {
1252 Tcl_SetBooleanObj(resultPtr, (int) Tk_IsMapped(tkwin));
1256 if (winPtr->geomMgrPtr != NULL) {
1257 Tcl_SetStringObj(resultPtr, winPtr->geomMgrPtr->name, -1);
1262 Tcl_SetStringObj(resultPtr, Tk_Name(tkwin), -1);
1266 if (winPtr->parentPtr != NULL) {
1267 Tcl_SetStringObj(resultPtr, winPtr->parentPtr->pathName, -1);
1271 case WIN_POINTERX: {
1276 case WIN_POINTERY: {
1281 case WIN_POINTERXY: {
1286 winPtr = GetToplevel(tkwin);
1287 if (winPtr == NULL) {
1291 TkGetPointerCoords((Tk_Window) winPtr, &x, &y);
1294 char buf[TCL_INTEGER_SPACE * 2];
1296 sprintf(buf, "%d %d", x, y);
1297 Tcl_SetStringObj(resultPtr, buf, -1);
1299 Tcl_SetIntObj(resultPtr, x);
1301 Tcl_SetIntObj(resultPtr, y);
1305 case WIN_REQHEIGHT: {
1306 Tcl_SetIntObj(resultPtr, Tk_ReqHeight(tkwin));
1309 case WIN_REQWIDTH: {
1310 Tcl_SetIntObj(resultPtr, Tk_ReqWidth(tkwin));
1314 Tk_GetRootCoords(tkwin, &x, &y);
1315 Tcl_SetIntObj(resultPtr, x);
1319 Tk_GetRootCoords(tkwin, &x, &y);
1320 Tcl_SetIntObj(resultPtr, y);
1324 char buf[TCL_INTEGER_SPACE];
1326 sprintf(buf, "%d", Tk_ScreenNumber(tkwin));
1327 Tcl_AppendStringsToObj(resultPtr, Tk_DisplayName(tkwin), ".",
1331 case WIN_SCREENCELLS: {
1332 Tcl_SetIntObj(resultPtr, CellsOfScreen(Tk_Screen(tkwin)));
1335 case WIN_SCREENDEPTH: {
1336 Tcl_SetIntObj(resultPtr, DefaultDepthOfScreen(Tk_Screen(tkwin)));
1339 case WIN_SCREENHEIGHT: {
1340 Tcl_SetIntObj(resultPtr, HeightOfScreen(Tk_Screen(tkwin)));
1343 case WIN_SCREENWIDTH: {
1344 Tcl_SetIntObj(resultPtr, WidthOfScreen(Tk_Screen(tkwin)));
1347 case WIN_SCREENMMHEIGHT: {
1348 Tcl_SetIntObj(resultPtr, HeightMMOfScreen(Tk_Screen(tkwin)));
1351 case WIN_SCREENMMWIDTH: {
1352 Tcl_SetIntObj(resultPtr, WidthMMOfScreen(Tk_Screen(tkwin)));
1355 case WIN_SCREENVISUAL: {
1356 class = DefaultVisualOfScreen(Tk_Screen(tkwin))->class;
1360 TkGetServerInfo(interp, tkwin);
1363 case WIN_TOPLEVEL: {
1364 winPtr = GetToplevel(tkwin);
1365 if (winPtr != NULL) {
1366 Tcl_SetStringObj(resultPtr, winPtr->pathName, -1);
1370 case WIN_VIEWABLE: {
1372 for ( ; ; winPtr = winPtr->parentPtr) {
1373 if ((winPtr == NULL) || !(winPtr->flags & TK_MAPPED)) {
1376 if (winPtr->flags & TK_TOP_HIERARCHY) {
1382 Tcl_SetBooleanObj(resultPtr, viewable);
1386 class = Tk_Visual(tkwin)->class;
1389 string = TkFindStateString(visualMap, class);
1390 if (string == NULL) {
1393 Tcl_SetStringObj(resultPtr, string, -1);
1396 case WIN_VISUALID: {
1397 char buf[TCL_INTEGER_SPACE];
1399 sprintf(buf, "0x%x",
1400 (unsigned int) XVisualIDFromVisual(Tk_Visual(tkwin)));
1401 Tcl_SetStringObj(resultPtr, buf, -1);
1404 case WIN_VROOTHEIGHT: {
1405 Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height);
1406 Tcl_SetIntObj(resultPtr, height);
1409 case WIN_VROOTWIDTH: {
1410 Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height);
1411 Tcl_SetIntObj(resultPtr, width);
1415 Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height);
1416 Tcl_SetIntObj(resultPtr, x);
1420 Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height);
1421 Tcl_SetIntObj(resultPtr, y);
1425 Tcl_SetIntObj(resultPtr, Tk_Width(tkwin));
1429 Tcl_SetIntObj(resultPtr, Tk_X(tkwin));
1433 Tcl_SetIntObj(resultPtr, Tk_Y(tkwin));
1442 skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
1446 if (objc - skip != 3) {
1447 Tcl_WrongNumArgs(interp, 2, objv, "?-displayof window? name");
1451 string = Tcl_GetStringFromObj(objv[2], NULL);
1452 Tcl_SetLongObj(resultPtr, (long) Tk_InternAtom(tkwin, string));
1455 case WIN_ATOMNAME: {
1459 skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
1463 if (objc - skip != 3) {
1464 Tcl_WrongNumArgs(interp, 2, objv, "?-displayof window? id");
1468 if (Tcl_GetLongFromObj(interp, objv[2], &id) != TCL_OK) {
1471 name = Tk_GetAtomName(tkwin, (Atom) id);
1472 if (strcmp(name, "?bad atom?") == 0) {
1473 string = Tcl_GetStringFromObj(objv[2], NULL);
1474 Tcl_AppendStringsToObj(resultPtr,
1475 "no atom exists with id \"", string, "\"", NULL);
1478 Tcl_SetStringObj(resultPtr, name, -1);
1481 case WIN_CONTAINING: {
1482 skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
1486 if (objc - skip != 4) {
1487 Tcl_WrongNumArgs(interp, 2, objv,
1488 "?-displayof window? rootX rootY");
1492 string = Tcl_GetStringFromObj(objv[2], NULL);
1493 if (Tk_GetPixels(interp, tkwin, string, &x) != TCL_OK) {
1496 string = Tcl_GetStringFromObj(objv[3], NULL);
1497 if (Tk_GetPixels(interp, tkwin, string, &y) != TCL_OK) {
1500 tkwin = Tk_CoordsToWindow(x, y, tkwin);
1501 if (tkwin != NULL) {
1502 Tcl_SetStringObj(resultPtr, Tk_PathName(tkwin), -1);
1509 skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
1513 if (objc - skip != 2) {
1514 Tcl_WrongNumArgs(interp, 2, objv, "?-displayof window?");
1517 result = TkGetInterpNames(interp, tkwin);
1520 case WIN_PATHNAME: {
1523 skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
1527 if (objc - skip != 3) {
1528 Tcl_WrongNumArgs(interp, 2, objv, "?-displayof window? id");
1531 string = Tcl_GetStringFromObj(objv[2 + skip], NULL);
1532 if (TkpScanWindowId(interp, string, &id) != TCL_OK) {
1535 winPtr = (TkWindow *)Tk_IdToWindow(Tk_Display(tkwin), id);
1536 if ((winPtr == NULL) ||
1537 (winPtr->mainPtr != ((TkWindow *) tkwin)->mainPtr)) {
1538 Tcl_AppendStringsToObj(resultPtr, "window id \"", string,
1539 "\" doesn't exist in this application", (char *) NULL);
1544 * If the window is a utility window with no associated path
1545 * (such as a wrapper window or send communication window), just
1546 * return an empty string.
1549 tkwin = (Tk_Window) winPtr;
1550 if (Tk_PathName(tkwin) != NULL) {
1551 Tcl_SetStringObj(resultPtr, Tk_PathName(tkwin), -1);
1557 * objv[3] is window.
1564 Tcl_WrongNumArgs(interp, 2, objv, "window");
1567 string = Tcl_GetStringFromObj(objv[2], NULL);
1568 winPtr = (TkWindow *) Tk_NameToWindow(interp, string, tkwin);
1569 Tcl_ResetResult(interp);
1570 resultPtr = Tcl_GetObjResult(interp);
1573 if ((winPtr == NULL) || (winPtr->flags & TK_ALREADY_DEAD)) {
1576 Tcl_SetBooleanObj(resultPtr, alive);
1583 Tcl_WrongNumArgs(interp, 2, objv, "window number");
1586 string = Tcl_GetStringFromObj(objv[2], NULL);
1587 tkwin = Tk_NameToWindow(interp, string, tkwin);
1588 if (tkwin == NULL) {
1591 string = Tcl_GetStringFromObj(objv[3], NULL);
1592 if (Tk_GetScreenMM(interp, tkwin, string, &mm) != TCL_OK) {
1595 pixels = mm * WidthOfScreen(Tk_Screen(tkwin))
1596 / WidthMMOfScreen(Tk_Screen(tkwin));
1597 Tcl_SetDoubleObj(resultPtr, pixels);
1604 Tcl_WrongNumArgs(interp, 2, objv, "window number");
1607 string = Tcl_GetStringFromObj(objv[2], NULL);
1608 tkwin = Tk_NameToWindow(interp, string, tkwin);
1609 if (tkwin == NULL) {
1612 string = Tcl_GetStringFromObj(objv[3], NULL);
1613 if (Tk_GetPixels(interp, tkwin, string, &pixels) != TCL_OK) {
1616 Tcl_SetIntObj(resultPtr, pixels);
1621 char buf[TCL_INTEGER_SPACE * 3];
1624 Tcl_WrongNumArgs(interp, 2, objv, "window colorName");
1627 string = Tcl_GetStringFromObj(objv[2], NULL);
1628 tkwin = Tk_NameToWindow(interp, string, tkwin);
1629 if (tkwin == NULL) {
1632 string = Tcl_GetStringFromObj(objv[3], NULL);
1633 colorPtr = Tk_GetColor(interp, tkwin, string);
1634 if (colorPtr == NULL) {
1637 sprintf(buf, "%d %d %d", colorPtr->red, colorPtr->green,
1639 Tk_FreeColor(colorPtr);
1640 Tcl_SetStringObj(resultPtr, buf, -1);
1643 case WIN_VISUALSAVAILABLE: {
1644 XVisualInfo template, *visInfoPtr;
1646 int includeVisualId;
1648 char buf[16 + TCL_INTEGER_SPACE];
1649 char visualIdString[TCL_INTEGER_SPACE];
1652 includeVisualId = 0;
1653 } else if ((objc == 4)
1654 && (strcmp(Tcl_GetStringFromObj(objv[3], NULL),
1655 "includeids") == 0)) {
1656 includeVisualId = 1;
1658 Tcl_WrongNumArgs(interp, 2, objv, "window ?includeids?");
1662 string = Tcl_GetStringFromObj(objv[2], NULL);
1663 tkwin = Tk_NameToWindow(interp, string, tkwin);
1664 if (tkwin == NULL) {
1668 template.screen = Tk_ScreenNumber(tkwin);
1669 visInfoPtr = XGetVisualInfo(Tk_Display(tkwin), VisualScreenMask,
1671 if (visInfoPtr == NULL) {
1672 Tcl_SetStringObj(resultPtr,
1673 "can't find any visuals for screen", -1);
1676 for (i = 0; i < count; i++) {
1677 string = TkFindStateString(visualMap, visInfoPtr[i].class);
1678 if (string == NULL) {
1679 strcpy(buf, "unknown");
1681 sprintf(buf, "%s %d", string, visInfoPtr[i].depth);
1683 if (includeVisualId) {
1684 sprintf(visualIdString, " 0x%x",
1685 (unsigned int) visInfoPtr[i].visualid);
1686 strcat(buf, visualIdString);
1688 strPtr = Tcl_NewStringObj(buf, -1);
1689 Tcl_ListObjAppendElement(NULL, resultPtr, strPtr);
1691 XFree((char *) visInfoPtr);
1700 *----------------------------------------------------------------------
1704 * This procedure is invoked to process the "wm" Tcl command.
1705 * See the user documentation for details on what it does.
1708 * A standard Tcl result.
1711 * See the user documentation.
1713 *----------------------------------------------------------------------
1718 Tk_WmObjCmd(clientData, interp, objc, objv)
1719 ClientData clientData; /* Main window associated with
1721 Tcl_Interp *interp; /* Current interpreter. */
1722 int objc; /* Number of arguments. */
1723 Tcl_Obj *CONST objv[]; /* Argument objects. */
1728 static CONST char *optionStrings[] = {
1729 "aspect", "client", "command", "deiconify",
1730 "focusmodel", "frame", "geometry", "grid",
1731 "group", "iconbitmap", "iconify", "iconmask",
1732 "iconname", "iconposition", "iconwindow", "maxsize",
1733 "minsize", "overrideredirect", "positionfrom", "protocol",
1734 "resizable", "sizefrom", "state", "title",
1735 "tracing", "transient", "withdraw", (char *) NULL
1738 TKWM_ASPECT, TKWM_CLIENT, TKWM_COMMAND, TKWM_DEICONIFY,
1739 TKWM_FOCUSMOD, TKWM_FRAME, TKWM_GEOMETRY, TKWM_GRID,
1740 TKWM_GROUP, TKWM_ICONBMP, TKWM_ICONIFY, TKWM_ICONMASK,
1741 TKWM_ICONNAME, TKWM_ICONPOS, TKWM_ICONWIN, TKWM_MAXSIZE,
1742 TKWM_MINSIZE, TKWM_OVERRIDE, TKWM_POSFROM, TKWM_PROTOCOL,
1743 TKWM_RESIZABLE, TKWM_SIZEFROM, TKWM_STATE, TKWM_TITLE,
1744 TKWM_TRACING, TKWM_TRANSIENT, TKWM_WITHDRAW
1747 tkwin = (Tk_Window) clientData;
1750 Tcl_WrongNumArgs(interp, 1, objv, "option window ?arg?");
1753 if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
1754 &index) != TCL_OK) {
1758 if (index == TKWM_TRACING) {
1760 TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
1762 if ((objc != 2) && (objc != 3)) {
1763 Tcl_WrongNumArgs(interp, 1, objv, "tracing ?boolean?");
1767 Tcl_SetObjResult(interp,
1768 Tcl_NewBooleanObj(dispPtr->flags & TK_DISPLAY_WM_TRACING));
1771 if (Tcl_GetBooleanFromObj(interp, objv[2], &wmTracing) != TCL_OK) {
1775 dispPtr->flags |= TK_DISPLAY_WM_TRACING;
1777 dispPtr->flags &= ~TK_DISPLAY_WM_TRACING;
1783 Tcl_WrongNumArgs(interp, 2, objv, "window ?arg?");
1787 winPtr = (TkWindow *) Tk_NameToWindow(interp,
1788 Tcl_GetString(objv[2]), tkwin);
1789 if (winPtr == NULL) {
1792 if (!(winPtr->flags & TK_TOP_LEVEL)) {
1793 Tcl_AppendResult(interp, "window \"", winPtr->pathName,
1794 "\" isn't a top-level window", (char *) NULL);
1798 switch ((enum options) index) {
1800 TkpWmAspectCmd(interp, tkwin, winPtr, objc, objv);
1804 TkpWmClientCmd(interp, tkwin, winPtr, objc, objv);
1807 case TKWM_COMMAND: {
1808 TkpWmCommandCmd(interp, tkwin, winPtr, objc, objv);
1811 case TKWM_DEICONIFY: {
1812 TkpWmDeiconifyCmd(interp, tkwin, winPtr, objc, objv);
1815 case TKWM_FOCUSMOD: {
1816 TkpWmFocusmodCmd(interp, tkwin, winPtr, objc, objv);
1820 TkpWmFrameCmd(interp, tkwin, winPtr, objc, objv);
1823 case TKWM_GEOMETRY: {
1824 TkpWmGeometryCmd(interp, tkwin, winPtr, objc, objv);
1828 TkpWmGridCmd(interp, tkwin, winPtr, objc, objv);
1832 TkpWmGroupCmd(interp, tkwin, winPtr, objc, objv);
1835 case TKWM_ICONBMP: {
1836 TkpWmIconbitmapCmd(interp, tkwin, winPtr, objc, objv);
1839 case TKWM_ICONIFY: {
1840 TkpWmIconifyCmd(interp, tkwin, winPtr, objc, objv);
1843 case TKWM_ICONMASK: {
1844 TkpWmIconmaskCmd(interp, tkwin, winPtr, objc, objv);
1847 case TKWM_ICONNAME: {
1848 /* slight Unix variation */
1849 TkpWmIconnameCmd(interp, tkwin, winPtr, objc, objv);
1852 case TKWM_ICONPOS: {
1853 /* nearly same - 1 line more on Unix */
1854 TkpWmIconpositionCmd(interp, tkwin, winPtr, objc, objv);
1857 case TKWM_ICONWIN: {
1858 TkpWmIconwindowCmd(interp, tkwin, winPtr, objc, objv);
1861 case TKWM_MAXSIZE: {
1862 /* nearly same, win diffs */
1863 TkpWmMaxsizeCmd(interp, tkwin, winPtr, objc, objv);
1866 case TKWM_MINSIZE: {
1867 /* nearly same, win diffs */
1868 TkpWmMinsizeCmd(interp, tkwin, winPtr, objc, objv);
1871 case TKWM_OVERRIDE: {
1873 TkpWmOverrideCmd(interp, tkwin, winPtr, objc, objv);
1876 case TKWM_POSFROM: {
1877 /* Equal across platforms */
1878 TkpWmPositionfromCmd(interp, tkwin, winPtr, objc, objv);
1881 case TKWM_PROTOCOL: {
1882 /* Equal across platforms */
1883 TkpWmProtocolCmd(interp, tkwin, winPtr, objc, objv);
1886 case TKWM_RESIZABLE: {
1888 TkpWmResizableCmd(interp, tkwin, winPtr, objc, objv);
1891 case TKWM_SIZEFROM: {
1892 /* Equal across platforms */
1893 TkpWmSizefromCmd(interp, tkwin, winPtr, objc, objv);
1897 TkpWmStateCmd(interp, tkwin, winPtr, objc, objv);
1901 TkpWmTitleCmd(interp, tkwin, winPtr, objc, objv);
1904 case TKWM_TRANSIENT: {
1905 TkpWmTransientCmd(interp, tkwin, winPtr, objc, objv);
1908 case TKWM_WITHDRAW: {
1909 TkpWmWithdrawCmd(interp, tkwin, winPtr, objc, objv);
1915 if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
1916 Tcl_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
1917 wmPtr->flags |= WM_UPDATE_PENDING;
1924 *----------------------------------------------------------------------
1928 * Parses a "-displayof window" option for various commands. If
1929 * present, the literal "-displayof" should be in objv[0] and the
1930 * window name in objv[1].
1933 * The return value is 0 if the argument strings did not contain
1934 * the "-displayof" option. The return value is 2 if the
1935 * argument strings contained both the "-displayof" option and
1936 * a valid window name. Otherwise, the return value is -1 if
1937 * the window name was missing or did not specify a valid window.
1939 * If the return value was 2, *tkwinPtr is filled with the
1940 * token for the window specified on the command line. If the
1941 * return value was -1, an error message is left in interp's
1947 *----------------------------------------------------------------------
1951 TkGetDisplayOf(interp, objc, objv, tkwinPtr)
1952 Tcl_Interp *interp; /* Interpreter for error reporting. */
1953 int objc; /* Number of arguments. */
1954 Tcl_Obj *CONST objv[]; /* Argument objects. If it is present,
1955 * "-displayof" should be in objv[0] and
1956 * objv[1] the name of a window. */
1957 Tk_Window *tkwinPtr; /* On input, contains main window of
1958 * application associated with interp. On
1959 * output, filled with window specified as
1960 * option to "-displayof" argument, or
1961 * unmodified if "-displayof" argument was not
1970 string = Tcl_GetStringFromObj(objv[0], &length);
1971 if ((length >= 2) &&
1972 (strncmp(string, "-displayof", (unsigned) length) == 0)) {
1974 Tcl_SetStringObj(Tcl_GetObjResult(interp),
1975 "value for \"-displayof\" missing", -1);
1978 string = Tcl_GetStringFromObj(objv[1], NULL);
1979 *tkwinPtr = Tk_NameToWindow(interp, string, *tkwinPtr);
1980 if (*tkwinPtr == NULL) {
1989 *----------------------------------------------------------------------
1993 * If an application has been deleted then all Tk commands will be
1994 * re-bound to this procedure.
1997 * A standard Tcl error is reported to let the user know that
1998 * the application is dead.
2001 * See the user documentation.
2003 *----------------------------------------------------------------------
2008 TkDeadAppCmd(clientData, interp, argc, argv)
2009 ClientData clientData; /* Dummy. */
2010 Tcl_Interp *interp; /* Current interpreter. */
2011 int argc; /* Number of arguments. */
2012 CONST char **argv; /* Argument strings. */
2014 Tcl_AppendResult(interp, "can't invoke \"", argv[0],
2015 "\" command: application has been destroyed", (char *) NULL);
2020 *----------------------------------------------------------------------
2024 * Retrieves the toplevel window which is the nearest ancestor of
2025 * of the specified window.
2028 * Returns the toplevel window or NULL if the window has no
2029 * ancestor which is a toplevel.
2034 *----------------------------------------------------------------------
2039 Tk_Window tkwin; /* Window for which the toplevel should be
2042 TkWindow *winPtr = (TkWindow *) tkwin;
2044 while (!(winPtr->flags & TK_TOP_LEVEL)) {
2045 winPtr = winPtr->parentPtr;
2046 if (winPtr == NULL) {