summaryrefslogtreecommitdiffstats
path: root/tk8.6/generic/tkCmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'tk8.6/generic/tkCmds.c')
-rw-r--r--tk8.6/generic/tkCmds.c2163
1 files changed, 0 insertions, 2163 deletions
diff --git a/tk8.6/generic/tkCmds.c b/tk8.6/generic/tkCmds.c
deleted file mode 100644
index 6196b17..0000000
--- a/tk8.6/generic/tkCmds.c
+++ /dev/null
@@ -1,2163 +0,0 @@
-/*
- * tkCmds.c --
- *
- * This file contains a collection of Tk-related Tcl commands that didn't
- * fit in any particular file of the toolkit.
- *
- * Copyright (c) 1990-1994 The Regents of the University of California.
- * Copyright (c) 1994-1997 Sun Microsystems, Inc.
- * Copyright (c) 2000 Scriptics Corporation.
- *
- * See the file "license.terms" for information on usage and redistribution of
- * this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-#include "tkInt.h"
-
-#if defined(_WIN32)
-#include "tkWinInt.h"
-#elif defined(MAC_OSX_TK)
-#include "tkMacOSXInt.h"
-#else
-#include "tkUnixInt.h"
-#endif
-
-/*
- * Forward declarations for functions defined later in this file:
- */
-
-static TkWindow * GetTopHierarchy(Tk_Window tkwin);
-static char * WaitVariableProc(ClientData clientData,
- Tcl_Interp *interp, const char *name1,
- const char *name2, int flags);
-static void WaitVisibilityProc(ClientData clientData,
- XEvent *eventPtr);
-static void WaitWindowProc(ClientData clientData,
- XEvent *eventPtr);
-static int AppnameCmd(ClientData dummy, Tcl_Interp *interp,
- int objc, Tcl_Obj *const *objv);
-static int CaretCmd(ClientData dummy, Tcl_Interp *interp,
- int objc, Tcl_Obj *const *objv);
-static int InactiveCmd(ClientData dummy, Tcl_Interp *interp,
- int objc, Tcl_Obj *const *objv);
-static int ScalingCmd(ClientData dummy, Tcl_Interp *interp,
- int objc, Tcl_Obj *const *objv);
-static int UseinputmethodsCmd(ClientData dummy,
- Tcl_Interp *interp, int objc,
- Tcl_Obj *const *objv);
-static int WindowingsystemCmd(ClientData dummy,
- Tcl_Interp *interp, int objc,
- Tcl_Obj *const *objv);
-
-#if defined(_WIN32) || defined(MAC_OSX_TK)
-MODULE_SCOPE const TkEnsemble tkFontchooserEnsemble[];
-#else
-#define tkFontchooserEnsemble NULL
-#endif
-
-/*
- * Table of tk subcommand names and implementations.
- */
-
-static const TkEnsemble tkCmdMap[] = {
- {"appname", AppnameCmd, NULL },
- {"busy", Tk_BusyObjCmd, NULL },
- {"caret", CaretCmd, NULL },
- {"inactive", InactiveCmd, NULL },
- {"scaling", ScalingCmd, NULL },
- {"useinputmethods", UseinputmethodsCmd, NULL },
- {"windowingsystem", WindowingsystemCmd, NULL },
- {"fontchooser", NULL, tkFontchooserEnsemble},
- {NULL, NULL, NULL}
-};
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_BellObjCmd --
- *
- * This function is invoked to process the "bell" Tcl command. See the
- * user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-int
-Tk_BellObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- static const char *const bellOptions[] = {
- "-displayof", "-nice", NULL
- };
- enum options { TK_BELL_DISPLAYOF, TK_BELL_NICE };
- Tk_Window tkwin = clientData;
- int i, index, nice = 0;
-
- if (objc > 4) {
- wrongArgs:
- Tcl_WrongNumArgs(interp, 1, objv, "?-displayof window? ?-nice?");
- return TCL_ERROR;
- }
-
- for (i = 1; i < objc; i++) {
- if (Tcl_GetIndexFromObjStruct(interp, objv[i], bellOptions,
- sizeof(char *), "option", 0, &index) != TCL_OK) {
- return TCL_ERROR;
- }
- switch ((enum options) index) {
- case TK_BELL_DISPLAYOF:
- if (++i >= objc) {
- goto wrongArgs;
- }
- tkwin = Tk_NameToWindow(interp, Tcl_GetString(objv[i]), tkwin);
- if (tkwin == NULL) {
- return TCL_ERROR;
- }
- break;
- case TK_BELL_NICE:
- nice = 1;
- break;
- }
- }
- XBell(Tk_Display(tkwin), 0);
- if (!nice) {
- XForceScreenSaver(Tk_Display(tkwin), ScreenSaverReset);
- }
- XFlush(Tk_Display(tkwin));
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_BindObjCmd --
- *
- * This function is invoked to process the "bind" Tcl command. See the
- * user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-int
-Tk_BindObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window tkwin = clientData;
- TkWindow *winPtr;
- ClientData object;
- const char *string;
-
- if ((objc < 2) || (objc > 4)) {
- Tcl_WrongNumArgs(interp, 1, objv, "window ?pattern? ?command?");
- return TCL_ERROR;
- }
- string = Tcl_GetString(objv[1]);
-
- /*
- * Bind tags either a window name or a tag name for the first argument.
- * If the argument starts with ".", assume it is a window; otherwise, it
- * is a tag.
- */
-
- if (string[0] == '.') {
- winPtr = (TkWindow *) Tk_NameToWindow(interp, string, tkwin);
- if (winPtr == NULL) {
- return TCL_ERROR;
- }
- object = (ClientData) winPtr->pathName;
- } else {
- winPtr = clientData;
- object = (ClientData) Tk_GetUid(string);
- }
-
- /*
- * If there are four arguments, the command is modifying a binding. If
- * there are three arguments, the command is querying a binding. If there
- * are only two arguments, the command is querying all the bindings for
- * the given tag/window.
- */
-
- if (objc == 4) {
- int append = 0;
- unsigned long mask;
- const char *sequence = Tcl_GetString(objv[2]);
- const char *script = Tcl_GetString(objv[3]);
-
- /*
- * If the script is null, just delete the binding.
- */
-
- if (script[0] == 0) {
- return Tk_DeleteBinding(interp, winPtr->mainPtr->bindingTable,
- object, sequence);
- }
-
- /*
- * If the script begins with "+", append this script to the existing
- * binding.
- */
-
- if (script[0] == '+') {
- script++;
- append = 1;
- }
- mask = Tk_CreateBinding(interp, winPtr->mainPtr->bindingTable,
- object, sequence, script, append);
- if (mask == 0) {
- return TCL_ERROR;
- }
- } else if (objc == 3) {
- const char *command;
-
- command = Tk_GetBinding(interp, winPtr->mainPtr->bindingTable,
- object, Tcl_GetString(objv[2]));
- if (command == NULL) {
- Tcl_ResetResult(interp);
- return TCL_OK;
- }
- Tcl_SetObjResult(interp, Tcl_NewStringObj(command, -1));
- } else {
- Tk_GetAllBindings(interp, winPtr->mainPtr->bindingTable, object);
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkBindEventProc --
- *
- * This function is invoked by Tk_HandleEvent for each event; it causes
- * any appropriate bindings for that event to be invoked.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Depends on what bindings have been established with the "bind"
- * command.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkBindEventProc(
- TkWindow *winPtr, /* Pointer to info about window. */
- XEvent *eventPtr) /* Information about event. */
-{
-#define MAX_OBJS 20
- ClientData objects[MAX_OBJS], *objPtr;
- TkWindow *topLevPtr;
- int i, count;
- const char *p;
- Tcl_HashEntry *hPtr;
-
- if ((winPtr->mainPtr == NULL) || (winPtr->mainPtr->bindingTable == NULL)) {
- return;
- }
-
- objPtr = objects;
- if (winPtr->numTags != 0) {
- /*
- * Make a copy of the tags for the window, replacing window names with
- * pointers to the pathName from the appropriate window.
- */
-
- if (winPtr->numTags > MAX_OBJS) {
- objPtr = ckalloc(winPtr->numTags * sizeof(ClientData));
- }
- for (i = 0; i < winPtr->numTags; i++) {
- p = winPtr->tagPtr[i];
- if (*p == '.') {
- hPtr = Tcl_FindHashEntry(&winPtr->mainPtr->nameTable, p);
- if (hPtr != NULL) {
- p = ((TkWindow *) Tcl_GetHashValue(hPtr))->pathName;
- } else {
- p = NULL;
- }
- }
- objPtr[i] = (ClientData) p;
- }
- count = winPtr->numTags;
- } else {
- objPtr[0] = (ClientData) winPtr->pathName;
- objPtr[1] = (ClientData) winPtr->classUid;
- for (topLevPtr = winPtr;
- (topLevPtr != NULL) && !(topLevPtr->flags & TK_TOP_HIERARCHY);
- topLevPtr = topLevPtr->parentPtr) {
- /* Empty loop body. */
- }
- if ((winPtr != topLevPtr) && (topLevPtr != NULL)) {
- count = 4;
- objPtr[2] = (ClientData) topLevPtr->pathName;
- } else {
- count = 3;
- }
- objPtr[count-1] = (ClientData) Tk_GetUid("all");
- }
- Tk_BindEvent(winPtr->mainPtr->bindingTable, eventPtr, (Tk_Window) winPtr,
- count, objPtr);
- if (objPtr != objects) {
- ckfree(objPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_BindtagsObjCmd --
- *
- * This function is invoked to process the "bindtags" Tcl command. See
- * the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-int
-Tk_BindtagsObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window tkwin = clientData;
- TkWindow *winPtr, *winPtr2;
- int i, length;
- const char *p;
- Tcl_Obj *listPtr, **tags;
-
- if ((objc < 2) || (objc > 3)) {
- Tcl_WrongNumArgs(interp, 1, objv, "window ?taglist?");
- return TCL_ERROR;
- }
- winPtr = (TkWindow *) Tk_NameToWindow(interp, Tcl_GetString(objv[1]),
- tkwin);
- if (winPtr == NULL) {
- return TCL_ERROR;
- }
- if (objc == 2) {
- listPtr = Tcl_NewObj();
- if (winPtr->numTags == 0) {
- Tcl_ListObjAppendElement(NULL, listPtr,
- Tcl_NewStringObj(winPtr->pathName, -1));
- Tcl_ListObjAppendElement(NULL, listPtr,
- Tcl_NewStringObj(winPtr->classUid, -1));
- winPtr2 = winPtr;
- while ((winPtr2 != NULL) && !(Tk_TopWinHierarchy(winPtr2))) {
- winPtr2 = winPtr2->parentPtr;
- }
- if ((winPtr != winPtr2) && (winPtr2 != NULL)) {
- Tcl_ListObjAppendElement(NULL, listPtr,
- Tcl_NewStringObj(winPtr2->pathName, -1));
- }
- Tcl_ListObjAppendElement(NULL, listPtr,
- Tcl_NewStringObj("all", -1));
- } else {
- for (i = 0; i < winPtr->numTags; i++) {
- Tcl_ListObjAppendElement(NULL, listPtr,
- Tcl_NewStringObj((char *) winPtr->tagPtr[i], -1));
- }
- }
- Tcl_SetObjResult(interp, listPtr);
- return TCL_OK;
- }
- if (winPtr->tagPtr != NULL) {
- TkFreeBindingTags(winPtr);
- }
- if (Tcl_ListObjGetElements(interp, objv[2], &length, &tags) != TCL_OK) {
- return TCL_ERROR;
- }
- if (length == 0) {
- return TCL_OK;
- }
-
- winPtr->numTags = length;
- winPtr->tagPtr = ckalloc(length * sizeof(ClientData));
- for (i = 0; i < length; i++) {
- p = Tcl_GetString(tags[i]);
- if (p[0] == '.') {
- char *copy;
-
- /*
- * Handle names starting with "." specially: store a malloc'ed
- * string, rather than a Uid; at event time we'll look up the name
- * in the window table and use the corresponding window, if there
- * is one.
- */
-
- copy = ckalloc(strlen(p) + 1);
- strcpy(copy, p);
- winPtr->tagPtr[i] = (ClientData) copy;
- } else {
- winPtr->tagPtr[i] = (ClientData) Tk_GetUid(p);
- }
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkFreeBindingTags --
- *
- * This function is called to free all of the binding tags associated
- * with a window; typically it is only invoked where there are
- * window-specific tags.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Any binding tags for winPtr are freed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkFreeBindingTags(
- TkWindow *winPtr) /* Window whose tags are to be released. */
-{
- int i;
- const char *p;
-
- for (i = 0; i < winPtr->numTags; i++) {
- p = winPtr->tagPtr[i];
- if (*p == '.') {
- /*
- * Names starting with "." are malloced rather than Uids, so they
- * have to be freed.
- */
-
- ckfree((char *)p);
- }
- }
- ckfree(winPtr->tagPtr);
- winPtr->numTags = 0;
- winPtr->tagPtr = NULL;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_DestroyObjCmd --
- *
- * This function is invoked to process the "destroy" Tcl command. See the
- * user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-int
-Tk_DestroyObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window window;
- Tk_Window tkwin = clientData;
- int i;
-
- for (i = 1; i < objc; i++) {
- window = Tk_NameToWindow(interp, Tcl_GetString(objv[i]), tkwin);
- if (window == NULL) {
- Tcl_ResetResult(interp);
- continue;
- }
- Tk_DestroyWindow(window);
- if (window == tkwin) {
- /*
- * We just deleted the main window for the application! This makes
- * it impossible to do anything more (tkwin isn't valid anymore).
- */
-
- break;
- }
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_LowerObjCmd --
- *
- * This function is invoked to process the "lower" Tcl command. See the
- * user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
- /* ARGSUSED */
-int
-Tk_LowerObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window mainwin = clientData;
- Tk_Window tkwin, other;
-
- if ((objc != 2) && (objc != 3)) {
- Tcl_WrongNumArgs(interp, 1, objv, "window ?belowThis?");
- return TCL_ERROR;
- }
-
- tkwin = Tk_NameToWindow(interp, Tcl_GetString(objv[1]), mainwin);
- if (tkwin == NULL) {
- return TCL_ERROR;
- }
- if (objc == 2) {
- other = NULL;
- } else {
- other = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), mainwin);
- if (other == NULL) {
- return TCL_ERROR;
- }
- }
- if (Tk_RestackWindow(tkwin, Below, other) != TCL_OK) {
- if (other) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "can't lower \"%s\" below \"%s\"",
- Tcl_GetString(objv[1]), Tcl_GetString(objv[2])));
- } else {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "can't lower \"%s\" to bottom", Tcl_GetString(objv[1])));
- }
- Tcl_SetErrorCode(interp, "TK", "RESTACK", "LOWER", NULL);
- return TCL_ERROR;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_RaiseObjCmd --
- *
- * This function is invoked to process the "raise" Tcl command. See the
- * user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
- /* ARGSUSED */
-int
-Tk_RaiseObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window mainwin = clientData;
- Tk_Window tkwin, other;
-
- if ((objc != 2) && (objc != 3)) {
- Tcl_WrongNumArgs(interp, 1, objv, "window ?aboveThis?");
- return TCL_ERROR;
- }
-
- tkwin = Tk_NameToWindow(interp, Tcl_GetString(objv[1]), mainwin);
- if (tkwin == NULL) {
- return TCL_ERROR;
- }
- if (objc == 2) {
- other = NULL;
- } else {
- other = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), mainwin);
- if (other == NULL) {
- return TCL_ERROR;
- }
- }
- if (Tk_RestackWindow(tkwin, Above, other) != TCL_OK) {
- if (other) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "can't raise \"%s\" above \"%s\"",
- Tcl_GetString(objv[1]), Tcl_GetString(objv[2])));
- } else {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "can't raise \"%s\" to top", Tcl_GetString(objv[1])));
- }
- Tcl_SetErrorCode(interp, "TK", "RESTACK", "RAISE", NULL);
- return TCL_ERROR;
- }
- return TCL_OK;
-}
-
-/*
- * ----------------------------------------------------------------------
- *
- * TkInitTkCmd --
- *
- * Set up the tk ensemble.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * None.
- *
- * ----------------------------------------------------------------------
- */
-
-int
-TkInitTkCmd(
- Tcl_Interp *interp,
- ClientData clientData)
-{
- TkMakeEnsemble(interp, "::", "tk", clientData, tkCmdMap);
-#if defined(_WIN32) || defined(MAC_OSX_TK)
- TkInitFontchooser(interp, clientData);
-#endif
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * AppnameCmd, CaretCmd, ScalingCmd, UseinputmethodsCmd,
- * WindowingsystemCmd, InactiveCmd --
- *
- * These functions are invoked to process the "tk" ensemble subcommands.
- * See the user documentation for details on what they do.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-int
-AppnameCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window tkwin = clientData;
- TkWindow *winPtr;
- const char *string;
-
- if (Tcl_IsSafe(interp)) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "appname not accessible in a safe interpreter", -1));
- Tcl_SetErrorCode(interp, "TK", "SAFE", "APPLICATION", NULL);
- return TCL_ERROR;
- }
-
- winPtr = (TkWindow *) tkwin;
-
- if (objc > 2) {
- Tcl_WrongNumArgs(interp, 1, objv, "?newName?");
- return TCL_ERROR;
- }
- if (objc == 2) {
- string = Tcl_GetString(objv[1]);
- winPtr->nameUid = Tk_GetUid(Tk_SetAppName(tkwin, string));
- }
- Tcl_SetObjResult(interp, Tcl_NewStringObj(winPtr->nameUid, -1));
- return TCL_OK;
-}
-
-int
-CaretCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window tkwin = clientData;
- int index;
- Tcl_Obj *objPtr;
- TkCaret *caretPtr;
- Tk_Window window;
- static const char *const caretStrings[] = {
- "-x", "-y", "-height", NULL
- };
- enum caretOptions {
- TK_CARET_X, TK_CARET_Y, TK_CARET_HEIGHT
- };
-
- if ((objc < 2) || ((objc > 3) && !!(objc & 1))) {
- Tcl_WrongNumArgs(interp, 1, objv,
- "window ?-x x? ?-y y? ?-height height?");
- return TCL_ERROR;
- }
- window = Tk_NameToWindow(interp, Tcl_GetString(objv[1]), tkwin);
- if (window == NULL) {
- return TCL_ERROR;
- }
- caretPtr = &(((TkWindow *) window)->dispPtr->caret);
- if (objc == 2) {
- /*
- * Return all the current values
- */
-
- objPtr = Tcl_NewObj();
- Tcl_ListObjAppendElement(interp, objPtr,
- Tcl_NewStringObj("-height", 7));
- Tcl_ListObjAppendElement(interp, objPtr,
- Tcl_NewIntObj(caretPtr->height));
- Tcl_ListObjAppendElement(interp, objPtr,
- Tcl_NewStringObj("-x", 2));
- Tcl_ListObjAppendElement(interp, objPtr,
- Tcl_NewIntObj(caretPtr->x));
- Tcl_ListObjAppendElement(interp, objPtr,
- Tcl_NewStringObj("-y", 2));
- Tcl_ListObjAppendElement(interp, objPtr,
- Tcl_NewIntObj(caretPtr->y));
- Tcl_SetObjResult(interp, objPtr);
- } else if (objc == 3) {
- int value;
-
- /*
- * Return the current value of the selected option
- */
-
- if (Tcl_GetIndexFromObj(interp, objv[2], caretStrings,
- "caret option", 0, &index) != TCL_OK) {
- return TCL_ERROR;
- }
- if (index == TK_CARET_X) {
- value = caretPtr->x;
- } else if (index == TK_CARET_Y) {
- value = caretPtr->y;
- } else /* if (index == TK_CARET_HEIGHT) -- last case */ {
- value = caretPtr->height;
- }
- Tcl_SetObjResult(interp, Tcl_NewIntObj(value));
- } else {
- int i, value, x = 0, y = 0, height = -1;
-
- for (i = 2; i < objc; i += 2) {
- if ((Tcl_GetIndexFromObj(interp, objv[i], caretStrings,
- "caret option", 0, &index) != TCL_OK) ||
- Tcl_GetIntFromObj(interp,objv[i+1],&value) != TCL_OK) {
- return TCL_ERROR;
- }
- if (index == TK_CARET_X) {
- x = value;
- } else if (index == TK_CARET_Y) {
- y = value;
- } else /* if (index == TK_CARET_HEIGHT) -- last case */ {
- height = value;
- }
- }
- if (height < 0) {
- height = Tk_Height(window);
- }
- Tk_SetCaretPos(window, x, y, height);
- }
- return TCL_OK;
-}
-
-int
-ScalingCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window tkwin = clientData;
- Screen *screenPtr;
- int skip, width, height;
- double d;
-
- if (Tcl_IsSafe(interp)) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "scaling not accessible in a safe interpreter", -1));
- Tcl_SetErrorCode(interp, "TK", "SAFE", "SCALING", NULL);
- return TCL_ERROR;
- }
-
- skip = TkGetDisplayOf(interp, objc - 1, objv + 1, &tkwin);
- if (skip < 0) {
- return TCL_ERROR;
- }
- screenPtr = Tk_Screen(tkwin);
- if (objc - skip == 1) {
- d = 25.4 / 72;
- d *= WidthOfScreen(screenPtr);
- d /= WidthMMOfScreen(screenPtr);
- Tcl_SetObjResult(interp, Tcl_NewDoubleObj(d));
- } else if (objc - skip == 2) {
- if (Tcl_GetDoubleFromObj(interp, objv[1+skip], &d) != TCL_OK) {
- return TCL_ERROR;
- }
- d = (25.4 / 72) / d;
- width = (int) (d * WidthOfScreen(screenPtr) + 0.5);
- if (width <= 0) {
- width = 1;
- }
- height = (int) (d * HeightOfScreen(screenPtr) + 0.5);
- if (height <= 0) {
- height = 1;
- }
- WidthMMOfScreen(screenPtr) = width;
- HeightMMOfScreen(screenPtr) = height;
- } else {
- Tcl_WrongNumArgs(interp, 1, objv, "?-displayof window? ?factor?");
- return TCL_ERROR;
- }
- return TCL_OK;
-}
-
-int
-UseinputmethodsCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window tkwin = clientData;
- TkDisplay *dispPtr;
- int skip;
-
- if (Tcl_IsSafe(interp)) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "useinputmethods not accessible in a safe interpreter", -1));
- Tcl_SetErrorCode(interp, "TK", "SAFE", "INPUT_METHODS", NULL);
- return TCL_ERROR;
- }
-
- skip = TkGetDisplayOf(interp, objc-1, objv+1, &tkwin);
- if (skip < 0) {
- return TCL_ERROR;
- }
- dispPtr = ((TkWindow *) tkwin)->dispPtr;
- if ((objc - skip) == 2) {
- /*
- * In the case where TK_USE_INPUT_METHODS is not defined, this
- * will be ignored and we will always return 0. That will indicate
- * to the user that input methods are just not available.
- */
-
- int boolVal;
-
- if (Tcl_GetBooleanFromObj(interp, objv[1+skip],
- &boolVal) != TCL_OK) {
- return TCL_ERROR;
- }
-#ifdef TK_USE_INPUT_METHODS
- if (boolVal) {
- dispPtr->flags |= TK_DISPLAY_USE_IM;
- } else {
- dispPtr->flags &= ~TK_DISPLAY_USE_IM;
- }
-#endif /* TK_USE_INPUT_METHODS */
- } else if ((objc - skip) != 1) {
- Tcl_WrongNumArgs(interp, 1, objv,
- "?-displayof window? ?boolean?");
- return TCL_ERROR;
- }
- Tcl_SetObjResult(interp,
- Tcl_NewBooleanObj(dispPtr->flags & TK_DISPLAY_USE_IM));
- return TCL_OK;
-}
-
-int
-WindowingsystemCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- const char *windowingsystem;
-
- if (objc != 1) {
- Tcl_WrongNumArgs(interp, 1, objv, NULL);
- return TCL_ERROR;
- }
-#if defined(_WIN32)
- windowingsystem = "win32";
-#elif defined(MAC_OSX_TK)
- windowingsystem = "aqua";
-#else
- windowingsystem = "x11";
-#endif
- Tcl_SetObjResult(interp, Tcl_NewStringObj(windowingsystem, -1));
- return TCL_OK;
-}
-
-int
-InactiveCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window tkwin = clientData;
- int skip = TkGetDisplayOf(interp, objc - 1, objv + 1, &tkwin);
-
- if (skip < 0) {
- return TCL_ERROR;
- }
- if (objc - skip == 1) {
- long inactive;
-
- inactive = (Tcl_IsSafe(interp) ? -1 :
- Tk_GetUserInactiveTime(Tk_Display(tkwin)));
- Tcl_SetObjResult(interp, Tcl_NewLongObj(inactive));
- } else if (objc - skip == 2) {
- const char *string;
-
- string = Tcl_GetString(objv[objc-1]);
- if (strcmp(string, "reset") != 0) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "bad option \"%s\": must be reset", string));
- Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "INDEX", "option",
- string, NULL);
- return TCL_ERROR;
- }
- if (Tcl_IsSafe(interp)) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "resetting the user inactivity timer "
- "is not allowed in a safe interpreter", -1));
- Tcl_SetErrorCode(interp, "TK", "SAFE", "INACTIVITY_TIMER", NULL);
- return TCL_ERROR;
- }
- Tk_ResetUserInactiveTime(Tk_Display(tkwin));
- Tcl_ResetResult(interp);
- } else {
- Tcl_WrongNumArgs(interp, 1, objv, "?-displayof window? ?reset?");
- return TCL_ERROR;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_TkwaitObjCmd --
- *
- * This function is invoked to process the "tkwait" Tcl command. See the
- * user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
- /* ARGSUSED */
-int
-Tk_TkwaitObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window tkwin = clientData;
- int done, index;
- int code = TCL_OK;
- static const char *const optionStrings[] = {
- "variable", "visibility", "window", NULL
- };
- enum options {
- TKWAIT_VARIABLE, TKWAIT_VISIBILITY, TKWAIT_WINDOW
- };
-
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 1, objv, "variable|visibility|window name");
- return TCL_ERROR;
- }
-
- if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
-
- switch ((enum options) index) {
- case TKWAIT_VARIABLE:
- if (Tcl_TraceVar2(interp, Tcl_GetString(objv[2]),
- NULL, TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
- WaitVariableProc, &done) != TCL_OK) {
- return TCL_ERROR;
- }
- done = 0;
- while (!done) {
- if (Tcl_Canceled(interp, TCL_LEAVE_ERR_MSG) == TCL_ERROR) {
- code = TCL_ERROR;
- break;
- }
- Tcl_DoOneEvent(0);
- }
- Tcl_UntraceVar2(interp, Tcl_GetString(objv[2]),
- NULL, TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
- WaitVariableProc, &done);
- break;
-
- case TKWAIT_VISIBILITY: {
- Tk_Window window;
-
- window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin);
- if (window == NULL) {
- return TCL_ERROR;
- }
- Tk_CreateEventHandler(window,
- VisibilityChangeMask|StructureNotifyMask,
- WaitVisibilityProc, &done);
- done = 0;
- while (!done) {
- if (Tcl_Canceled(interp, TCL_LEAVE_ERR_MSG) == TCL_ERROR) {
- code = TCL_ERROR;
- break;
- }
- Tcl_DoOneEvent(0);
- }
- if ((done != 0) && (done != 1)) {
- /*
- * Note that we do not delete the event handler because it was
- * deleted automatically when the window was destroyed.
- */
-
- Tcl_ResetResult(interp);
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "window \"%s\" was deleted before its visibility changed",
- Tcl_GetString(objv[2])));
- Tcl_SetErrorCode(interp, "TK", "WAIT", "PREMATURE", NULL);
- return TCL_ERROR;
- }
- Tk_DeleteEventHandler(window,
- VisibilityChangeMask|StructureNotifyMask,
- WaitVisibilityProc, &done);
- break;
- }
-
- case TKWAIT_WINDOW: {
- Tk_Window window;
-
- window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin);
- if (window == NULL) {
- return TCL_ERROR;
- }
- Tk_CreateEventHandler(window, StructureNotifyMask,
- WaitWindowProc, &done);
- done = 0;
- while (!done) {
- if (Tcl_Canceled(interp, TCL_LEAVE_ERR_MSG) == TCL_ERROR) {
- code = TCL_ERROR;
- break;
- }
- Tcl_DoOneEvent(0);
- }
-
- /*
- * Note: normally there's no need to delete the event handler. It was
- * deleted automatically when the window was destroyed; however, if
- * the wait operation was canceled, we need to delete it.
- */
-
- if (done == 0) {
- Tk_DeleteEventHandler(window, StructureNotifyMask,
- WaitWindowProc, &done);
- }
- break;
- }
- }
-
- /*
- * Clear out the interpreter's result, since it may have been set by event
- * handlers. This is skipped if an error occurred above, such as the wait
- * operation being canceled.
- */
-
- if (code == TCL_OK)
- Tcl_ResetResult(interp);
-
- return code;
-}
-
- /* ARGSUSED */
-static char *
-WaitVariableProc(
- ClientData clientData, /* Pointer to integer to set to 1. */
- Tcl_Interp *interp, /* Interpreter containing variable. */
- const char *name1, /* Name of variable. */
- const char *name2, /* Second part of variable name. */
- int flags) /* Information about what happened. */
-{
- int *donePtr = clientData;
-
- *donePtr = 1;
- return NULL;
-}
-
- /*ARGSUSED*/
-static void
-WaitVisibilityProc(
- ClientData clientData, /* Pointer to integer to set to 1. */
- XEvent *eventPtr) /* Information about event (not used). */
-{
- int *donePtr = clientData;
-
- if (eventPtr->type == VisibilityNotify) {
- *donePtr = 1;
- } else if (eventPtr->type == DestroyNotify) {
- *donePtr = 2;
- }
-}
-
-static void
-WaitWindowProc(
- ClientData clientData, /* Pointer to integer to set to 1. */
- XEvent *eventPtr) /* Information about event. */
-{
- int *donePtr = clientData;
-
- if (eventPtr->type == DestroyNotify) {
- *donePtr = 1;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_UpdateObjCmd --
- *
- * This function is invoked to process the "update" Tcl command. See the
- * user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
- /* ARGSUSED */
-int
-Tk_UpdateObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- static const char *const updateOptions[] = {"idletasks", NULL};
- int flags, index;
- TkDisplay *dispPtr;
- int code = TCL_OK;
-
- if (objc == 1) {
- flags = TCL_DONT_WAIT;
- } else if (objc == 2) {
- if (Tcl_GetIndexFromObj(interp, objv[1], updateOptions, "option", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
- flags = TCL_IDLE_EVENTS;
- } else {
- Tcl_WrongNumArgs(interp, 1, objv, "?idletasks?");
- return TCL_ERROR;
- }
-
- /*
- * Handle all pending events, sync all displays, and repeat over and over
- * again until all pending events have been handled. Special note: it's
- * possible that the entire application could be destroyed by an event
- * handler that occurs during the update. Thus, don't use any information
- * from tkwin after calling Tcl_DoOneEvent.
- */
-
- while (1) {
- while (Tcl_DoOneEvent(flags) != 0) {
- if (Tcl_Canceled(interp, TCL_LEAVE_ERR_MSG) == TCL_ERROR) {
- code = TCL_ERROR;
- break;
- }
- }
-
- /*
- * If event processing was canceled proceed no further.
- */
-
- if (code == TCL_ERROR)
- break;
-
- for (dispPtr = TkGetDisplayList(); dispPtr != NULL;
- dispPtr = dispPtr->nextPtr) {
- XSync(dispPtr->display, False);
- }
-
- /*
- * Check again if event processing has been canceled because the inner
- * loop (above) may not have checked (i.e. no events were processed and
- * the loop body was skipped).
- */
-
- if (Tcl_Canceled(interp, TCL_LEAVE_ERR_MSG) == TCL_ERROR) {
- code = TCL_ERROR;
- break;
- }
-
- if (Tcl_DoOneEvent(flags) == 0) {
- break;
- }
- }
-
- /*
- * Must clear the interpreter's result because event handlers could have
- * executed commands. This is skipped if an error occurred above, such as
- * the wait operation being canceled.
- */
-
- if (code == TCL_OK)
- Tcl_ResetResult(interp);
-
- return code;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_WinfoObjCmd --
- *
- * This function is invoked to process the "winfo" Tcl command. See the
- * user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-int
-Tk_WinfoObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- int index, x, y, width, height, useX, useY, class, skip;
- const char *string;
- TkWindow *winPtr;
- Tk_Window tkwin = clientData;
-
- static const TkStateMap visualMap[] = {
- {PseudoColor, "pseudocolor"},
- {GrayScale, "grayscale"},
- {DirectColor, "directcolor"},
- {TrueColor, "truecolor"},
- {StaticColor, "staticcolor"},
- {StaticGray, "staticgray"},
- {-1, NULL}
- };
- static const char *const optionStrings[] = {
- "cells", "children", "class", "colormapfull",
- "depth", "geometry", "height", "id",
- "ismapped", "manager", "name", "parent",
- "pointerx", "pointery", "pointerxy", "reqheight",
- "reqwidth", "rootx", "rooty", "screen",
- "screencells", "screendepth", "screenheight", "screenwidth",
- "screenmmheight","screenmmwidth","screenvisual","server",
- "toplevel", "viewable", "visual", "visualid",
- "vrootheight", "vrootwidth", "vrootx", "vrooty",
- "width", "x", "y",
-
- "atom", "atomname", "containing", "interps",
- "pathname",
-
- "exists", "fpixels", "pixels", "rgb",
- "visualsavailable",
-
- NULL
- };
- enum options {
- WIN_CELLS, WIN_CHILDREN, WIN_CLASS, WIN_COLORMAPFULL,
- WIN_DEPTH, WIN_GEOMETRY, WIN_HEIGHT, WIN_ID,
- WIN_ISMAPPED, WIN_MANAGER, WIN_NAME, WIN_PARENT,
- WIN_POINTERX, WIN_POINTERY, WIN_POINTERXY, WIN_REQHEIGHT,
- WIN_REQWIDTH, WIN_ROOTX, WIN_ROOTY, WIN_SCREEN,
- WIN_SCREENCELLS,WIN_SCREENDEPTH,WIN_SCREENHEIGHT,WIN_SCREENWIDTH,
- WIN_SCREENMMHEIGHT,WIN_SCREENMMWIDTH,WIN_SCREENVISUAL,WIN_SERVER,
- WIN_TOPLEVEL, WIN_VIEWABLE, WIN_VISUAL, WIN_VISUALID,
- WIN_VROOTHEIGHT,WIN_VROOTWIDTH, WIN_VROOTX, WIN_VROOTY,
- WIN_WIDTH, WIN_X, WIN_Y,
-
- WIN_ATOM, WIN_ATOMNAME, WIN_CONTAINING, WIN_INTERPS,
- WIN_PATHNAME,
-
- WIN_EXISTS, WIN_FPIXELS, WIN_PIXELS, WIN_RGB,
- WIN_VISUALSAVAILABLE
- };
-
- if (objc < 2) {
- Tcl_WrongNumArgs(interp, 1, objv, "option ?arg?");
- return TCL_ERROR;
- }
- if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
-
- if (index < WIN_ATOM) {
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "window");
- return TCL_ERROR;
- }
- string = Tcl_GetString(objv[2]);
- tkwin = Tk_NameToWindow(interp, string, tkwin);
- if (tkwin == NULL) {
- return TCL_ERROR;
- }
- }
- winPtr = (TkWindow *) tkwin;
-
- switch ((enum options) index) {
- case WIN_CELLS:
- Tcl_SetObjResult(interp,
- Tcl_NewIntObj(Tk_Visual(tkwin)->map_entries));
- break;
- case WIN_CHILDREN: {
- Tcl_Obj *strPtr, *resultPtr = Tcl_NewObj();
-
- winPtr = winPtr->childList;
- for ( ; winPtr != NULL; winPtr = winPtr->nextPtr) {
- if (!(winPtr->flags & TK_ANONYMOUS_WINDOW)) {
- strPtr = Tcl_NewStringObj(winPtr->pathName, -1);
- Tcl_ListObjAppendElement(NULL, resultPtr, strPtr);
- }
- }
- Tcl_SetObjResult(interp, resultPtr);
- break;
- }
- case WIN_CLASS:
- Tcl_SetObjResult(interp, Tcl_NewStringObj(Tk_Class(tkwin), -1));
- break;
- case WIN_COLORMAPFULL:
- Tcl_SetObjResult(interp,
- Tcl_NewBooleanObj(TkpCmapStressed(tkwin,Tk_Colormap(tkwin))));
- break;
- case WIN_DEPTH:
- Tcl_SetObjResult(interp, Tcl_NewIntObj(Tk_Depth(tkwin)));
- break;
- case WIN_GEOMETRY:
- Tcl_SetObjResult(interp, Tcl_ObjPrintf("%dx%d+%d+%d",
- Tk_Width(tkwin), Tk_Height(tkwin), Tk_X(tkwin), Tk_Y(tkwin)));
- break;
- case WIN_HEIGHT:
- Tcl_SetObjResult(interp, Tcl_NewIntObj(Tk_Height(tkwin)));
- break;
- case WIN_ID: {
- char buf[TCL_INTEGER_SPACE];
-
- Tk_MakeWindowExist(tkwin);
- TkpPrintWindowId(buf, Tk_WindowId(tkwin));
- Tcl_SetObjResult(interp, Tcl_NewStringObj(buf, -1));
- break;
- }
- case WIN_ISMAPPED:
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(Tk_IsMapped(tkwin)));
- break;
- case WIN_MANAGER:
- if (winPtr->geomMgrPtr != NULL) {
- Tcl_SetObjResult(interp,
- Tcl_NewStringObj(winPtr->geomMgrPtr->name, -1));
- }
- break;
- case WIN_NAME:
- Tcl_SetObjResult(interp, Tcl_NewStringObj(Tk_Name(tkwin), -1));
- break;
- case WIN_PARENT:
- if (winPtr->parentPtr != NULL) {
- Tcl_SetObjResult(interp,
- Tcl_NewStringObj(winPtr->parentPtr->pathName, -1));
- }
- break;
- case WIN_POINTERX:
- useX = 1;
- useY = 0;
- goto pointerxy;
- case WIN_POINTERY:
- useX = 0;
- useY = 1;
- goto pointerxy;
- case WIN_POINTERXY:
- useX = 1;
- useY = 1;
-
- pointerxy:
- winPtr = GetTopHierarchy(tkwin);
- if (winPtr == NULL) {
- x = -1;
- y = -1;
- } else {
- TkGetPointerCoords((Tk_Window) winPtr, &x, &y);
- }
- if (useX & useY) {
- Tcl_Obj *xyObj[2];
-
- xyObj[0] = Tcl_NewIntObj(x);
- xyObj[1] = Tcl_NewIntObj(y);
- Tcl_SetObjResult(interp, Tcl_NewListObj(2, xyObj));
- } else if (useX) {
- Tcl_SetObjResult(interp, Tcl_NewIntObj(x));
- } else {
- Tcl_SetObjResult(interp, Tcl_NewIntObj(y));
- }
- break;
- case WIN_REQHEIGHT:
- Tcl_SetObjResult(interp, Tcl_NewIntObj(Tk_ReqHeight(tkwin)));
- break;
- case WIN_REQWIDTH:
- Tcl_SetObjResult(interp, Tcl_NewIntObj(Tk_ReqWidth(tkwin)));
- break;
- case WIN_ROOTX:
- Tk_GetRootCoords(tkwin, &x, &y);
- Tcl_SetObjResult(interp, Tcl_NewIntObj(x));
- break;
- case WIN_ROOTY:
- Tk_GetRootCoords(tkwin, &x, &y);
- Tcl_SetObjResult(interp, Tcl_NewIntObj(y));
- break;
- case WIN_SCREEN:
- Tcl_SetObjResult(interp, Tcl_ObjPrintf("%s.%d",
- Tk_DisplayName(tkwin), Tk_ScreenNumber(tkwin)));
- break;
- case WIN_SCREENCELLS:
- Tcl_SetObjResult(interp,
- Tcl_NewIntObj(CellsOfScreen(Tk_Screen(tkwin))));
- break;
- case WIN_SCREENDEPTH:
- Tcl_SetObjResult(interp,
- Tcl_NewIntObj(DefaultDepthOfScreen(Tk_Screen(tkwin))));
- break;
- case WIN_SCREENHEIGHT:
- Tcl_SetObjResult(interp,
- Tcl_NewIntObj(HeightOfScreen(Tk_Screen(tkwin))));
- break;
- case WIN_SCREENWIDTH:
- Tcl_SetObjResult(interp,
- Tcl_NewIntObj(WidthOfScreen(Tk_Screen(tkwin))));
- break;
- case WIN_SCREENMMHEIGHT:
- Tcl_SetObjResult(interp,
- Tcl_NewIntObj(HeightMMOfScreen(Tk_Screen(tkwin))));
- break;
- case WIN_SCREENMMWIDTH:
- Tcl_SetObjResult(interp,
- Tcl_NewIntObj(WidthMMOfScreen(Tk_Screen(tkwin))));
- break;
- case WIN_SCREENVISUAL:
- class = DefaultVisualOfScreen(Tk_Screen(tkwin))->class;
- goto visual;
- case WIN_SERVER:
- TkGetServerInfo(interp, tkwin);
- break;
- case WIN_TOPLEVEL:
- winPtr = GetTopHierarchy(tkwin);
- if (winPtr != NULL) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(winPtr->pathName, -1));
- }
- break;
- case WIN_VIEWABLE: {
- int viewable = 0;
-
- for ( ; ; winPtr = winPtr->parentPtr) {
- if ((winPtr == NULL) || !(winPtr->flags & TK_MAPPED)) {
- break;
- }
- if (winPtr->flags & TK_TOP_HIERARCHY) {
- viewable = 1;
- break;
- }
- }
-
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(viewable));
- break;
- }
- case WIN_VISUAL:
- class = Tk_Visual(tkwin)->class;
-
- visual:
- string = TkFindStateString(visualMap, class);
- if (string == NULL) {
- string = "unknown";
- }
- Tcl_SetObjResult(interp, Tcl_NewStringObj(string, -1));
- break;
- case WIN_VISUALID:
- Tcl_SetObjResult(interp, Tcl_ObjPrintf("0x%x", (unsigned)
- XVisualIDFromVisual(Tk_Visual(tkwin))));
- break;
- case WIN_VROOTHEIGHT:
- Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height);
- Tcl_SetObjResult(interp, Tcl_NewIntObj(height));
- break;
- case WIN_VROOTWIDTH:
- Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height);
- Tcl_SetObjResult(interp, Tcl_NewIntObj(width));
- break;
- case WIN_VROOTX:
- Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height);
- Tcl_SetObjResult(interp, Tcl_NewIntObj(x));
- break;
- case WIN_VROOTY:
- Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height);
- Tcl_SetObjResult(interp, Tcl_NewIntObj(y));
- break;
- case WIN_WIDTH:
- Tcl_SetObjResult(interp, Tcl_NewIntObj(Tk_Width(tkwin)));
- break;
- case WIN_X:
- Tcl_SetObjResult(interp, Tcl_NewIntObj(Tk_X(tkwin)));
- break;
- case WIN_Y:
- Tcl_SetObjResult(interp, Tcl_NewIntObj(Tk_Y(tkwin)));
- break;
-
- /*
- * Uses -displayof.
- */
-
- case WIN_ATOM:
- skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
- if (skip < 0) {
- return TCL_ERROR;
- }
- if (objc - skip != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "?-displayof window? name");
- return TCL_ERROR;
- }
- objv += skip;
- string = Tcl_GetString(objv[2]);
- Tcl_SetObjResult(interp,
- Tcl_NewLongObj((long) Tk_InternAtom(tkwin, string)));
- break;
- case WIN_ATOMNAME: {
- const char *name;
- long id;
-
- skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
- if (skip < 0) {
- return TCL_ERROR;
- }
- if (objc - skip != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "?-displayof window? id");
- return TCL_ERROR;
- }
- objv += skip;
- if (Tcl_GetLongFromObj(interp, objv[2], &id) != TCL_OK) {
- return TCL_ERROR;
- }
- name = Tk_GetAtomName(tkwin, (Atom) id);
- if (strcmp(name, "?bad atom?") == 0) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "no atom exists with id \"%s\"", Tcl_GetString(objv[2])));
- Tcl_SetErrorCode(interp, "TK", "LOOKUP", "ATOM",
- Tcl_GetString(objv[2]), NULL);
- return TCL_ERROR;
- }
- Tcl_SetObjResult(interp, Tcl_NewStringObj(name, -1));
- break;
- }
- case WIN_CONTAINING:
- skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
- if (skip < 0) {
- return TCL_ERROR;
- }
- if (objc - skip != 4) {
- Tcl_WrongNumArgs(interp, 2, objv,
- "?-displayof window? rootX rootY");
- return TCL_ERROR;
- }
- objv += skip;
- string = Tcl_GetString(objv[2]);
- if (Tk_GetPixels(interp, tkwin, string, &x) != TCL_OK) {
- return TCL_ERROR;
- }
- string = Tcl_GetString(objv[3]);
- if (Tk_GetPixels(interp, tkwin, string, &y) != TCL_OK) {
- return TCL_ERROR;
- }
- tkwin = Tk_CoordsToWindow(x, y, tkwin);
- if (tkwin != NULL) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(Tk_PathName(tkwin),-1));
- }
- break;
- case WIN_INTERPS:
- skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
- if (skip < 0) {
- return TCL_ERROR;
- }
- if (objc - skip != 2) {
- Tcl_WrongNumArgs(interp, 2, objv, "?-displayof window?");
- return TCL_ERROR;
- }
- return TkGetInterpNames(interp, tkwin);
- case WIN_PATHNAME: {
- Window id;
-
- skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin);
- if (skip < 0) {
- return TCL_ERROR;
- }
- if (objc - skip != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "?-displayof window? id");
- return TCL_ERROR;
- }
- string = Tcl_GetString(objv[2 + skip]);
- if (TkpScanWindowId(interp, string, &id) != TCL_OK) {
- return TCL_ERROR;
- }
- winPtr = (TkWindow *) Tk_IdToWindow(Tk_Display(tkwin), id);
- if ((winPtr == NULL) ||
- (winPtr->mainPtr != ((TkWindow *) tkwin)->mainPtr)) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "window id \"%s\" doesn't exist in this application",
- string));
- Tcl_SetErrorCode(interp, "TK", "LOOKUP", "WINDOW", string, NULL);
- return TCL_ERROR;
- }
-
- /*
- * If the window is a utility window with no associated path (such as
- * a wrapper window or send communication window), just return an
- * empty string.
- */
-
- tkwin = (Tk_Window) winPtr;
- if (Tk_PathName(tkwin) != NULL) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(Tk_PathName(tkwin),-1));
- }
- break;
- }
-
- /*
- * objv[3] is window.
- */
-
- case WIN_EXISTS: {
- int alive;
-
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "window");
- return TCL_ERROR;
- }
- string = Tcl_GetString(objv[2]);
- winPtr = (TkWindow *) Tk_NameToWindow(interp, string, tkwin);
- Tcl_ResetResult(interp);
-
- alive = 1;
- if ((winPtr == NULL) || (winPtr->flags & TK_ALREADY_DEAD)) {
- alive = 0;
- }
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(alive));
- break;
- }
- case WIN_FPIXELS: {
- double mm, pixels;
-
- if (objc != 4) {
- Tcl_WrongNumArgs(interp, 2, objv, "window number");
- return TCL_ERROR;
- }
- if (TkGetWindowFromObj(interp, tkwin, objv[2], &tkwin) != TCL_OK) {
- return TCL_ERROR;
- }
- string = Tcl_GetString(objv[3]);
- if (Tk_GetScreenMM(interp, tkwin, string, &mm) != TCL_OK) {
- return TCL_ERROR;
- }
- pixels = mm * WidthOfScreen(Tk_Screen(tkwin))
- / WidthMMOfScreen(Tk_Screen(tkwin));
- Tcl_SetObjResult(interp, Tcl_NewDoubleObj(pixels));
- break;
- }
- case WIN_PIXELS: {
- int pixels;
-
- if (objc != 4) {
- Tcl_WrongNumArgs(interp, 2, objv, "window number");
- return TCL_ERROR;
- }
- if (TkGetWindowFromObj(interp, tkwin, objv[2], &tkwin) != TCL_OK) {
- return TCL_ERROR;
- }
- string = Tcl_GetString(objv[3]);
- if (Tk_GetPixels(interp, tkwin, string, &pixels) != TCL_OK) {
- return TCL_ERROR;
- }
- Tcl_SetObjResult(interp, Tcl_NewIntObj(pixels));
- break;
- }
- case WIN_RGB: {
- XColor *colorPtr;
-
- if (objc != 4) {
- Tcl_WrongNumArgs(interp, 2, objv, "window colorName");
- return TCL_ERROR;
- }
- if (TkGetWindowFromObj(interp, tkwin, objv[2], &tkwin) != TCL_OK) {
- return TCL_ERROR;
- }
- colorPtr = Tk_GetColor(interp, tkwin, Tcl_GetString(objv[3]));
- if (colorPtr == NULL) {
- return TCL_ERROR;
- }
- Tcl_SetObjResult(interp, Tcl_ObjPrintf("%d %d %d",
- colorPtr->red, colorPtr->green, colorPtr->blue));
- Tk_FreeColor(colorPtr);
- break;
- }
- case WIN_VISUALSAVAILABLE: {
- XVisualInfo template, *visInfoPtr;
- int count, i;
- int includeVisualId;
- Tcl_Obj *strPtr, *resultPtr;
- char buf[16 + TCL_INTEGER_SPACE];
- char visualIdString[TCL_INTEGER_SPACE];
-
- if (objc == 3) {
- includeVisualId = 0;
- } else if ((objc == 4)
- && (strcmp(Tcl_GetString(objv[3]), "includeids") == 0)) {
- includeVisualId = 1;
- } else {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?includeids?");
- return TCL_ERROR;
- }
-
- if (TkGetWindowFromObj(interp, tkwin, objv[2], &tkwin) != TCL_OK) {
- return TCL_ERROR;
- }
-
- template.screen = Tk_ScreenNumber(tkwin);
- visInfoPtr = XGetVisualInfo(Tk_Display(tkwin), VisualScreenMask,
- &template, &count);
- if (visInfoPtr == NULL) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "can't find any visuals for screen", -1));
- Tcl_SetErrorCode(interp, "TK", "VISUAL", "NONE", NULL);
- return TCL_ERROR;
- }
- resultPtr = Tcl_NewObj();
- for (i = 0; i < count; i++) {
- string = TkFindStateString(visualMap, visInfoPtr[i].class);
- if (string == NULL) {
- strcpy(buf, "unknown");
- } else {
- sprintf(buf, "%s %d", string, visInfoPtr[i].depth);
- }
- if (includeVisualId) {
- sprintf(visualIdString, " 0x%x",
- (unsigned) visInfoPtr[i].visualid);
- strcat(buf, visualIdString);
- }
- strPtr = Tcl_NewStringObj(buf, -1);
- Tcl_ListObjAppendElement(NULL, resultPtr, strPtr);
- }
- Tcl_SetObjResult(interp, resultPtr);
- XFree((char *) visInfoPtr);
- break;
- }
- }
- return TCL_OK;
-}
-
-#if 0
-/*
- *----------------------------------------------------------------------
- *
- * Tk_WmObjCmd --
- *
- * This function is invoked to process the "wm" Tcl command. See the user
- * documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
- /* ARGSUSED */
-int
-Tk_WmObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tk_Window tkwin;
- TkWindow *winPtr;
-
- static const char *const optionStrings[] = {
- "aspect", "client", "command", "deiconify",
- "focusmodel", "frame", "geometry", "grid",
- "group", "iconbitmap", "iconify", "iconmask",
- "iconname", "iconposition", "iconwindow", "maxsize",
- "minsize", "overrideredirect", "positionfrom", "protocol",
- "resizable", "sizefrom", "state", "title",
- "tracing", "transient", "withdraw", NULL
- };
- enum options {
- TKWM_ASPECT, TKWM_CLIENT, TKWM_COMMAND, TKWM_DEICONIFY,
- TKWM_FOCUSMOD, TKWM_FRAME, TKWM_GEOMETRY, TKWM_GRID,
- TKWM_GROUP, TKWM_ICONBMP, TKWM_ICONIFY, TKWM_ICONMASK,
- TKWM_ICONNAME, TKWM_ICONPOS, TKWM_ICONWIN, TKWM_MAXSIZE,
- TKWM_MINSIZE, TKWM_OVERRIDE, TKWM_POSFROM, TKWM_PROTOCOL,
- TKWM_RESIZABLE, TKWM_SIZEFROM, TKWM_STATE, TKWM_TITLE,
- TKWM_TRACING, TKWM_TRANSIENT, TKWM_WITHDRAW
- };
-
- tkwin = (Tk_Window) clientData;
-
- if (objc < 2) {
- Tcl_WrongNumArgs(interp, 1, objv, "option window ?arg?");
- return TCL_ERROR;
- }
- if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
-
- if (index == TKWM_TRACING) {
- int wmTracing;
- TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
-
- if ((objc != 2) && (objc != 3)) {
- Tcl_WrongNumArgs(interp, 1, objv, "tracing ?boolean?");
- return TCL_ERROR;
- }
- if (objc == 2) {
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(
- dispPtr->flags & TK_DISPLAY_WM_TRACING));
- return TCL_OK;
- }
- if (Tcl_GetBooleanFromObj(interp, objv[2], &wmTracing) != TCL_OK) {
- return TCL_ERROR;
- }
- if (wmTracing) {
- dispPtr->flags |= TK_DISPLAY_WM_TRACING;
- } else {
- dispPtr->flags &= ~TK_DISPLAY_WM_TRACING;
- }
- return TCL_OK;
- }
-
- if (objc < 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?arg?");
- return TCL_ERROR;
- }
-
- winPtr = (TkWindow *) Tk_NameToWindow(interp,
- Tcl_GetString(objv[2]), tkwin);
- if (winPtr == NULL) {
- return TCL_ERROR;
- }
- if (!(winPtr->flags & TK_TOP_LEVEL)) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "window \"%s\" isn't a top-level window", winPtr->pathName));
- Tcl_SetErrorCode(interp, "TK", "LOOKUP", "TOPLEVEL", winPtr->pathName,
- NULL);
- return TCL_ERROR;
- }
-
- switch ((enum options) index) {
- case TKWM_ASPECT:
- TkpWmAspectCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_CLIENT:
- TkpWmClientCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_COMMAND:
- TkpWmCommandCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_DEICONIFY:
- TkpWmDeiconifyCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_FOCUSMOD:
- TkpWmFocusmodCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_FRAME:
- TkpWmFrameCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_GEOMETRY:
- TkpWmGeometryCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_GRID:
- TkpWmGridCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_GROUP:
- TkpWmGroupCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_ICONBMP:
- TkpWmIconbitmapCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_ICONIFY:
- TkpWmIconifyCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_ICONMASK:
- TkpWmIconmaskCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_ICONNAME:
- /*
- * Slight Unix variation.
- */
- TkpWmIconnameCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_ICONPOS:
- /*
- * nearly same - 1 line more on Unix.
- */
- TkpWmIconpositionCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_ICONWIN:
- TkpWmIconwindowCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_MAXSIZE:
- /*
- * Nearly same, win diffs.
- */
- TkpWmMaxsizeCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_MINSIZE:
- /*
- * Nearly same, win diffs
- */
- TkpWmMinsizeCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_OVERRIDE:
- /*
- * Almost same.
- */
- TkpWmOverrideCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_POSFROM:
- /*
- * Equal across platforms
- */
- TkpWmPositionfromCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_PROTOCOL:
- /*
- * Equal across platforms
- */
- TkpWmProtocolCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_RESIZABLE:
- /*
- * Almost same
- */
- TkpWmResizableCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_SIZEFROM:
- /*
- * Equal across platforms
- */
- TkpWmSizefromCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_STATE:
- TkpWmStateCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_TITLE:
- TkpWmTitleCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_TRANSIENT:
- TkpWmTransientCmd(interp, tkwin, winPtr, objc, objv);
- break;
- case TKWM_WITHDRAW:
- TkpWmWithdrawCmd(interp, tkwin, winPtr, objc, objv);
- break;
- }
-
- updateGeom:
- if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
- Tcl_DoWhenIdle(UpdateGeometryInfo, winPtr);
- wmPtr->flags |= WM_UPDATE_PENDING;
- }
- return TCL_OK;
-}
-#endif
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGetDisplayOf --
- *
- * Parses a "-displayof window" option for various commands. If present,
- * the literal "-displayof" should be in objv[0] and the window name in
- * objv[1].
- *
- * Results:
- * The return value is 0 if the argument strings did not contain the
- * "-displayof" option. The return value is 2 if the argument strings
- * contained both the "-displayof" option and a valid window name.
- * Otherwise, the return value is -1 if the window name was missing or
- * did not specify a valid window.
- *
- * If the return value was 2, *tkwinPtr is filled with the token for the
- * window specified on the command line. If the return value was -1, an
- * error message is left in interp's result object.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkGetDisplayOf(
- Tcl_Interp *interp, /* Interpreter for error reporting. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[], /* Argument objects. If it is present,
- * "-displayof" should be in objv[0] and
- * objv[1] the name of a window. */
- Tk_Window *tkwinPtr) /* On input, contains main window of
- * application associated with interp. On
- * output, filled with window specified as
- * option to "-displayof" argument, or
- * unmodified if "-displayof" argument was not
- * present. */
-{
- const char *string;
- int length;
-
- if (objc < 1) {
- return 0;
- }
- string = Tcl_GetStringFromObj(objv[0], &length);
- if ((length >= 2) &&
- (strncmp(string, "-displayof", (unsigned) length) == 0)) {
- if (objc < 2) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "value for \"-displayof\" missing", -1));
- Tcl_SetErrorCode(interp, "TK", "NO_VALUE", "DISPLAYOF", NULL);
- return -1;
- }
- *tkwinPtr = Tk_NameToWindow(interp, Tcl_GetString(objv[1]), *tkwinPtr);
- if (*tkwinPtr == NULL) {
- return -1;
- }
- return 2;
- }
- return 0;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkDeadAppObjCmd --
- *
- * If an application has been deleted then all Tk commands will be
- * re-bound to this function.
- *
- * Results:
- * A standard Tcl error is reported to let the user know that the
- * application is dead.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
- /* ARGSUSED */
-int
-TkDeadAppObjCmd(
- ClientData clientData, /* Dummy. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument strings. */
-{
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "can't invoke \"%s\" command: application has been destroyed",
- Tcl_GetString(objv[0])));
- return TCL_ERROR;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetTopHierarchy --
- *
- * Retrieves the top-of-hierarchy window which is the nearest ancestor of
- * the specified window.
- *
- * Results:
- * Returns the top-of-hierarchy window, or NULL if the window has no
- * ancestor which is at the top of a physical window hierarchy.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static TkWindow *
-GetTopHierarchy(
- Tk_Window tkwin) /* Window for which the top-of-hierarchy
- * ancestor should be deterined. */
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
-
- while ((winPtr != NULL) && !(winPtr->flags & TK_TOP_HIERARCHY)) {
- winPtr = winPtr->parentPtr;
- }
- return winPtr;
-}
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 4
- * fill-column: 78
- * End:
- */