diff options
Diffstat (limited to 'generic/tkGrid.c')
| -rw-r--r-- | generic/tkGrid.c | 156 |
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); |
