summaryrefslogtreecommitdiffstats
path: root/generic/tkFrame.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2024-10-25 21:06:25 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2024-10-25 21:06:25 (GMT)
commit0d5336db012f45753abace489f18f0ca299c6961 (patch)
treeb1bf3280a9046df99226158978502eeb26f5b0a3 /generic/tkFrame.c
parente97381a6d921de403516d5b761539a450f4af83c (diff)
parent1320b8a2a9c1269a345d44d673a7a35707fbbe9c (diff)
downloadtk-core-tip-626.zip
tk-core-tip-626.tar.gz
tk-core-tip-626.tar.bz2
Merge 9.0core-tip-626
Diffstat (limited to 'generic/tkFrame.c')
-rw-r--r--generic/tkFrame.c307
1 files changed, 172 insertions, 135 deletions
diff --git a/generic/tkFrame.c b/generic/tkFrame.c
index 8e4bb93..27dab9d 100644
--- a/generic/tkFrame.c
+++ b/generic/tkFrame.c
@@ -41,19 +41,16 @@ typedef struct {
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. */
+ Tcl_Obj *classNameObj; /* Class name for widget (from configuration
+ * option). May be NULL. */
int 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
- * NULL. */
- char *visualName; /* Textual description of visual for window,
- * from -visual option. Malloc-ed, may be
- * NULL. */
- char *colormapName; /* Textual description of colormap for window,
- * from -colormap option. Malloc-ed, may be
- * NULL. */
- char *menuName; /* Textual description of menu to use for
+ Tcl_Obj *screenNameObj; /* Screen on which widget is created. Non-null
+ * only for top-levels. May be NULL. */
+ Tcl_Obj *visualNameObj; /* Textual description of visual for window,
+ * from -visual option. May be NULL. */
+ Tcl_Obj *colormapNameObj; /* Textual description of colormap for window,
+ * from -colormap option. May be NULL. */
+ Tcl_Obj *menuNameObj; /* Textual description of menu to use for
* menubar. Malloc-ed, may be NULL. */
Colormap colormap; /* If not None, identifies a colormap
* allocated for this window, which must be
@@ -61,39 +58,36 @@ typedef struct {
Tk_3DBorder border; /* Structure used to draw 3-D border and
* background. NULL means no background or
* border. */
- int borderWidth; /* Width of 3-D border (if any). */
+ Tcl_Obj *borderWidthObj; /* 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
+ Tcl_Obj *highlightWidthObj; /* 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. */
XColor *highlightColorPtr; /* Color for drawing traversal highlight. */
- int width; /* Width to request for window. <= 0 means
+ Tcl_Obj *widthObj; /* Width to request for window. <= 0 means
* don't request any size. */
- int height; /* Height to request for window. <= 0 means
+ Tcl_Obj *heightObj; /* 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
+ Tcl_Obj *takeFocusObj; /* Value of -takefocus option; not used in the
* C code, but used by keyboard traversal
- * scripts. Malloc'ed, but may be NULL. */
+ * scripts. 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
+ Tcl_Obj *useThisObj; /* If the window is embedded, this points to
* the name of the window in which it is
- * embedded (malloc'ed). For non-embedded
- * windows this is NULL. */
+ * embedded. For non-embedded windows this is NULL. */
int flags; /* Various flags; see below for
* definitions. */
- Tcl_Obj *padXPtr; /* Value of -padx option: specifies how many
+ Tcl_Obj *padXObj; /* Value of -padx option: specifies how many
* pixels of extra space to leave on left and
* right of child area. */
- int padX; /* Integer value corresponding to padXPtr. */
- Tcl_Obj *padYPtr; /* Value of -padx option: specifies how many
+ Tcl_Obj *padYObj; /* Value of -padx option: specifies how many
* pixels of extra space to leave above and
* below child area. */
- int padY; /* Integer value corresponding to padYPtr. */
Tcl_Obj *bgimgPtr; /* Value of -backgroundimage option: specifies
* image to display on window's background, or
* NULL if none. */
@@ -189,7 +183,7 @@ static const Tk_OptionSpec commonOptSpec[] = {
{TK_OPTION_SYNONYM, "-bg", NULL, NULL,
NULL, 0, TCL_INDEX_NONE, 0, "-background", 0},
{TK_OPTION_STRING, "-colormap", "colormap", "Colormap",
- DEF_FRAME_COLORMAP, TCL_INDEX_NONE, offsetof(Frame, colormapName),
+ DEF_FRAME_COLORMAP, offsetof(Frame, colormapNameObj), TCL_INDEX_NONE,
TK_OPTION_NULL_OK, 0, 0},
/*
* Having -container is useless in a labelframe since a container has
@@ -201,7 +195,7 @@ static const Tk_OptionSpec commonOptSpec[] = {
DEF_FRAME_CURSOR, TCL_INDEX_NONE, offsetof(Frame, cursor),
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_PIXELS, "-height", "height", "Height",
- DEF_FRAME_HEIGHT, TCL_INDEX_NONE, offsetof(Frame, height), 0, 0, 0},
+ DEF_FRAME_HEIGHT, offsetof(Frame, heightObj), TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_COLOR, "-highlightbackground", "highlightBackground",
"HighlightBackground", DEF_FRAME_HIGHLIGHT_BG, TCL_INDEX_NONE,
offsetof(Frame, highlightBgColorPtr), 0, 0, 0},
@@ -209,22 +203,20 @@ static const Tk_OptionSpec commonOptSpec[] = {
DEF_FRAME_HIGHLIGHT, TCL_INDEX_NONE, offsetof(Frame, highlightColorPtr),
0, 0, 0},
{TK_OPTION_PIXELS, "-highlightthickness", "highlightThickness",
- "HighlightThickness", DEF_FRAME_HIGHLIGHT_WIDTH, TCL_INDEX_NONE,
- offsetof(Frame, highlightWidth), 0, 0, 0},
+ "HighlightThickness", DEF_FRAME_HIGHLIGHT_WIDTH, offsetof(Frame, highlightWidthObj),
+ TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_PIXELS, "-padx", "padX", "Pad",
- DEF_FRAME_PADX, offsetof(Frame, padXPtr),
- offsetof(Frame, padX), 0, 0, 0},
+ DEF_FRAME_PADX, offsetof(Frame, padXObj), TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_PIXELS, "-pady", "padY", "Pad",
- DEF_FRAME_PADY, offsetof(Frame, padYPtr),
- offsetof(Frame, padY), 0, 0, 0},
+ DEF_FRAME_PADY, offsetof(Frame, padYObj), TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus",
- DEF_FRAME_TAKE_FOCUS, TCL_INDEX_NONE, offsetof(Frame, takeFocus),
+ DEF_FRAME_TAKE_FOCUS, offsetof(Frame, takeFocusObj), TCL_INDEX_NONE,
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_STRING, "-visual", "visual", "Visual",
- DEF_FRAME_VISUAL, TCL_INDEX_NONE, offsetof(Frame, visualName),
+ DEF_FRAME_VISUAL, offsetof(Frame, visualNameObj), TCL_INDEX_NONE,
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_PIXELS, "-width", "width", "Width",
- DEF_FRAME_WIDTH, TCL_INDEX_NONE, offsetof(Frame, width), 0, 0, 0},
+ DEF_FRAME_WIDTH, offsetof(Frame, widthObj), TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_END, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0}
};
@@ -237,9 +229,9 @@ static const Tk_OptionSpec frameOptSpec[] = {
{TK_OPTION_SYNONYM, "-bgimg", NULL, NULL,
NULL, 0, TCL_INDEX_NONE, 0, "-backgroundimage", 0},
{TK_OPTION_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
- DEF_FRAME_BORDER_WIDTH, TCL_INDEX_NONE, offsetof(Frame, borderWidth), 0, 0, 0},
+ DEF_FRAME_BORDER_WIDTH, offsetof(Frame, borderWidthObj), TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_STRING, "-class", "class", "Class",
- DEF_FRAME_CLASS, TCL_INDEX_NONE, offsetof(Frame, className), 0, 0, 0},
+ DEF_FRAME_CLASS, offsetof(Frame, classNameObj), TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_RELIEF, "-relief", "relief", "Relief",
DEF_FRAME_RELIEF, TCL_INDEX_NONE, offsetof(Frame, relief), 0, 0, 0},
{TK_OPTION_BOOLEAN, "-tile", "tile", "Tile",
@@ -257,21 +249,21 @@ static const Tk_OptionSpec toplevelOptSpec[] = {
{TK_OPTION_SYNONYM, "-bgimg", NULL, NULL,
NULL, 0, TCL_INDEX_NONE, 0, "-backgroundimage", 0},
{TK_OPTION_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
- DEF_FRAME_BORDER_WIDTH, TCL_INDEX_NONE, offsetof(Frame, borderWidth), 0, 0, 0},
+ DEF_FRAME_BORDER_WIDTH, offsetof(Frame, borderWidthObj), TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_STRING, "-class", "class", "Class",
- DEF_TOPLEVEL_CLASS, TCL_INDEX_NONE, offsetof(Frame, className), 0, 0, 0},
+ DEF_TOPLEVEL_CLASS, offsetof(Frame, classNameObj), TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_STRING, "-menu", "menu", "Menu",
- DEF_TOPLEVEL_MENU, TCL_INDEX_NONE, offsetof(Frame, menuName),
+ DEF_TOPLEVEL_MENU, offsetof(Frame, menuNameObj), TCL_INDEX_NONE,
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_RELIEF, "-relief", "relief", "Relief",
DEF_FRAME_RELIEF, TCL_INDEX_NONE, offsetof(Frame, relief), 0, 0, 0},
{TK_OPTION_STRING, "-screen", "screen", "Screen",
- DEF_TOPLEVEL_SCREEN, TCL_INDEX_NONE, offsetof(Frame, screenName),
+ DEF_TOPLEVEL_SCREEN, offsetof(Frame, screenNameObj), TCL_INDEX_NONE,
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_BOOLEAN, "-tile", "tile", "Tile",
DEF_FRAME_BG_TILE, TCL_INDEX_NONE, offsetof(Frame, tile), 0, 0, 0},
{TK_OPTION_STRING, "-use", "use", "Use",
- DEF_TOPLEVEL_USE, TCL_INDEX_NONE, offsetof(Frame, useThis),
+ DEF_TOPLEVEL_USE, offsetof(Frame, useThisObj), TCL_INDEX_NONE,
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_END, NULL, NULL, NULL,
NULL, 0, 0, 0, commonOptSpec, 0}
@@ -281,10 +273,10 @@ static const Tk_OptionSpec labelframeOptSpec[] = {
{TK_OPTION_SYNONYM, "-bd", NULL, NULL,
NULL, 0, TCL_INDEX_NONE, 0, "-borderwidth", 0},
{TK_OPTION_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
- DEF_LABELFRAME_BORDER_WIDTH, TCL_INDEX_NONE, offsetof(Frame, borderWidth),
+ DEF_LABELFRAME_BORDER_WIDTH, offsetof(Frame, borderWidthObj), TCL_INDEX_NONE,
0, 0, 0},
{TK_OPTION_STRING, "-class", "class", "Class",
- DEF_LABELFRAME_CLASS, TCL_INDEX_NONE, offsetof(Frame, className), 0, 0, 0},
+ DEF_LABELFRAME_CLASS, offsetof(Frame, classNameObj), TCL_INDEX_NONE, 0, 0, 0},
{TK_OPTION_SYNONYM, "-fg", "foreground", NULL,
NULL, 0, TCL_INDEX_NONE, 0, "-foreground", 0},
{TK_OPTION_FONT, "-font", "font", "Font",
@@ -441,6 +433,7 @@ Tk_LabelframeObjCmd(
*
*--------------------------------------------------------------
*/
+
int
TkCreateFrame(
TCL_UNUSED(void *),
@@ -561,7 +554,7 @@ TkCreateFrame(
* Mark Tk frames as suitable candidates for [wm manage].
*/
- ((TkWindow *) newWin)->flags |= TK_WM_MANAGEABLE;
+ ((TkWindow *)newWin)->flags |= TK_WM_MANAGEABLE;
if (className == NULL) {
className = Tk_GetOption(newWin, "class", "Class");
@@ -660,7 +653,7 @@ TkCreateFrame(
goto error;
}
if (framePtr->isContainer) {
- if (framePtr->useThis != NULL) {
+ if (framePtr->useThisObj != NULL) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"windows cannot have both the -use and the -container"
" option set", TCL_INDEX_NONE));
@@ -927,20 +920,20 @@ ConfigureFrame(
Tcl_Obj *const objv[]) /* Arguments. */
{
Tk_SavedOptions savedOptions;
- char *oldMenuName;
+ Tcl_Obj *oldMenuNameObj;
Tk_Window oldWindow = NULL;
Labelframe *labelframePtr = (Labelframe *) framePtr;
Tk_Image image = NULL;
+ int padX, padY, width, height;
+ int borderWidth, highlightWidth;
/*
* Need the old menubar name for the menu code to delete it.
*/
- if (framePtr->menuName == NULL) {
- oldMenuName = NULL;
- } else {
- oldMenuName = (char *)ckalloc(strlen(framePtr->menuName) + 1);
- strcpy(oldMenuName, framePtr->menuName);
+ oldMenuNameObj = framePtr->menuNameObj;
+ if (oldMenuNameObj) {
+ Tcl_IncrRefCount(oldMenuNameObj);
}
if (framePtr->type == TYPE_LABELFRAME) {
@@ -949,8 +942,8 @@ ConfigureFrame(
if (Tk_SetOptions(interp, framePtr,
framePtr->optionTable, objc, objv,
framePtr->tkwin, &savedOptions, NULL) != TCL_OK) {
- if (oldMenuName != NULL) {
- ckfree(oldMenuName);
+ if (oldMenuNameObj != NULL) {
+ Tcl_DecrRefCount(oldMenuNameObj);
}
return TCL_ERROR;
}
@@ -974,17 +967,17 @@ ConfigureFrame(
* A few of the options require additional processing.
*/
- if ((((oldMenuName == NULL) && (framePtr->menuName != NULL))
- || ((oldMenuName != NULL) && (framePtr->menuName == NULL))
- || ((oldMenuName != NULL) && (framePtr->menuName != NULL)
- && strcmp(oldMenuName, framePtr->menuName) != 0))
+ if ((((oldMenuNameObj == NULL) && (framePtr->menuNameObj != NULL))
+ || ((oldMenuNameObj != NULL) && (framePtr->menuNameObj == NULL))
+ || ((oldMenuNameObj != NULL) && (framePtr->menuNameObj != NULL)
+ && strcmp(Tcl_GetString(oldMenuNameObj), Tcl_GetString(framePtr->menuNameObj)) != 0))
&& framePtr->type == TYPE_TOPLEVEL) {
- Tk_SetWindowMenubar(interp, framePtr->tkwin, oldMenuName,
- framePtr->menuName);
+ Tk_SetWindowMenubar(interp, framePtr->tkwin, (oldMenuNameObj ? Tcl_GetString(oldMenuNameObj) : NULL),
+ (framePtr->menuNameObj ? Tcl_GetString(framePtr->menuNameObj) : NULL));
}
- if (oldMenuName != NULL) {
- ckfree(oldMenuName);
+ if (oldMenuNameObj != NULL) {
+ Tcl_DecrRefCount(oldMenuNameObj);
}
if (framePtr->border != NULL) {
@@ -993,14 +986,41 @@ ConfigureFrame(
Tk_SetWindowBackgroundPixmap(framePtr->tkwin, None);
}
- if (framePtr->highlightWidth < 0) {
- framePtr->highlightWidth = 0;
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->widthObj, &width);
+ if (width < 0) {
+ Tcl_DecrRefCount(framePtr->widthObj);
+ framePtr->widthObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(framePtr->widthObj);
+ }
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->heightObj, &height);
+ if (height < 0) {
+ Tcl_DecrRefCount(framePtr->heightObj);
+ framePtr->heightObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(framePtr->heightObj);
+ }
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->borderWidthObj, &borderWidth);
+ if (borderWidth < 0) {
+ Tcl_DecrRefCount(framePtr->borderWidthObj);
+ framePtr->borderWidthObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(framePtr->borderWidthObj);
+ }
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->highlightWidthObj, &highlightWidth);
+ if (highlightWidth < 0) {
+ Tcl_DecrRefCount(framePtr->highlightWidthObj);
+ framePtr->highlightWidthObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(framePtr->highlightWidthObj);
}
- if (framePtr->padX < 0) {
- framePtr->padX = 0;
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->padXObj, &padX);
+ if (padX < 0) {
+ Tcl_DecrRefCount(framePtr->padXObj);
+ framePtr->padXObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(framePtr->padXObj);
}
- if (framePtr->padY < 0) {
- framePtr->padY = 0;
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->padYObj, &padY);
+ if (padY < 0) {
+ Tcl_DecrRefCount(framePtr->padYObj);
+ framePtr->padYObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(framePtr->padYObj);
}
/*
@@ -1102,6 +1122,8 @@ FrameWorldChanged(
int anyTextLabel, anyWindowLabel;
int bWidthLeft, bWidthRight, bWidthTop, bWidthBottom;
const char *labelText;
+ int padX, padY, width, height;
+ int borderWidth, highlightWidth;
anyTextLabel = (framePtr->type == TYPE_LABELFRAME) &&
(labelframePtr->textPtr != NULL) &&
@@ -1117,6 +1139,7 @@ FrameWorldChanged(
}
framePtr->copyGC = gc;
#endif /* TK_NO_DOUBLE_BUFFERING */
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->borderWidthObj, &borderWidth);
if (framePtr->type == TYPE_LABELFRAME) {
/*
@@ -1164,12 +1187,12 @@ FrameWorldChanged(
if ((labelframePtr->labelAnchor >= LABELANCHOR_N) &&
(labelframePtr->labelAnchor <= LABELANCHOR_SW)) {
- if (labelframePtr->labelReqHeight < framePtr->borderWidth) {
- labelframePtr->labelReqHeight = framePtr->borderWidth;
+ if (labelframePtr->labelReqHeight < borderWidth) {
+ labelframePtr->labelReqHeight = borderWidth;
}
} else {
- if (labelframePtr->labelReqWidth < framePtr->borderWidth) {
- labelframePtr->labelReqWidth = framePtr->borderWidth;
+ if (labelframePtr->labelReqWidth < borderWidth) {
+ labelframePtr->labelReqWidth = borderWidth;
}
}
}
@@ -1178,35 +1201,36 @@ FrameWorldChanged(
* Calculate individual border widths.
*/
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->highlightWidthObj, &highlightWidth);
bWidthBottom = bWidthTop = bWidthRight = bWidthLeft =
- framePtr->borderWidth + framePtr->highlightWidth;
+ borderWidth + highlightWidth;
- bWidthLeft += framePtr->padX;
- bWidthRight += framePtr->padX;
- bWidthTop += framePtr->padY;
- bWidthBottom += framePtr->padY;
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->padXObj, &padX);
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->padYObj, &padY);
+ bWidthLeft += padX;
+ bWidthRight += padX;
+ bWidthTop += padY;
+ bWidthBottom += padY;
if (anyTextLabel || anyWindowLabel) {
switch (labelframePtr->labelAnchor) {
case LABELANCHOR_E:
case LABELANCHOR_EN:
case LABELANCHOR_ES:
- bWidthRight += labelframePtr->labelReqWidth -
- framePtr->borderWidth;
+ bWidthRight += labelframePtr->labelReqWidth - borderWidth;
break;
case LABELANCHOR_N:
case LABELANCHOR_NE:
case LABELANCHOR_NW:
- bWidthTop += labelframePtr->labelReqHeight - framePtr->borderWidth;
+ bWidthTop += labelframePtr->labelReqHeight - borderWidth;
break;
case LABELANCHOR_S:
case LABELANCHOR_SE:
case LABELANCHOR_SW:
- bWidthBottom += labelframePtr->labelReqHeight -
- framePtr->borderWidth;
+ bWidthBottom += labelframePtr->labelReqHeight - borderWidth;
break;
default:
- bWidthLeft += labelframePtr->labelReqWidth - framePtr->borderWidth;
+ bWidthLeft += labelframePtr->labelReqWidth - borderWidth;
break;
}
}
@@ -1223,25 +1247,27 @@ FrameWorldChanged(
if (framePtr->type == TYPE_LABELFRAME) {
int minwidth = labelframePtr->labelReqWidth;
int minheight = labelframePtr->labelReqHeight;
- int padding = framePtr->highlightWidth;
+ int padding = highlightWidth;
- if (framePtr->borderWidth > 0) {
- padding += framePtr->borderWidth + LABELMARGIN;
+ if (borderWidth > 0) {
+ padding += borderWidth + LABELMARGIN;
}
padding *= 2;
if ((labelframePtr->labelAnchor >= LABELANCHOR_N) &&
(labelframePtr->labelAnchor <= LABELANCHOR_SW)) {
minwidth += padding;
- minheight += framePtr->borderWidth + framePtr->highlightWidth;
+ minheight += borderWidth + highlightWidth;
} else {
minheight += padding;
- minwidth += framePtr->borderWidth + framePtr->highlightWidth;
+ minwidth += borderWidth + highlightWidth;
}
Tk_SetMinimumRequestSize(tkwin, minwidth, minheight);
}
- if ((framePtr->width > 0) || (framePtr->height > 0)) {
- Tk_GeometryRequest(tkwin, framePtr->width, framePtr->height);
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->widthObj, &width);
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->heightObj, &height);
+ if ((width > 0) || (height > 0)) {
+ Tk_GeometryRequest(tkwin, width, height);
}
if (Tk_IsMapped(tkwin)) {
@@ -1277,6 +1303,7 @@ ComputeFrameGeometry(
int otherWidth, otherHeight, otherWidthT, otherHeightT, padding;
int maxWidth, maxHeight;
Tk_Window tkwin;
+ int borderWidth, highlightWidth;
Labelframe *labelframePtr = (Labelframe *) framePtr;
/*
@@ -1299,9 +1326,11 @@ ComputeFrameGeometry(
labelframePtr->labelBox.width = labelframePtr->labelReqWidth;
labelframePtr->labelBox.height = labelframePtr->labelReqHeight;
- padding = framePtr->highlightWidth;
- if (framePtr->borderWidth > 0) {
- padding += framePtr->borderWidth + LABELMARGIN;
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->borderWidthObj, &borderWidth);
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->highlightWidthObj, &highlightWidth);
+ padding = highlightWidth;
+ if (borderWidth > 0) {
+ padding += borderWidth + LABELMARGIN;
}
padding *= 2;
@@ -1337,7 +1366,7 @@ ComputeFrameGeometry(
otherHeight = Tk_Height(tkwin) - labelframePtr->labelBox.height;
otherWidthT = Tk_Width(tkwin) - labelframePtr->labelReqWidth;
otherHeightT = Tk_Height(tkwin) - labelframePtr->labelReqHeight;
- padding = framePtr->highlightWidth;
+ padding = highlightWidth;
switch (labelframePtr->labelAnchor) {
case LABELANCHOR_E:
@@ -1364,8 +1393,8 @@ ComputeFrameGeometry(
break;
}
- if (framePtr->borderWidth > 0) {
- padding += framePtr->borderWidth + LABELMARGIN;
+ if (borderWidth > 0) {
+ padding += borderWidth + LABELMARGIN;
}
switch (labelframePtr->labelAnchor) {
@@ -1423,9 +1452,10 @@ DisplayFrame(
{
Frame *framePtr = (Frame *)clientData;
Tk_Window tkwin = framePtr->tkwin;
- int bdX1, bdY1, bdX2, bdY2, hlWidth;
+ int bdX1, bdY1, bdX2, bdY2;
Pixmap pixmap;
Bool useClipping = False;
+ int borderWidth, highlightWidth;
framePtr->flags &= ~REDRAW_PENDING;
if ((framePtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
@@ -1436,9 +1466,9 @@ DisplayFrame(
* Highlight shall always be drawn if it exists, so do that first.
*/
- hlWidth = framePtr->highlightWidth;
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->highlightWidthObj, &highlightWidth);
- if (hlWidth != 0) {
+ if (highlightWidth > 0) {
GC fgGC, bgGC;
bgGC = Tk_GCForColor(framePtr->highlightBgColorPtr,
@@ -1446,10 +1476,10 @@ DisplayFrame(
if (framePtr->flags & GOT_FOCUS) {
fgGC = Tk_GCForColor(framePtr->highlightColorPtr,
Tk_WindowId(tkwin));
- Tk_DrawHighlightBorder(tkwin, fgGC, bgGC, hlWidth,
+ Tk_DrawHighlightBorder(tkwin, fgGC, bgGC, highlightWidth,
Tk_WindowId(tkwin));
} else {
- Tk_DrawHighlightBorder(tkwin, bgGC, bgGC, hlWidth,
+ Tk_DrawHighlightBorder(tkwin, bgGC, bgGC, highlightWidth,
Tk_WindowId(tkwin));
}
}
@@ -1478,7 +1508,10 @@ DisplayFrame(
Tk_Depth(tkwin));
#else
pixmap = Tk_WindowId(tkwin);
+ Tk_ClipDrawableToRect(Tk_Display(tkwin), pixmap, 0, 0,
+ Tk_Width(tkwin), Tk_Height(tkwin));
#endif /* TK_NO_DOUBLE_BUFFERING */
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->borderWidthObj, &borderWidth);
if (framePtr->type != TYPE_LABELFRAME) {
/*
@@ -1487,10 +1520,10 @@ DisplayFrame(
*/
noLabel:
- TkpDrawFrameEx(tkwin, pixmap, framePtr->border, hlWidth,
- framePtr->borderWidth, framePtr->relief);
+ TkpDrawFrameEx(tkwin, pixmap, framePtr->border, highlightWidth,
+ borderWidth, framePtr->relief);
if (framePtr->bgimg) {
- DrawFrameBackground(tkwin, pixmap, hlWidth, framePtr->borderWidth,
+ DrawFrameBackground(tkwin, pixmap, highlightWidth, borderWidth,
framePtr->bgimg, framePtr->tile);
}
} else {
@@ -1512,15 +1545,15 @@ DisplayFrame(
* Calculate how the label affects the border's position.
*/
- bdX1 = bdY1 = hlWidth;
- bdX2 = Tk_Width(tkwin) - hlWidth;
- bdY2 = Tk_Height(tkwin) - hlWidth;
+ bdX1 = bdY1 = highlightWidth;
+ bdX2 = Tk_Width(tkwin) - highlightWidth;
+ bdY2 = Tk_Height(tkwin) - highlightWidth;
switch (labelframePtr->labelAnchor) {
case LABELANCHOR_E:
case LABELANCHOR_EN:
case LABELANCHOR_ES:
- bdX2 -= (labelframePtr->labelBox.width-framePtr->borderWidth) / 2;
+ bdX2 -= (labelframePtr->labelBox.width-borderWidth) / 2;
break;
case LABELANCHOR_N:
case LABELANCHOR_NE:
@@ -1530,15 +1563,15 @@ DisplayFrame(
* favor a lower border position by rounding up.
*/
- bdY1 += (labelframePtr->labelBox.height-framePtr->borderWidth+1)/2;
+ bdY1 += (labelframePtr->labelBox.height - borderWidth+1)/2;
break;
case LABELANCHOR_S:
case LABELANCHOR_SE:
case LABELANCHOR_SW:
- bdY2 -= (labelframePtr->labelBox.height-framePtr->borderWidth) / 2;
+ bdY2 -= (labelframePtr->labelBox.height - borderWidth) / 2;
break;
default:
- bdX1 += (labelframePtr->labelBox.width-framePtr->borderWidth) / 2;
+ bdX1 += (labelframePtr->labelBox.width - borderWidth) / 2;
break;
}
@@ -1547,7 +1580,7 @@ DisplayFrame(
*/
Tk_Draw3DRectangle(tkwin, pixmap, framePtr->border, bdX1, bdY1,
- bdX2 - bdX1, bdY2 - bdY1, framePtr->borderWidth,
+ bdX2 - bdX1, bdY2 - bdY1, borderWidth,
framePtr->relief);
if (labelframePtr->labelWin == NULL) {
@@ -1618,10 +1651,10 @@ DisplayFrame(
*/
XCopyArea(framePtr->display, pixmap, Tk_WindowId(tkwin),
- framePtr->copyGC, hlWidth, hlWidth,
- (unsigned) (Tk_Width(tkwin) - 2 * hlWidth),
- (unsigned) (Tk_Height(tkwin) - 2 * hlWidth),
- hlWidth, hlWidth);
+ framePtr->copyGC, highlightWidth, highlightWidth,
+ (unsigned) (Tk_Width(tkwin) - 2 * highlightWidth),
+ (unsigned) (Tk_Height(tkwin) - 2 * highlightWidth),
+ highlightWidth, highlightWidth);
Tk_FreePixmap(framePtr->display, pixmap);
#endif /* TK_NO_DOUBLE_BUFFERING */
}
@@ -1691,11 +1724,11 @@ FrameEventProc(
ComputeFrameGeometry(framePtr);
goto redraw;
} else if (eventPtr->type == DestroyNotify) {
- if (framePtr->menuName != NULL) {
+ if (framePtr->menuNameObj != NULL) {
Tk_SetWindowMenubar(framePtr->interp, framePtr->tkwin,
- framePtr->menuName, NULL);
- ckfree(framePtr->menuName);
- framePtr->menuName = NULL;
+ Tcl_GetString(framePtr->menuNameObj), NULL);
+ Tcl_DecrRefCount(framePtr->menuNameObj);
+ framePtr->menuNameObj = NULL;
}
if (framePtr->tkwin != NULL) {
/*
@@ -1728,21 +1761,25 @@ FrameEventProc(
Tcl_EventuallyFree(framePtr, DestroyFrame);
} else if (eventPtr->type == FocusIn) {
if (eventPtr->xfocus.detail != NotifyInferior) {
+ int highlightWidth;
framePtr->flags |= GOT_FOCUS;
- if (framePtr->highlightWidth > 0) {
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->highlightWidthObj, &highlightWidth);
+ if (highlightWidth > 0) {
goto redraw;
}
}
} else if (eventPtr->type == FocusOut) {
if (eventPtr->xfocus.detail != NotifyInferior) {
+ int highlightWidth;
framePtr->flags &= ~GOT_FOCUS;
- if (framePtr->highlightWidth > 0) {
+ Tk_GetPixelsFromObj(NULL, framePtr->tkwin, framePtr->highlightWidthObj, &highlightWidth);
+ if (highlightWidth > 0) {
goto redraw;
}
}
} else if (eventPtr->type == ActivateNotify) {
- Tk_SetMainMenubar(framePtr->interp, framePtr->tkwin,
- framePtr->menuName);
+ Tk_SetMainMenubar(framePtr->interp, framePtr->tkwin,
+ (framePtr->menuNameObj ? Tcl_GetString(framePtr->menuNameObj) : NULL));
}
return;
@@ -1778,11 +1815,11 @@ FrameCmdDeletedProc(
Frame *framePtr = (Frame *)clientData;
Tk_Window tkwin = framePtr->tkwin;
- if (framePtr->menuName != NULL) {
+ if (framePtr->menuNameObj != NULL) {
Tk_SetWindowMenubar(framePtr->interp, framePtr->tkwin,
- framePtr->menuName, NULL);
- ckfree(framePtr->menuName);
- framePtr->menuName = NULL;
+ Tcl_GetString(framePtr->menuNameObj), NULL);
+ Tcl_DecrRefCount(framePtr->menuNameObj);
+ framePtr->menuNameObj = NULL;
}
/*
@@ -1878,7 +1915,7 @@ void
TkInstallFrameMenu(
Tk_Window tkwin) /* The window that was just created. */
{
- TkWindow *winPtr = (TkWindow *) tkwin;
+ TkWindow *winPtr = (TkWindow *)tkwin;
if (winPtr->mainPtr != NULL) {
Frame *framePtr = (Frame *)winPtr->instanceData;
@@ -1887,7 +1924,7 @@ TkInstallFrameMenu(
Tcl_Panic("TkInstallFrameMenu couldn't get frame pointer");
}
TkpMenuNotifyToplevelCreate(winPtr->mainPtr->interp,
- framePtr->menuName);
+ (framePtr->menuNameObj ? Tcl_GetString(framePtr->menuNameObj) : NULL));
}
}
@@ -1976,7 +2013,7 @@ FrameRequestProc(
static void
FrameLostContentProc(
- void *clientData, /* Frame structure for content window window that was
+ void *clientData, /* Frame structure for content window that was
* stolen away. */
TCL_UNUSED(Tk_Window)) /* Tk's handle for the content window window. */
{
@@ -2004,15 +2041,15 @@ void
TkMapTopFrame(
Tk_Window tkwin)
{
- Frame *framePtr = (Frame *)((TkWindow *) tkwin)->instanceData;
+ Frame *framePtr = (Frame *)((TkWindow *)tkwin)->instanceData;
Tk_OptionTable optionTable;
if (Tk_IsTopLevel(tkwin) && framePtr->type == TYPE_FRAME) {
framePtr->type = TYPE_TOPLEVEL;
Tcl_DoWhenIdle(MapFrame, framePtr);
- if (framePtr->menuName != NULL) {
+ if (framePtr->menuNameObj != NULL) {
Tk_SetWindowMenubar(framePtr->interp, framePtr->tkwin, NULL,
- framePtr->menuName);
+ Tcl_GetString(framePtr->menuNameObj));
}
} else if (!Tk_IsTopLevel(tkwin) && framePtr->type == TYPE_TOPLEVEL) {
framePtr->type = TYPE_FRAME;