tkMacWm.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:164k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * tkMacWm.c --
  3.  *
  4.  * This module takes care of the interactions between a Tk-based
  5.  * application and the window manager.  Among other things, it
  6.  * implements the "wm" command and passes geometry information
  7.  * to the window manager.
  8.  *
  9.  * Copyright (c) 1994-1997 Sun Microsystems, Inc.
  10.  *
  11.  * See the file "license.terms" for information on usage and redistribution
  12.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  13.  *
  14.  * RCS: @(#) $Id: tkMacWm.c,v 1.24.2.1 2005/12/01 18:31:43 dgp Exp $
  15.  */
  16. #include <Gestalt.h>
  17. #include <QDOffscreen.h>
  18. #include <Windows.h>
  19. #include <ToolUtils.h>
  20. #include <tclMac.h>
  21. #include "tkPort.h"
  22. #include "tkInt.h"
  23. #include "tkMacInt.h"
  24. #include <errno.h>
  25. #include "tkScrollbar.h"
  26. /*
  27.  * We now require the Appearance headers.  They come with CodeWarrior Pro,
  28.  * and are on the SDK CD.  However, we do not require the Appearance
  29.  * extension
  30.  */
  31. #include <Appearance.h>
  32. /*
  33.  * A data structure of the following type holds information for
  34.  * each window manager protocol (such as WM_DELETE_WINDOW) for
  35.  * which a handler (i.e. a Tcl command) has been defined for a
  36.  * particular top-level window.
  37.  */
  38. typedef struct ProtocolHandler {
  39.     Atom protocol; /* Identifies the protocol. */
  40.     struct ProtocolHandler *nextPtr;
  41. /* Next in list of protocol handlers for
  42.  * the same top-level window, or NULL for
  43.  * end of list. */
  44.     Tcl_Interp *interp; /* Interpreter in which to invoke command. */
  45.     char command[4]; /* Tcl command to invoke when a client
  46.  * message for this protocol arrives.
  47.  * The actual size of the structure varies
  48.  * to accommodate the needs of the actual
  49.  * command. THIS MUST BE THE LAST FIELD OF
  50.  * THE STRUCTURE. */
  51. } ProtocolHandler;
  52. #define HANDLER_SIZE(cmdLength) 
  53. ((unsigned) (sizeof(ProtocolHandler) - 3 + cmdLength))
  54. /*
  55.  * A data structure of the following type holds window-manager-related
  56.  * information for each top-level window in an application.
  57.  */
  58. typedef struct TkWmInfo {
  59.     TkWindow *winPtr; /* Pointer to main Tk information for
  60.  * this window. */
  61.     Window reparent; /* If the window has been reparented, this
  62.  * gives the ID of the ancestor of the window
  63.  * that is a child of the root window (may
  64.  * not be window's immediate parent).  If
  65.  * the window isn't reparented, this has the
  66.  * value None. */
  67.     char *title; /* Title to display in window caption.  If
  68.  * NULL, use name of widget.  Malloced. */
  69.     char *iconName; /* Name to display in icon.  Malloced. */
  70.     Window master; /* Master window for TRANSIENT_FOR property,
  71.  * or None. */
  72.     XWMHints hints; /* Various pieces of information for
  73.  * window manager. */
  74.     char *leaderName; /* Path name of leader of window group
  75.  * (corresponds to hints.window_group).
  76.  * Malloc-ed.  Note:  this field doesn't
  77.  * get updated if leader is destroyed. */
  78.     char *masterWindowName; /* Path name of window specified as master
  79.  * in "wm transient" command, or NULL.
  80.  * Malloc-ed. Note:  this field doesn't
  81.  * get updated if masterWindowName is
  82.  * destroyed. */
  83.     Tk_Window icon; /* Window to use as icon for this window,
  84.  * or NULL. */
  85.     Tk_Window iconFor; /* Window for which this window is icon, or
  86.  * NULL if this isn't an icon for anyone. */
  87.     /*
  88.      * Information used to construct an XSizeHints structure for
  89.      * the window manager:
  90.      */
  91.     int sizeHintsFlags; /* Flags word for XSizeHints structure.
  92.  * If the PBaseSize flag is set then the
  93.  * window is gridded;  otherwise it isn't
  94.  * gridded. */
  95.     int minWidth, minHeight; /* Minimum dimensions of window, in
  96.  * grid units, not pixels. */
  97.     int maxWidth, maxHeight; /* Maximum dimensions of window, in
  98.  * grid units, not pixels. */
  99.     Tk_Window gridWin; /* Identifies the window that controls
  100.  * gridding for this top-level, or NULL if
  101.  * the top-level isn't currently gridded. */
  102.     int widthInc, heightInc; /* Increments for size changes (# pixels
  103.  * per step). */
  104.     struct {
  105. int x; /* numerator */
  106. int y;  /* denominator */
  107.     } minAspect, maxAspect; /* Min/max aspect ratios for window. */
  108.     int reqGridWidth, reqGridHeight;
  109. /* The dimensions of the window (in
  110.  * grid units) requested through
  111.  * the geometry manager. */
  112.     int gravity; /* Desired window gravity. */
  113.     /*
  114.      * Information used to manage the size and location of a window.
  115.      */
  116.     int width, height; /* Desired dimensions of window, specified
  117.  * in grid units.  These values are
  118.  * set by the "wm geometry" command and by
  119.  * ConfigureNotify events (for when wm
  120.  * resizes window).  -1 means user hasn't
  121.  * requested dimensions. */
  122.     int x, y; /* Desired X and Y coordinates for window.
  123.  * These values are set by "wm geometry",
  124.  * plus by ConfigureNotify events (when wm
  125.  * moves window).  These numbers are
  126.  * different than the numbers stored in
  127.  * winPtr->changes because (a) they could be
  128.  * measured from the right or bottom edge
  129.  * of the screen (see WM_NEGATIVE_X and
  130.  * WM_NEGATIVE_Y flags) and (b) if the window
  131.  * has been reparented then they refer to the
  132.  * parent rather than the window itself. */
  133.     int parentWidth, parentHeight;
  134. /* Width and height of reparent, in pixels
  135.  * *including border*.  If window hasn't been
  136.  * reparented then these will be the outer
  137.  * dimensions of the window, including
  138.  * border. */
  139.     int xInParent, yInParent; /* Offset of window within reparent,  measured
  140.  * from upper-left outer corner of parent's
  141.  * border to upper-left outer corner of child's
  142.  * border.  If not reparented then these are
  143.  * zero. */
  144.     int configWidth, configHeight;
  145. /* Dimensions passed to last request that we
  146.  * issued to change geometry of window.  Used
  147.  * to eliminate redundant resize operations. */
  148.     /*
  149.      * Information about the virtual root window for this top-level,
  150.      * if there is one.
  151.      */
  152.     Window vRoot; /* Virtual root window for this top-level,
  153.  * or None if there is no virtual root
  154.  * window (i.e. just use the screen's root). */
  155.     int vRootX, vRootY; /* Position of the virtual root inside the
  156.  * root window.  If the WM_VROOT_OFFSET_STALE
  157.  * flag is set then this information may be
  158.  * incorrect and needs to be refreshed from
  159.  * the X server.  If vRoot is None then these
  160.  * values are both 0. */
  161.     unsigned int vRootWidth, vRootHeight;
  162. /* Dimensions of the virtual root window.
  163.  * If vRoot is None, gives the dimensions
  164.  * of the containing screen.  This information
  165.  * is never stale, even though vRootX and
  166.  * vRootY can be. */
  167.     /*
  168.      * List of children of the toplevel which have private colormaps.
  169.      */
  170.     TkWindow **cmapList; /* Array of window with private colormaps. */
  171.     int cmapCount; /* Number of windows in array. */
  172.     /*
  173.      * Miscellaneous information.
  174.      */
  175.     ProtocolHandler *protPtr; /* First in list of protocol handlers for
  176.  * this window (NULL means none). */
  177.     int cmdArgc; /* Number of elements in cmdArgv below. */
  178.     CONST char **cmdArgv; /* Array of strings to store in the
  179.  * WM_COMMAND property.  NULL means nothing
  180.  * available. */
  181.     char *clientMachine; /* String to store in WM_CLIENT_MACHINE
  182.  * property, or NULL. */
  183.     int flags; /* Miscellaneous flags, defined below. */
  184.     /*
  185.      * Macintosh information.
  186.      */
  187.     int style; /* Native window style. */
  188.     int macClass;
  189.     int attributes;
  190.     TkWindow *scrollWinPtr; /* Ptr to scrollbar handling grow widget. */
  191. } WmInfo;
  192. /*
  193.  * Flag values for WmInfo structures:
  194.  *
  195.  * WM_NEVER_MAPPED - non-zero means window has never been
  196.  * mapped;  need to update all info when
  197.  * window is first mapped.
  198.  * WM_UPDATE_PENDING - non-zero means a call to UpdateGeometryInfo
  199.  * has already been scheduled for this
  200.  * window;  no need to schedule another one.
  201.  * WM_NEGATIVE_X - non-zero means x-coordinate is measured in
  202.  * pixels from right edge of screen, rather
  203.  * than from left edge.
  204.  * WM_NEGATIVE_Y - non-zero means y-coordinate is measured in
  205.  * pixels up from bottom of screen, rather than
  206.  * down from top.
  207.  * WM_UPDATE_SIZE_HINTS - non-zero means that new size hints need to be
  208.  * propagated to window manager.
  209.  * WM_SYNC_PENDING - set to non-zero while waiting for the window
  210.  * manager to respond to some state change.
  211.  * WM_VROOT_OFFSET_STALE - non-zero means that (x,y) offset information
  212.  * about the virtual root window is stale and
  213.  * needs to be fetched fresh from the X server.
  214.  * WM_ABOUT_TO_MAP - non-zero means that the window is about to
  215.  * be mapped by TkWmMapWindow.  This is used
  216.  * by UpdateGeometryInfo to modify its behavior.
  217.  * WM_MOVE_PENDING - non-zero means the application has requested
  218.  * a new position for the window, but it hasn't
  219.  * been reflected through the window manager
  220.  * yet.
  221.  * WM_COLORMAPS_EXPLICIT - non-zero means the colormap windows were
  222.  * set explicitly via "wm colormapwindows".
  223.  * WM_ADDED_TOPLEVEL_COLORMAP - non-zero means that when "wm colormapwindows"
  224.  * was called the top-level itself wasn't
  225.  * specified, so we added it implicitly at
  226.  * the end of the list.
  227.  * WM_WIDTH_NOT_RESIZABLE - non-zero means that we're not supposed to
  228.  * allow the user to change the width of the
  229.  * window (controlled by "wm resizable"
  230.  * command).
  231.  * WM_HEIGHT_NOT_RESIZABLE - non-zero means that we're not supposed to
  232.  * allow the user to change the height of the
  233.  * window (controlled by "wm resizable"
  234.  * command).
  235.  */
  236. #define WM_NEVER_MAPPED 1
  237. #define WM_UPDATE_PENDING 2
  238. #define WM_NEGATIVE_X 4
  239. #define WM_NEGATIVE_Y 8
  240. #define WM_UPDATE_SIZE_HINTS 0x10
  241. #define WM_SYNC_PENDING 0x20
  242. #define WM_VROOT_OFFSET_STALE 0x40
  243. #define WM_ABOUT_TO_MAP 0x100
  244. #define WM_MOVE_PENDING 0x200
  245. #define WM_COLORMAPS_EXPLICIT 0x400
  246. #define WM_ADDED_TOPLEVEL_COLORMAP 0x800
  247. #define WM_WIDTH_NOT_RESIZABLE 0x1000
  248. #define WM_HEIGHT_NOT_RESIZABLE 0x2000
  249. /*
  250.  * This is a list of all of the toplevels that have been mapped so far. It is
  251.  * used by the menu code to inval windows that were damaged by menus, and will
  252.  * eventually also be used to keep track of floating windows.
  253.  */
  254. TkMacWindowList *tkMacWindowListPtr = NULL;
  255. /*
  256.  * The variable below is used to enable or disable tracing in this
  257.  * module.  If tracing is enabled, then information is printed on
  258.  * standard output about interesting interactions with the window
  259.  * manager.
  260.  */
  261. static int wmTracing = 0;
  262. /*
  263.  * The following structure is the official type record for geometry
  264.  * management of top-level windows.
  265.  */
  266. static void TopLevelReqProc _ANSI_ARGS_((ClientData dummy,
  267. Tk_Window tkwin));
  268. static Tk_GeomMgr wmMgrType = {
  269.     "wm", /* name */
  270.     TopLevelReqProc, /* requestProc */
  271.     (Tk_GeomLostSlaveProc *) NULL, /* lostSlaveProc */
  272. };
  273. /*
  274.  * Hash table for Mac Window -> TkWindow mapping.
  275.  */
  276. static Tcl_HashTable windowTable;
  277. static int windowHashInit = false;
  278. void tkMacMoveWindow(WindowRef window, int x, int y);
  279. /*
  280.  * Forward declarations for procedures defined in this file:
  281.  */
  282. static void InitialWindowBounds _ANSI_ARGS_((TkWindow *winPtr,
  283.     Rect *geometry));
  284. static int ParseGeometry _ANSI_ARGS_((Tcl_Interp *interp,
  285.     char *string, TkWindow *winPtr));
  286. static void TopLevelEventProc _ANSI_ARGS_((ClientData clientData,
  287.     XEvent *eventPtr));
  288. static void TkWmStackorderToplevelWrapperMap _ANSI_ARGS_((
  289.     TkWindow *winPtr,
  290.     Tcl_HashTable *reparentTable));
  291. static void TopLevelReqProc _ANSI_ARGS_((ClientData dummy,
  292.     Tk_Window tkwin));
  293. static void UpdateGeometryInfo _ANSI_ARGS_((
  294.     ClientData clientData));
  295. static void UpdateSizeHints _ANSI_ARGS_((TkWindow *winPtr));
  296. static void UpdateVRootGeometry _ANSI_ARGS_((WmInfo *wmPtr));
  297. static int  WmAspectCmd _ANSI_ARGS_((Tk_Window tkwin,
  298.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  299.     Tcl_Obj *CONST objv[]));
  300. static int  WmAttributesCmd _ANSI_ARGS_((Tk_Window tkwin,
  301.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  302.     Tcl_Obj *CONST objv[]));
  303. static int  WmClientCmd _ANSI_ARGS_((Tk_Window tkwin,
  304.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  305.     Tcl_Obj *CONST objv[]));
  306. static int  WmColormapwindowsCmd _ANSI_ARGS_((Tk_Window tkwin,
  307.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  308.     Tcl_Obj *CONST objv[]));
  309. static int  WmCommandCmd _ANSI_ARGS_((Tk_Window tkwin,
  310.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  311.     Tcl_Obj *CONST objv[]));
  312. static int  WmDeiconifyCmd _ANSI_ARGS_((Tk_Window tkwin,
  313.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  314.     Tcl_Obj *CONST objv[]));
  315. static int  WmFocusmodelCmd _ANSI_ARGS_((Tk_Window tkwin,
  316.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  317.     Tcl_Obj *CONST objv[]));
  318. static int  WmFrameCmd _ANSI_ARGS_((Tk_Window tkwin,
  319.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  320.     Tcl_Obj *CONST objv[]));
  321. static int  WmGeometryCmd _ANSI_ARGS_((Tk_Window tkwin,
  322.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  323.     Tcl_Obj *CONST objv[]));
  324. static int  WmGridCmd _ANSI_ARGS_((Tk_Window tkwin,
  325.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  326.     Tcl_Obj *CONST objv[]));
  327. static int  WmGroupCmd _ANSI_ARGS_((Tk_Window tkwin,
  328.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  329.     Tcl_Obj *CONST objv[]));
  330. static int  WmIconbitmapCmd _ANSI_ARGS_((Tk_Window tkwin,
  331.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  332.     Tcl_Obj *CONST objv[]));
  333. static int  WmIconifyCmd _ANSI_ARGS_((Tk_Window tkwin,
  334.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  335.     Tcl_Obj *CONST objv[]));
  336. static int  WmIconmaskCmd _ANSI_ARGS_((Tk_Window tkwin,
  337.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  338.     Tcl_Obj *CONST objv[]));
  339. static int  WmIconnameCmd _ANSI_ARGS_((Tk_Window tkwin,
  340.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  341.     Tcl_Obj *CONST objv[]));
  342. static int  WmIconpositionCmd _ANSI_ARGS_((Tk_Window tkwin,
  343.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  344.     Tcl_Obj *CONST objv[]));
  345. static int  WmIconwindowCmd _ANSI_ARGS_((Tk_Window tkwin,
  346.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  347.     Tcl_Obj *CONST objv[]));
  348. static int  WmMaxsizeCmd _ANSI_ARGS_((Tk_Window tkwin,
  349.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  350.     Tcl_Obj *CONST objv[]));
  351. static int  WmMinsizeCmd _ANSI_ARGS_((Tk_Window tkwin,
  352.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  353.     Tcl_Obj *CONST objv[]));
  354. static int  WmOverrideredirectCmd _ANSI_ARGS_((Tk_Window tkwin,
  355.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  356.     Tcl_Obj *CONST objv[]));
  357. static int  WmPositionfromCmd _ANSI_ARGS_((Tk_Window tkwin,
  358.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  359.     Tcl_Obj *CONST objv[]));
  360. static int  WmProtocolCmd _ANSI_ARGS_((Tk_Window tkwin,
  361.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  362.     Tcl_Obj *CONST objv[]));
  363. static int  WmResizableCmd _ANSI_ARGS_((Tk_Window tkwin,
  364.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  365.     Tcl_Obj *CONST objv[]));
  366. static int  WmSizefromCmd _ANSI_ARGS_((Tk_Window tkwin,
  367.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  368.     Tcl_Obj *CONST objv[]));
  369. static int  WmStackorderCmd _ANSI_ARGS_((Tk_Window tkwin,
  370.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  371.     Tcl_Obj *CONST objv[]));
  372. static int  WmStateCmd _ANSI_ARGS_((Tk_Window tkwin,
  373.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  374.     Tcl_Obj *CONST objv[]));
  375. static int  WmTitleCmd _ANSI_ARGS_((Tk_Window tkwin,
  376.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  377.     Tcl_Obj *CONST objv[]));
  378. static int  WmTransientCmd _ANSI_ARGS_((Tk_Window tkwin,
  379.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  380.     Tcl_Obj *CONST objv[]));
  381. static int  WmWithdrawCmd _ANSI_ARGS_((Tk_Window tkwin,
  382.     TkWindow *winPtr, Tcl_Interp *interp, int objc,
  383.     Tcl_Obj *CONST objv[]));
  384. static void WmUpdateGeom _ANSI_ARGS_((WmInfo *wmPtr,
  385.     TkWindow *winPtr));
  386. /*
  387.  *--------------------------------------------------------------
  388.  *
  389.  * TkWmNewWindow --
  390.  *
  391.  * This procedure is invoked whenever a new top-level
  392.  * window is created.  Its job is to initialize the WmInfo
  393.  * structure for the window.
  394.  *
  395.  * Results:
  396.  * None.
  397.  *
  398.  * Side effects:
  399.  * A WmInfo structure gets allocated and initialized.
  400.  *
  401.  *--------------------------------------------------------------
  402.  */
  403. void
  404. TkWmNewWindow(
  405.     TkWindow *winPtr) /* Newly-created top-level window. */
  406. {
  407.     register WmInfo *wmPtr;
  408.     wmPtr = (WmInfo *) ckalloc(sizeof(WmInfo));
  409.     wmPtr->winPtr = winPtr;
  410.     wmPtr->reparent = None;
  411.     wmPtr->title = NULL;
  412.     wmPtr->iconName = NULL;
  413.     wmPtr->master = None;
  414.     wmPtr->hints.flags = InputHint | StateHint;
  415.     wmPtr->hints.input = True;
  416.     wmPtr->hints.initial_state = NormalState;
  417.     wmPtr->hints.icon_pixmap = None;
  418.     wmPtr->hints.icon_window = None;
  419.     wmPtr->hints.icon_x = wmPtr->hints.icon_y = 0;
  420.     wmPtr->hints.icon_mask = None;
  421.     wmPtr->hints.window_group = None;
  422.     wmPtr->leaderName = NULL;
  423.     wmPtr->masterWindowName = NULL;
  424.     wmPtr->icon = NULL;
  425.     wmPtr->iconFor = NULL;
  426.     wmPtr->sizeHintsFlags = 0;
  427.     wmPtr->minWidth = wmPtr->minHeight = 1;
  428.     /*
  429.      * Default the maximum dimensions to the size of the display, minus
  430.      * a guess about how space is needed for window manager decorations.
  431.      */
  432.     wmPtr->maxWidth = DisplayWidth(winPtr->display, winPtr->screenNum) - 15;
  433.     wmPtr->maxHeight = DisplayHeight(winPtr->display, winPtr->screenNum) - 30;
  434.     wmPtr->gridWin = NULL;
  435.     wmPtr->widthInc = wmPtr->heightInc = 1;
  436.     wmPtr->minAspect.x = wmPtr->minAspect.y = 1;
  437.     wmPtr->maxAspect.x = wmPtr->maxAspect.y = 1;
  438.     wmPtr->reqGridWidth = wmPtr->reqGridHeight = -1;
  439.     wmPtr->gravity = NorthWestGravity;
  440.     wmPtr->width = -1;
  441.     wmPtr->height = -1;
  442.     wmPtr->x = winPtr->changes.x;
  443.     wmPtr->y = winPtr->changes.y;
  444.     wmPtr->parentWidth = winPtr->changes.width
  445. + 2*winPtr->changes.border_width;
  446.     wmPtr->parentHeight = winPtr->changes.height
  447. + 2*winPtr->changes.border_width;
  448.     wmPtr->xInParent = 0;
  449.     wmPtr->yInParent = 0;
  450.     wmPtr->cmapList = NULL;
  451.     wmPtr->cmapCount = 0;
  452.     wmPtr->configWidth = -1;
  453.     wmPtr->configHeight = -1;
  454.     wmPtr->vRoot = None;
  455.     wmPtr->protPtr = NULL;
  456.     wmPtr->cmdArgv = NULL;
  457.     wmPtr->clientMachine = NULL;
  458.     wmPtr->flags = WM_NEVER_MAPPED;
  459.     if (TkMacHaveAppearance() >= 0x110) {
  460.         wmPtr->style = -1;
  461.     } else {
  462.         wmPtr->style = documentProc;
  463.     }
  464.     wmPtr->macClass = kDocumentWindowClass;
  465.     wmPtr->attributes = kWindowStandardDocumentAttributes;
  466.     wmPtr->scrollWinPtr = NULL;
  467.     winPtr->wmInfoPtr = wmPtr;
  468.     UpdateVRootGeometry(wmPtr);
  469.     /*
  470.      * Tk must monitor structure events for top-level windows, in order
  471.      * to detect size and position changes caused by window managers.
  472.      */
  473.     Tk_CreateEventHandler((Tk_Window) winPtr, StructureNotifyMask,
  474.     TopLevelEventProc, (ClientData) winPtr);
  475.     /*
  476.      * Arrange for geometry requests to be reflected from the window
  477.      * to the window manager.
  478.      */
  479.     Tk_ManageGeometry((Tk_Window) winPtr, &wmMgrType, (ClientData) 0);
  480. }
  481. /*
  482.  *--------------------------------------------------------------
  483.  *
  484.  * TkWmMapWindow --
  485.  *
  486.  * This procedure is invoked to map a top-level window.  This
  487.  * module gets a chance to update all window-manager-related
  488.  * information in properties before the window manager sees
  489.  * the map event and checks the properties.  It also gets to
  490.  * decide whether or not to even map the window after all.
  491.  *
  492.  * Results:
  493.  * None.
  494.  *
  495.  * Side effects:
  496.  * Properties of winPtr may get updated to provide up-to-date
  497.  * information to the window manager.  The window may also get
  498.  * mapped, but it may not be if this procedure decides that
  499.  * isn't appropriate (e.g. because the window is withdrawn).
  500.  *
  501.  *--------------------------------------------------------------
  502.  */
  503. void
  504. TkWmMapWindow(
  505.     TkWindow *winPtr) /* Top-level window that's about to
  506.  * be mapped. */
  507. {
  508.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  509.     Point where = {0, 0};
  510.     int xOffset, yOffset;
  511.     int firstMap = false;
  512.     MacDrawable *macWin;
  513.     if (wmPtr->flags & WM_NEVER_MAPPED) {
  514. wmPtr->flags &= ~WM_NEVER_MAPPED;
  515. firstMap = true;
  516. /*
  517.  * Create the underlying Mac window for this Tk window.
  518.  */
  519. macWin = (MacDrawable *) winPtr->window;
  520. if (!TkMacHostToplevelExists(winPtr)) {
  521.     TkMacMakeRealWindowExist(winPtr);
  522. }
  523. /*
  524.  * Generate configure event when we first map the window.
  525.  */
  526. LocalToGlobal(&where);
  527. TkMacWindowOffset((WindowRef) TkMacGetDrawablePort((Drawable) macWin),
  528. &xOffset, &yOffset);
  529. where.h -= xOffset;
  530. where.v -= yOffset;
  531. TkGenWMConfigureEvent((Tk_Window) winPtr,
  532. where.h, where.v, -1, -1, TK_LOCATION_CHANGED);
  533. /*
  534.  * This is the first time this window has ever been mapped.
  535.  * Store all the window-manager-related information for the
  536.  * window.
  537.  */
  538. if (!Tk_IsEmbedded(winPtr)) {
  539.     TkSetWMName(winPtr, ((wmPtr->title != NULL) ?
  540.     wmPtr->title : winPtr->nameUid));
  541. }
  542. TkWmSetClass(winPtr);
  543. if (wmPtr->iconName != NULL) {
  544.     XSetIconName(winPtr->display, winPtr->window, wmPtr->iconName);
  545. }
  546. wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
  547.     }
  548.     if (wmPtr->hints.initial_state == WithdrawnState) {
  549. return;
  550.     }
  551.     /*
  552.      * TODO: we need to display a window if it's iconic on creation.
  553.      */
  554.     if (wmPtr->hints.initial_state == IconicState) {
  555. return;
  556.     }
  557.     /*
  558.      * Update geometry information.
  559.      */
  560.     wmPtr->flags |= WM_ABOUT_TO_MAP;
  561.     if (wmPtr->flags & WM_UPDATE_PENDING) {
  562. Tk_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr);
  563.     }
  564.     UpdateGeometryInfo((ClientData) winPtr);
  565.     wmPtr->flags &= ~WM_ABOUT_TO_MAP;
  566.     /*
  567.      * Map the window.
  568.      */
  569.     XMapWindow(winPtr->display, winPtr->window);
  570.     /*
  571.      * Now that the window is visable we can determine the offset
  572.      * from the window's content orgin to the window's decorative
  573.      * orgin (structure orgin).
  574.      */
  575.     TkMacWindowOffset((WindowRef) TkMacGetDrawablePort(Tk_WindowId(winPtr)),
  576. &wmPtr->xInParent, &wmPtr->yInParent);
  577. }
  578. /*
  579.  *--------------------------------------------------------------
  580.  *
  581.  * TkWmUnmapWindow --
  582.  *
  583.  * This procedure is invoked to unmap a top-level window.
  584.  * On the Macintosh all we do is call XUnmapWindow.
  585.  *
  586.  * Results:
  587.  * None.
  588.  *
  589.  * Side effects:
  590.  * Unmaps the window.
  591.  *
  592.  *--------------------------------------------------------------
  593.  */
  594. void
  595. TkWmUnmapWindow(
  596.     TkWindow *winPtr) /* Top-level window that's about to
  597.  * be mapped. */
  598. {
  599.     XUnmapWindow(winPtr->display, winPtr->window);
  600. }
  601. /*
  602.  *--------------------------------------------------------------
  603.  *
  604.  * TkWmDeadWindow --
  605.  *
  606.  * This procedure is invoked when a top-level window is
  607.  * about to be deleted.  It cleans up the wm-related data
  608.  * structures for the window.
  609.  *
  610.  * Results:
  611.  * None.
  612.  *
  613.  * Side effects:
  614.  * The WmInfo structure for winPtr gets freed up.
  615.  *
  616.  *--------------------------------------------------------------
  617.  */
  618. void
  619. TkWmDeadWindow(winPtr)
  620.     TkWindow *winPtr; /* Top-level window that's being deleted. */
  621. {
  622.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  623.     WmInfo *wmPtr2;
  624.     if (wmPtr == NULL) {
  625. return;
  626.     }
  627.     if (wmPtr->title != NULL) {
  628. ckfree(wmPtr->title);
  629.     }
  630.     if (wmPtr->iconName != NULL) {
  631. ckfree(wmPtr->iconName);
  632.     }
  633.     if (wmPtr->hints.flags & IconPixmapHint) {
  634. Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_pixmap);
  635.     }
  636.     if (wmPtr->hints.flags & IconMaskHint) {
  637. Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_mask);
  638.     }
  639.     if (wmPtr->leaderName != NULL) {
  640. ckfree(wmPtr->leaderName);
  641.     }
  642.     if (wmPtr->masterWindowName != NULL) {
  643. ckfree(wmPtr->masterWindowName);
  644.     }
  645.     if (wmPtr->icon != NULL) {
  646. wmPtr2 = ((TkWindow *) wmPtr->icon)->wmInfoPtr;
  647. wmPtr2->iconFor = NULL;
  648.     }
  649.     if (wmPtr->iconFor != NULL) {
  650. wmPtr2 = ((TkWindow *) wmPtr->iconFor)->wmInfoPtr;
  651. wmPtr2->icon = NULL;
  652. wmPtr2->hints.flags &= ~IconWindowHint;
  653.     }
  654.     while (wmPtr->protPtr != NULL) {
  655. ProtocolHandler *protPtr;
  656. protPtr = wmPtr->protPtr;
  657. wmPtr->protPtr = protPtr->nextPtr;
  658. Tcl_EventuallyFree((ClientData) protPtr, TCL_DYNAMIC);
  659.     }
  660.     if (wmPtr->cmdArgv != NULL) {
  661. ckfree((char *) wmPtr->cmdArgv);
  662.     }
  663.     if (wmPtr->clientMachine != NULL) {
  664. ckfree((char *) wmPtr->clientMachine);
  665.     }
  666.     if (wmPtr->flags & WM_UPDATE_PENDING) {
  667. Tk_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr);
  668.     }
  669.     ckfree((char *) wmPtr);
  670.     winPtr->wmInfoPtr = NULL;
  671. }
  672. /*
  673.  *--------------------------------------------------------------
  674.  *
  675.  * TkWmSetClass --
  676.  *
  677.  * This procedure is invoked whenever a top-level window's
  678.  * class is changed.  If the window has been mapped then this
  679.  * procedure updates the window manager property for the
  680.  * class.  If the window hasn't been mapped, the update is
  681.  * deferred until just before the first mapping.
  682.  *
  683.  * Results:
  684.  * None.
  685.  *
  686.  * Side effects:
  687.  * A window property may get updated.
  688.  *
  689.  *--------------------------------------------------------------
  690.  */
  691. void
  692. TkWmSetClass(
  693.     TkWindow *winPtr) /* Newly-created top-level window. */
  694. {
  695.     return;
  696. }
  697. /*
  698.  *----------------------------------------------------------------------
  699.  *
  700.  * Tk_WmObjCmd --
  701.  *
  702.  * This procedure is invoked to process the "wm" Tcl command.
  703.  * See the user documentation for details on what it does.
  704.  *
  705.  * Results:
  706.  * A standard Tcl result.
  707.  *
  708.  * Side effects:
  709.  * See the user documentation.
  710.  *
  711.  *----------------------------------------------------------------------
  712.  */
  713. /* ARGSUSED */
  714. int
  715. Tk_WmObjCmd(
  716.     ClientData clientData, /* Main window associated with
  717.  * interpreter. */
  718.     Tcl_Interp *interp, /* Current interpreter. */
  719.     int objc, /* Number of arguments. */
  720.     Tcl_Obj *CONST objv[]) /* Argument objects. */
  721. {
  722.     Tk_Window tkwin = (Tk_Window) clientData;
  723.     static CONST char *optionStrings[] = {
  724. "aspect", "attributes", "client", "colormapwindows",
  725. "command", "deiconify", "focusmodel", "frame",
  726. "geometry", "grid", "group", "iconbitmap",
  727. "iconify", "iconmask", "iconname", "iconposition",
  728. "iconwindow", "maxsize", "minsize", "overrideredirect",
  729.         "positionfrom", "protocol", "resizable", "sizefrom",
  730.         "stackorder", "state", "title", "transient",
  731. "withdraw", (char *) NULL };
  732.     enum options {
  733.         WMOPT_ASPECT, WMOPT_ATTRIBUTES, WMOPT_CLIENT, WMOPT_COLORMAPWINDOWS,
  734. WMOPT_COMMAND, WMOPT_DEICONIFY, WMOPT_FOCUSMODEL, WMOPT_FRAME,
  735. WMOPT_GEOMETRY, WMOPT_GRID, WMOPT_GROUP, WMOPT_ICONBITMAP,
  736. WMOPT_ICONIFY, WMOPT_ICONMASK, WMOPT_ICONNAME, WMOPT_ICONPOSITION,
  737. WMOPT_ICONWINDOW, WMOPT_MAXSIZE, WMOPT_MINSIZE, WMOPT_OVERRIDEREDIRECT,
  738.         WMOPT_POSITIONFROM, WMOPT_PROTOCOL, WMOPT_RESIZABLE, WMOPT_SIZEFROM,
  739.         WMOPT_STACKORDER, WMOPT_STATE, WMOPT_TITLE, WMOPT_TRANSIENT,
  740. WMOPT_WITHDRAW };
  741.     int index, length;
  742.     char *argv1;
  743.     TkWindow *winPtr;
  744.     TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
  745.     if (objc < 2) {
  746. wrongNumArgs:
  747. Tcl_WrongNumArgs(interp, 1, objv, "option window ?arg ...?");
  748. return TCL_ERROR;
  749.     }
  750.     argv1 = Tcl_GetStringFromObj(objv[1], &length);
  751.     if ((argv1[0] == 't') && (strncmp(argv1, "tracing", length) == 0)
  752.     && (length >= 3)) {
  753. if ((objc != 2) && (objc != 3)) {
  754.     Tcl_WrongNumArgs(interp, 2, objv, "?boolean?");
  755.     return TCL_ERROR;
  756. }
  757. if (objc == 2) {
  758.     Tcl_SetResult(interp, ((wmTracing) ? "on" : "off"), TCL_STATIC);
  759.     return TCL_OK;
  760. }
  761. return Tcl_GetBooleanFromObj(interp, objv[2], &wmTracing);
  762.     }
  763.     if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
  764.     &index) != TCL_OK) {
  765. return TCL_ERROR;
  766.     }
  767.     if (objc < 3) {
  768. goto wrongNumArgs;
  769.     }
  770.     if (TkGetWindowFromObj(interp, tkwin, objv[2], (Tk_Window *) &winPtr)
  771.     != TCL_OK) {
  772. return TCL_ERROR;
  773.     }
  774.     if (!Tk_IsTopLevel(winPtr)) {
  775. Tcl_AppendResult(interp, "window "", winPtr->pathName,
  776. "" isn't a top-level window", (char *) NULL);
  777. return TCL_ERROR;
  778.     }
  779.     switch ((enum options) index) {
  780.       case WMOPT_ASPECT:
  781. return WmAspectCmd(tkwin, winPtr, interp, objc, objv);
  782.       case WMOPT_ATTRIBUTES:
  783. return WmAttributesCmd(tkwin, winPtr, interp, objc, objv);
  784.       case WMOPT_CLIENT:
  785. return WmClientCmd(tkwin, winPtr, interp, objc, objv);
  786.       case WMOPT_COLORMAPWINDOWS:
  787. return WmColormapwindowsCmd(tkwin, winPtr, interp, objc, objv);
  788.       case WMOPT_COMMAND:
  789. return WmCommandCmd(tkwin, winPtr, interp, objc, objv);
  790.       case WMOPT_DEICONIFY:
  791. return WmDeiconifyCmd(tkwin, winPtr, interp, objc, objv);
  792.       case WMOPT_FOCUSMODEL:
  793. return WmFocusmodelCmd(tkwin, winPtr, interp, objc, objv);
  794.       case WMOPT_FRAME:
  795. return WmFrameCmd(tkwin, winPtr, interp, objc, objv);
  796.       case WMOPT_GEOMETRY:
  797. return WmGeometryCmd(tkwin, winPtr, interp, objc, objv);
  798.       case WMOPT_GRID:
  799. return WmGridCmd(tkwin, winPtr, interp, objc, objv);
  800.       case WMOPT_GROUP:
  801. return WmGroupCmd(tkwin, winPtr, interp, objc, objv);
  802.       case WMOPT_ICONBITMAP:
  803. return WmIconbitmapCmd(tkwin, winPtr, interp, objc, objv);
  804.       case WMOPT_ICONIFY:
  805. return WmIconifyCmd(tkwin, winPtr, interp, objc, objv);
  806.       case WMOPT_ICONMASK:
  807. return WmIconmaskCmd(tkwin, winPtr, interp, objc, objv);
  808.       case WMOPT_ICONNAME:
  809. return WmIconnameCmd(tkwin, winPtr, interp, objc, objv);
  810.       case WMOPT_ICONPOSITION:
  811. return WmIconpositionCmd(tkwin, winPtr, interp, objc, objv);
  812.       case WMOPT_ICONWINDOW:
  813. return WmIconwindowCmd(tkwin, winPtr, interp, objc, objv);
  814.       case WMOPT_MAXSIZE:
  815. return WmMaxsizeCmd(tkwin, winPtr, interp, objc, objv);
  816.       case WMOPT_MINSIZE:
  817. return WmMinsizeCmd(tkwin, winPtr, interp, objc, objv);
  818.       case WMOPT_OVERRIDEREDIRECT:
  819. return WmOverrideredirectCmd(tkwin, winPtr, interp, objc, objv);
  820.       case WMOPT_POSITIONFROM:
  821. return WmPositionfromCmd(tkwin, winPtr, interp, objc, objv);
  822.       case WMOPT_PROTOCOL:
  823. return WmProtocolCmd(tkwin, winPtr, interp, objc, objv);
  824.       case WMOPT_RESIZABLE:
  825. return WmResizableCmd(tkwin, winPtr, interp, objc, objv);
  826.       case WMOPT_SIZEFROM:
  827. return WmSizefromCmd(tkwin, winPtr, interp, objc, objv);
  828.       case WMOPT_STACKORDER:
  829. return WmStackorderCmd(tkwin, winPtr, interp, objc, objv);
  830.       case WMOPT_STATE:
  831. return WmStateCmd(tkwin, winPtr, interp, objc, objv);
  832.       case WMOPT_TITLE:
  833. return WmTitleCmd(tkwin, winPtr, interp, objc, objv);
  834.       case WMOPT_TRANSIENT:
  835. return WmTransientCmd(tkwin, winPtr, interp, objc, objv);
  836.       case WMOPT_WITHDRAW:
  837. return WmWithdrawCmd(tkwin, winPtr, interp, objc, objv);
  838.     }
  839.     /* This should not happen */
  840.     return TCL_ERROR;
  841. }
  842. /*
  843.  *----------------------------------------------------------------------
  844.  *
  845.  * WmAspectCmd --
  846.  *
  847.  * This procedure is invoked to process the "wm aspect" Tcl command.
  848.  * See the user documentation for details on what it does.
  849.  *
  850.  * Results:
  851.  * A standard Tcl result.
  852.  *
  853.  * Side effects:
  854.  * See the user documentation.
  855.  *
  856.  *----------------------------------------------------------------------
  857.  */
  858. static int
  859. WmAspectCmd(tkwin, winPtr, interp, objc, objv)
  860.     Tk_Window tkwin; /* Main window of the application. */
  861.     TkWindow *winPtr;           /* Toplevel to work with */
  862.     Tcl_Interp *interp; /* Current interpreter. */
  863.     int objc; /* Number of arguments. */
  864.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  865. {
  866.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  867.     int numer1, denom1, numer2, denom2;
  868.     if ((objc != 3) && (objc != 7)) {
  869. Tcl_WrongNumArgs(interp, 2, objv,
  870. "window ?minNumer minDenom maxNumer maxDenom?");
  871. return TCL_ERROR;
  872.     }
  873.     if (objc == 3) {
  874. if (wmPtr->sizeHintsFlags & PAspect) {
  875.     char buf[TCL_INTEGER_SPACE * 4];
  876.     sprintf(buf, "%d %d %d %d", wmPtr->minAspect.x,
  877.     wmPtr->minAspect.y, wmPtr->maxAspect.x,
  878.     wmPtr->maxAspect.y);
  879.     Tcl_SetResult(interp, buf, TCL_VOLATILE);
  880. }
  881. return TCL_OK;
  882.     }
  883.     if (*Tcl_GetString(objv[3]) == '') {
  884. wmPtr->sizeHintsFlags &= ~PAspect;
  885.     } else {
  886. if ((Tcl_GetIntFromObj(interp, objv[3], &numer1) != TCL_OK)
  887. || (Tcl_GetIntFromObj(interp, objv[4], &denom1) != TCL_OK)
  888. || (Tcl_GetIntFromObj(interp, objv[5], &numer2) != TCL_OK)
  889. || (Tcl_GetIntFromObj(interp, objv[6], &denom2) != TCL_OK)) {
  890.     return TCL_ERROR;
  891. }
  892. if ((numer1 <= 0) || (denom1 <= 0) || (numer2 <= 0) ||
  893. (denom2 <= 0)) {
  894.     Tcl_SetResult(interp, "aspect number can't be <= 0",
  895.     TCL_STATIC);
  896.     return TCL_ERROR;
  897. }
  898. wmPtr->minAspect.x = numer1;
  899. wmPtr->minAspect.y = denom1;
  900. wmPtr->maxAspect.x = numer2;
  901. wmPtr->maxAspect.y = denom2;
  902. wmPtr->sizeHintsFlags |= PAspect;
  903.     }
  904.     wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
  905.     WmUpdateGeom(wmPtr, winPtr);
  906.     return TCL_OK;
  907. }
  908. /*
  909.  *----------------------------------------------------------------------
  910.  *
  911.  * WmAttributesCmd --
  912.  *
  913.  * This procedure is invoked to process the "wm attributes" Tcl command.
  914.  * See the user documentation for details on what it does.
  915.  *
  916.  * Results:
  917.  * A standard Tcl result.
  918.  *
  919.  * Side effects:
  920.  * See the user documentation.
  921.  *
  922.  *----------------------------------------------------------------------
  923.  */
  924. static int
  925. WmAttributesCmd(tkwin, winPtr, interp, objc, objv)
  926.     Tk_Window tkwin; /* Main window of the application. */
  927.     TkWindow *winPtr;           /* Toplevel to work with */
  928.     Tcl_Interp *interp; /* Current interpreter. */
  929.     int objc; /* Number of arguments. */
  930.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  931. {
  932.     if (objc != 3) {
  933. Tcl_WrongNumArgs(interp, 2, objv, "window");
  934. return TCL_ERROR;
  935.     }
  936.     return TCL_OK;
  937. }
  938. /*
  939.  *----------------------------------------------------------------------
  940.  *
  941.  * WmClientCmd --
  942.  *
  943.  * This procedure is invoked to process the "wm client" Tcl command.
  944.  * See the user documentation for details on what it does.
  945.  *
  946.  * Results:
  947.  * A standard Tcl result.
  948.  *
  949.  * Side effects:
  950.  * See the user documentation.
  951.  *
  952.  *----------------------------------------------------------------------
  953.  */
  954. static int
  955. WmClientCmd(tkwin, winPtr, interp, objc, objv)
  956.     Tk_Window tkwin; /* Main window of the application. */
  957.     TkWindow *winPtr;           /* Toplevel to work with */
  958.     Tcl_Interp *interp; /* Current interpreter. */
  959.     int objc; /* Number of arguments. */
  960.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  961. {
  962.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  963.     char *argv3;
  964.     int length;
  965.     if ((objc != 3) && (objc != 4)) {
  966. Tcl_WrongNumArgs(interp, 2, objv, "window ?name?");
  967. return TCL_ERROR;
  968.     }
  969.     if (objc == 3) {
  970. if (wmPtr->clientMachine != NULL) {
  971.     Tcl_SetResult(interp, wmPtr->clientMachine, TCL_STATIC);
  972. }
  973. return TCL_OK;
  974.     }
  975.     argv3 = Tcl_GetStringFromObj(objv[3], &length);
  976.     if (argv3[0] == 0) {
  977. if (wmPtr->clientMachine != NULL) {
  978.     ckfree((char *) wmPtr->clientMachine);
  979.     wmPtr->clientMachine = NULL;
  980. }
  981. return TCL_OK;
  982.     }
  983.     if (wmPtr->clientMachine != NULL) {
  984. ckfree((char *) wmPtr->clientMachine);
  985.     }
  986.     wmPtr->clientMachine = (char *)
  987.     ckalloc((unsigned) (length + 1));
  988.     strcpy(wmPtr->clientMachine, argv3);
  989.     return TCL_OK;
  990. }
  991. /*
  992.  *----------------------------------------------------------------------
  993.  *
  994.  * WmColormapwindowsCmd --
  995.  *
  996.  * This procedure is invoked to process the "wm colormapwindows"
  997.  * Tcl command.
  998.  * See the user documentation for details on what it does.
  999.  *
  1000.  * Results:
  1001.  * A standard Tcl result.
  1002.  *
  1003.  * Side effects:
  1004.  * See the user documentation.
  1005.  *
  1006.  *----------------------------------------------------------------------
  1007.  */
  1008. static int
  1009. WmColormapwindowsCmd(tkwin, winPtr, interp, objc, objv)
  1010.     Tk_Window tkwin; /* Main window of the application. */
  1011.     TkWindow *winPtr;           /* Toplevel to work with */
  1012.     Tcl_Interp *interp; /* Current interpreter. */
  1013.     int objc; /* Number of arguments. */
  1014.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1015. {
  1016.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1017.     TkWindow **cmapList;
  1018.     TkWindow *winPtr2;
  1019.     int i, windowObjc, gotToplevel = 0;
  1020.     Tcl_Obj **windowObjv;
  1021.     if ((objc != 3) && (objc != 4)) {
  1022. Tcl_WrongNumArgs(interp, 2, objv, "window ?windowList?");
  1023. return TCL_ERROR;
  1024.     }
  1025.     if (objc == 3) {
  1026. Tk_MakeWindowExist((Tk_Window) winPtr);
  1027. for (i = 0; i < wmPtr->cmapCount; i++) {
  1028.     if ((i == (wmPtr->cmapCount-1))
  1029.     && (wmPtr->flags & WM_ADDED_TOPLEVEL_COLORMAP)) {
  1030. break;
  1031.     }
  1032.     Tcl_AppendElement(interp, wmPtr->cmapList[i]->pathName);
  1033. }
  1034. return TCL_OK;
  1035.     }
  1036.     if (Tcl_ListObjGetElements(interp, objv[3], &windowObjc, &windowObjv)
  1037.     != TCL_OK) {
  1038. return TCL_ERROR;
  1039.     }
  1040.     cmapList = (TkWindow **) ckalloc((unsigned)
  1041.     ((windowObjc+1)*sizeof(TkWindow*)));
  1042.     for (i = 0; i < windowObjc; i++) {
  1043. if (TkGetWindowFromObj(interp, tkwin, windowObjv[i],
  1044. (Tk_Window *) &winPtr2) != TCL_OK)
  1045. {
  1046.     ckfree((char *) cmapList);
  1047.     return TCL_ERROR;
  1048. }
  1049. if (winPtr2 == winPtr) {
  1050.     gotToplevel = 1;
  1051. }
  1052. if (winPtr2->window == None) {
  1053.     Tk_MakeWindowExist((Tk_Window) winPtr2);
  1054. }
  1055. cmapList[i] = winPtr2;
  1056.     }
  1057.     if (!gotToplevel) {
  1058. wmPtr->flags |= WM_ADDED_TOPLEVEL_COLORMAP;
  1059. cmapList[windowObjc] = winPtr;
  1060. windowObjc++;
  1061.     } else {
  1062. wmPtr->flags &= ~WM_ADDED_TOPLEVEL_COLORMAP;
  1063.     }
  1064.     wmPtr->flags |= WM_COLORMAPS_EXPLICIT;
  1065.     if (wmPtr->cmapList != NULL) {
  1066. ckfree((char *)wmPtr->cmapList);
  1067.     }
  1068.     wmPtr->cmapList = cmapList;
  1069.     wmPtr->cmapCount = windowObjc;
  1070.     /*
  1071.      * On the Macintosh all of this is just an excercise
  1072.      * in compatability as we don't support colormaps.  If
  1073.      * we did they would be installed here.
  1074.      */
  1075.     return TCL_OK;
  1076. }
  1077. /*
  1078.  *----------------------------------------------------------------------
  1079.  *
  1080.  * WmCommandCmd --
  1081.  *
  1082.  * This procedure is invoked to process the "wm command" Tcl command.
  1083.  * See the user documentation for details on what it does.
  1084.  *
  1085.  * Results:
  1086.  * A standard Tcl result.
  1087.  *
  1088.  * Side effects:
  1089.  * See the user documentation.
  1090.  *
  1091.  *----------------------------------------------------------------------
  1092.  */
  1093. static int
  1094. WmCommandCmd(tkwin, winPtr, interp, objc, objv)
  1095.     Tk_Window tkwin; /* Main window of the application. */
  1096.     TkWindow *winPtr;           /* Toplevel to work with */
  1097.     Tcl_Interp *interp; /* Current interpreter. */
  1098.     int objc; /* Number of arguments. */
  1099.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1100. {
  1101.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1102.     char *argv3;
  1103.     int cmdArgc;
  1104.     CONST char **cmdArgv;
  1105.     if ((objc != 3) && (objc != 4)) {
  1106. Tcl_WrongNumArgs(interp, 2, objv, "window ?value?");
  1107. return TCL_ERROR;
  1108.     }
  1109.     if (objc == 3) {
  1110. if (wmPtr->cmdArgv != NULL) {
  1111.     Tcl_SetResult(interp,
  1112.     Tcl_Merge(wmPtr->cmdArgc, wmPtr->cmdArgv),
  1113.     TCL_DYNAMIC);
  1114. }
  1115. return TCL_OK;
  1116.     }
  1117.     argv3 = Tcl_GetString(objv[3]);
  1118.     if (argv3[0] == 0) {
  1119. if (wmPtr->cmdArgv != NULL) {
  1120.     ckfree((char *) wmPtr->cmdArgv);
  1121.     wmPtr->cmdArgv = NULL;
  1122. }
  1123. return TCL_OK;
  1124.     }
  1125.     if (Tcl_SplitList(interp, argv3, &cmdArgc, &cmdArgv) != TCL_OK) {
  1126. return TCL_ERROR;
  1127.     }
  1128.     if (wmPtr->cmdArgv != NULL) {
  1129. ckfree((char *) wmPtr->cmdArgv);
  1130.     }
  1131.     wmPtr->cmdArgc = cmdArgc;
  1132.     wmPtr->cmdArgv = cmdArgv;
  1133.     return TCL_OK;
  1134. }
  1135. /*
  1136.  *----------------------------------------------------------------------
  1137.  *
  1138.  * WmDeiconifyCmd --
  1139.  *
  1140.  * This procedure is invoked to process the "wm deiconify" Tcl command.
  1141.  * See the user documentation for details on what it does.
  1142.  *
  1143.  * Results:
  1144.  * A standard Tcl result.
  1145.  *
  1146.  * Side effects:
  1147.  * See the user documentation.
  1148.  *
  1149.  *----------------------------------------------------------------------
  1150.  */
  1151. static int
  1152. WmDeiconifyCmd(tkwin, winPtr, interp, objc, objv)
  1153.     Tk_Window tkwin; /* Main window of the application. */
  1154.     TkWindow *winPtr;           /* Toplevel to work with */
  1155.     Tcl_Interp *interp; /* Current interpreter. */
  1156.     int objc; /* Number of arguments. */
  1157.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1158. {
  1159.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1160.     if (objc != 3) {
  1161. Tcl_WrongNumArgs(interp, 2, objv, "window");
  1162. return TCL_ERROR;
  1163.     }
  1164.     if (wmPtr->iconFor != NULL) {
  1165. Tcl_AppendResult(interp, "can't deiconify ", Tcl_GetString(objv[2]),
  1166. ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
  1167. (char *) NULL);
  1168. return TCL_ERROR;
  1169.     }
  1170.     if (winPtr->flags & TK_EMBEDDED) {
  1171. Tcl_AppendResult(interp, "can't deiconify ", winPtr->pathName,
  1172. ": it is an embedded window", (char *) NULL);
  1173. return TCL_ERROR;
  1174.     }
  1175.     /*
  1176.      * TODO: may not want to call this function - look at Map events gened.
  1177.      */
  1178.     TkpWmSetState(winPtr, NormalState);
  1179.     return TCL_OK;
  1180. }
  1181. /*
  1182.  *----------------------------------------------------------------------
  1183.  *
  1184.  * WmFocusmodelCmd --
  1185.  *
  1186.  * This procedure is invoked to process the "wm focusmodel" Tcl command.
  1187.  * See the user documentation for details on what it does.
  1188.  *
  1189.  * Results:
  1190.  * A standard Tcl result.
  1191.  *
  1192.  * Side effects:
  1193.  * See the user documentation.
  1194.  *
  1195.  *----------------------------------------------------------------------
  1196.  */
  1197. static int
  1198. WmFocusmodelCmd(tkwin, winPtr, interp, objc, objv)
  1199.     Tk_Window tkwin; /* Main window of the application. */
  1200.     TkWindow *winPtr;           /* Toplevel to work with */
  1201.     Tcl_Interp *interp; /* Current interpreter. */
  1202.     int objc; /* Number of arguments. */
  1203.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1204. {
  1205.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1206.     static CONST char *optionStrings[] = {
  1207. "active", "passive", (char *) NULL };
  1208.     enum options {
  1209. OPT_ACTIVE, OPT_PASSIVE };
  1210.     int index;
  1211.     if ((objc != 3) && (objc != 4)) {
  1212. Tcl_WrongNumArgs(interp, 2, objv, "window ?active|passive?");
  1213. return TCL_ERROR;
  1214.     }
  1215.     if (objc == 3) {
  1216. Tcl_SetResult(interp, (wmPtr->hints.input ? "passive" : "active"),
  1217. TCL_STATIC);
  1218. return TCL_OK;
  1219.     }
  1220.     if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
  1221.     &index) != TCL_OK) {
  1222. return TCL_ERROR;
  1223.     }
  1224.     if (index == OPT_ACTIVE) {
  1225. wmPtr->hints.input = False;
  1226.     } else { /* OPT_PASSIVE */
  1227. wmPtr->hints.input = True;
  1228.     }
  1229.     return TCL_OK;
  1230. }
  1231. /*
  1232.  *----------------------------------------------------------------------
  1233.  *
  1234.  * WmFrameCmd --
  1235.  *
  1236.  * This procedure is invoked to process the "wm frame" Tcl command.
  1237.  * See the user documentation for details on what it does.
  1238.  *
  1239.  * Results:
  1240.  * A standard Tcl result.
  1241.  *
  1242.  * Side effects:
  1243.  * See the user documentation.
  1244.  *
  1245.  *----------------------------------------------------------------------
  1246.  */
  1247. static int
  1248. WmFrameCmd(tkwin, winPtr, interp, objc, objv)
  1249.     Tk_Window tkwin; /* Main window of the application. */
  1250.     TkWindow *winPtr;           /* Toplevel to work with */
  1251.     Tcl_Interp *interp; /* Current interpreter. */
  1252.     int objc; /* Number of arguments. */
  1253.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1254. {
  1255.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1256.     Window window;
  1257.     char buf[TCL_INTEGER_SPACE];
  1258.     if (objc != 3) {
  1259. Tcl_WrongNumArgs(interp, 2, objv, "window");
  1260. return TCL_ERROR;
  1261.     }
  1262.     window = wmPtr->reparent;
  1263.     if (window == None) {
  1264. window = Tk_WindowId((Tk_Window) winPtr);
  1265.     }
  1266.     sprintf(buf, "0x%x", (unsigned int) window);
  1267.     Tcl_SetResult(interp, buf, TCL_VOLATILE);
  1268.     return TCL_OK;
  1269. }
  1270. /*
  1271.  *----------------------------------------------------------------------
  1272.  *
  1273.  * WmGeometryCmd --
  1274.  *
  1275.  * This procedure is invoked to process the "wm geometry" Tcl command.
  1276.  * See the user documentation for details on what it does.
  1277.  *
  1278.  * Results:
  1279.  * A standard Tcl result.
  1280.  *
  1281.  * Side effects:
  1282.  * See the user documentation.
  1283.  *
  1284.  *----------------------------------------------------------------------
  1285.  */
  1286. static int
  1287. WmGeometryCmd(tkwin, winPtr, interp, objc, objv)
  1288.     Tk_Window tkwin; /* Main window of the application. */
  1289.     TkWindow *winPtr;           /* Toplevel to work with */
  1290.     Tcl_Interp *interp; /* Current interpreter. */
  1291.     int objc; /* Number of arguments. */
  1292.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1293. {
  1294.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1295.     char xSign, ySign;
  1296.     int width, height;
  1297.     char *argv3;
  1298.     if ((objc != 3) && (objc != 4)) {
  1299. Tcl_WrongNumArgs(interp, 2, objv, "window ?newGeometry?");
  1300. return TCL_ERROR;
  1301.     }
  1302.     if (objc == 3) {
  1303. char buf[16 + TCL_INTEGER_SPACE * 4];
  1304. xSign = (wmPtr->flags & WM_NEGATIVE_X) ? '-' : '+';
  1305. ySign = (wmPtr->flags & WM_NEGATIVE_Y) ? '-' : '+';
  1306. if (wmPtr->gridWin != NULL) {
  1307.     width = wmPtr->reqGridWidth + (winPtr->changes.width
  1308.     - winPtr->reqWidth)/wmPtr->widthInc;
  1309.     height = wmPtr->reqGridHeight + (winPtr->changes.height
  1310.     - winPtr->reqHeight)/wmPtr->heightInc;
  1311. } else {
  1312.     width = winPtr->changes.width;
  1313.     height = winPtr->changes.height;
  1314. }
  1315. sprintf(buf, "%dx%d%c%d%c%d", width, height, xSign, wmPtr->x,
  1316. ySign, wmPtr->y);
  1317. Tcl_SetResult(interp, buf, TCL_VOLATILE);
  1318. return TCL_OK;
  1319.     }
  1320.     argv3 = Tcl_GetString(objv[3]);
  1321.     if (*argv3 == '') {
  1322. wmPtr->width = -1;
  1323. wmPtr->height = -1;
  1324. WmUpdateGeom(wmPtr, winPtr);
  1325. return TCL_OK;
  1326.     }
  1327.     return ParseGeometry(interp, argv3, winPtr);
  1328. }
  1329. /*
  1330.  *----------------------------------------------------------------------
  1331.  *
  1332.  * WmGridCmd --
  1333.  *
  1334.  * This procedure is invoked to process the "wm grid" Tcl command.
  1335.  * See the user documentation for details on what it does.
  1336.  *
  1337.  * Results:
  1338.  * A standard Tcl result.
  1339.  *
  1340.  * Side effects:
  1341.  * See the user documentation.
  1342.  *
  1343.  *----------------------------------------------------------------------
  1344.  */
  1345. static int
  1346. WmGridCmd(tkwin, winPtr, interp, objc, objv)
  1347.     Tk_Window tkwin; /* Main window of the application. */
  1348.     TkWindow *winPtr;           /* Toplevel to work with */
  1349.     Tcl_Interp *interp; /* Current interpreter. */
  1350.     int objc; /* Number of arguments. */
  1351.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1352. {
  1353.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1354.     int reqWidth, reqHeight, widthInc, heightInc;
  1355.     if ((objc != 3) && (objc != 7)) {
  1356. Tcl_WrongNumArgs(interp, 2, objv,
  1357. "window ?baseWidth baseHeight widthInc heightInc?");
  1358. return TCL_ERROR;
  1359.     }
  1360.     if (objc == 3) {
  1361. if (wmPtr->sizeHintsFlags & PBaseSize) {
  1362.     char buf[TCL_INTEGER_SPACE * 4];
  1363.     sprintf(buf, "%d %d %d %d", wmPtr->reqGridWidth,
  1364.     wmPtr->reqGridHeight, wmPtr->widthInc,
  1365.     wmPtr->heightInc);
  1366.     Tcl_SetResult(interp, buf, TCL_VOLATILE);
  1367. }
  1368. return TCL_OK;
  1369.     }
  1370.     if (*Tcl_GetString(objv[3]) == '') {
  1371. /*
  1372.  * Turn off gridding and reset the width and height
  1373.  * to make sense as ungridded numbers.
  1374.  */
  1375. wmPtr->sizeHintsFlags &= ~(PBaseSize|PResizeInc);
  1376. if (wmPtr->width != -1) {
  1377.     wmPtr->width = winPtr->reqWidth + (wmPtr->width
  1378.     - wmPtr->reqGridWidth)*wmPtr->widthInc;
  1379.     wmPtr->height = winPtr->reqHeight + (wmPtr->height
  1380.     - wmPtr->reqGridHeight)*wmPtr->heightInc;
  1381. }
  1382. wmPtr->widthInc = 1;
  1383. wmPtr->heightInc = 1;
  1384.     } else {
  1385. if ((Tcl_GetIntFromObj(interp, objv[3], &reqWidth) != TCL_OK)
  1386. || (Tcl_GetIntFromObj(interp, objv[4], &reqHeight) != TCL_OK)
  1387. || (Tcl_GetIntFromObj(interp, objv[5], &widthInc) != TCL_OK)
  1388. || (Tcl_GetIntFromObj(interp, objv[6], &heightInc) != TCL_OK)) {
  1389.     return TCL_ERROR;
  1390. }
  1391. if (reqWidth < 0) {
  1392.     Tcl_SetResult(interp, "baseWidth can't be < 0", TCL_STATIC);
  1393.     return TCL_ERROR;
  1394. }
  1395. if (reqHeight < 0) {
  1396.     Tcl_SetResult(interp, "baseHeight can't be < 0", TCL_STATIC);
  1397.     return TCL_ERROR;
  1398. }
  1399. if (widthInc <= 0) {
  1400.     Tcl_SetResult(interp, "widthInc can't be <= 0", TCL_STATIC);
  1401.     return TCL_ERROR;
  1402. }
  1403. if (heightInc <= 0) {
  1404.     Tcl_SetResult(interp, "heightInc can't be <= 0", TCL_STATIC);
  1405.     return TCL_ERROR;
  1406. }
  1407. Tk_SetGrid((Tk_Window) winPtr, reqWidth, reqHeight, widthInc,
  1408. heightInc);
  1409.     }
  1410.     wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
  1411.     WmUpdateGeom(wmPtr, winPtr);
  1412.     return TCL_OK;
  1413. }
  1414. /*
  1415.  *----------------------------------------------------------------------
  1416.  *
  1417.  * WmGroupCmd --
  1418.  *
  1419.  * This procedure is invoked to process the "wm group" Tcl command.
  1420.  * See the user documentation for details on what it does.
  1421.  *
  1422.  * Results:
  1423.  * A standard Tcl result.
  1424.  *
  1425.  * Side effects:
  1426.  * See the user documentation.
  1427.  *
  1428.  *----------------------------------------------------------------------
  1429.  */
  1430. static int
  1431. WmGroupCmd(tkwin, winPtr, interp, objc, objv)
  1432.     Tk_Window tkwin; /* Main window of the application. */
  1433.     TkWindow *winPtr;           /* Toplevel to work with */
  1434.     Tcl_Interp *interp; /* Current interpreter. */
  1435.     int objc; /* Number of arguments. */
  1436.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1437. {
  1438.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1439.     Tk_Window tkwin2;
  1440.     char *argv3;
  1441.     int length;
  1442.     if ((objc != 3) && (objc != 4)) {
  1443. Tcl_WrongNumArgs(interp, 2, objv, "window ?pathName?");
  1444. return TCL_ERROR;
  1445.     }
  1446.     if (objc == 3) {
  1447. if (wmPtr->hints.flags & WindowGroupHint) {
  1448.     Tcl_SetResult(interp, wmPtr->leaderName, TCL_STATIC);
  1449. }
  1450. return TCL_OK;
  1451.     }
  1452.     argv3 = Tcl_GetStringFromObj(objv[3], &length);
  1453.     if (*argv3 == '') {
  1454. wmPtr->hints.flags &= ~WindowGroupHint;
  1455. if (wmPtr->leaderName != NULL) {
  1456.     ckfree(wmPtr->leaderName);
  1457. }
  1458. wmPtr->leaderName = NULL;
  1459.     } else {
  1460. if (TkGetWindowFromObj(interp, tkwin, objv[3], &tkwin2) != TCL_OK) {
  1461.     return TCL_ERROR;
  1462. }
  1463. Tk_MakeWindowExist(tkwin2);
  1464. if (wmPtr->leaderName != NULL) {
  1465.     ckfree(wmPtr->leaderName);
  1466. }
  1467. wmPtr->hints.window_group = Tk_WindowId(tkwin2);
  1468. wmPtr->hints.flags |= WindowGroupHint;
  1469. wmPtr->leaderName = ckalloc((unsigned) (length + 1));
  1470. strcpy(wmPtr->leaderName, argv3);
  1471.     }
  1472.     return TCL_OK;
  1473. }
  1474. /*
  1475.  *----------------------------------------------------------------------
  1476.  *
  1477.  * WmIconbitmapCmd --
  1478.  *
  1479.  * This procedure is invoked to process the "wm iconbitmap" Tcl command.
  1480.  * See the user documentation for details on what it does.
  1481.  *
  1482.  * Results:
  1483.  * A standard Tcl result.
  1484.  *
  1485.  * Side effects:
  1486.  * See the user documentation.
  1487.  *
  1488.  *----------------------------------------------------------------------
  1489.  */
  1490. static int
  1491. WmIconbitmapCmd(tkwin, winPtr, interp, objc, objv)
  1492.     Tk_Window tkwin; /* Main window of the application. */
  1493.     TkWindow *winPtr;           /* Toplevel to work with */
  1494.     Tcl_Interp *interp; /* Current interpreter. */
  1495.     int objc; /* Number of arguments. */
  1496.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1497. {
  1498.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1499.     char *argv3;
  1500.     Pixmap pixmap;
  1501.     if ((objc != 3) && (objc != 4)) {
  1502. Tcl_WrongNumArgs(interp, 2, objv, "window ?bitmap?");
  1503. return TCL_ERROR;
  1504.     }
  1505.     if (objc == 3) {
  1506. if (wmPtr->hints.flags & IconPixmapHint) {
  1507.     Tcl_SetResult(interp, (char *)
  1508.     Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_pixmap),
  1509.     TCL_STATIC);
  1510. }
  1511. return TCL_OK;
  1512.     }
  1513.     argv3 = Tcl_GetString(objv[3]);
  1514.     if (*argv3 == '') {
  1515. if (wmPtr->hints.icon_pixmap != None) {
  1516.     Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_pixmap);
  1517.     wmPtr->hints.icon_pixmap = None;
  1518. }
  1519. wmPtr->hints.flags &= ~IconPixmapHint;
  1520.     } else {
  1521. pixmap = Tk_GetBitmap(interp, (Tk_Window) winPtr, argv3);
  1522. if (pixmap == None) {
  1523.     return TCL_ERROR;
  1524. }
  1525. wmPtr->hints.icon_pixmap = pixmap;
  1526. wmPtr->hints.flags |= IconPixmapHint;
  1527.     }
  1528.     return TCL_OK;
  1529. }
  1530. /*
  1531.  *----------------------------------------------------------------------
  1532.  *
  1533.  * WmIconifyCmd --
  1534.  *
  1535.  * This procedure is invoked to process the "wm iconify" Tcl command.
  1536.  * See the user documentation for details on what it does.
  1537.  *
  1538.  * Results:
  1539.  * A standard Tcl result.
  1540.  *
  1541.  * Side effects:
  1542.  * See the user documentation.
  1543.  *
  1544.  *----------------------------------------------------------------------
  1545.  */
  1546. static int
  1547. WmIconifyCmd(tkwin, winPtr, interp, objc, objv)
  1548.     Tk_Window tkwin; /* Main window of the application. */
  1549.     TkWindow *winPtr;           /* Toplevel to work with */
  1550.     Tcl_Interp *interp; /* Current interpreter. */
  1551.     int objc; /* Number of arguments. */
  1552.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1553. {
  1554.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1555.     if (objc != 3) {
  1556. Tcl_WrongNumArgs(interp, 2, objv, "window");
  1557. return TCL_ERROR;
  1558.     }
  1559.     if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) {
  1560. Tcl_AppendResult(interp, "can't iconify "", winPtr->pathName,
  1561. "": override-redirect flag is set", (char *) NULL);
  1562. return TCL_ERROR;
  1563.     }
  1564.     if (wmPtr->master != None) {
  1565. Tcl_AppendResult(interp, "can't iconify "", winPtr->pathName,
  1566. "": it is a transient", (char *) NULL);
  1567. return TCL_ERROR;
  1568.     }
  1569.     if (wmPtr->iconFor != NULL) {
  1570. Tcl_AppendResult(interp, "can't iconify ", winPtr->pathName,
  1571. ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
  1572. (char *) NULL);
  1573. return TCL_ERROR;
  1574.     }
  1575.     if (winPtr->flags & TK_EMBEDDED) {
  1576. Tcl_AppendResult(interp, "can't iconify ", winPtr->pathName,
  1577. ": it is an embedded window", (char *) NULL);
  1578. return TCL_ERROR;
  1579.     }
  1580.     TkpWmSetState(winPtr, IconicState);
  1581.     return TCL_OK;
  1582. }
  1583. /*
  1584.  *----------------------------------------------------------------------
  1585.  *
  1586.  * WmIconmaskCmd --
  1587.  *
  1588.  * This procedure is invoked to process the "wm iconmask" Tcl command.
  1589.  * See the user documentation for details on what it does.
  1590.  *
  1591.  * Results:
  1592.  * A standard Tcl result.
  1593.  *
  1594.  * Side effects:
  1595.  * See the user documentation.
  1596.  *
  1597.  *----------------------------------------------------------------------
  1598.  */
  1599. static int
  1600. WmIconmaskCmd(tkwin, winPtr, interp, objc, objv)
  1601.     Tk_Window tkwin; /* Main window of the application. */
  1602.     TkWindow *winPtr;           /* Toplevel to work with */
  1603.     Tcl_Interp *interp; /* Current interpreter. */
  1604.     int objc; /* Number of arguments. */
  1605.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1606. {
  1607.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1608.     Pixmap pixmap;
  1609.     char *argv3;
  1610.     if ((objc != 3) && (objc != 4)) {
  1611. Tcl_WrongNumArgs(interp, 2, objv, "window ?bitmap?");
  1612. return TCL_ERROR;
  1613.     }
  1614.     if (objc == 3) {
  1615. if (wmPtr->hints.flags & IconMaskHint) {
  1616.     Tcl_SetResult(interp, (char *)
  1617.     Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_mask),
  1618.     TCL_STATIC);
  1619. }
  1620. return TCL_OK;
  1621.     }
  1622.     argv3 = Tcl_GetString(objv[3]);
  1623.     if (*argv3 == '') {
  1624. if (wmPtr->hints.icon_mask != None) {
  1625.     Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_mask);
  1626. }
  1627. wmPtr->hints.flags &= ~IconMaskHint;
  1628.     } else {
  1629. pixmap = Tk_GetBitmap(interp, tkwin, argv3);
  1630. if (pixmap == None) {
  1631.     return TCL_ERROR;
  1632. }
  1633. wmPtr->hints.icon_mask = pixmap;
  1634. wmPtr->hints.flags |= IconMaskHint;
  1635.     }
  1636.     return TCL_OK;
  1637. }
  1638. /*
  1639.  *----------------------------------------------------------------------
  1640.  *
  1641.  * WmIconnameCmd --
  1642.  *
  1643.  * This procedure is invoked to process the "wm iconname" Tcl command.
  1644.  * See the user documentation for details on what it does.
  1645.  *
  1646.  * Results:
  1647.  * A standard Tcl result.
  1648.  *
  1649.  * Side effects:
  1650.  * See the user documentation.
  1651.  *
  1652.  *----------------------------------------------------------------------
  1653.  */
  1654. static int
  1655. WmIconnameCmd(tkwin, winPtr, interp, objc, objv)
  1656.     Tk_Window tkwin; /* Main window of the application. */
  1657.     TkWindow *winPtr;           /* Toplevel to work with */
  1658.     Tcl_Interp *interp; /* Current interpreter. */
  1659.     int objc; /* Number of arguments. */
  1660.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1661. {
  1662.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1663.     char *argv3;
  1664.     int length;
  1665.     if (objc > 4) {
  1666. Tcl_WrongNumArgs(interp, 2, objv, "window ?newName?");
  1667. return TCL_ERROR;
  1668.     }
  1669.     if (objc == 3) {
  1670. Tcl_SetResult(interp,
  1671. ((wmPtr->iconName != NULL) ? wmPtr->iconName : ""),
  1672. TCL_STATIC);
  1673. return TCL_OK;
  1674.     } else {
  1675. if (wmPtr->iconName != NULL) {
  1676.     ckfree((char *) wmPtr->iconName);
  1677. }
  1678. argv3 = Tcl_GetStringFromObj(objv[3], &length);
  1679. wmPtr->iconName = ckalloc((unsigned) (length + 1));
  1680. strcpy(wmPtr->iconName, argv3);
  1681. if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
  1682.     XSetIconName(winPtr->display, winPtr->window, wmPtr->iconName);
  1683. }
  1684.     }
  1685.     return TCL_OK;
  1686. }
  1687. /*
  1688.  *----------------------------------------------------------------------
  1689.  *
  1690.  * WmIconpositionCmd --
  1691.  *
  1692.  * This procedure is invoked to process the "wm iconposition"
  1693.  * Tcl command.
  1694.  * See the user documentation for details on what it does.
  1695.  *
  1696.  * Results:
  1697.  * A standard Tcl result.
  1698.  *
  1699.  * Side effects:
  1700.  * See the user documentation.
  1701.  *
  1702.  *----------------------------------------------------------------------
  1703.  */
  1704. static int
  1705. WmIconpositionCmd(tkwin, winPtr, interp, objc, objv)
  1706.     Tk_Window tkwin; /* Main window of the application. */
  1707.     TkWindow *winPtr;           /* Toplevel to work with */
  1708.     Tcl_Interp *interp; /* Current interpreter. */
  1709.     int objc; /* Number of arguments. */
  1710.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1711. {
  1712.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1713.     int x, y;
  1714.     if ((objc != 3) && (objc != 5)) {
  1715. Tcl_WrongNumArgs(interp, 2, objv, "window ?x y?");
  1716. return TCL_ERROR;
  1717.     }
  1718.     if (objc == 3) {
  1719. if (wmPtr->hints.flags & IconPositionHint) {
  1720.     char buf[TCL_INTEGER_SPACE * 2];
  1721.     sprintf(buf, "%d %d", wmPtr->hints.icon_x,
  1722.     wmPtr->hints.icon_y);
  1723.     Tcl_SetResult(interp, buf, TCL_VOLATILE);
  1724. }
  1725. return TCL_OK;
  1726.     }
  1727.     if (*Tcl_GetString(objv[3]) == '') {
  1728. wmPtr->hints.flags &= ~IconPositionHint;
  1729.     } else {
  1730. if ((Tcl_GetIntFromObj(interp, objv[3], &x) != TCL_OK)
  1731. || (Tcl_GetIntFromObj(interp, objv[4], &y) != TCL_OK)){
  1732.     return TCL_ERROR;
  1733. }
  1734. wmPtr->hints.icon_x = x;
  1735. wmPtr->hints.icon_y = y;
  1736. wmPtr->hints.flags |= IconPositionHint;
  1737.     }
  1738.     return TCL_OK;
  1739. }
  1740. /*
  1741.  *----------------------------------------------------------------------
  1742.  *
  1743.  * WmIconwindowCmd --
  1744.  *
  1745.  * This procedure is invoked to process the "wm iconwindow" Tcl command.
  1746.  * See the user documentation for details on what it does.
  1747.  *
  1748.  * Results:
  1749.  * A standard Tcl result.
  1750.  *
  1751.  * Side effects:
  1752.  * See the user documentation.
  1753.  *
  1754.  *----------------------------------------------------------------------
  1755.  */
  1756. static int
  1757. WmIconwindowCmd(tkwin, winPtr, interp, objc, objv)
  1758.     Tk_Window tkwin; /* Main window of the application. */
  1759.     TkWindow *winPtr;           /* Toplevel to work with */
  1760.     Tcl_Interp *interp; /* Current interpreter. */
  1761.     int objc; /* Number of arguments. */
  1762.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1763. {
  1764.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1765.     Tk_Window tkwin2;
  1766.     WmInfo *wmPtr2;
  1767.     if ((objc != 3) && (objc != 4)) {
  1768. Tcl_WrongNumArgs(interp, 2, objv, "window ?pathName?");
  1769. return TCL_ERROR;
  1770.     }
  1771.     if (objc == 3) {
  1772. if (wmPtr->icon != NULL) {
  1773.     Tcl_SetResult(interp, Tk_PathName(wmPtr->icon), TCL_STATIC);
  1774. }
  1775. return TCL_OK;
  1776.     }
  1777.     if (*Tcl_GetString(objv[3]) == '') {
  1778. wmPtr->hints.flags &= ~IconWindowHint;
  1779. if (wmPtr->icon != NULL) {
  1780.     wmPtr2 = ((TkWindow *) wmPtr->icon)->wmInfoPtr;
  1781.     wmPtr2->iconFor = NULL;
  1782.     wmPtr2->hints.initial_state = WithdrawnState;
  1783. }
  1784. wmPtr->icon = NULL;
  1785.     } else {
  1786. if (TkGetWindowFromObj(interp, tkwin, objv[3], &tkwin2) != TCL_OK) {
  1787.     return TCL_ERROR;
  1788. }
  1789. if (!Tk_IsTopLevel(tkwin2)) {
  1790.     Tcl_AppendResult(interp, "can't use ", Tcl_GetString(objv[3]),
  1791.     " as icon window: not at top level", (char *) NULL);
  1792.     return TCL_ERROR;
  1793. }
  1794. wmPtr2 = ((TkWindow *) tkwin2)->wmInfoPtr;
  1795. if (wmPtr2->iconFor != NULL) {
  1796.     Tcl_AppendResult(interp, Tcl_GetString(objv[3]),
  1797.     " is already an icon for ",
  1798.     Tk_PathName(wmPtr2->iconFor), (char *) NULL);
  1799.     return TCL_ERROR;
  1800. }
  1801. if (wmPtr->icon != NULL) {
  1802.     WmInfo *wmPtr3 = ((TkWindow *) wmPtr->icon)->wmInfoPtr;
  1803.     wmPtr3->iconFor = NULL;
  1804. }
  1805. Tk_MakeWindowExist(tkwin2);
  1806. wmPtr->hints.icon_window = Tk_WindowId(tkwin2);
  1807. wmPtr->hints.flags |= IconWindowHint;
  1808. wmPtr->icon = tkwin2;
  1809. wmPtr2->iconFor = (Tk_Window) winPtr;
  1810. if (!(wmPtr2->flags & WM_NEVER_MAPPED)) {
  1811.     /*
  1812.      * Don't have iconwindows on the Mac.  We just withdraw.
  1813.      */
  1814.     Tk_UnmapWindow(tkwin2);
  1815. }
  1816.     }
  1817.     return TCL_OK;
  1818. }
  1819. /*
  1820.  *----------------------------------------------------------------------
  1821.  *
  1822.  * WmMaxsizeCmd --
  1823.  *
  1824.  * This procedure is invoked to process the "wm maxsize" Tcl command.
  1825.  * See the user documentation for details on what it does.
  1826.  *
  1827.  * Results:
  1828.  * A standard Tcl result.
  1829.  *
  1830.  * Side effects:
  1831.  * See the user documentation.
  1832.  *
  1833.  *----------------------------------------------------------------------
  1834.  */
  1835. static int
  1836. WmMaxsizeCmd(tkwin, winPtr, interp, objc, objv)
  1837.     Tk_Window tkwin; /* Main window of the application. */
  1838.     TkWindow *winPtr;           /* Toplevel to work with */
  1839.     Tcl_Interp *interp; /* Current interpreter. */
  1840.     int objc; /* Number of arguments. */
  1841.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1842. {
  1843.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1844.     int width, height;
  1845.     if ((objc != 3) && (objc != 5)) {
  1846. Tcl_WrongNumArgs(interp, 2, objv, "window ?width height?");
  1847. return TCL_ERROR;
  1848.     }
  1849.     if (objc == 3) {
  1850. char buf[TCL_INTEGER_SPACE * 2];
  1851. sprintf(buf, "%d %d", wmPtr->maxWidth, wmPtr->maxHeight);
  1852. Tcl_SetResult(interp, buf, TCL_VOLATILE);
  1853. return TCL_OK;
  1854.     }
  1855.     if ((Tcl_GetIntFromObj(interp, objv[3], &width) != TCL_OK)
  1856.     || (Tcl_GetIntFromObj(interp, objv[4], &height) != TCL_OK)) {
  1857. return TCL_ERROR;
  1858.     }
  1859.     wmPtr->maxWidth = width;
  1860.     wmPtr->maxHeight = height;
  1861.     wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
  1862.     WmUpdateGeom(wmPtr, winPtr);
  1863.     return TCL_OK;
  1864. }
  1865. /*
  1866.  *----------------------------------------------------------------------
  1867.  *
  1868.  * WmMinsizeCmd --
  1869.  *
  1870.  * This procedure is invoked to process the "wm minsize" Tcl command.
  1871.  * See the user documentation for details on what it does.
  1872.  *
  1873.  * Results:
  1874.  * A standard Tcl result.
  1875.  *
  1876.  * Side effects:
  1877.  * See the user documentation.
  1878.  *
  1879.  *----------------------------------------------------------------------
  1880.  */
  1881. static int
  1882. WmMinsizeCmd(tkwin, winPtr, interp, objc, objv)
  1883.     Tk_Window tkwin; /* Main window of the application. */
  1884.     TkWindow *winPtr;           /* Toplevel to work with */
  1885.     Tcl_Interp *interp; /* Current interpreter. */
  1886.     int objc; /* Number of arguments. */
  1887.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1888. {
  1889.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1890.     int width, height;
  1891.     if ((objc != 3) && (objc != 5)) {
  1892. Tcl_WrongNumArgs(interp, 2, objv, "window ?width height?");
  1893. return TCL_ERROR;
  1894.     }
  1895.     if (objc == 3) {
  1896. char buf[TCL_INTEGER_SPACE * 2];
  1897. sprintf(buf, "%d %d", wmPtr->minWidth, wmPtr->minHeight);
  1898. Tcl_SetResult(interp, buf, TCL_VOLATILE);
  1899. return TCL_OK;
  1900.     }
  1901.     if ((Tcl_GetIntFromObj(interp, objv[3], &width) != TCL_OK)
  1902.     || (Tcl_GetIntFromObj(interp, objv[4], &height) != TCL_OK)) {
  1903. return TCL_ERROR;
  1904.     }
  1905.     wmPtr->minWidth = width;
  1906.     wmPtr->minHeight = height;
  1907.     wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
  1908.     WmUpdateGeom(wmPtr, winPtr);
  1909.     return TCL_OK;
  1910. }
  1911. /*
  1912.  *----------------------------------------------------------------------
  1913.  *
  1914.  * WmOverrideredirectCmd --
  1915.  *
  1916.  * This procedure is invoked to process the "wm overrideredirect"
  1917.  * Tcl command.
  1918.  * See the user documentation for details on what it does.
  1919.  *
  1920.  * Results:
  1921.  * A standard Tcl result.
  1922.  *
  1923.  * Side effects:
  1924.  * See the user documentation.
  1925.  *
  1926.  *----------------------------------------------------------------------
  1927.  */
  1928. static int
  1929. WmOverrideredirectCmd(tkwin, winPtr, interp, objc, objv)
  1930.     Tk_Window tkwin; /* Main window of the application. */
  1931.     TkWindow *winPtr;           /* Toplevel to work with */
  1932.     Tcl_Interp *interp; /* Current interpreter. */
  1933.     int objc; /* Number of arguments. */
  1934.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1935. {
  1936.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1937.     int boolean;
  1938.     XSetWindowAttributes atts;
  1939.     if ((objc != 3) && (objc != 4)) {
  1940. Tcl_WrongNumArgs(interp, 2, objv, "window ?boolean?");
  1941. return TCL_ERROR;
  1942.     }
  1943.     if (objc == 3) {
  1944. Tcl_SetBooleanObj(Tcl_GetObjResult(interp),
  1945. Tk_Attributes((Tk_Window) winPtr)->override_redirect);
  1946. return TCL_OK;
  1947.     }
  1948.     if (Tcl_GetBooleanFromObj(interp, objv[3], &boolean) != TCL_OK) {
  1949. return TCL_ERROR;
  1950.     }
  1951.     atts.override_redirect = (boolean) ? True : False;
  1952.     Tk_ChangeWindowAttributes((Tk_Window) winPtr, CWOverrideRedirect,
  1953.     &atts);
  1954.     wmPtr->style = (boolean) ? plainDBox : documentProc;
  1955.     return TCL_OK;
  1956. }
  1957. /*
  1958.  *----------------------------------------------------------------------
  1959.  *
  1960.  * WmPositionfromCmd --
  1961.  *
  1962.  * This procedure is invoked to process the "wm positionfrom"
  1963.  * Tcl command.
  1964.  * See the user documentation for details on what it does.
  1965.  *
  1966.  * Results:
  1967.  * A standard Tcl result.
  1968.  *
  1969.  * Side effects:
  1970.  * See the user documentation.
  1971.  *
  1972.  *----------------------------------------------------------------------
  1973.  */
  1974. static int
  1975. WmPositionfromCmd(tkwin, winPtr, interp, objc, objv)
  1976.     Tk_Window tkwin; /* Main window of the application. */
  1977.     TkWindow *winPtr;           /* Toplevel to work with */
  1978.     Tcl_Interp *interp; /* Current interpreter. */
  1979.     int objc; /* Number of arguments. */
  1980.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  1981. {
  1982.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  1983.     static CONST char *optionStrings[] = {
  1984. "program", "user", (char *) NULL };
  1985.     enum options {
  1986. OPT_PROGRAM, OPT_USER };
  1987.     int index;
  1988.     if ((objc != 3) && (objc != 4)) {
  1989. Tcl_WrongNumArgs(interp, 2, objv, "window ?user/program?");
  1990. return TCL_ERROR;
  1991.     }
  1992.     if (objc == 3) {
  1993. if (wmPtr->sizeHintsFlags & USPosition) {
  1994.     Tcl_SetResult(interp, "user", TCL_STATIC);
  1995. } else if (wmPtr->sizeHintsFlags & PPosition) {
  1996.     Tcl_SetResult(interp, "program", TCL_STATIC);
  1997. }
  1998. return TCL_OK;
  1999.     }
  2000.     if (*Tcl_GetString(objv[3]) == '') {
  2001. wmPtr->sizeHintsFlags &= ~(USPosition|PPosition);
  2002.     } else {
  2003. if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
  2004. &index) != TCL_OK) {
  2005.     return TCL_ERROR;
  2006. }
  2007. if (index == OPT_USER) {
  2008.     wmPtr->sizeHintsFlags &= ~PPosition;
  2009.     wmPtr->sizeHintsFlags |= USPosition;
  2010. } else {
  2011.     wmPtr->sizeHintsFlags &= ~USPosition;
  2012.     wmPtr->sizeHintsFlags |= PPosition;
  2013. }
  2014.     }
  2015.     wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
  2016.     WmUpdateGeom(wmPtr, winPtr);
  2017.     return TCL_OK;
  2018. }
  2019. /*
  2020.  *----------------------------------------------------------------------
  2021.  *
  2022.  * WmProtocolCmd --
  2023.  *
  2024.  * This procedure is invoked to process the "wm protocol" Tcl command.
  2025.  * See the user documentation for details on what it does.
  2026.  *
  2027.  * Results:
  2028.  * A standard Tcl result.
  2029.  *
  2030.  * Side effects:
  2031.  * See the user documentation.
  2032.  *
  2033.  *----------------------------------------------------------------------
  2034.  */
  2035. static int
  2036. WmProtocolCmd(tkwin, winPtr, interp, objc, objv)
  2037.     Tk_Window tkwin; /* Main window of the application. */
  2038.     TkWindow *winPtr;           /* Toplevel to work with */
  2039.     Tcl_Interp *interp; /* Current interpreter. */
  2040.     int objc; /* Number of arguments. */
  2041.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  2042. {
  2043.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  2044.     register ProtocolHandler *protPtr, *prevPtr;
  2045.     Atom protocol;
  2046.     char *cmd;
  2047.     int cmdLength;
  2048.     if ((objc < 3) || (objc > 5)) {
  2049. Tcl_WrongNumArgs(interp, 2, objv, "window ?name? ?command?");
  2050. return TCL_ERROR;
  2051.     }
  2052.     if (objc == 3) {
  2053. /*
  2054.  * Return a list of all defined protocols for the window.
  2055.  */
  2056. for (protPtr = wmPtr->protPtr; protPtr != NULL;
  2057.      protPtr = protPtr->nextPtr) {
  2058.     Tcl_AppendElement(interp,
  2059.     Tk_GetAtomName((Tk_Window) winPtr, protPtr->protocol));
  2060. }
  2061. return TCL_OK;
  2062.     }
  2063.     protocol = Tk_InternAtom((Tk_Window) winPtr, Tcl_GetString(objv[3]));
  2064.     if (objc == 4) {
  2065. /*
  2066.  * Return the command to handle a given protocol.
  2067.  */
  2068. for (protPtr = wmPtr->protPtr; protPtr != NULL;
  2069.      protPtr = protPtr->nextPtr) {
  2070.     if (protPtr->protocol == protocol) {
  2071. Tcl_SetResult(interp, protPtr->command, TCL_STATIC);
  2072. return TCL_OK;
  2073.     }
  2074. }
  2075. return TCL_OK;
  2076.     }
  2077.     /*
  2078.      * Delete any current protocol handler, then create a new
  2079.      * one with the specified command, unless the command is
  2080.      * empty.
  2081.      */
  2082.     for (protPtr = wmPtr->protPtr, prevPtr = NULL; protPtr != NULL;
  2083.  prevPtr = protPtr, protPtr = protPtr->nextPtr) {
  2084. if (protPtr->protocol == protocol) {
  2085.     if (prevPtr == NULL) {
  2086. wmPtr->protPtr = protPtr->nextPtr;
  2087.     } else {
  2088. prevPtr->nextPtr = protPtr->nextPtr;
  2089.     }
  2090.     Tcl_EventuallyFree((ClientData) protPtr, TCL_DYNAMIC);
  2091.     break;
  2092. }
  2093.     }
  2094.     cmd = Tcl_GetStringFromObj(objv[4], &cmdLength);
  2095.     if (cmdLength > 0) {
  2096. protPtr = (ProtocolHandler *) ckalloc(HANDLER_SIZE(cmdLength));
  2097. protPtr->protocol = protocol;
  2098. protPtr->nextPtr = wmPtr->protPtr;
  2099. wmPtr->protPtr = protPtr;
  2100. protPtr->interp = interp;
  2101. strcpy(protPtr->command, cmd);
  2102.     }
  2103.     return TCL_OK;
  2104. }
  2105. /*
  2106.  *----------------------------------------------------------------------
  2107.  *
  2108.  * WmResizableCmd --
  2109.  *
  2110.  * This procedure is invoked to process the "wm resizable" Tcl command.
  2111.  * See the user documentation for details on what it does.
  2112.  *
  2113.  * Results:
  2114.  * A standard Tcl result.
  2115.  *
  2116.  * Side effects:
  2117.  * See the user documentation.
  2118.  *
  2119.  *----------------------------------------------------------------------
  2120.  */
  2121. static int
  2122. WmResizableCmd(tkwin, winPtr, interp, objc, objv)
  2123.     Tk_Window tkwin; /* Main window of the application. */
  2124.     TkWindow *winPtr;           /* Toplevel to work with */
  2125.     Tcl_Interp *interp; /* Current interpreter. */
  2126.     int objc; /* Number of arguments. */
  2127.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  2128. {
  2129.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  2130.     int width, height;
  2131.     if ((objc != 3) && (objc != 5)) {
  2132. Tcl_WrongNumArgs(interp, 2, objv, "window ?width height?");
  2133. return TCL_ERROR;
  2134.     }
  2135.     if (objc == 3) {
  2136. char buf[TCL_INTEGER_SPACE * 2];
  2137. sprintf(buf, "%d %d",
  2138. (wmPtr->flags  & WM_WIDTH_NOT_RESIZABLE) ? 0 : 1,
  2139. (wmPtr->flags  & WM_HEIGHT_NOT_RESIZABLE) ? 0 : 1);
  2140. Tcl_SetResult(interp, buf, TCL_VOLATILE);
  2141. return TCL_OK;
  2142.     }
  2143.     if ((Tcl_GetBooleanFromObj(interp, objv[3], &width) != TCL_OK)
  2144.     || (Tcl_GetBooleanFromObj(interp, objv[4], &height) != TCL_OK)) {
  2145. return TCL_ERROR;
  2146.     }
  2147.     if (width) {
  2148. wmPtr->flags &= ~WM_WIDTH_NOT_RESIZABLE;
  2149.     } else {
  2150. wmPtr->flags |= WM_WIDTH_NOT_RESIZABLE;
  2151.     }
  2152.     if (height) {
  2153. wmPtr->flags &= ~WM_HEIGHT_NOT_RESIZABLE;
  2154.     } else {
  2155. wmPtr->flags |= WM_HEIGHT_NOT_RESIZABLE;
  2156.     }
  2157.     wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
  2158.     if (wmPtr->scrollWinPtr != NULL) {
  2159. TkScrollbarEventuallyRedraw(
  2160. (TkScrollbar *) wmPtr->scrollWinPtr->instanceData);
  2161.     }
  2162.     WmUpdateGeom(wmPtr, winPtr);
  2163.     return TCL_OK;
  2164. }
  2165. /*
  2166.  *----------------------------------------------------------------------
  2167.  *
  2168.  * WmSizefromCmd --
  2169.  *
  2170.  * This procedure is invoked to process the "wm sizefrom" Tcl command.
  2171.  * See the user documentation for details on what it does.
  2172.  *
  2173.  * Results:
  2174.  * A standard Tcl result.
  2175.  *
  2176.  * Side effects:
  2177.  * See the user documentation.
  2178.  *
  2179.  *----------------------------------------------------------------------
  2180.  */
  2181. static int
  2182. WmSizefromCmd(tkwin, winPtr, interp, objc, objv)
  2183.     Tk_Window tkwin; /* Main window of the application. */
  2184.     TkWindow *winPtr;           /* Toplevel to work with */
  2185.     Tcl_Interp *interp; /* Current interpreter. */
  2186.     int objc; /* Number of arguments. */
  2187.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  2188. {
  2189.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  2190.     static CONST char *optionStrings[] = {
  2191. "program", "user", (char *) NULL };
  2192.     enum options {
  2193. OPT_PROGRAM, OPT_USER };
  2194.     int index;
  2195.     if ((objc != 3) && (objc != 4)) {
  2196. Tcl_WrongNumArgs(interp, 2, objv, "window ?user|program?");
  2197. return TCL_ERROR;
  2198.     }
  2199.     if (objc == 3) {
  2200. if (wmPtr->sizeHintsFlags & USSize) {
  2201.     Tcl_SetResult(interp, "user", TCL_STATIC);
  2202. } else if (wmPtr->sizeHintsFlags & PSize) {
  2203.     Tcl_SetResult(interp, "program", TCL_STATIC);
  2204. }
  2205. return TCL_OK;
  2206.     }
  2207.     if (*Tcl_GetString(objv[3]) == '') {
  2208. wmPtr->sizeHintsFlags &= ~(USSize|PSize);
  2209.     } else {
  2210. if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
  2211. &index) != TCL_OK) {
  2212.     return TCL_ERROR;
  2213. }
  2214. if (index == OPT_USER) {
  2215.     wmPtr->sizeHintsFlags &= ~PSize;
  2216.     wmPtr->sizeHintsFlags |= USSize;
  2217. } else { /* OPT_PROGRAM */
  2218.     wmPtr->sizeHintsFlags &= ~USSize;
  2219.     wmPtr->sizeHintsFlags |= PSize;
  2220. }
  2221.     }
  2222.     wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
  2223.     WmUpdateGeom(wmPtr, winPtr);
  2224.     return TCL_OK;
  2225. }
  2226. /*
  2227.  *----------------------------------------------------------------------
  2228.  *
  2229.  * WmStackorderCmd --
  2230.  *
  2231.  * This procedure is invoked to process the "wm stackorder" Tcl command.
  2232.  * See the user documentation for details on what it does.
  2233.  *
  2234.  * Results:
  2235.  * A standard Tcl result.
  2236.  *
  2237.  * Side effects:
  2238.  * See the user documentation.
  2239.  *
  2240.  *----------------------------------------------------------------------
  2241.  */
  2242. static int
  2243. WmStackorderCmd(tkwin, winPtr, interp, objc, objv)
  2244.     Tk_Window tkwin; /* Main window of the application. */
  2245.     TkWindow *winPtr;           /* Toplevel to work with */
  2246.     Tcl_Interp *interp; /* Current interpreter. */
  2247.     int objc; /* Number of arguments. */
  2248.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  2249. {
  2250.     TkWindow **windows, **window_ptr;
  2251.     static CONST char *optionStrings[] = {
  2252. "isabove", "isbelow", (char *) NULL };
  2253.     enum options {
  2254. OPT_ISABOVE, OPT_ISBELOW };
  2255.     int index;
  2256.     if ((objc != 3) && (objc != 5)) {
  2257. Tcl_WrongNumArgs(interp, 2, objv, "window ?isabove|isbelow window?");
  2258. return TCL_ERROR;
  2259.     }
  2260.     if (objc == 3) {
  2261. windows = TkWmStackorderToplevel(winPtr);
  2262. if (windows == NULL) {
  2263.     panic("TkWmStackorderToplevel failed");
  2264. } else {
  2265.     for (window_ptr = windows; *window_ptr ; window_ptr++) {
  2266. Tcl_AppendElement(interp, (*window_ptr)->pathName);
  2267.     }
  2268.     ckfree((char *) windows);
  2269.     return TCL_OK;
  2270. }
  2271.     } else {
  2272. TkWindow *winPtr2;
  2273. int index1=-1, index2=-1, result;
  2274. if (TkGetWindowFromObj(interp, tkwin, objv[4], (Tk_Window *) &winPtr2)
  2275. != TCL_OK) {
  2276.     return TCL_ERROR;
  2277. }
  2278. if (!Tk_IsTopLevel(winPtr2)) {
  2279.     Tcl_AppendResult(interp, "window "", winPtr2->pathName,
  2280.     "" isn't a top-level window", (char *) NULL);
  2281.     return TCL_ERROR;
  2282. }
  2283. if (!Tk_IsMapped(winPtr)) {
  2284.     Tcl_AppendResult(interp, "window "", winPtr->pathName,
  2285.     "" isn't mapped", (char *) NULL);
  2286.     return TCL_ERROR;
  2287. }
  2288. if (!Tk_IsMapped(winPtr2)) {
  2289.     Tcl_AppendResult(interp, "window "", winPtr2->pathName,
  2290.     "" isn't mapped", (char *) NULL);
  2291.     return TCL_ERROR;
  2292. }
  2293. /*
  2294.  * Lookup stacking order of all toplevels that are children
  2295.  * of "." and find the position of winPtr and winPtr2
  2296.  * in the stacking order.
  2297.  */
  2298. windows = TkWmStackorderToplevel(winPtr->mainPtr->winPtr);
  2299. if (windows == NULL) {
  2300.     Tcl_AppendResult(interp, "TkWmStackorderToplevel failed",
  2301.                     (char *) NULL);
  2302.     return TCL_ERROR;
  2303. } else {
  2304.     for (window_ptr = windows; *window_ptr ; window_ptr++) {
  2305. if (*window_ptr == winPtr)
  2306.     index1 = (window_ptr - windows);
  2307. if (*window_ptr == winPtr2)
  2308.     index2 = (window_ptr - windows);
  2309.     }
  2310.     if (index1 == -1)
  2311. panic("winPtr window not found");
  2312.     if (index2 == -1)
  2313. panic("winPtr2 window not found");
  2314.     ckfree((char *) windows);
  2315. }
  2316. if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
  2317. &index) != TCL_OK) {
  2318.     return TCL_ERROR;
  2319. }
  2320. if (index == OPT_ISABOVE) {
  2321.     result = index1 > index2;
  2322. } else { /* OPT_ISBELOW */
  2323.     result = index1 < index2;
  2324. }
  2325. Tcl_SetIntObj(Tcl_GetObjResult(interp), result);
  2326. return TCL_OK;
  2327.     }
  2328.     return TCL_OK;
  2329. }
  2330. /*
  2331.  *----------------------------------------------------------------------
  2332.  *
  2333.  * WmStateCmd --
  2334.  *
  2335.  * This procedure is invoked to process the "wm state" Tcl command.
  2336.  * See the user documentation for details on what it does.
  2337.  *
  2338.  * Results:
  2339.  * A standard Tcl result.
  2340.  *
  2341.  * Side effects:
  2342.  * See the user documentation.
  2343.  *
  2344.  *----------------------------------------------------------------------
  2345.  */
  2346. static int
  2347. WmStateCmd(tkwin, winPtr, interp, objc, objv)
  2348.     Tk_Window tkwin; /* Main window of the application. */
  2349.     TkWindow *winPtr;           /* Toplevel to work with */
  2350.     Tcl_Interp *interp; /* Current interpreter. */
  2351.     int objc; /* Number of arguments. */
  2352.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  2353. {
  2354.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  2355.     static CONST char *optionStrings[] = {
  2356. "normal", "iconic", "withdrawn", "zoomed", (char *) NULL };
  2357.     enum options {
  2358. OPT_NORMAL, OPT_ICONIC, OPT_WITHDRAWN, OPT_ZOOMED };
  2359.     int index;
  2360.     if ((objc < 3) || (objc > 4)) {
  2361. Tcl_WrongNumArgs(interp, 2, objv, "window ?state?");
  2362. return TCL_ERROR;
  2363.     }
  2364.     if (objc == 4) {
  2365. if (wmPtr->iconFor != NULL) {
  2366.     Tcl_AppendResult(interp, "can't change state of ",
  2367.     Tcl_GetString(objv[2]),
  2368.     ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
  2369.     (char *) NULL);
  2370.     return TCL_ERROR;
  2371. }
  2372. if (winPtr->flags & TK_EMBEDDED) {
  2373.     Tcl_AppendResult(interp, "can't change state of ",
  2374.     winPtr->pathName, ": it is an embedded window",
  2375.     (char *) NULL);
  2376.     return TCL_ERROR;
  2377. }
  2378. if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
  2379. &index) != TCL_OK) {
  2380.     return TCL_ERROR;
  2381. }
  2382. if (index == OPT_NORMAL) {
  2383.     TkpWmSetState(winPtr, NormalState);
  2384.     /*
  2385.      * This varies from 'wm deiconify' because it does not
  2386.      * force the window to be raised and receive focus
  2387.      */
  2388. } else if (index == OPT_ICONIC) {
  2389.     if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) {
  2390. Tcl_AppendResult(interp, "can't iconify "",
  2391. winPtr->pathName,
  2392. "": override-redirect flag is set",
  2393. (char *) NULL);
  2394. return TCL_ERROR;
  2395.     }
  2396.     if (wmPtr->master != NULL) {
  2397. Tcl_AppendResult(interp, "can't iconify "",
  2398. winPtr->pathName,
  2399. "": it is a transient", (char *) NULL);
  2400. return TCL_ERROR;
  2401.     }
  2402.     TkpWmSetState(winPtr, IconicState);
  2403. } else if (index == OPT_WITHDRAWN) {
  2404.     TkpWmSetState(winPtr, WithdrawnState);
  2405. } else { /* OPT_ZOOMED */
  2406.     TkpWmSetState(winPtr, ZoomState);
  2407. }
  2408.     } else {
  2409. if (wmPtr->iconFor != NULL) {
  2410.     Tcl_SetResult(interp, "icon", TCL_STATIC);
  2411. } else {
  2412.     switch (wmPtr->hints.initial_state) {
  2413.       case NormalState:
  2414. Tcl_SetResult(interp, "normal", TCL_STATIC);
  2415. break;
  2416.       case IconicState:
  2417. Tcl_SetResult(interp, "iconic", TCL_STATIC);
  2418. break;
  2419.       case WithdrawnState:
  2420. Tcl_SetResult(interp, "withdrawn", TCL_STATIC);
  2421. break;
  2422.       case ZoomState:
  2423. Tcl_SetResult(interp, "zoomed", TCL_STATIC);
  2424. break;
  2425.     }
  2426. }
  2427.     }
  2428.     return TCL_OK;
  2429. }
  2430. /*
  2431.  *----------------------------------------------------------------------
  2432.  *
  2433.  * WmTitleCmd --
  2434.  *
  2435.  * This procedure is invoked to process the "wm title" Tcl command.
  2436.  * See the user documentation for details on what it does.
  2437.  *
  2438.  * Results:
  2439.  * A standard Tcl result.
  2440.  *
  2441.  * Side effects:
  2442.  * See the user documentation.
  2443.  *
  2444.  *----------------------------------------------------------------------
  2445.  */
  2446. static int
  2447. WmTitleCmd(tkwin, winPtr, interp, objc, objv)
  2448.     Tk_Window tkwin; /* Main window of the application. */
  2449.     TkWindow *winPtr;           /* Toplevel to work with */
  2450.     Tcl_Interp *interp; /* Current interpreter. */
  2451.     int objc; /* Number of arguments. */
  2452.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  2453. {
  2454.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  2455.     char *argv3;
  2456.     int length;
  2457.     if (objc > 4) {
  2458. Tcl_WrongNumArgs(interp, 2, objv, "window ?newTitle?");
  2459. return TCL_ERROR;
  2460.     }
  2461.     if (objc == 3) {
  2462. Tcl_SetResult(interp, (char *)
  2463. ((wmPtr->title != NULL) ? wmPtr->title : winPtr->nameUid),
  2464. TCL_STATIC);
  2465. return TCL_OK;
  2466.     } else {
  2467. if (wmPtr->title != NULL) {
  2468.     ckfree((char *) wmPtr->title);
  2469. }
  2470. argv3 = Tcl_GetStringFromObj(objv[3], &length);
  2471. wmPtr->title = ckalloc((unsigned) (length + 1));
  2472. strcpy(wmPtr->title, argv3);
  2473. if (!(wmPtr->flags & WM_NEVER_MAPPED) && !Tk_IsEmbedded(winPtr)) {
  2474.     TkSetWMName(winPtr, wmPtr->title);
  2475. }
  2476.     }
  2477.     return TCL_OK;
  2478. }
  2479. /*
  2480.  *----------------------------------------------------------------------
  2481.  *
  2482.  * WmTransientCmd --
  2483.  *
  2484.  * This procedure is invoked to process the "wm transient" Tcl command.
  2485.  * See the user documentation for details on what it does.
  2486.  *
  2487.  * Results:
  2488.  * A standard Tcl result.
  2489.  *
  2490.  * Side effects:
  2491.  * See the user documentation.
  2492.  *
  2493.  *----------------------------------------------------------------------
  2494.  */
  2495. static int
  2496. WmTransientCmd(tkwin, winPtr, interp, objc, objv)
  2497.     Tk_Window tkwin; /* Main window of the application. */
  2498.     TkWindow *winPtr;           /* Toplevel to work with */
  2499.     Tcl_Interp *interp; /* Current interpreter. */
  2500.     int objc; /* Number of arguments. */
  2501.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  2502. {
  2503.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  2504.     Tk_Window master;
  2505.     WmInfo *wmPtr2;
  2506.     char *argv3;
  2507.     int length;
  2508.     if ((objc != 3) && (objc != 4)) {
  2509. Tcl_WrongNumArgs(interp, 2, objv, "window ?master?");
  2510. return TCL_ERROR;
  2511.     }
  2512.     if (objc == 3) {
  2513. if (wmPtr->master != None) {
  2514.     Tcl_SetResult(interp, wmPtr->masterWindowName, TCL_STATIC);
  2515. }
  2516. return TCL_OK;
  2517.     }
  2518.     if (Tcl_GetString(objv[3])[0] == '') {
  2519. wmPtr->master = None;
  2520. if (wmPtr->masterWindowName != NULL) {
  2521.     ckfree(wmPtr->masterWindowName);
  2522. }
  2523. wmPtr->masterWindowName = NULL;
  2524. wmPtr->style = documentProc;
  2525.     } else {
  2526. if (TkGetWindowFromObj(interp, tkwin, objv[3], &master) != TCL_OK) {
  2527.     return TCL_ERROR;
  2528. }
  2529. Tk_MakeWindowExist(master);
  2530. if (wmPtr->iconFor != NULL) {
  2531.     Tcl_AppendResult(interp, "can't make "",
  2532.     Tcl_GetString(objv[2]),
  2533.     "" a transient: it is an icon for ",
  2534.     Tk_PathName(wmPtr->iconFor),
  2535.     (char *) NULL);
  2536.     return TCL_ERROR;
  2537. }
  2538. wmPtr2 = ((TkWindow *) master)->wmInfoPtr;
  2539. if (wmPtr2->iconFor != NULL) {
  2540.     Tcl_AppendResult(interp, "can't make "",
  2541.     Tcl_GetString(objv[3]),
  2542.     "" a master: it is an icon for ",
  2543.     Tk_PathName(wmPtr2->iconFor),
  2544.     (char *) NULL);
  2545.     return TCL_ERROR;
  2546. }
  2547. argv3 = Tcl_GetStringFromObj(objv[3], &length);
  2548. wmPtr->master = Tk_WindowId(master);
  2549. wmPtr->masterWindowName = ckalloc((unsigned) length+1);
  2550. strcpy(wmPtr->masterWindowName, argv3);
  2551. wmPtr->style = plainDBox;
  2552.     }
  2553.     return TCL_OK;
  2554. }
  2555. /*
  2556.  *----------------------------------------------------------------------
  2557.  *
  2558.  * WmWithdrawCmd --
  2559.  *
  2560.  * This procedure is invoked to process the "wm withdraw" Tcl command.
  2561.  * See the user documentation for details on what it does.
  2562.  *
  2563.  * Results:
  2564.  * A standard Tcl result.
  2565.  *
  2566.  * Side effects:
  2567.  * See the user documentation.
  2568.  *
  2569.  *----------------------------------------------------------------------
  2570.  */
  2571. static int
  2572. WmWithdrawCmd(tkwin, winPtr, interp, objc, objv)
  2573.     Tk_Window tkwin; /* Main window of the application. */
  2574.     TkWindow *winPtr;           /* Toplevel to work with */
  2575.     Tcl_Interp *interp; /* Current interpreter. */
  2576.     int objc; /* Number of arguments. */
  2577.     Tcl_Obj *CONST objv[]; /* Argument objects. */
  2578. {
  2579.     register WmInfo *wmPtr = winPtr->wmInfoPtr;
  2580.     if (objc != 3) {
  2581. Tcl_WrongNumArgs(interp, 2, objv, "window");
  2582. return TCL_ERROR;
  2583.     }
  2584.     if (wmPtr->iconFor != NULL) {
  2585. Tcl_AppendResult(interp, "can't withdraw ", Tcl_GetString(objv[2]),
  2586. ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
  2587. (char *) NULL);
  2588. return TCL_ERROR;
  2589.     }
  2590.     TkpWmSetState(winPtr, WithdrawnState);
  2591.     return TCL_OK;
  2592. }
  2593. /*
  2594.  * Invoked by those wm subcommands that affect geometry.
  2595.  * Schedules a geometry update.
  2596.  */
  2597. static void
  2598. WmUpdateGeom(wmPtr, winPtr)
  2599.     WmInfo *wmPtr;
  2600.     TkWindow *winPtr;
  2601. {
  2602.     if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
  2603. Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
  2604. wmPtr->flags |= WM_UPDATE_PENDING;
  2605.     }
  2606. }
  2607. /*
  2608.  *----------------------------------------------------------------------
  2609.  *
  2610.  * Tk_SetGrid --
  2611.  *
  2612.  * This procedure is invoked by a widget when it wishes to set a grid
  2613.  * coordinate system that controls the size of a top-level window.
  2614.  * It provides a C interface equivalent to the "wm grid" command and
  2615.  * is usually asscoiated with the -setgrid option.
  2616.  *
  2617.  * Results:
  2618.  * None.
  2619.  *
  2620.  * Side effects:
  2621.  * Grid-related information will be passed to the window manager, so
  2622.  * that the top-level window associated with tkwin will resize on
  2623.  * even grid units.  If some other window already controls gridding
  2624.  * for the top-level window then this procedure call has no effect.
  2625.  *
  2626.  *----------------------------------------------------------------------
  2627.  */
  2628. void
  2629. Tk_SetGrid(
  2630.     Tk_Window tkwin, /* Token for window.  New window mgr info
  2631.  * will be posted for the top-level window
  2632.  * associated with this window. */
  2633.     int reqWidth, /* Width (in grid units) corresponding to
  2634.  * the requested geometry for tkwin. */
  2635.     int reqHeight, /* Height (in grid units) corresponding to
  2636.  * the requested geometry for tkwin. */
  2637.     int widthInc, int heightInc)/* Pixel increments corresponding to a
  2638.  * change of one grid unit. */
  2639. {
  2640.     TkWindow *winPtr = (TkWindow *) tkwin;
  2641.     register WmInfo *wmPtr;
  2642.     /*
  2643.      * Find the top-level window for tkwin, plus the window manager
  2644.      * information.
  2645.      */
  2646.     while (!(winPtr->flags & TK_TOP_HIERARCHY)) {
  2647. winPtr = winPtr->parentPtr;
  2648.     }
  2649.     wmPtr = winPtr->wmInfoPtr;
  2650.     if (wmPtr == NULL) {
  2651. return;
  2652.     }
  2653.     if ((wmPtr->gridWin != NULL) && (wmPtr->gridWin != tkwin)) {
  2654. return;
  2655.     }
  2656.     if ((wmPtr->reqGridWidth == reqWidth)
  2657.     && (wmPtr->reqGridHeight == reqHeight)
  2658.     && (wmPtr->widthInc == widthInc)
  2659.     && (wmPtr->heightInc == heightInc)
  2660.     && ((wmPtr->sizeHintsFlags & (PBaseSize|PResizeInc))
  2661.     == (PBaseSize|PResizeInc))) {
  2662. return;
  2663.     }
  2664.     /*
  2665.      * If gridding was previously off, then forget about any window
  2666.      * size requests made by the user or via "wm geometry":  these are
  2667.      * in pixel units and there's no easy way to translate them to
  2668.      * grid units since the new requested size of the top-level window in
  2669.      * pixels may not yet have been registered yet (it may filter up
  2670.      * the hierarchy in DoWhenIdle handlers).  However, if the window
  2671.      * has never been mapped yet then just leave the window size alone:
  2672.      * assume that it is intended to be in grid units but just happened
  2673.      * to have been specified before this procedure was called.
  2674.      */
  2675.     if ((wmPtr->gridWin == NULL) && !(wmPtr->flags & WM_NEVER_MAPPED)) {
  2676. wmPtr->width = -1;
  2677. wmPtr->height = -1;
  2678.     }
  2679.     /*
  2680.      * Set the new gridding information, and start the process of passing
  2681.      * all of this information to the window manager.
  2682.      */
  2683.     wmPtr->gridWin = tkwin;
  2684.     wmPtr->reqGridWidth = reqWidth;
  2685.     wmPtr->reqGridHeight = reqHeight;
  2686.     wmPtr->widthInc = widthInc;
  2687.     wmPtr->heightInc = heightInc;