diff options
Diffstat (limited to 'generic/tkFrame.c')
-rw-r--r-- | generic/tkFrame.c | 1195 |
1 files changed, 605 insertions, 590 deletions
diff --git a/generic/tkFrame.c b/generic/tkFrame.c index a416b22..e38fe87 100644 --- a/generic/tkFrame.c +++ b/generic/tkFrame.c @@ -1,20 +1,18 @@ -/* +/* * tkFrame.c -- * * This module implements "frame", "labelframe" and "toplevel" widgets - * for the Tk toolkit. Frames are windows with a background color - * and possibly a 3-D effect, but not much else in the way of - * attributes. + * for the Tk toolkit. Frames are windows with a background color and + * possibly a 3-D effect, but not much else in the way of attributes. * * Copyright (c) 1990-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "default.h" -#include "tkPort.h" #include "tkInt.h" /* @@ -31,29 +29,29 @@ enum FrameType { */ typedef struct { - Tk_Window tkwin; /* Window that embodies the frame. NULL - * means that the window has been destroyed - * but the data structures haven't yet been - * cleaned up. */ - Display *display; /* Display containing widget. Used, among + Tk_Window tkwin; /* Window that embodies the frame. NULL means + * that the window has been destroyed but the + * data structures haven't yet been cleaned + * up. */ + Display *display; /* Display containing widget. Used, among * other things, so that resources can be * freed even after tkwin has gone away. */ - Tcl_Interp *interp; /* Interpreter associated with widget. Used - * to delete widget command. */ + Tcl_Interp *interp; /* Interpreter associated with widget. Used to + * delete widget command. */ Tcl_Command widgetCmd; /* Token for frame's widget command. */ Tk_OptionTable optionTable; /* Table that defines configuration options * available for this widget. */ char *className; /* Class name for widget (from configuration - * option). Malloc-ed. */ + * option). Malloc-ed. */ enum FrameType type; /* Type of widget, such as TYPE_FRAME. */ - char *screenName; /* Screen on which widget is created. Non-null - * only for top-levels. Malloc-ed, may be + char *screenName; /* Screen on which widget is created. Non-null + * only for top-levels. Malloc-ed, may be * NULL. */ char *visualName; /* Textual description of visual for window, - * from -visual option. Malloc-ed, may be + * from -visual option. Malloc-ed, may be * NULL. */ char *colormapName; /* Textual description of colormap for window, - * from -colormap option. Malloc-ed, may be + * from -colormap option. Malloc-ed, may be * NULL. */ char *menuName; /* Textual description of menu to use for * menubar. Malloc-ed, may be NULL. */ @@ -61,32 +59,32 @@ typedef struct { * allocated for this window, which must be * freed when the window is deleted. */ Tk_3DBorder border; /* Structure used to draw 3-D border and - * background. NULL means no background - * or border. */ + * background. NULL means no background or + * border. */ int borderWidth; /* Width of 3-D border (if any). */ int relief; /* 3-d effect: TK_RELIEF_RAISED etc. */ - int highlightWidth; /* Width in pixels of highlight to draw - * around widget when it has the focus. - * 0 means don't draw a highlight. */ + int highlightWidth; /* Width in pixels of highlight to draw around + * widget when it has the focus. 0 means don't + * draw a highlight. */ XColor *highlightBgColorPtr; - /* Color for drawing traversal highlight - * area when highlight is off. */ + /* Color for drawing traversal highlight area + * when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ - int width; /* Width to request for window. <= 0 means + int width; /* Width to request for window. <= 0 means * don't request any size. */ - int height; /* Height to request for window. <= 0 means + int height; /* Height to request for window. <= 0 means * don't request any size. */ Tk_Cursor cursor; /* Current cursor for window, or None. */ - char *takeFocus; /* Value of -takefocus option; not used in - * the C code, but used by keyboard traversal - * scripts. Malloc'ed, but may be NULL. */ + char *takeFocus; /* Value of -takefocus option; not used in the + * C code, but used by keyboard traversal + * scripts. Malloc'ed, but may be NULL. */ int isContainer; /* 1 means this window is a container, 0 means * that it isn't. */ char *useThis; /* If the window is embedded, this points to * the name of the window in which it is - * embedded (malloc'ed). For non-embedded + * embedded (malloc'ed). For non-embedded * windows this is NULL. */ - int flags; /* Various flags; see below for + int flags; /* Various flags; see below for * definitions. */ Tcl_Obj *padXPtr; /* Value of -padx option: specifies how many * pixels of extra space to leave on left and @@ -99,46 +97,41 @@ typedef struct { } Frame; /* - * A data structure of the following type is kept for each labelframe - * widget managed by this file: + * A data structure of the following type is kept for each labelframe widget + * managed by this file: */ typedef struct { Frame frame; /* A pointer to the generic frame structure. * This must be the first element of the * Labelframe. */ - /* * Labelframe specific configuration settings. */ - Tcl_Obj *textPtr; /* Value of -text option: specifies text to * display in button. */ - Tk_Font tkfont; /* Value of -font option: specifies font - * to use for display text. */ + Tk_Font tkfont; /* Value of -font option: specifies font to + * use for display text. */ XColor *textColorPtr; /* Value of -fg option: specifies foreground * color in normal mode. */ int labelAnchor; /* Value of -labelanchor option: specifies * where to place the label. */ - Tk_Window labelWin; /* Value of -labelwidget option: Window to - * use as label for the frame. */ - + Tk_Window labelWin; /* Value of -labelwidget option: Window to use + * as label for the frame. */ /* * Labelframe specific fields for use with configuration settings above. */ - GC textGC; /* GC for drawing text in normal mode. */ Tk_TextLayout textLayout; /* Stored text layout information. */ XRectangle labelBox; /* The label's actual size and position. */ int labelReqWidth; /* The label's requested width. */ int labelReqHeight; /* The label's requested height. */ int labelTextX, labelTextY; /* Position of the text to be drawn. */ - } Labelframe; /* - * The following macros define how many extra pixels to leave - * around a label's text. + * The following macros define how many extra pixels to leave around a label's + * text. */ #define LABELSPACING 1 @@ -147,20 +140,19 @@ typedef struct { /* * Flag bits for frames: * - * REDRAW_PENDING: Non-zero means a DoWhenIdle handler - * has already been queued to redraw - * this window. - * GOT_FOCUS: Non-zero means this widget currently - * has the input focus. + * REDRAW_PENDING: Non-zero means a DoWhenIdle handler has + * already been queued to redraw this window. + * GOT_FOCUS: Non-zero means this widget currently has the + * input focus. */ #define REDRAW_PENDING 1 #define GOT_FOCUS 4 /* - * The following enum is used to define a type for the -labelanchor option - * of the Labelframe widget. These values are used as indices into the - * string table below. + * The following enum is used to define a type for the -labelanchor option of + * the Labelframe widget. These values are used as indices into the string + * table below. */ enum labelanchor { @@ -172,32 +164,34 @@ enum labelanchor { static CONST char *labelAnchorStrings[] = { "e", "en", "es", "n", "ne", "nw", "s", "se", "sw", "w", "wn", "ws", - (char *) NULL + NULL }; /* - * Information used for parsing configuration options. There are - * one common table used by all and one table for each widget class. + * Information used for parsing configuration options. There are one common + * table used by all and one table for each widget class. */ -static Tk_OptionSpec commonOptSpec[] = { +static const Tk_OptionSpec commonOptSpec[] = { {TK_OPTION_BORDER, "-background", "background", "Background", DEF_FRAME_BG_COLOR, -1, Tk_Offset(Frame, border), TK_OPTION_NULL_OK, (ClientData) DEF_FRAME_BG_MONO, 0}, - {TK_OPTION_SYNONYM, "-bg", (char *) NULL, (char *) NULL, - (char *) NULL, 0, -1, 0, (ClientData) "-background", 0}, + {TK_OPTION_SYNONYM, "-bg", NULL, NULL, + NULL, 0, -1, 0, (ClientData) "-background", 0}, {TK_OPTION_STRING, "-colormap", "colormap", "Colormap", DEF_FRAME_COLORMAP, -1, Tk_Offset(Frame, colormapName), TK_OPTION_NULL_OK, 0, 0}, + /* + * Having -container is useless in a labelframe since a container has + * no border. It should be deprecated. + */ {TK_OPTION_BOOLEAN, "-container", "container", "Container", - DEF_FRAME_CONTAINER, -1, Tk_Offset(Frame, isContainer), - 0, 0, 0}, + DEF_FRAME_CONTAINER, -1, Tk_Offset(Frame, isContainer), 0, 0, 0}, {TK_OPTION_CURSOR, "-cursor", "cursor", "Cursor", DEF_FRAME_CURSOR, -1, Tk_Offset(Frame, cursor), TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_PIXELS, "-height", "height", "Height", - DEF_FRAME_HEIGHT, -1, Tk_Offset(Frame, height), - 0, 0, 0}, + DEF_FRAME_HEIGHT, -1, Tk_Offset(Frame, height), 0, 0, 0}, {TK_OPTION_COLOR, "-highlightbackground", "highlightBackground", "HighlightBackground", DEF_FRAME_HIGHLIGHT_BG, -1, Tk_Offset(Frame, highlightBgColorPtr), 0, 0, 0}, @@ -220,82 +214,71 @@ static Tk_OptionSpec commonOptSpec[] = { DEF_FRAME_VISUAL, -1, Tk_Offset(Frame, visualName), TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_PIXELS, "-width", "width", "Width", - DEF_FRAME_WIDTH, -1, Tk_Offset(Frame, width), - 0, 0, 0}, - {TK_OPTION_END, (char *) NULL, (char *) NULL, (char *) NULL, - (char *) NULL, 0, 0, 0, 0, 0} + DEF_FRAME_WIDTH, -1, Tk_Offset(Frame, width), 0, 0, 0}, + {TK_OPTION_END, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0} }; -static Tk_OptionSpec frameOptSpec[] = { - {TK_OPTION_SYNONYM, "-bd", (char *) NULL, (char *) NULL, - (char *) NULL, 0, -1, 0, (ClientData) "-borderwidth", 0}, +static const Tk_OptionSpec frameOptSpec[] = { + {TK_OPTION_SYNONYM, "-bd", NULL, NULL, + NULL, 0, -1, 0, (ClientData) "-borderwidth", 0}, {TK_OPTION_PIXELS, "-borderwidth", "borderWidth", "BorderWidth", - DEF_FRAME_BORDER_WIDTH, -1, Tk_Offset(Frame, borderWidth), - 0, 0, 0}, + DEF_FRAME_BORDER_WIDTH, -1, Tk_Offset(Frame, borderWidth), 0, 0, 0}, {TK_OPTION_STRING, "-class", "class", "Class", - DEF_FRAME_CLASS, -1, Tk_Offset(Frame, className), - 0, 0, 0}, + DEF_FRAME_CLASS, -1, Tk_Offset(Frame, className), 0, 0, 0}, {TK_OPTION_RELIEF, "-relief", "relief", "Relief", - DEF_FRAME_RELIEF, -1, Tk_Offset(Frame, relief), - 0, 0, 0}, - {TK_OPTION_END, (char *) NULL, (char *) NULL, (char *) NULL, - (char *) NULL, 0, 0, 0, (ClientData) commonOptSpec, 0} + DEF_FRAME_RELIEF, -1, Tk_Offset(Frame, relief), 0, 0, 0}, + {TK_OPTION_END, NULL, NULL, NULL, + NULL, 0, 0, 0, (ClientData) commonOptSpec, 0} }; -static Tk_OptionSpec toplevelOptSpec[] = { - {TK_OPTION_SYNONYM, "-bd", (char *) NULL, (char *) NULL, - (char *) NULL, 0, -1, 0, (ClientData) "-borderwidth", 0}, +static const Tk_OptionSpec toplevelOptSpec[] = { + {TK_OPTION_SYNONYM, "-bd", NULL, NULL, + NULL, 0, -1, 0, (ClientData) "-borderwidth", 0}, {TK_OPTION_PIXELS, "-borderwidth", "borderWidth", "BorderWidth", - DEF_FRAME_BORDER_WIDTH, -1, Tk_Offset(Frame, borderWidth), - 0, 0, 0}, + DEF_FRAME_BORDER_WIDTH, -1, Tk_Offset(Frame, borderWidth), 0, 0, 0}, {TK_OPTION_STRING, "-class", "class", "Class", - DEF_TOPLEVEL_CLASS, -1, Tk_Offset(Frame, className), - 0, 0, 0}, + DEF_TOPLEVEL_CLASS, -1, Tk_Offset(Frame, className), 0, 0, 0}, {TK_OPTION_STRING, "-menu", "menu", "Menu", DEF_TOPLEVEL_MENU, -1, Tk_Offset(Frame, menuName), TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_RELIEF, "-relief", "relief", "Relief", - DEF_FRAME_RELIEF, -1, Tk_Offset(Frame, relief), - 0, 0, 0}, + DEF_FRAME_RELIEF, -1, Tk_Offset(Frame, relief), 0, 0, 0}, {TK_OPTION_STRING, "-screen", "screen", "Screen", DEF_TOPLEVEL_SCREEN, -1, Tk_Offset(Frame, screenName), TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_STRING, "-use", "use", "Use", DEF_TOPLEVEL_USE, -1, Tk_Offset(Frame, useThis), TK_OPTION_NULL_OK, 0, 0}, - {TK_OPTION_END, (char *) NULL, (char *) NULL, (char *) NULL, - (char *) NULL, 0, 0, 0, (ClientData) commonOptSpec, 0} + {TK_OPTION_END, NULL, NULL, NULL, + NULL, 0, 0, 0, (ClientData) commonOptSpec, 0} }; -static Tk_OptionSpec labelframeOptSpec[] = { - {TK_OPTION_SYNONYM, "-bd", (char *) NULL, (char *) NULL, - (char *) NULL, 0, -1, 0, (ClientData) "-borderwidth", 0}, +static const Tk_OptionSpec labelframeOptSpec[] = { + {TK_OPTION_SYNONYM, "-bd", NULL, NULL, + NULL, 0, -1, 0, (ClientData) "-borderwidth", 0}, {TK_OPTION_PIXELS, "-borderwidth", "borderWidth", "BorderWidth", DEF_LABELFRAME_BORDER_WIDTH, -1, Tk_Offset(Frame, borderWidth), - 0, 0, 0}, - {TK_OPTION_STRING, "-class", "class", "Class", - DEF_LABELFRAME_CLASS, -1, Tk_Offset(Frame, className), 0, 0, 0}, - {TK_OPTION_SYNONYM, "-fg", "foreground", (char *) NULL, - (char *) NULL, 0, -1, 0, (ClientData) "-foreground", 0}, + {TK_OPTION_STRING, "-class", "class", "Class", + DEF_LABELFRAME_CLASS, -1, Tk_Offset(Frame, className), 0, 0, 0}, + {TK_OPTION_SYNONYM, "-fg", "foreground", NULL, + NULL, 0, -1, 0, (ClientData) "-foreground", 0}, {TK_OPTION_FONT, "-font", "font", "Font", DEF_LABELFRAME_FONT, -1, Tk_Offset(Labelframe, tkfont), 0, 0, 0}, {TK_OPTION_COLOR, "-foreground", "foreground", "Foreground", DEF_LABELFRAME_FG, -1, Tk_Offset(Labelframe, textColorPtr), 0, 0, 0}, {TK_OPTION_STRING_TABLE, "-labelanchor", "labelAnchor", "LabelAnchor", DEF_LABELFRAME_LABELANCHOR, -1, Tk_Offset(Labelframe, labelAnchor), - 0, (ClientData) labelAnchorStrings, 0}, + 0, (ClientData) labelAnchorStrings, 0}, {TK_OPTION_WINDOW, "-labelwidget", "labelWidget", "LabelWidget", - (char *) NULL, -1, Tk_Offset(Labelframe, labelWin), - TK_OPTION_NULL_OK, 0, 0}, + NULL, -1, Tk_Offset(Labelframe, labelWin), TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_RELIEF, "-relief", "relief", "Relief", - DEF_LABELFRAME_RELIEF, -1, Tk_Offset(Frame, relief), - 0, 0, 0}, + DEF_LABELFRAME_RELIEF, -1, Tk_Offset(Frame, relief), 0, 0, 0}, {TK_OPTION_STRING, "-text", "text", "Text", DEF_LABELFRAME_TEXT, Tk_Offset(Labelframe, textPtr), -1, TK_OPTION_NULL_OK, 0, 0}, - {TK_OPTION_END, (char *) NULL, (char *) NULL, (char *) NULL, - (char *) NULL, 0, 0, 0, (ClientData) commonOptSpec, 0} + {TK_OPTION_END, NULL, NULL, NULL, + NULL, 0, 0, 0, (ClientData) commonOptSpec, 0} }; /* @@ -305,48 +288,47 @@ static Tk_OptionSpec labelframeOptSpec[] = { static CONST char *classNames[] = {"Frame", "Toplevel", "Labelframe"}; /* - * The following table maps from FrameType to the option template for - * that class of widgets. + * The following table maps from FrameType to the option template for that + * class of widgets. */ -static Tk_OptionSpec *optionSpecs[] = { +static const Tk_OptionSpec * const optionSpecs[] = { frameOptSpec, toplevelOptSpec, labelframeOptSpec }; /* - * Forward declarations for procedures defined later in this file: + * Forward declarations for functions defined later in this file: */ -static void ComputeFrameGeometry _ANSI_ARGS_((Frame *framePtr)); -static int ConfigureFrame _ANSI_ARGS_((Tcl_Interp *interp, - Frame *framePtr, int objc, Tcl_Obj *CONST objv[])); -static int CreateFrame _ANSI_ARGS_((ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *CONST argv[], - enum FrameType type, char *appName)); -static void DestroyFrame _ANSI_ARGS_((char *memPtr)); -static void DestroyFramePartly _ANSI_ARGS_((Frame *framePtr)); -static void DisplayFrame _ANSI_ARGS_((ClientData clientData)); -static void FrameCmdDeletedProc _ANSI_ARGS_(( - ClientData clientData)); -static void FrameEventProc _ANSI_ARGS_((ClientData clientData, - XEvent *eventPtr)); -static void FrameLostSlaveProc _ANSI_ARGS_(( - ClientData clientData, Tk_Window tkwin)); -static void FrameRequestProc _ANSI_ARGS_((ClientData clientData, - Tk_Window tkwin)); -static void FrameStructureProc _ANSI_ARGS_(( - ClientData clientData, XEvent *eventPtr)); -static int FrameWidgetObjCmd _ANSI_ARGS_((ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); -static void FrameWorldChanged _ANSI_ARGS_(( - ClientData instanceData)); -static void MapFrame _ANSI_ARGS_((ClientData clientData)); +static void ComputeFrameGeometry(Frame *framePtr); +static int ConfigureFrame(Tcl_Interp *interp, Frame *framePtr, + int objc, Tcl_Obj *CONST objv[]); +static int CreateFrame(ClientData clientData, Tcl_Interp *interp, + int objc, Tcl_Obj *CONST argv[], + enum FrameType type, char *appName); +static void DestroyFrame(char *memPtr); +static void DestroyFramePartly(Frame *framePtr); +static void DisplayFrame(ClientData clientData); +static void FrameCmdDeletedProc(ClientData clientData); +static void FrameEventProc(ClientData clientData, + XEvent *eventPtr); +static void FrameLostSlaveProc(ClientData clientData, + Tk_Window tkwin); +static void FrameRequestProc(ClientData clientData, + Tk_Window tkwin); +static void FrameStructureProc(ClientData clientData, + XEvent *eventPtr); +static int FrameWidgetObjCmd(ClientData clientData, + Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[]); +static void FrameWorldChanged(ClientData instanceData); +static void MapFrame(ClientData clientData); /* - * The structure below defines frame class behavior by means of procedures - * that can be invoked from generic window code. + * The structure below defines frame class behavior by means of functions that + * can be invoked from generic window code. */ static Tk_ClassProcs frameClass = { @@ -355,67 +337,63 @@ static Tk_ClassProcs frameClass = { }; /* - * The structure below defines the official type record for the - * labelframe's geometry manager: + * The structure below defines the official type record for the labelframe's + * geometry manager: */ -static Tk_GeomMgr frameGeomType = { - "labelframe", /* name */ - FrameRequestProc, /* requestProc */ - FrameLostSlaveProc /* lostSlaveProc */ +static const Tk_GeomMgr frameGeomType = { + "labelframe", /* name */ + FrameRequestProc, /* requestProc */ + FrameLostSlaveProc /* lostSlaveProc */ }; - /* *-------------------------------------------------------------- * * Tk_FrameObjCmd, Tk_ToplevelObjCmd, Tk_LabelframeObjCmd -- * - * These procedures are invoked to process the "frame", - * "toplevel" and "labelframe" Tcl commands. See the user - * documentation for details on what they do. + * These functions are invoked to process the "frame", "toplevel" and + * "labelframe" Tcl commands. See the user documentation for details on + * what they do. * * Results: * A standard Tcl result. * * Side effects: - * See the user documentation. These procedures are just wrappers; - * they call CreateFrame to do all of the real work. + * See the user documentation. These functions are just wrappers; they + * call CreateFrame to do all of the real work. * *-------------------------------------------------------------- */ int -Tk_FrameObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Either NULL or pointer to option table. */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ +Tk_FrameObjCmd( + ClientData clientData, /* Either NULL or pointer to option table. */ + Tcl_Interp *interp, /* Current interpreter. */ + int objc, /* Number of arguments. */ + Tcl_Obj *CONST objv[]) /* Argument objects. */ { - return CreateFrame(clientData, interp, objc, objv, TYPE_FRAME, - (char *) NULL); + return CreateFrame(clientData, interp, objc, objv, TYPE_FRAME, NULL); } int -Tk_ToplevelObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Either NULL or pointer to option table. */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ +Tk_ToplevelObjCmd( + ClientData clientData, /* Either NULL or pointer to option table. */ + Tcl_Interp *interp, /* Current interpreter. */ + int objc, /* Number of arguments. */ + Tcl_Obj *CONST objv[]) /* Argument objects. */ { - return CreateFrame(clientData, interp, objc, objv, TYPE_TOPLEVEL, - (char *) NULL); + return CreateFrame(clientData, interp, objc, objv, TYPE_TOPLEVEL, NULL); } int -Tk_LabelframeObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Either NULL or pointer to option table. */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ +Tk_LabelframeObjCmd( + ClientData clientData, /* Either NULL or pointer to option table. */ + Tcl_Interp *interp, /* Current interpreter. */ + int objc, /* Number of arguments. */ + Tcl_Obj *CONST objv[]) /* Argument objects. */ { - return CreateFrame(clientData, interp, objc, objv, TYPE_LABELFRAME, - (char *) NULL); + return CreateFrame(clientData, interp, objc, objv, TYPE_LABELFRAME, NULL); } /* @@ -423,10 +401,10 @@ Tk_LabelframeObjCmd(clientData, interp, objc, objv) * * TkCreateFrame -- * - * This procedure is the old command procedure for the "frame" - * and "toplevel" commands. Now it is used directly by Tk_Init to - * create a new main window. See the user documentation for the - * "frame" and "toplevel" commands for details on what it does. + * This function is the old command function for the "frame" and + * "toplevel" commands. Now it is used directly by Tk_Init to create a + * new main window. See the user documentation for the "frame" and + * "toplevel" commands for details on what it does. * * Results: * A standard Tcl result. @@ -438,20 +416,21 @@ Tk_LabelframeObjCmd(clientData, interp, objc, objv) */ int -TkCreateFrame(clientData, interp, argc, argv, toplevel, appName) - ClientData clientData; /* Either NULL or pointer to option table. */ - Tcl_Interp *interp; /* Current interpreter. */ - int argc; /* Number of arguments. */ - char **argv; /* Argument strings. */ - int toplevel; /* Non-zero means create a toplevel window, +TkCreateFrame( + ClientData clientData, /* Either NULL or pointer to option table. */ + Tcl_Interp *interp, /* Current interpreter. */ + int argc, /* Number of arguments. */ + char **argv, /* Argument strings. */ + int toplevel, /* Non-zero means create a toplevel window, * zero means create a frame. */ - char *appName; /* Should only be non-NULL if there is no main + char *appName) /* Should only be non-NULL if there is no main * window associated with the interpreter. - * Gives the base name to use for the - * new application. */ + * Gives the base name to use for the new + * application. */ { int result, i; Tcl_Obj **objv = (Tcl_Obj **) ckalloc((argc+1) * sizeof(Tcl_Obj **)); + for (i=0; i<argc; i++) { objv[i] = Tcl_NewStringObj(argv[i], -1); Tcl_IncrRefCount(objv[i]); @@ -467,23 +446,23 @@ TkCreateFrame(clientData, interp, argc, argv, toplevel, appName) } static int -CreateFrame(clientData, interp, objc, objv, type, appName) - ClientData clientData; /* NULL. */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ - enum FrameType type; /* What widget type to create. */ - char *appName; /* Should only be non-NULL if there are no - * Main window associated with the interpreter. - * Gives the base name to use for the - * new application. */ +CreateFrame( + ClientData clientData, /* NULL. */ + Tcl_Interp *interp, /* Current interpreter. */ + int objc, /* Number of arguments. */ + Tcl_Obj *CONST objv[], /* Argument objects. */ + enum FrameType type, /* What widget type to create. */ + char *appName) /* Should only be non-NULL if there are no + * Main window associated with the + * interpreter. Gives the base name to use for + * the new application. */ { Tk_Window tkwin; Frame *framePtr; Tk_OptionTable optionTable; - Tk_Window new; + Tk_Window newWin; CONST char *className, *screenName, *visualName, *colormapName, *arg, *useOption; - int i, c, depth, length; + int i, c, length, depth; unsigned int mask; Colormap colormap; Visual *visual; @@ -494,17 +473,17 @@ CreateFrame(clientData, interp, objc, objv, type, appName) } /* - * Create the option table for this widget class. If it has already - * been created, the cached pointer will be returned. + * Create the option table for this widget class. If it has already been + * created, the cached pointer will be returned. */ optionTable = Tk_CreateOptionTable(interp, optionSpecs[type]); /* - * Pre-process the argument list. Scan through it to find any - * "-class", "-screen", "-visual", and "-colormap" options. These - * arguments need to be processed specially, before the window - * is configured using the usual Tk mechanisms. + * Pre-process the argument list. Scan through it to find any "-class", + * "-screen", "-visual", and "-colormap" options. These arguments need to + * be processed specially, before the window is configured using the usual + * Tk mechanisms. */ className = colormapName = screenName = visualName = useOption = NULL; @@ -515,8 +494,8 @@ CreateFrame(clientData, interp, objc, objv, type, appName) continue; } c = arg[1]; - if ((c == 'c') && (strncmp(arg, "-class", (unsigned) length) == 0) - && (length >= 3)) { + if ((c == 'c') && (length >= 3) + && (strncmp(arg, "-class", (unsigned) length) == 0)) { className = Tcl_GetString(objv[i+1]); } else if ((c == 'c') && (strncmp(arg, "-colormap", (unsigned) length) == 0)) { @@ -534,18 +513,17 @@ CreateFrame(clientData, interp, objc, objv, type, appName) } /* - * Create the window, and deal with the special options -use, - * -classname, -colormap, -screenname, and -visual. These options - * must be handle before calling ConfigureFrame below, and they must - * also be processed in a particular order, for the following - * reasons: - * 1. Must set the window's class before calling ConfigureFrame, - * so that unspecified options are looked up in the option - * database using the correct class. - * 2. Must set visual information before calling ConfigureFrame - * so that colors are allocated in a proper colormap. + * Create the window, and deal with the special options -use, -classname, + * -colormap, -screenname, and -visual. These options must be handle + * before calling ConfigureFrame below, and they must also be processed in + * a particular order, for the following reasons: + * 1. Must set the window's class before calling ConfigureFrame, so that + * unspecified options are looked up in the option database using the + * correct class. + * 2. Must set visual information before calling ConfigureFrame so that + * colors are allocated in a proper colormap. * 3. Must call TkpUseWindow before setting non-default visual - * information, since TkpUseWindow changes the defaults. + * information, since TkpUseWindow changes the defaults. */ if (screenName == NULL) { @@ -553,88 +531,93 @@ CreateFrame(clientData, interp, objc, objv, type, appName) } /* - * Main window associated with interpreter. - * If we're called by Tk_Init to create a - * new application, then this is NULL. + * Main window associated with interpreter. If we're called by Tk_Init to + * create a new application, then this is NULL. */ tkwin = Tk_MainWindow(interp); if (tkwin != NULL) { - new = Tk_CreateWindowFromPath(interp, tkwin, Tcl_GetString(objv[1]), + newWin = Tk_CreateWindowFromPath(interp, tkwin, Tcl_GetString(objv[1]), screenName); } else if (appName == NULL) { /* - * This occurs when someone tried to create a frame/toplevel - * while we are being destroyed. Let an error be thrown. + * This occurs when someone tried to create a frame/toplevel while we + * are being destroyed. Let an error be thrown. */ Tcl_AppendResult(interp, "unable to create widget \"", - Tcl_GetString(objv[1]), "\"", (char *) NULL); - new = NULL; + Tcl_GetString(objv[1]), "\"", NULL); + newWin = NULL; } else { /* - * We were called from Tk_Init; create a new application. + * We were called from Tk_Init; create a new application. */ - new = TkCreateMainWindow(interp, screenName, appName); + newWin = TkCreateMainWindow(interp, screenName, appName); } - if (new == NULL) { + if (newWin == NULL) { goto error; + } else { + /* + * Mark Tk frames as suitable candidates for [wm manage] + */ + TkWindow *winPtr = (TkWindow *)newWin; + winPtr->flags |= TK_WM_MANAGEABLE; } if (className == NULL) { - className = Tk_GetOption(new, "class", "Class"); + className = Tk_GetOption(newWin, "class", "Class"); if (className == NULL) { className = classNames[type]; } } - Tk_SetClass(new, className); + Tk_SetClass(newWin, className); if (useOption == NULL) { - useOption = Tk_GetOption(new, "use", "Use"); + useOption = Tk_GetOption(newWin, "use", "Use"); } if ((useOption != NULL) && (*useOption != 0)) { - if (TkpUseWindow(interp, new, useOption) != TCL_OK) { + if (TkpUseWindow(interp, newWin, useOption) != TCL_OK) { goto error; } } if (visualName == NULL) { - visualName = Tk_GetOption(new, "visual", "Visual"); + visualName = Tk_GetOption(newWin, "visual", "Visual"); } if (colormapName == NULL) { - colormapName = Tk_GetOption(new, "colormap", "Colormap"); + colormapName = Tk_GetOption(newWin, "colormap", "Colormap"); } if ((colormapName != NULL) && (*colormapName == 0)) { colormapName = NULL; } if (visualName != NULL) { - visual = Tk_GetVisual(interp, new, visualName, &depth, - (colormapName == NULL) ? &colormap : (Colormap *) NULL); + visual = Tk_GetVisual(interp, newWin, visualName, &depth, + (colormapName == NULL) ? &colormap : NULL); if (visual == NULL) { goto error; } - Tk_SetWindowVisual(new, visual, depth, colormap); + Tk_SetWindowVisual(newWin, visual, depth, colormap); } if (colormapName != NULL) { - colormap = Tk_GetColormap(interp, new, colormapName); + colormap = Tk_GetColormap(interp, newWin, colormapName); if (colormap == None) { goto error; } - Tk_SetWindowColormap(new, colormap); + Tk_SetWindowColormap(newWin, colormap); } /* - * For top-level windows, provide an initial geometry request of - * 200x200, just so the window looks nicer on the screen if it - * doesn't request a size for itself. + * For top-level windows, provide an initial geometry request of 200x200, + * just so the window looks nicer on the screen if it doesn't request a + * size for itself. */ if (type == TYPE_TOPLEVEL) { - Tk_GeometryRequest(new, 200, 200); + Tk_GeometryRequest(newWin, 200, 200); } /* - * Create the widget record, process configuration options, and - * create event handlers. Then fill in a few additional fields - * in the widget record from the special options. + * Create the widget record, process configuration options, and create + * event handlers. Then fill in a few additional fields in the widget + * record from the special options. */ if (type == TYPE_LABELFRAME) { @@ -644,11 +627,11 @@ CreateFrame(clientData, interp, objc, objv, type, appName) framePtr = (Frame *) ckalloc(sizeof(Frame)); memset((void *) framePtr, 0, (sizeof(Frame))); } - framePtr->tkwin = new; - framePtr->display = Tk_Display(new); + framePtr->tkwin = newWin; + framePtr->display = Tk_Display(newWin); framePtr->interp = interp; framePtr->widgetCmd = Tcl_CreateObjCommand(interp, - Tk_PathName(new), FrameWidgetObjCmd, + Tk_PathName(newWin), FrameWidgetObjCmd, (ClientData) framePtr, FrameCmdDeletedProc); framePtr->optionTable = optionTable; framePtr->type = type; @@ -665,14 +648,15 @@ CreateFrame(clientData, interp, objc, objv, type, appName) /* * Store backreference to frame widget in window structure. */ - Tk_SetClassProcs(new, &frameClass, (ClientData) framePtr); + + Tk_SetClassProcs(newWin, &frameClass, (ClientData) framePtr); mask = ExposureMask | StructureNotifyMask | FocusChangeMask; if (type == TYPE_TOPLEVEL) { - mask |= ActivateMask; + mask |= ActivateMask; } - Tk_CreateEventHandler(new, mask, FrameEventProc, (ClientData) framePtr); - if ((Tk_InitOptions(interp, (char *) framePtr, optionTable, new) + Tk_CreateEventHandler(newWin, mask, FrameEventProc, (ClientData) framePtr); + if ((Tk_InitOptions(interp, (char *) framePtr, optionTable, newWin) != TCL_OK) || (ConfigureFrame(interp, framePtr, objc-2, objv+2) != TCL_OK)) { goto error; @@ -682,19 +666,19 @@ CreateFrame(clientData, interp, objc, objv, type, appName) TkpMakeContainer(framePtr->tkwin); } else { Tcl_AppendResult(interp, "A window cannot have both the -use ", - "and the -container option set.", (char *) NULL); + "and the -container option set.", NULL); goto error; } } if (type == TYPE_TOPLEVEL) { Tcl_DoWhenIdle(MapFrame, (ClientData) framePtr); } - Tcl_SetResult(interp, Tk_PathName(new), TCL_STATIC); + Tcl_SetResult(interp, Tk_PathName(newWin), TCL_STATIC); return TCL_OK; - error: - if (new != NULL) { - Tk_DestroyWindow(new); + error: + if (newWin != NULL) { + Tk_DestroyWindow(newWin); } return TCL_ERROR; } @@ -704,9 +688,9 @@ CreateFrame(clientData, interp, objc, objv, type, appName) * * FrameWidgetObjCmd -- * - * This procedure is invoked to process the Tcl command - * that corresponds to a frame widget. See the user - * documentation for details on what it does. + * This function is invoked to process the Tcl command that corresponds + * to a frame widget. See the user documentation for details on what it + * does. * * Results: * A standard Tcl result. @@ -718,14 +702,14 @@ CreateFrame(clientData, interp, objc, objv, type, appName) */ static int -FrameWidgetObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Information about frame widget. */ - Tcl_Interp *interp; /* Current interpreter. */ - int objc; /* Number of arguments. */ - Tcl_Obj *CONST objv[]; /* Argument objects. */ +FrameWidgetObjCmd( + ClientData clientData, /* Information about frame widget. */ + Tcl_Interp *interp, /* Current interpreter. */ + int objc, /* Number of arguments. */ + Tcl_Obj *CONST objv[]) /* Argument objects. */ { static CONST char *frameOptions[] = { - "cget", "configure", (char *) NULL + "cget", "configure", NULL }; enum options { FRAME_CGET, FRAME_CONFIGURE @@ -745,27 +729,26 @@ FrameWidgetObjCmd(clientData, interp, objc, objv) } Tcl_Preserve((ClientData) framePtr); switch ((enum options) index) { - case FRAME_CGET: { + case FRAME_CGET: if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "option"); result = TCL_ERROR; goto done; } - objPtr = Tk_GetOptionValue(interp, (char *) framePtr, + objPtr = Tk_GetOptionValue(interp, (char *) framePtr, framePtr->optionTable, objv[2], framePtr->tkwin); - if (objPtr == NULL) { + if (objPtr == NULL) { result = TCL_ERROR; goto done; - } else { + } else { Tcl_SetObjResult(interp, objPtr); - } + } break; - } - case FRAME_CONFIGURE: { + case FRAME_CONFIGURE: if (objc <= 3) { objPtr = Tk_GetOptionInfo(interp, (char *) framePtr, framePtr->optionTable, - (objc == 3) ? objv[2] : (Tcl_Obj *) NULL, + (objc == 3) ? objv[2] : NULL, framePtr->tkwin); if (objPtr == NULL) { result = TCL_ERROR; @@ -775,8 +758,8 @@ FrameWidgetObjCmd(clientData, interp, objc, objv) } } else { /* - * Don't allow the options -class, -colormap, -container, - * -newcmap, -screen, -use, or -visual to be changed. + * Don't allow the options -class, -colormap, -container, -screen, + * -use, or -visual to be changed. */ for (i = 2; i < objc; i++) { @@ -785,34 +768,47 @@ FrameWidgetObjCmd(clientData, interp, objc, objv) continue; } c = arg[1]; - if (((c == 'c') - && (strncmp(arg, "-class", (unsigned) length) == 0) - && (length >= 2)) - || ((c == 'c') - && (strncmp(arg, "-colormap", (unsigned) length) == 0) - && (length >= 3)) - || ((c == 'c') - && (strncmp(arg, "-container", (unsigned) length) == 0) - && (length >= 3)) - || ((c == 's') && (framePtr->type == TYPE_TOPLEVEL) - && (strncmp(arg, "-screen", (unsigned) length) == 0)) - || ((c == 'u') && (framePtr->type == TYPE_TOPLEVEL) - && (strncmp(arg, "-use", (unsigned) length) == 0)) - || ((c == 'v') - && (strncmp(arg, "-visual", (unsigned) length) ==0))) { - Tcl_AppendResult(interp, "can't modify ", arg, - " option after widget is created", (char *) NULL); - result = TCL_ERROR; - goto done; + if (((c == 'c') && (length >= 2) + && (strncmp(arg, "-class", (unsigned)length) == 0)) + || ((c == 'c') && (length >= 3) + && (strncmp(arg, "-colormap", (unsigned)length) == 0)) + || ((c == 'c') && (length >= 3) + && (strncmp(arg, "-container", (unsigned)length) == 0)) + || ((c == 's') && (framePtr->type == TYPE_TOPLEVEL) + && (strncmp(arg, "-screen", (unsigned)length) == 0)) + || ((c == 'u') && (framePtr->type == TYPE_TOPLEVEL) + && (strncmp(arg, "-use", (unsigned)length) == 0)) + || ((c == 'v') + && (strncmp(arg, "-visual", (unsigned)length) == 0))) { + + #ifdef SUPPORT_CONFIG_EMBEDDED + if (c == 'u') { + CONST char *string = Tcl_GetString(objv[i+1]); + if (TkpUseWindow(interp, framePtr->tkwin, + string) != TCL_OK) { + result = TCL_ERROR; + goto done; + } + } else { + Tcl_AppendResult(interp, "can't modify ", arg, + " option after widget is created", NULL); + result = TCL_ERROR; + goto done; + } + #else + Tcl_AppendResult(interp, "can't modify ", arg, + " option after widget is created", NULL); + result = TCL_ERROR; + goto done; + #endif } } result = ConfigureFrame(interp, framePtr, objc-2, objv+2); } break; - } } - done: + done: Tcl_Release((ClientData) framePtr); return result; } @@ -822,9 +818,9 @@ FrameWidgetObjCmd(clientData, interp, objc, objv) * * DestroyFrame -- * - * This procedure is invoked by Tcl_EventuallyFree or Tcl_Release - * to clean up the internal structure of a frame at a safe time - * (when no-one is using it anymore). + * This function is invoked by Tcl_EventuallyFree or Tcl_Release to clean + * up the internal structure of a frame at a safe time (when no-one is + * using it anymore). * * Results: * None. @@ -836,8 +832,8 @@ FrameWidgetObjCmd(clientData, interp, objc, objv) */ static void -DestroyFrame(memPtr) - char *memPtr; /* Info about frame widget. */ +DestroyFrame( + char *memPtr) /* Info about frame widget. */ { register Frame *framePtr = (Frame *) memPtr; register Labelframe *labelframePtr = (Labelframe *) memPtr; @@ -859,10 +855,9 @@ DestroyFrame(memPtr) * * DestroyFramePartly -- * - * This procedure is invoked to clean up everything that needs - * tkwin to be defined when deleted. During the destruction - * process tkwin is always set to NULL and this procedure must - * be called before that happens. + * This function is invoked to clean up everything that needs tkwin to be + * defined when deleted. During the destruction process tkwin is always + * set to NULL and this function must be called before that happens. * * Results: * None. @@ -874,16 +869,15 @@ DestroyFrame(memPtr) */ static void -DestroyFramePartly(framePtr) - Frame *framePtr; /* Info about frame widget. */ +DestroyFramePartly( + Frame *framePtr) /* Info about frame widget. */ { register Labelframe *labelframePtr = (Labelframe *) framePtr; if (framePtr->type == TYPE_LABELFRAME && labelframePtr->labelWin != NULL) { Tk_DeleteEventHandler(labelframePtr->labelWin, StructureNotifyMask, FrameStructureProc, (ClientData) framePtr); - Tk_ManageGeometry(labelframePtr->labelWin, (Tk_GeomMgr *) NULL, - (ClientData) NULL); + Tk_ManageGeometry(labelframePtr->labelWin, NULL, (ClientData) NULL); if (framePtr->tkwin != Tk_Parent(labelframePtr->labelWin)) { Tk_UnmaintainGeometry(labelframePtr->labelWin, framePtr->tkwin); } @@ -892,7 +886,7 @@ DestroyFramePartly(framePtr) } Tk_FreeConfigOptions((char *) framePtr, framePtr->optionTable, - framePtr->tkwin); + framePtr->tkwin); } /* @@ -900,29 +894,28 @@ DestroyFramePartly(framePtr) * * ConfigureFrame -- * - * This procedure is called to process an objv/objc list, plus - * the Tk option database, in order to configure (or - * reconfigure) a frame widget. + * This function is called to process an objv/objc list, plus the Tk + * option database, in order to configure (or reconfigure) a frame + * widget. * * Results: - * The return value is a standard Tcl result. If TCL_ERROR is - * returned, then the interp's result contains an error message. + * The return value is a standard Tcl result. If TCL_ERROR is returned, + * then the interp's result contains an error message. * * Side effects: - * Configuration information, such as text string, colors, font, - * etc. get set for framePtr; old resources get freed, if there - * were any. + * Configuration information, such as text string, colors, font, etc. get + * set for framePtr; old resources get freed, if there were any. * *---------------------------------------------------------------------- */ static int -ConfigureFrame(interp, framePtr, objc, objv) - Tcl_Interp *interp; /* Used for error reporting. */ - register Frame *framePtr; /* Information about widget; may or may - * not already have values for some fields. */ - int objc; /* Number of valid entries in objv. */ - Tcl_Obj *CONST objv[]; /* Arguments. */ +ConfigureFrame( + Tcl_Interp *interp, /* Used for error reporting. */ + register Frame *framePtr, /* Information about widget; may or may not + * already have values for some fields. */ + int objc, /* Number of valid entries in objv. */ + Tcl_Obj *CONST objv[]) /* Arguments. */ { Tk_SavedOptions savedOptions; char *oldMenuName; @@ -932,7 +925,7 @@ ConfigureFrame(interp, framePtr, objc, objv) /* * Need the old menubar name for the menu code to delete it. */ - + if (framePtr->menuName == NULL) { oldMenuName = NULL; } else { @@ -945,7 +938,7 @@ ConfigureFrame(interp, framePtr, objc, objv) } if (Tk_SetOptions(interp, (char *) framePtr, framePtr->optionTable, objc, objv, - framePtr->tkwin, &savedOptions, (int *) NULL) != TCL_OK) { + framePtr->tkwin, &savedOptions, NULL) != TCL_OK) { if (oldMenuName != NULL) { ckfree(oldMenuName); } @@ -958,10 +951,11 @@ ConfigureFrame(interp, framePtr, objc, objv) * A few of the options require additional processing. */ - if (((oldMenuName == NULL) && (framePtr->menuName != NULL)) + if ((((oldMenuName == NULL) && (framePtr->menuName != NULL)) || ((oldMenuName != NULL) && (framePtr->menuName == NULL)) || ((oldMenuName != NULL) && (framePtr->menuName != NULL) - && strcmp(oldMenuName, framePtr->menuName) != 0)) { + && strcmp(oldMenuName, framePtr->menuName) != 0)) + && framePtr->type == TYPE_TOPLEVEL) { TkSetWindowMenuBar(interp, framePtr->tkwin, oldMenuName, framePtr->menuName); } @@ -987,8 +981,8 @@ ConfigureFrame(interp, framePtr, objc, objv) } /* - * If a -labelwidget is specified, check that it is valid and set - * up geometry management for it. + * If a -labelwidget is specified, check that it is valid and set up + * geometry management for it. */ if (framePtr->type == TYPE_LABELFRAME) { @@ -996,8 +990,7 @@ ConfigureFrame(interp, framePtr, objc, objv) if (oldWindow != NULL) { Tk_DeleteEventHandler(oldWindow, StructureNotifyMask, FrameStructureProc, (ClientData) framePtr); - Tk_ManageGeometry(oldWindow, (Tk_GeomMgr *) NULL, - (ClientData) NULL); + Tk_ManageGeometry(oldWindow, NULL, (ClientData) NULL); Tk_UnmaintainGeometry(oldWindow, framePtr->tkwin); Tk_UnmapWindow(oldWindow); } @@ -1005,10 +998,9 @@ ConfigureFrame(interp, framePtr, objc, objv) Tk_Window ancestor, parent, sibling = NULL; /* - * Make sure that the frame is either the parent of the - * window used as label or a descendant of that - * parent. Also, don't allow a top-level window to be - * managed inside the frame. + * Make sure that the frame is either the parent of the window + * used as label or a descendant of that parent. Also, don't + * allow a top-level window to be managed inside the frame. */ parent = Tk_Parent(labelframePtr->labelWin); @@ -1022,7 +1014,7 @@ ConfigureFrame(interp, framePtr, objc, objv) badWindow: Tcl_AppendResult(interp, "can't use ", Tk_PathName(labelframePtr->labelWin), - " as label in this frame", (char *) NULL); + " as label in this frame", NULL); labelframePtr->labelWin = NULL; return TCL_ERROR; } @@ -1040,9 +1032,8 @@ ConfigureFrame(interp, framePtr, objc, objv) (ClientData) framePtr); /* - * If the frame is not parent to the label, make - * sure the label is above its sibling in the stacking - * order. + * If the frame is not parent to the label, make sure the + * label is above its sibling in the stacking order. */ if (sibling != NULL) { @@ -1062,22 +1053,22 @@ ConfigureFrame(interp, framePtr, objc, objv) * * FrameWorldChanged -- * - * This procedure is called when the world has changed in some - * way and the widget needs to recompute all its graphics contexts - * and determine its new geometry. + * This function is called when the world has changed in some way and the + * widget needs to recompute all its graphics contexts and determine its + * new geometry. * * Results: - * None. + * None. * * Side effects: - * Frame will be relayed out and redisplayed. + * Frame will be relayed out and redisplayed. * *--------------------------------------------------------------------------- */ - + static void -FrameWorldChanged(instanceData) - ClientData instanceData; /* Information about widget. */ +FrameWorldChanged( + ClientData instanceData) /* Information about widget. */ { Frame *framePtr = (Frame *) instanceData; Labelframe *labelframePtr = (Labelframe *) framePtr; @@ -1096,8 +1087,8 @@ FrameWorldChanged(instanceData) if (framePtr->type == TYPE_LABELFRAME) { /* - * The textGC is needed even in the labelWin case, so it's - * always created for a labelframe. + * The textGC is needed even in the labelWin case, so it's always + * created for a labelframe. */ gcValues.font = Tk_FontId(labelframePtr->tkfont); @@ -1113,7 +1104,7 @@ FrameWorldChanged(instanceData) /* * Calculate label size. */ - + labelframePtr->labelReqWidth = labelframePtr->labelReqHeight = 0; if (anyTextLabel) { @@ -1129,13 +1120,13 @@ FrameWorldChanged(instanceData) labelframePtr->labelReqHeight = Tk_ReqHeight(labelframePtr->labelWin); } - /* - * Make sure label size is at least as big as the border. - * This simplifies later calculations and gives a better - * appearance with thick borders. + /* + * Make sure label size is at least as big as the border. This + * simplifies later calculations and gives a better appearance with + * thick borders. */ - - if ((labelframePtr->labelAnchor >= LABELANCHOR_N) && + + if ((labelframePtr->labelAnchor >= LABELANCHOR_N) && (labelframePtr->labelAnchor <= LABELANCHOR_SW)) { if (labelframePtr->labelReqHeight < framePtr->borderWidth) { labelframePtr->labelReqHeight = framePtr->borderWidth; @@ -1151,34 +1142,34 @@ FrameWorldChanged(instanceData) * Calculate individual border widths. */ - bWidthBottom = bWidthTop = bWidthRight = bWidthLeft = - framePtr->borderWidth + framePtr->highlightWidth; + bWidthBottom = bWidthTop = bWidthRight = bWidthLeft = + framePtr->borderWidth + framePtr->highlightWidth; bWidthLeft += framePtr->padX; bWidthRight += framePtr->padX; bWidthTop += framePtr->padY; bWidthBottom += framePtr->padY; - + if (anyTextLabel || anyWindowLabel) { switch (labelframePtr->labelAnchor) { - case LABELANCHOR_E: - case LABELANCHOR_EN: - case LABELANCHOR_ES: + case LABELANCHOR_E: + case LABELANCHOR_EN: + case LABELANCHOR_ES: bWidthRight += labelframePtr->labelReqWidth - framePtr->borderWidth; break; - case LABELANCHOR_N: - case LABELANCHOR_NE: - case LABELANCHOR_NW: + case LABELANCHOR_N: + case LABELANCHOR_NE: + case LABELANCHOR_NW: bWidthTop += labelframePtr->labelReqHeight - framePtr->borderWidth; break; - case LABELANCHOR_S: - case LABELANCHOR_SE: - case LABELANCHOR_SW: + case LABELANCHOR_S: + case LABELANCHOR_SE: + case LABELANCHOR_SW: bWidthBottom += labelframePtr->labelReqHeight - framePtr->borderWidth; break; - default: + default: bWidthLeft += labelframePtr->labelReqWidth - framePtr->borderWidth; break; } @@ -1197,11 +1188,12 @@ FrameWorldChanged(instanceData) int minwidth = labelframePtr->labelReqWidth; int minheight = labelframePtr->labelReqHeight; int padding = framePtr->highlightWidth; + if (framePtr->borderWidth > 0) { padding += framePtr->borderWidth + LABELMARGIN; } padding *= 2; - if ((labelframePtr->labelAnchor >= LABELANCHOR_N) && + if ((labelframePtr->labelAnchor >= LABELANCHOR_N) && (labelframePtr->labelAnchor <= LABELANCHOR_SW)) { minwidth += padding; minheight += framePtr->borderWidth + framePtr->highlightWidth; @@ -1229,9 +1221,9 @@ FrameWorldChanged(instanceData) * * ComputeFrameGeometry -- * - * This procedure is called to compute various geometrical - * information for a frame, such as where various things get - * displayed. It's called when the window is reconfigured. + * This function is called to compute various geometrical information for + * a frame, such as where various things get displayed. It's called when + * the window is reconfigured. * * Results: * None. @@ -1243,8 +1235,8 @@ FrameWorldChanged(instanceData) */ static void -ComputeFrameGeometry(framePtr) - register Frame *framePtr; /* Information about widget. */ +ComputeFrameGeometry( + register Frame *framePtr) /* Information about widget. */ { int otherWidth, otherHeight, otherWidthT, otherHeightT, padding; int maxWidth, maxHeight; @@ -1256,12 +1248,13 @@ ComputeFrameGeometry(framePtr) */ if (framePtr->type != TYPE_LABELFRAME) return; - if ((labelframePtr->textPtr == NULL) && - (labelframePtr->labelWin == NULL)) return; + if (labelframePtr->textPtr == NULL && labelframePtr->labelWin == NULL) { + return; + } tkwin = framePtr->tkwin; - /* + /* * Calculate the available size for the label */ @@ -1270,15 +1263,15 @@ ComputeFrameGeometry(framePtr) padding = framePtr->highlightWidth; if (framePtr->borderWidth > 0) { - padding += framePtr->borderWidth + LABELMARGIN; + padding += framePtr->borderWidth + LABELMARGIN; } padding *= 2; maxHeight = Tk_Height(tkwin); maxWidth = Tk_Width(tkwin); - if ((labelframePtr->labelAnchor >= LABELANCHOR_N) && - (labelframePtr->labelAnchor <= LABELANCHOR_SW)) { + if ((labelframePtr->labelAnchor >= LABELANCHOR_N) && + (labelframePtr->labelAnchor <= LABELANCHOR_SW)) { maxWidth -= padding; if (maxWidth < 1) maxWidth = 1; } else { @@ -1293,9 +1286,9 @@ ComputeFrameGeometry(framePtr) } /* - * Calculate label and text position. - * The text's position is based on the requested size (= the text's - * real size) to get proper alignment if the text does not fit. + * Calculate label and text position. The text's position is based on the + * requested size (= the text's real size) to get proper alignment if the + * text does not fit. */ otherWidth = Tk_Width(tkwin) - labelframePtr->labelBox.width; @@ -1305,64 +1298,64 @@ ComputeFrameGeometry(framePtr) padding = framePtr->highlightWidth; switch (labelframePtr->labelAnchor) { - case LABELANCHOR_E: - case LABELANCHOR_EN: - case LABELANCHOR_ES: - labelframePtr->labelTextX = otherWidthT - padding; - labelframePtr->labelBox.x = otherWidth - padding; - break; - case LABELANCHOR_N: - case LABELANCHOR_NE: - case LABELANCHOR_NW: - labelframePtr->labelTextY = padding; - labelframePtr->labelBox.y = padding; - break; - case LABELANCHOR_S: - case LABELANCHOR_SE: - case LABELANCHOR_SW: - labelframePtr->labelTextY = otherHeightT - padding; - labelframePtr->labelBox.y = otherHeight - padding; - break; - default: - labelframePtr->labelTextX = padding; - labelframePtr->labelBox.x = padding; - break; + case LABELANCHOR_E: + case LABELANCHOR_EN: + case LABELANCHOR_ES: + labelframePtr->labelTextX = otherWidthT - padding; + labelframePtr->labelBox.x = otherWidth - padding; + break; + case LABELANCHOR_N: + case LABELANCHOR_NE: + case LABELANCHOR_NW: + labelframePtr->labelTextY = padding; + labelframePtr->labelBox.y = padding; + break; + case LABELANCHOR_S: + case LABELANCHOR_SE: + case LABELANCHOR_SW: + labelframePtr->labelTextY = otherHeightT - padding; + labelframePtr->labelBox.y = otherHeight - padding; + break; + default: + labelframePtr->labelTextX = padding; + labelframePtr->labelBox.x = padding; + break; } if (framePtr->borderWidth > 0) { - padding += framePtr->borderWidth + LABELMARGIN; + padding += framePtr->borderWidth + LABELMARGIN; } switch (labelframePtr->labelAnchor) { - case LABELANCHOR_NW: - case LABELANCHOR_SW: - labelframePtr->labelTextX = padding; - labelframePtr->labelBox.x = padding; - break; - case LABELANCHOR_N: - case LABELANCHOR_S: - labelframePtr->labelTextX = otherWidthT / 2; - labelframePtr->labelBox.x = otherWidth / 2; - break; - case LABELANCHOR_NE: - case LABELANCHOR_SE: - labelframePtr->labelTextX = otherWidthT - padding; - labelframePtr->labelBox.x = otherWidth - padding; - break; - case LABELANCHOR_EN: - case LABELANCHOR_WN: - labelframePtr->labelTextY = padding; - labelframePtr->labelBox.y = padding; - break; - case LABELANCHOR_E: - case LABELANCHOR_W: - labelframePtr->labelTextY = otherHeightT / 2; - labelframePtr->labelBox.y = otherHeight / 2; - break; - default: + case LABELANCHOR_NW: + case LABELANCHOR_SW: + labelframePtr->labelTextX = padding; + labelframePtr->labelBox.x = padding; + break; + case LABELANCHOR_N: + case LABELANCHOR_S: + labelframePtr->labelTextX = otherWidthT / 2; + labelframePtr->labelBox.x = otherWidth / 2; + break; + case LABELANCHOR_NE: + case LABELANCHOR_SE: + labelframePtr->labelTextX = otherWidthT - padding; + labelframePtr->labelBox.x = otherWidth - padding; + break; + case LABELANCHOR_EN: + case LABELANCHOR_WN: + labelframePtr->labelTextY = padding; + labelframePtr->labelBox.y = padding; + break; + case LABELANCHOR_E: + case LABELANCHOR_W: + labelframePtr->labelTextY = otherHeightT / 2; + labelframePtr->labelBox.y = otherHeight / 2; + break; + default: labelframePtr->labelTextY = otherHeightT - padding; labelframePtr->labelBox.y = otherHeight - padding; - break; + break; } } @@ -1371,21 +1364,20 @@ ComputeFrameGeometry(framePtr) * * DisplayFrame -- * - * This procedure is invoked to display a frame widget. + * This function is invoked to display a frame widget. * * Results: * None. * * Side effects: - * Commands are output to X to display the frame in its - * current mode. + * Commands are output to X to display the frame in its current mode. * *---------------------------------------------------------------------- */ static void -DisplayFrame(clientData) - ClientData clientData; /* Information about widget. */ +DisplayFrame( + ClientData clientData) /* Information about widget. */ { register Frame *framePtr = (Frame *) clientData; register Tk_Window tkwin = framePtr->tkwin; @@ -1394,8 +1386,7 @@ DisplayFrame(clientData) TkRegion clipRegion = NULL; framePtr->flags &= ~REDRAW_PENDING; - if ((framePtr->tkwin == NULL) || !Tk_IsMapped(tkwin) - || framePtr->isContainer) { + if ((framePtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) { return; } @@ -1406,7 +1397,7 @@ DisplayFrame(clientData) hlWidth = framePtr->highlightWidth; if (hlWidth != 0) { - GC fgGC, bgGC; + GC fgGC, bgGC; bgGC = Tk_GCForColor(framePtr->highlightBgColorPtr, Tk_WindowId(tkwin)); @@ -1429,11 +1420,11 @@ DisplayFrame(clientData) if (framePtr->type != TYPE_LABELFRAME) { /* - * Pass to platform specific draw function. In general, it just - * draws a simple rectangle, but it may "theme" the background. + * Pass to platform specific draw function. In general, it just draws + * a simple rectangle, but it may "theme" the background. */ - noLabel: + noLabel: TkpDrawFrame(tkwin, framePtr->border, hlWidth, framePtr->borderWidth, framePtr->relief); } else { @@ -1446,10 +1437,10 @@ DisplayFrame(clientData) #ifndef TK_NO_DOUBLE_BUFFERING /* - * In order to avoid screen flashes, this procedure redraws the - * frame into off-screen memory, then copies it back on-screen - * in a single operation. This means there's no point in time - * where the on-screen image has been cleared. + * In order to avoid screen flashes, this function redraws the frame + * into off-screen memory, then copies it back on-screen in a single + * operation. This means there's no point in time where the on-screen + * image has been cleared. */ pixmap = Tk_GetPixmap(framePtr->display, Tk_WindowId(tkwin), @@ -1458,7 +1449,7 @@ DisplayFrame(clientData) pixmap = Tk_WindowId(tkwin); #endif /* TK_NO_DOUBLE_BUFFERING */ - /* + /* * Clear the pixmap. */ @@ -1474,61 +1465,56 @@ DisplayFrame(clientData) bdY2 = Tk_Height(tkwin) - hlWidth; switch (labelframePtr->labelAnchor) { - case LABELANCHOR_E: - case LABELANCHOR_EN: - case LABELANCHOR_ES: - bdX2 -= (labelframePtr->labelBox.width - framePtr->borderWidth) - / 2; + case LABELANCHOR_E: + case LABELANCHOR_EN: + case LABELANCHOR_ES: + bdX2 -= (labelframePtr->labelBox.width-framePtr->borderWidth) / 2; break; - case LABELANCHOR_N: - case LABELANCHOR_NE: - case LABELANCHOR_NW: - /* - * Since the glyphs of the text tend to be in the lower part - * we favor a lower border position by rounding up. + case LABELANCHOR_N: + case LABELANCHOR_NE: + case LABELANCHOR_NW: + /* + * Since the glyphs of the text tend to be in the lower part we + * favor a lower border position by rounding up. */ - bdY1 += (labelframePtr->labelBox.height - framePtr->borderWidth +1) - / 2; + bdY1 += (labelframePtr->labelBox.height-framePtr->borderWidth+1)/2; break; - case LABELANCHOR_S: - case LABELANCHOR_SE: - case LABELANCHOR_SW: - bdY2 -= (labelframePtr->labelBox.height - framePtr->borderWidth) - / 2; + case LABELANCHOR_S: + case LABELANCHOR_SE: + case LABELANCHOR_SW: + bdY2 -= (labelframePtr->labelBox.height-framePtr->borderWidth) / 2; break; - default: - bdX1 += (labelframePtr->labelBox.width - framePtr->borderWidth) - / 2; + default: + bdX1 += (labelframePtr->labelBox.width-framePtr->borderWidth) / 2; break; } - /* - * Draw border - */ + /* + * Draw border + */ Tk_Draw3DRectangle(tkwin, pixmap, framePtr->border, bdX1, bdY1, bdX2 - bdX1, bdY2 - bdY1, framePtr->borderWidth, framePtr->relief); - if (labelframePtr->labelWin == NULL) { - /* - * Clear behind the label - */ - - Tk_Fill3DRectangle(tkwin, pixmap, - framePtr->border, labelframePtr->labelBox.x, - labelframePtr->labelBox.y, labelframePtr->labelBox.width, - labelframePtr->labelBox.height, 0, TK_RELIEF_FLAT); - - /* - * Draw label. - * If there is not room for the entire label, use clipping to - * get a nice appearance. - */ - + if (labelframePtr->labelWin == NULL) { + /* + * Clear behind the label + */ + + Tk_Fill3DRectangle(tkwin, pixmap, + framePtr->border, labelframePtr->labelBox.x, + labelframePtr->labelBox.y, labelframePtr->labelBox.width, + labelframePtr->labelBox.height, 0, TK_RELIEF_FLAT); + + /* + * Draw label. If there is not room for the entire label, use + * clipping to get a nice appearance. + */ + if ((labelframePtr->labelBox.width < labelframePtr->labelReqWidth) - || (labelframePtr->labelBox.height < + || (labelframePtr->labelBox.height < labelframePtr->labelReqHeight)) { clipRegion = TkCreateRegion(); TkUnionRectWithRegion(&labelframePtr->labelBox, clipRegion, @@ -1537,37 +1523,37 @@ DisplayFrame(clientData) clipRegion); } - Tk_DrawTextLayout(framePtr->display, pixmap, - labelframePtr->textGC, labelframePtr->textLayout, - labelframePtr->labelTextX + LABELSPACING, - labelframePtr->labelTextY + LABELSPACING, 0, -1); + Tk_DrawTextLayout(framePtr->display, pixmap, + labelframePtr->textGC, labelframePtr->textLayout, + labelframePtr->labelTextX + LABELSPACING, + labelframePtr->labelTextY + LABELSPACING, 0, -1); if (clipRegion != NULL) { XSetClipMask(framePtr->display, labelframePtr->textGC, None); TkDestroyRegion(clipRegion); } - } else { + } else { /* * Reposition and map the window (but in different ways depending * on whether the frame is the window's parent). */ - + if (framePtr->tkwin == Tk_Parent(labelframePtr->labelWin)) { if ((labelframePtr->labelBox.x != Tk_X(labelframePtr->labelWin)) || (labelframePtr->labelBox.y != Tk_Y(labelframePtr->labelWin)) - || (labelframePtr->labelBox.width != + || (labelframePtr->labelBox.width != Tk_Width(labelframePtr->labelWin)) - || (labelframePtr->labelBox.height != + || (labelframePtr->labelBox.height != Tk_Height(labelframePtr->labelWin))) { Tk_MoveResizeWindow(labelframePtr->labelWin, - labelframePtr->labelBox.x, labelframePtr->labelBox.y, + labelframePtr->labelBox.x, labelframePtr->labelBox.y, labelframePtr->labelBox.width, labelframePtr->labelBox.height); } Tk_MapWindow(labelframePtr->labelWin); } else { - Tk_MaintainGeometry(labelframePtr->labelWin, framePtr->tkwin, + Tk_MaintainGeometry(labelframePtr->labelWin, framePtr->tkwin, labelframePtr->labelBox.x, labelframePtr->labelBox.y, labelframePtr->labelBox.width, labelframePtr->labelBox.height); @@ -1577,7 +1563,7 @@ DisplayFrame(clientData) #ifndef TK_NO_DOUBLE_BUFFERING /* - * Everything's been redisplayed; now copy the pixmap onto the screen + * Everything's been redisplayed; now copy the pixmap onto the screen * and free up the pixmap. */ @@ -1597,24 +1583,24 @@ DisplayFrame(clientData) * * FrameEventProc -- * - * This procedure is invoked by the Tk dispatcher on - * structure changes to a frame. For frames with 3D - * borders, this procedure is also invoked for exposures. + * This function is invoked by the Tk dispatcher on structure changes to + * a frame. For frames with 3D borders, this function is also invoked for + * exposures. * * Results: * None. * * Side effects: - * When the window gets deleted, internal structures get - * cleaned up. When it gets exposed, it is redisplayed. + * When the window gets deleted, internal structures get cleaned up. + * When it gets exposed, it is redisplayed. * *-------------------------------------------------------------- */ static void -FrameEventProc(clientData, eventPtr) - ClientData clientData; /* Information about window. */ - register XEvent *eventPtr; /* Information about event. */ +FrameEventProc( + ClientData clientData, /* Information about window. */ + register XEvent *eventPtr) /* Information about event. */ { register Frame *framePtr = (Frame *) clientData; @@ -1631,15 +1617,14 @@ FrameEventProc(clientData, eventPtr) framePtr->menuName = NULL; } if (framePtr->tkwin != NULL) { - /* - * If this window is a container, then this event could be - * coming from the embedded application, in which case - * Tk_DestroyWindow hasn't been called yet. When Tk_DestroyWindow - * is called later, then another destroy event will be generated. - * We need to be sure we ignore the second event, since the frame - * could be gone by then. To do so, delete the event handler - * explicitly (normally it's done implicitly by Tk_DestroyWindow). + * If this window is a container, then this event could be coming + * from the embedded application, in which case Tk_DestroyWindow + * hasn't been called yet. When Tk_DestroyWindow is called later, + * then another destroy event will be generated. We need to be + * sure we ignore the second event, since the frame could be gone + * by then. To do so, delete the event handler explicitly + * (normally it's done implicitly by Tk_DestroyWindow). */ /* @@ -1647,13 +1632,13 @@ FrameEventProc(clientData, eventPtr) * DestroyFrame, we must free all options now. */ - DestroyFramePartly(framePtr); + DestroyFramePartly(framePtr); Tk_DeleteEventHandler(framePtr->tkwin, ExposureMask|StructureNotifyMask|FocusChangeMask, FrameEventProc, (ClientData) framePtr); framePtr->tkwin = NULL; - Tcl_DeleteCommandFromToken(framePtr->interp, framePtr->widgetCmd); + Tcl_DeleteCommandFromToken(framePtr->interp, framePtr->widgetCmd); } if (framePtr->flags & REDRAW_PENDING) { Tcl_CancelIdleCall(DisplayFrame, (ClientData) framePtr); @@ -1680,7 +1665,7 @@ FrameEventProc(clientData, eventPtr) } return; - redraw: + redraw: if ((framePtr->tkwin != NULL) && !(framePtr->flags & REDRAW_PENDING)) { Tcl_DoWhenIdle(DisplayFrame, (ClientData) framePtr); framePtr->flags |= REDRAW_PENDING; @@ -1692,9 +1677,9 @@ FrameEventProc(clientData, eventPtr) * * FrameCmdDeletedProc -- * - * This procedure is invoked when a widget command is deleted. If - * the widget isn't already in the process of being destroyed, - * this command destroys it. + * This function is invoked when a widget command is deleted. If the + * widget isn't already in the process of being destroyed, this command + * destroys it. * * Results: * None. @@ -1706,8 +1691,8 @@ FrameEventProc(clientData, eventPtr) */ static void -FrameCmdDeletedProc(clientData) - ClientData clientData; /* Pointer to widget record for widget. */ +FrameCmdDeletedProc( + ClientData clientData) /* Pointer to widget record for widget. */ { Frame *framePtr = (Frame *) clientData; Tk_Window tkwin = framePtr->tkwin; @@ -1720,19 +1705,19 @@ FrameCmdDeletedProc(clientData) } /* - * This procedure could be invoked either because the window was - * destroyed and the command was then deleted (in which case tkwin - * is NULL) or because the command was deleted, and then this procedure - * destroys the widget. + * This function could be invoked either because the window was destroyed + * and the command was then deleted (in which case tkwin is NULL) or + * because the command was deleted, and then this function destroys the + * widget. */ if (tkwin != NULL) { - /* - * Some options need tkwin to be freed, so we free them here, - * before setting tkwin to NULL. + /* + * Some options need tkwin to be freed, so we free them here, before + * setting tkwin to NULL. */ - DestroyFramePartly(framePtr); + DestroyFramePartly(framePtr); framePtr->tkwin = NULL; Tk_DestroyWindow(tkwin); @@ -1744,8 +1729,8 @@ FrameCmdDeletedProc(clientData) * * MapFrame -- * - * This procedure is invoked as a when-idle handler to map a - * newly-created top-level frame. + * This function is invoked as a when-idle handler to map a newly-created + * top-level frame. * * Results: * None. @@ -1757,16 +1742,16 @@ FrameCmdDeletedProc(clientData) */ static void -MapFrame(clientData) - ClientData clientData; /* Pointer to frame structure. */ +MapFrame( + ClientData clientData) /* Pointer to frame structure. */ { Frame *framePtr = (Frame *) clientData; /* - * Wait for all other background events to be processed before - * mapping window. This ensures that the window's correct geometry - * will have been determined before it is first mapped, so that the - * window manager doesn't get a false idea of its desired geometry. + * Wait for all other background events to be processed before mapping + * window. This ensures that the window's correct geometry will have been + * determined before it is first mapped, so that the window manager + * doesn't get a false idea of its desired geometry. */ Tcl_Preserve((ClientData) framePtr); @@ -1776,8 +1761,8 @@ MapFrame(clientData) } /* - * After each event, make sure that the window still exists - * and quit if the window has been destroyed. + * After each event, make sure that the window still exists and quit + * if the window has been destroyed. */ if (framePtr->tkwin == NULL) { @@ -1794,24 +1779,23 @@ MapFrame(clientData) * * TkInstallFrameMenu -- * - * This function is needed when a Windows HWND is created - * and a menubar has been set to the window with a system - * menu. It notifies the menu package so that the system - * menu can be rebuilt. + * This function is needed when a Windows HWND is created and a menubar + * has been set to the window with a system menu. It notifies the menu + * package so that the system menu can be rebuilt. * * Results: * None. * * Side effects: - * The system menu (if any) is created for the menubar - * associated with this frame. + * The system menu (if any) is created for the menubar associated with + * this frame. * *-------------------------------------------------------------- */ void -TkInstallFrameMenu(tkwin) - Tk_Window tkwin; /* The window that was just created. */ +TkInstallFrameMenu( + Tk_Window tkwin) /* The window that was just created. */ { TkWindow *winPtr = (TkWindow *) tkwin; @@ -1819,9 +1803,9 @@ TkInstallFrameMenu(tkwin) Frame *framePtr; framePtr = (Frame*) winPtr->instanceData; if (framePtr == NULL) { - panic("TkInstallFrameMenu couldn't get frame pointer"); + Tcl_Panic("TkInstallFrameMenu couldn't get frame pointer"); } - TkpMenuNotifyToplevelCreate(winPtr->mainPtr->interp, + TkpMenuNotifyToplevelCreate(winPtr->mainPtr->interp, framePtr->menuName); } } @@ -1831,32 +1815,30 @@ TkInstallFrameMenu(tkwin) * * FrameStructureProc -- * - * This procedure is invoked whenever StructureNotify events - * occur for a window that's managed as label for the frame. - * This procudure's only purpose is to clean up when windows - * are deleted. + * This function is invoked whenever StructureNotify events occur for a + * window that's managed as label for the frame. This procudure's only + * purpose is to clean up when windows are deleted. * * Results: * None. * * Side effects: - * The window is disassociated from the frame when it is - * deleted. + * The window is disassociated from the frame when it is deleted. * *-------------------------------------------------------------- */ static void -FrameStructureProc(clientData, eventPtr) - ClientData clientData; /* Pointer to record describing frame. */ - XEvent *eventPtr; /* Describes what just happened. */ +FrameStructureProc( + ClientData clientData, /* Pointer to record describing frame. */ + XEvent *eventPtr) /* Describes what just happened. */ { Labelframe *labelframePtr = (Labelframe *) clientData; if (eventPtr->type == DestroyNotify) { /* - * This should only happen in a labelframe but it doesn't - * hurt to be careful. + * This should only happen in a labelframe but it doesn't hurt to be + * careful. */ if (labelframePtr->frame.type == TYPE_LABELFRAME) { @@ -1871,24 +1853,23 @@ FrameStructureProc(clientData, eventPtr) * * FrameRequestProc -- * - * This procedure is invoked whenever a window that's associated - * with a frame changes its requested dimensions. + * This function is invoked whenever a window that's associated with a + * frame changes its requested dimensions. * * Results: * None. * * Side effects: - * The size and location on the screen of the window may change. - * depending on the options specified for the frame. + * The size and location on the screen of the window may change depending + * on the options specified for the frame. * *-------------------------------------------------------------- */ static void -FrameRequestProc(clientData, tkwin) - ClientData clientData; /* Pointer to record for frame. */ - Tk_Window tkwin; /* Window that changed its desired - * size. */ +FrameRequestProc( + ClientData clientData, /* Pointer to record for frame. */ + Tk_Window tkwin) /* Window that changed its desired size. */ { Frame *framePtr = (Frame *) clientData; @@ -1900,8 +1881,8 @@ FrameRequestProc(clientData, tkwin) * * FrameLostSlaveProc -- * - * This procedure is invoked by Tk whenever some other geometry - * claims control over a slave that used to be managed by us. + * This function is invoked by Tk whenever some other geometry claims + * control over a slave that used to be managed by us. * * Results: * None. @@ -1913,19 +1894,19 @@ FrameRequestProc(clientData, tkwin) */ static void -FrameLostSlaveProc(clientData, tkwin) - ClientData clientData; /* Frame structure for slave window that - * was stolen away. */ - Tk_Window tkwin; /* Tk's handle for the slave window. */ +FrameLostSlaveProc( + ClientData clientData, /* Frame structure for slave window that was + * stolen away. */ + Tk_Window tkwin) /* Tk's handle for the slave window. */ { Frame *framePtr = (Frame *) clientData; Labelframe *labelframePtr = (Labelframe *) clientData; /* - * This should only happen in a labelframe but it doesn't - * hurt to be careful. + * This should only happen in a labelframe but it doesn't hurt to be + * careful. */ - + if (labelframePtr->frame.type == TYPE_LABELFRAME) { Tk_DeleteEventHandler(labelframePtr->labelWin, StructureNotifyMask, FrameStructureProc, (ClientData) labelframePtr); @@ -1938,20 +1919,46 @@ FrameLostSlaveProc(clientData, tkwin) FrameWorldChanged((ClientData) framePtr); } +void +TkMapTopFrame (tkwin) + Tk_Window tkwin; +{ + Frame *framePtr = ((TkWindow*)tkwin)->instanceData; + Tk_OptionTable optionTable; + if (Tk_IsTopLevel(tkwin) && framePtr->type == TYPE_FRAME) { + framePtr->type = TYPE_TOPLEVEL; + Tcl_DoWhenIdle(MapFrame, (ClientData)framePtr); + if (framePtr->menuName != NULL) { + TkSetWindowMenuBar(framePtr->interp, framePtr->tkwin, NULL, + framePtr->menuName); + } + } else if (!Tk_IsTopLevel(tkwin) && framePtr->type == TYPE_TOPLEVEL) { + framePtr->type = TYPE_FRAME; + } else { + /* Not a frame or toplevel, skip it */ + return; + } + /* + * The option table has already been created so + * the cached pointer will be returned. + */ + optionTable = Tk_CreateOptionTable(framePtr->interp, optionSpecs[framePtr->type]); + framePtr->optionTable = optionTable; +} + /* *-------------------------------------------------------------- * * TkToplevelWindowFromCommandToken -- * - * If the given command name to the command for a toplevel window - * in the given interpreter, return the tkwin for that toplevel - * window. Note that this lookup can't be done using the - * standard tkwin internal table because the command might have - * been renamed. + * If the given command name to the command for a toplevel window in the + * given interpreter, return the tkwin for that toplevel window. Note + * that this lookup can't be done using the standard tkwin internal table + * because the command might have been renamed. * * Results: - * A Tk_Window token, or NULL if the name does not refer to a - * toplevel window. + * A Tk_Window token, or NULL if the name does not refer to a toplevel + * window. * * Side effects: * None. @@ -1960,9 +1967,9 @@ FrameLostSlaveProc(clientData, tkwin) */ Tk_Window -TkToplevelWindowForCommand(interp, cmdName) - Tcl_Interp *interp; - CONST char *cmdName; +TkToplevelWindowForCommand( + Tcl_Interp *interp, + CONST char *cmdName) { Tcl_CmdInfo cmdInfo; Frame *framePtr; @@ -1979,3 +1986,11 @@ TkToplevelWindowForCommand(interp, cmdName) } return framePtr->tkwin; } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ |