summaryrefslogtreecommitdiffstats
path: root/generic/tkGrid.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tkGrid.c')
-rw-r--r--generic/tkGrid.c156
1 files changed, 98 insertions, 58 deletions
diff --git a/generic/tkGrid.c b/generic/tkGrid.c
index 59d1363..3496ab7 100644
--- a/generic/tkGrid.c
+++ b/generic/tkGrid.c
@@ -417,7 +417,7 @@ Tk_GridObjCmd(
/* This should not happen */
Tcl_SetObjResult(interp, Tcl_NewStringObj("internal error in grid", TCL_INDEX_NONE));
- Tcl_SetErrorCode(interp, "TK", "API_ABUSE", NULL);
+ Tcl_SetErrorCode(interp, "TK", "API_ABUSE", (char *)NULL);
return TCL_ERROR;
}
@@ -458,7 +458,9 @@ GridAnchorCommand(
if (TkGetWindowFromObj(interp, tkwin, objv[2], &container) != TCL_OK) {
return TCL_ERROR;
}
- containerPtr = GetGrid(container);
+ if (!(containerPtr = GetGrid(container))) {
+ return TCL_OK;
+ }
if (objc == 3) {
gridPtr = containerPtr->containerDataPtr;
@@ -531,7 +533,9 @@ GridBboxCommand(
if (TkGetWindowFromObj(interp, tkwin, objv[2], &container) != TCL_OK) {
return TCL_ERROR;
}
- containerPtr = GetGrid(container);
+ if (!(containerPtr = GetGrid(container))) {
+ return TCL_OK;
+ }
if (objc >= 5) {
if (Tcl_GetIntFromObj(interp, objv[3], &column) != TCL_OK) {
@@ -655,7 +659,9 @@ GridForgetRemoveCommand(
return TCL_ERROR;
}
- contentPtr = GetGrid(content);
+ if (!(contentPtr = GetGrid(content))) {
+ continue;
+ }
if (contentPtr->containerPtr != NULL) {
/*
* For "forget", reset all the settings to their defaults
@@ -745,7 +751,9 @@ GridInfoCommand(
if (TkGetWindowFromObj(interp, tkwin, objv[2], &content) != TCL_OK) {
return TCL_ERROR;
}
- contentPtr = GetGrid(content);
+ if (!(contentPtr = GetGrid(content))) {
+ return TCL_OK;
+ }
if (contentPtr->containerPtr == NULL) {
Tcl_ResetResult(interp);
return TCL_OK;
@@ -820,7 +828,9 @@ GridLocationCommand(
return TCL_ERROR;
}
- containerPtr = GetGrid(container);
+ if (!(containerPtr = GetGrid(container))) {
+ return TCL_OK;
+ }
if (containerPtr->containerDataPtr == NULL) {
Tcl_SetObjResult(interp, NewPairObj(-1, TCL_INDEX_NONE));
return TCL_OK;
@@ -901,7 +911,9 @@ GridPropagateCommand(
if (TkGetWindowFromObj(interp, tkwin, objv[2], &container) != TCL_OK) {
return TCL_ERROR;
}
- containerPtr = GetGrid(container);
+ if (!(containerPtr = GetGrid(container))) {
+ return TCL_OK;
+ }
if (objc == 3) {
Tcl_SetObjResult(interp,
Tcl_NewBooleanObj(!(containerPtr->flags & DONT_PROPAGATE)));
@@ -1018,12 +1030,14 @@ GridRowColumnConfigureCommand(
if (lObjc == 0) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf("no %s indices specified",
(slotType == COLUMN) ? "column" : "row"));
- Tcl_SetErrorCode(interp, "TK", "GRID", "NO_INDEX", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "NO_INDEX", (char *)NULL);
Tcl_DecrRefCount(listCopy);
return TCL_ERROR;
}
- containerPtr = GetGrid(container);
+ if (!(containerPtr = GetGrid(container))) {
+ return TCL_OK;
+ }
first = 0;
last = 0;
@@ -1031,7 +1045,7 @@ GridRowColumnConfigureCommand(
if (lObjc != 1) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"must specify a single element on retrieval", TCL_INDEX_NONE));
- Tcl_SetErrorCode(interp, "TK", "GRID", "USAGE", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "USAGE", (char *)NULL);
Tcl_DecrRefCount(listCopy);
return TCL_ERROR;
}
@@ -1039,7 +1053,7 @@ GridRowColumnConfigureCommand(
Tcl_AppendResult(interp,
" (when retrieving options only integer indices are "
"allowed)", NULL);
- Tcl_SetErrorCode(interp, "TK", "GRID", "INDEX_FORMAT", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "INDEX_FORMAT", (char *)NULL);
Tcl_DecrRefCount(listCopy);
return TCL_ERROR;
}
@@ -1139,19 +1153,21 @@ GridRowColumnConfigureCommand(
* Is it gridded in this container?
*/
- contentPtr = GetGrid(content);
+ if (!(contentPtr = GetGrid(content))) {
+ continue;
+ }
if (contentPtr->containerPtr != containerPtr) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"the window \"%s\" is not managed by \"%s\"",
Tcl_GetString(lObjv[j]), Tcl_GetString(objv[2])));
- Tcl_SetErrorCode(interp, "TK", "GRID", "NOT_MANAGED", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "NOT_MANAGED", (char *)NULL);
Tcl_DecrRefCount(listCopy);
return TCL_ERROR;
}
} else {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"illegal index \"%s\"", Tcl_GetString(lObjv[j])));
- Tcl_SetErrorCode(interp, "TK", "VALUE", "GRID_INDEX", NULL);
+ Tcl_SetErrorCode(interp, "TK", "VALUE", "GRID_INDEX", (char *)NULL);
Tcl_DecrRefCount(listCopy);
return TCL_ERROR;
}
@@ -1175,7 +1191,7 @@ GridRowColumnConfigureCommand(
"\"%s\" is out of range",
Tcl_GetString(lObjv[j])));
Tcl_SetErrorCode(interp, "TK", "GRID", "INDEX_RANGE",
- NULL);
+ (char *)NULL);
Tcl_DecrRefCount(listCopy);
return TCL_ERROR;
}
@@ -1282,7 +1298,7 @@ GridRowColumnConfigureCommand(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"invalid arg \"%s\": should be non-negative",
Tcl_GetString(objv[i])));
- Tcl_SetErrorCode(interp, "TK", "GRID", "NEG_INDEX", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "NEG_INDEX", (char *)NULL);
return TCL_ERROR;
}
@@ -1322,7 +1338,9 @@ GridSizeCommand(
if (TkGetWindowFromObj(interp, tkwin, objv[2], &container) != TCL_OK) {
return TCL_ERROR;
}
- containerPtr = GetGrid(container);
+ if (!(containerPtr = GetGrid(container))) {
+ return TCL_OK;
+ }
if (containerPtr->containerDataPtr != NULL) {
SetGridSize(containerPtr);
@@ -1388,7 +1406,7 @@ GridContentCommand(
if (value < 0) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"%d is an invalid value: should NOT be < 0", value));
- Tcl_SetErrorCode(interp, "TK", "GRID", "NEG_INDEX", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "NEG_INDEX", (char *)NULL);
return TCL_ERROR;
}
if (index == CONTENT_COLUMN) {
@@ -1401,7 +1419,9 @@ GridContentCommand(
if (TkGetWindowFromObj(interp, tkwin, objv[2], &container) != TCL_OK) {
return TCL_ERROR;
}
- containerPtr = GetGrid(container);
+ if (!(containerPtr = GetGrid(container))) {
+ return TCL_OK;
+ }
res = Tcl_NewListObj(0, NULL);
for (contentPtr = containerPtr->contentPtr; contentPtr != NULL;
@@ -2417,11 +2437,12 @@ ResolveConstraints(
* GetGrid --
*
* This internal procedure is used to locate a Grid structure for a given
- * window, creating one if one doesn't exist already.
+ * window, creating one if one doesn't exist already, except if the window
+ * is already dead.
*
* Results:
* The return value is a pointer to the Grid structure corresponding to
- * tkwin.
+ * tkwin, or NULL when tkwin is already dead.
*
* Side effects:
* A new grid structure may be created. If so, then a callback is set up
@@ -2440,6 +2461,10 @@ GetGrid(
int isNew;
TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
+ if (((TkWindow *) tkwin)->flags & TK_ALREADY_DEAD) {
+ return NULL;
+ }
+
if (!dispPtr->gridInit) {
Tcl_InitHashTable(&dispPtr->gridHashTable, TCL_ONE_WORD_KEYS);
dispPtr->gridInit = 1;
@@ -2479,7 +2504,6 @@ GetGrid(
gridPtr->sticky = 0;
gridPtr->size = 0;
gridPtr->in = NULL;
- gridPtr->containerDataPtr = NULL;
Tcl_SetHashValue(hPtr, gridPtr);
Tk_CreateEventHandler(tkwin, StructureNotifyMask,
GridStructureProc, gridPtr);
@@ -2553,8 +2577,8 @@ SetContentColumn(
lastCol = ((newColumn >= 0) ? newColumn : 0) + newNumCols;
if (lastCol >= MAX_ELEMENT) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj("column out of bounds",-1));
- Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_COLUMN", NULL);
+ Tcl_SetObjResult(interp, Tcl_NewStringObj("column out of bounds", TCL_INDEX_NONE));
+ Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_COLUMN", (char *)NULL);
return TCL_ERROR;
}
@@ -2595,7 +2619,7 @@ SetContentRow(
lastRow = ((newRow >= 0) ? newRow : 0) + newNumRows;
if (lastRow >= MAX_ELEMENT) {
Tcl_SetObjResult(interp, Tcl_NewStringObj("row out of bounds", TCL_INDEX_NONE));
- Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_ROW", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_ROW", (char *)NULL);
return TCL_ERROR;
}
@@ -3011,11 +3035,15 @@ ConfigureContent(
* If the stored container does not exist, just ignore it.
*/
- contentPtr = GetGrid(content);
+ if (!(contentPtr = GetGrid(content))) {
+ continue;
+ }
if (contentPtr->in != NULL) {
if (TkGetWindowFromObj(interp, content, contentPtr->in, &parent)
== TCL_OK) {
- containerPtr = GetGrid(parent);
+ if (!(containerPtr = GetGrid(parent))) {
+ continue;
+ }
InitContainerData(containerPtr);
}
}
@@ -3023,7 +3051,9 @@ ConfigureContent(
if (containerPtr == NULL) {
parent = Tk_Parent(content);
if (parent != NULL) {
- containerPtr = GetGrid(parent);
+ if (!(containerPtr = GetGrid(parent))) {
+ continue;
+ }
InitContainerData(containerPtr);
}
}
@@ -3033,7 +3063,7 @@ ConfigureContent(
if (length > 1 && i == 0) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"bad argument \"%s\": must be name of window", string));
- Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_PARAMETER", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_PARAMETER", (char *)NULL);
return TCL_ERROR;
}
if (length > 1 && firstChar == '-') {
@@ -3043,7 +3073,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"unexpected parameter \"%s\" in configure list:"
" should be window name or option", string));
- Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_PARAMETER", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_PARAMETER", (char *)NULL);
return TCL_ERROR;
}
@@ -3051,7 +3081,7 @@ ConfigureContent(
(prevChar == REL_SKIP) || (prevChar == REL_VERT))) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"must specify window before shortcut '-'", TCL_INDEX_NONE));
- Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", (char *)NULL);
return TCL_ERROR;
}
@@ -3063,7 +3093,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"invalid window shortcut, \"%s\" should be '-', 'x', or '^'",
string));
- Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", (char *)NULL);
return TCL_ERROR;
}
numWindows = i;
@@ -3071,7 +3101,7 @@ ConfigureContent(
if ((objc - numWindows) & 1) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"extra option or option with no value", TCL_INDEX_NONE));
- Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_PARAMETER", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "BAD_PARAMETER", (char *)NULL);
return TCL_ERROR;
}
@@ -3092,7 +3122,9 @@ ConfigureContent(
TCL_OK) {
return TCL_ERROR;
}
- containerPtr = GetGrid(other);
+ if (!(containerPtr = GetGrid(other))) {
+ continue;
+ }
InitContainerData(containerPtr);
} else if (index == CONF_ROW) {
if (Tcl_GetIntFromObj(interp, objv[i+1], &tmp) != TCL_OK
@@ -3100,7 +3132,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"bad row value \"%s\": must be a non-negative integer",
Tcl_GetString(objv[i+1])));
- Tcl_SetErrorCode(interp, "TK", "VALUE", "POSITIVE_INT", NULL);
+ Tcl_SetErrorCode(interp, "TK", "VALUE", "POSITIVE_INT", (char *)NULL);
return TCL_ERROR;
}
defaultRow = tmp;
@@ -3166,10 +3198,12 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"can't manage \"%s\": it's a top-level window",
Tcl_GetString(objv[j])));
- Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "TOPLEVEL", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "TOPLEVEL", (char *)NULL);
return TCL_ERROR;
}
- contentPtr = GetGrid(content);
+ if (!(contentPtr = GetGrid(content))) {
+ continue;
+ }
/*
* The following statement is taken from tkPack.c:
@@ -3196,7 +3230,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"bad column value \"%s\": must be a non-negative integer",
Tcl_GetString(objv[i+1])));
- Tcl_SetErrorCode(interp, "TK", "VALUE", "COLUMN", NULL);
+ Tcl_SetErrorCode(interp, "TK", "VALUE", "COLUMN", (char *)NULL);
return TCL_ERROR;
}
if (SetContentColumn(interp, contentPtr, tmp, -1) != TCL_OK) {
@@ -3209,7 +3243,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"bad columnspan value \"%s\": must be a positive integer",
Tcl_GetString(objv[i+1])));
- Tcl_SetErrorCode(interp, "TK", "VALUE", "SPAN", NULL);
+ Tcl_SetErrorCode(interp, "TK", "VALUE", "SPAN", (char *)NULL);
return TCL_ERROR;
}
if (SetContentColumn(interp, contentPtr, -1, tmp) != TCL_OK) {
@@ -3224,11 +3258,13 @@ ConfigureContent(
if (other == content) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"window can't be managed in itself", TCL_INDEX_NONE));
- Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "SELF", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "SELF", (char *)NULL);
return TCL_ERROR;
}
positionGiven = 1;
- containerPtr = GetGrid(other);
+ if (!(containerPtr = GetGrid(other))) {
+ continue;
+ }
InitContainerData(containerPtr);
break;
case CONF_STICKY: {
@@ -3239,7 +3275,7 @@ ConfigureContent(
"bad stickyness value \"%s\": must be"
" a string containing n, e, s, and/or w",
Tcl_GetString(objv[i+1])));
- Tcl_SetErrorCode(interp, "TK", "VALUE", "STICKY", NULL);
+ Tcl_SetErrorCode(interp, "TK", "VALUE", "STICKY", (char *)NULL);
return TCL_ERROR;
}
contentPtr->sticky = sticky;
@@ -3251,7 +3287,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"bad ipadx value \"%s\": must be positive screen distance",
Tcl_GetString(objv[i+1])));
- Tcl_SetErrorCode(interp, "TK", "VALUE", "INT_PAD", NULL);
+ Tcl_SetErrorCode(interp, "TK", "VALUE", "INT_PAD", (char *)NULL);
return TCL_ERROR;
}
contentPtr->iPadX = tmp * 2;
@@ -3262,7 +3298,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"bad ipady value \"%s\": must be positive screen distance",
Tcl_GetString(objv[i+1])));
- Tcl_SetErrorCode(interp, "TK", "VALUE", "INT_PAD", NULL);
+ Tcl_SetErrorCode(interp, "TK", "VALUE", "INT_PAD", (char *)NULL);
return TCL_ERROR;
}
contentPtr->iPadY = tmp * 2;
@@ -3285,7 +3321,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"bad row value \"%s\": must be a non-negative integer",
Tcl_GetString(objv[i+1])));
- Tcl_SetErrorCode(interp, "TK", "VALUE", "COLUMN", NULL);
+ Tcl_SetErrorCode(interp, "TK", "VALUE", "COLUMN", (char *)NULL);
return TCL_ERROR;
}
if (SetContentRow(interp, contentPtr, tmp, -1) != TCL_OK) {
@@ -3298,7 +3334,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"bad rowspan value \"%s\": must be a positive integer",
Tcl_GetString(objv[i+1])));
- Tcl_SetErrorCode(interp, "TK", "VALUE", "SPAN", NULL);
+ Tcl_SetErrorCode(interp, "TK", "VALUE", "SPAN", (char *)NULL);
return TCL_ERROR;
}
if (SetContentRow(interp, contentPtr, -1, tmp) != TCL_OK) {
@@ -3335,14 +3371,16 @@ ConfigureContent(
parent = Tk_Parent(content);
if (containerPtr == NULL) {
- containerPtr = GetGrid(parent);
+ if (!(containerPtr = GetGrid(parent))) {
+ continue;
+ }
InitContainerData(containerPtr);
- }
+ }
if (contentPtr->containerPtr != NULL && contentPtr->containerPtr != containerPtr) {
- if (contentPtr->containerPtr->tkwin != Tk_Parent(contentPtr->tkwin)) {
- Tk_UnmaintainGeometry(contentPtr->tkwin, contentPtr->containerPtr->tkwin);
- }
+ if (contentPtr->containerPtr->tkwin != Tk_Parent(contentPtr->tkwin)) {
+ Tk_UnmaintainGeometry(contentPtr->tkwin, contentPtr->containerPtr->tkwin);
+ }
Unlink(contentPtr);
contentPtr->containerPtr = NULL;
}
@@ -3369,7 +3407,7 @@ ConfigureContent(
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"can't put \"%s\" inside \"%s\"", Tcl_GetString(objv[j]),
Tk_PathName(containerPtr->tkwin)));
- Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "HIERARCHY", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "HIERARCHY", (char *)NULL);
Unlink(contentPtr);
return TCL_ERROR;
}
@@ -3384,8 +3422,8 @@ ConfigureContent(
if (container == (TkWindow *)content) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"can't put \"%s\" inside \"%s\": would cause management loop",
- Tcl_GetString(objv[j]), Tk_PathName(containerPtr->tkwin)));
- Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "LOOP", NULL);
+ Tcl_GetString(objv[j]), Tk_PathName(containerPtr->tkwin)));
+ Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "LOOP", (char *)NULL);
Unlink(contentPtr);
return TCL_ERROR;
}
@@ -3469,7 +3507,7 @@ ConfigureContent(
if (containerPtr == NULL) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"can't use '^', can't find container window", TCL_INDEX_NONE));
- Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", (char *)NULL);
return TCL_ERROR;
}
@@ -3494,7 +3532,9 @@ ConfigureContent(
lastColumn = 0;
} else {
other = Tk_NameToWindow(interp, lastWindow, tkwin);
- otherPtr = GetGrid(other);
+ if (!(otherPtr = GetGrid(other))) {
+ continue;
+ }
lastRow = otherPtr->row + otherPtr->numRows - 2;
lastColumn = otherPtr->column + otherPtr->numCols;
}
@@ -3523,7 +3563,7 @@ ConfigureContent(
if (!match) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"can't find content to extend with \"^\"", TCL_INDEX_NONE));
- Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", (char *)NULL);
return TCL_ERROR;
}
}
@@ -3531,7 +3571,7 @@ ConfigureContent(
if (containerPtr == NULL) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"can't determine container window", TCL_INDEX_NONE));
- Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", NULL);
+ Tcl_SetErrorCode(interp, "TK", "GRID", "SHORTCUT_USAGE", (char *)NULL);
return TCL_ERROR;
}
SetGridSize(containerPtr);