diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2025-10-31 19:28:42 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2025-10-31 19:28:42 (GMT) |
| commit | c25f14940d3c7823cae0a783f34c6f147518a1b3 (patch) | |
| tree | d598543193e4ffbb2336840441fd696a854ab6cc /generic | |
| parent | 3d21e16ae679d4c1ae0b73441536c7429a72657d (diff) | |
| parent | 2f48a0563a693aeccaf7550989d0539a3c940d95 (diff) | |
| download | tk-core-tk-print-fixes.zip tk-core-tk-print-fixes.tar.gz tk-core-tk-print-fixes.tar.bz2 | |
Merge trunkcore-tk-print-fixes
Diffstat (limited to 'generic')
66 files changed, 2020 insertions, 589 deletions
diff --git a/generic/nanosvg.h b/generic/nanosvg.h index ab71443..648a8e7 100644 --- a/generic/nanosvg.h +++ b/generic/nanosvg.h @@ -139,6 +139,12 @@ enum NSVGflags { NSVG_FLAGS_VISIBLE = 0x01 }; +enum NSVGpaintOrder { + NSVG_PAINT_FILL = 0x00, + NSVG_PAINT_MARKERS = 0x01, + NSVG_PAINT_STROKE = 0x02 +}; + typedef struct NSVGgradientStop { unsigned int color; float offset; @@ -183,6 +189,7 @@ typedef struct NSVGshape char strokeLineCap; /* Stroke cap type. */ float miterLimit; /* Miter limit */ char fillRule; /* Fill rule, see NSVGfillRule. */ + unsigned char paintOrder; /* Encoded paint order (3×2-bit fields) see NSVGpaintOrder */ unsigned char flags; /* Logical or of NSVG_FLAGS_* flags */ float bounds[4]; /* Tight bounding box of the shape [minx,miny,maxx,maxy]. */ char fillGradient[64]; // Optional 'id' of fill gradient @@ -475,6 +482,7 @@ typedef struct NSVGattrib char hasFill; char hasStroke; char visible; + unsigned char paintOrder; } NSVGattrib; typedef struct NSVGstyles @@ -661,6 +669,10 @@ static void nsvg__curveBounds(float* bounds, float* curve) } } +static unsigned char nsvg__encodePaintOrder(enum NSVGpaintOrder a, enum NSVGpaintOrder b, enum NSVGpaintOrder c) { + return (a & 0x03) | ((b & 0x03) << 2) | ((c & 0x03) << 4); +} + static NSVGparser* nsvg__createParser(void) { NSVGparser* p; @@ -688,6 +700,7 @@ static NSVGparser* nsvg__createParser(void) p->attr[0].fillRule = NSVG_FILLRULE_NONZERO; p->attr[0].hasFill = 1; p->attr[0].visible = NSVG_VIS_DISPLAY | NSVG_VIS_VISIBLE; + p->attr[0].paintOrder = nsvg__encodePaintOrder(NSVG_PAINT_FILL, NSVG_PAINT_STROKE, NSVG_PAINT_MARKERS); return p; @@ -1032,6 +1045,7 @@ static void nsvg__addShape(NSVGparser* p) shape->miterLimit = attr->miterLimit; shape->fillRule = attr->fillRule; shape->opacity = attr->opacity; + shape->paintOrder = attr->paintOrder; shape->paths = p->plist; p->plist = NULL; @@ -1810,6 +1824,24 @@ static char nsvg__parseFillRule(const char* str) return NSVG_FILLRULE_NONZERO; } +static unsigned char nsvg__parsePaintOrder(const char* str) +{ + if (strcmp(str, "normal") == 0 || strcmp(str, "fill stroke markers") == 0) + return nsvg__encodePaintOrder(NSVG_PAINT_FILL, NSVG_PAINT_STROKE, NSVG_PAINT_MARKERS); + else if (strcmp(str, "fill markers stroke") == 0) + return nsvg__encodePaintOrder(NSVG_PAINT_FILL, NSVG_PAINT_MARKERS, NSVG_PAINT_STROKE); + else if (strcmp(str, "markers fill stroke") == 0) + return nsvg__encodePaintOrder(NSVG_PAINT_MARKERS, NSVG_PAINT_FILL, NSVG_PAINT_STROKE); + else if (strcmp(str, "markers stroke fill") == 0) + return nsvg__encodePaintOrder(NSVG_PAINT_MARKERS, NSVG_PAINT_STROKE, NSVG_PAINT_FILL); + else if (strcmp(str, "stroke fill markers") == 0) + return nsvg__encodePaintOrder(NSVG_PAINT_STROKE, NSVG_PAINT_FILL, NSVG_PAINT_MARKERS); + else if (strcmp(str, "stroke markers fill") == 0) + return nsvg__encodePaintOrder(NSVG_PAINT_STROKE, NSVG_PAINT_MARKERS, NSVG_PAINT_FILL); + /* TODO: handle inherit. */ + return nsvg__encodePaintOrder(NSVG_PAINT_FILL, NSVG_PAINT_STROKE, NSVG_PAINT_MARKERS); +} + static const char* nsvg__getNextDashItem(const char* s, char* it) { int n = 0; @@ -1924,6 +1956,8 @@ static int nsvg__parseAttr(NSVGparser* p, const char* name, const char* value) attr->stopOpacity = nsvg__parseOpacity(value); } else if (strcmp(name, "offset") == 0) { attr->stopOffset = nsvg__parseCoordinate(p, value, 0.0f, 1.0f); + } else if (strcmp(name, "paint-order") == 0) { + attr->paintOrder = nsvg__parsePaintOrder(value); } else if (strcmp(name, "id") == 0) { strncpy(attr->id, value, 63); attr->id[63] = '\0'; diff --git a/generic/nanosvgrast.h b/generic/nanosvgrast.h index b4fac60..b0bc2e1 100644 --- a/generic/nanosvgrast.h +++ b/generic/nanosvgrast.h @@ -971,7 +971,11 @@ static void nsvg__fillActiveEdges(unsigned char* scanline, int len, NSVGactiveEd } } -static float nsvg__clampf(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); } +static float nsvg__clampf(float a, float mn, float mx) { + if (isnan(a)) + return mn; + return a < mn ? mn : (a > mx ? mx : a); +} static unsigned int nsvg__RGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { @@ -1391,6 +1395,8 @@ void nsvgRasterize(NSVGrasterizer* r, NSVGedge *e = NULL; NSVGcachedPaint cache; int i; + int j; + unsigned char paintOrder; r->bitmap = dst; r->width = w; @@ -1409,58 +1415,61 @@ void nsvgRasterize(NSVGrasterizer* r, for (shape = image->shapes; shape != NULL; shape = shape->next) { if (!(shape->flags & NSVG_FLAGS_VISIBLE)) continue; + for (j = 0; j < 3; j++) { + paintOrder = (shape->paintOrder >> (2 * j)) & 0x03; + + if (paintOrder == NSVG_PAINT_FILL && shape->fill.type != NSVG_PAINT_NONE) { + nsvg__resetPool(r); + r->freelist = NULL; + r->nedges = 0; + + nsvg__flattenShape(r, shape, scale); + + /* Scale and translate edges */ + for (i = 0; i < r->nedges; i++) { + e = &r->edges[i]; + e->x0 = tx + e->x0; + e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; + e->x1 = tx + e->x1; + e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; + } - if (shape->fill.type != NSVG_PAINT_NONE) { - nsvg__resetPool(r); - r->freelist = NULL; - r->nedges = 0; + /* Rasterize edges */ + if (r->nedges != 0) + qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); - nsvg__flattenShape(r, shape, scale); + /* now, traverse the scanlines and find the intersections on each scanline, use non-zero rule */ + nsvg__initPaint(&cache, &shape->fill, shape->opacity); - /* Scale and translate edges */ - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - e->x0 = tx + e->x0; - e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; - e->x1 = tx + e->x1; - e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; + nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, shape->fillRule); } + if (paintOrder == NSVG_PAINT_STROKE && shape->stroke.type != NSVG_PAINT_NONE && (shape->strokeWidth * scale) > 0.01f) { + nsvg__resetPool(r); + r->freelist = NULL; + r->nedges = 0; + + nsvg__flattenShapeStroke(r, shape, scale); + +/* dumpEdges(r, "edge.svg"); */ + + /* Scale and translate edges */ + for (i = 0; i < r->nedges; i++) { + e = &r->edges[i]; + e->x0 = tx + e->x0; + e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; + e->x1 = tx + e->x1; + e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; + } - /* Rasterize edges */ - if (r->nedges != 0) - qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); + /* Rasterize edges */ + if (r->nedges != 0) + qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); - /* now, traverse the scanlines and find the intersections on each scanline, use non-zero rule */ - nsvg__initPaint(&cache, &shape->fill, shape->opacity); + /* now, traverse the scanlines and find the intersections on each scanline, use non-zero rule */ + nsvg__initPaint(&cache, &shape->stroke, shape->opacity); - nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, shape->fillRule); - } - if (shape->stroke.type != NSVG_PAINT_NONE && (shape->strokeWidth * scale) > 0.01f) { - nsvg__resetPool(r); - r->freelist = NULL; - r->nedges = 0; - - nsvg__flattenShapeStroke(r, shape, scale); - -/* dumpEdges(r, "edge.svg"); */ - - /* Scale and translate edges */ - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - e->x0 = tx + e->x0; - e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; - e->x1 = tx + e->x1; - e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; + nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, NSVG_FILLRULE_NONZERO); } - - /* Rasterize edges */ - if (r->nedges != 0) - qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); - - /* now, traverse the scanlines and find the intersections on each scanline, use non-zero rule */ - nsvg__initPaint(&cache, &shape->stroke, shape->opacity); - - nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, NSVG_FILLRULE_NONZERO); } } diff --git a/generic/tk.h b/generic/tk.h index c855ddf..9267cff 100644 --- a/generic/tk.h +++ b/generic/tk.h @@ -72,10 +72,10 @@ extern "C" { #endif # define TK_MINOR_VERSION 1 # define TK_RELEASE_LEVEL TCL_ALPHA_RELEASE -# define TK_RELEASE_SERIAL 0 +# define TK_RELEASE_SERIAL 1 # define TK_VERSION "9.1" -# define TK_PATCH_LEVEL "9.1a0" +# define TK_PATCH_LEVEL "9.1a1" /* * A special definition used to allow this header file to be included from @@ -1535,7 +1535,7 @@ typedef Tcl_Size (Tk_SelectionProc) (void *clientData, Tcl_Size offset, *---------------------------------------------------------------------- */ -#include "tkDecls.h" +#include "tkDecls.h" /* IWYU pragma: export */ #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLIMPORT diff --git a/generic/tkClipboard.c b/generic/tkClipboard.c index b8d1a96..276e690 100644 --- a/generic/tkClipboard.c +++ b/generic/tkClipboard.c @@ -394,7 +394,7 @@ Tk_ClipboardAppend( cbPtr->buffer = (char *)ckalloc(cbPtr->length + 1); strcpy(cbPtr->buffer, buffer); - TkSelUpdateClipboard((TkWindow *) dispPtr->clipWindow, targetPtr); + TkSelUpdateClipboard((TkWindow *) dispPtr->clipWindow, CLIPBOARD_APPEND); return TCL_OK; } @@ -426,9 +426,9 @@ Tk_ClipboardObjCmd( Tk_Window tkwin = (Tk_Window)clientData; const char *path = NULL; Atom selection; - static const char *const optionStrings[] = { "append", "clear", "get", NULL }; - enum options { CLIPBOARD_APPEND, CLIPBOARD_CLEAR, CLIPBOARD_GET }; - int index, i; + static const char *const optionStrings[] = { + "append", "clear", "get", NULL }; + int index, i, result; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "option ?arg ...?"); @@ -440,7 +440,7 @@ Tk_ClipboardObjCmd( return TCL_ERROR; } - switch ((enum options) index) { + switch ((clipboardOption) index) { case CLIPBOARD_APPEND: { Atom target, format; const char *targetName = NULL; @@ -543,13 +543,16 @@ Tk_ClipboardObjCmd( if (tkwin == NULL) { return TCL_ERROR; } - return Tk_ClipboardClear(interp, tkwin); + result = Tk_ClipboardClear(interp, tkwin); + if (result == TCL_OK) { + TkSelUpdateClipboard((TkWindow *) tkwin, CLIPBOARD_CLEAR); + } + return result; } case CLIPBOARD_GET: { Atom target; const char *targetName = NULL; Tcl_DString selBytes; - int result; const char *string; static const char *const getOptionStrings[] = { "-displayof", "-type", NULL diff --git a/generic/tkCmds.c b/generic/tkCmds.c index ac636d7..0735ea8 100644 --- a/generic/tkCmds.c +++ b/generic/tkCmds.c @@ -36,18 +36,23 @@ static void WaitWindowProc(void *clientData, XEvent *eventPtr); static int AppnameCmd(void *dummy, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const *objv); +static int AttribtableCmd(void *dummy, Tcl_Interp *interp, + Tcl_Size objc, Tcl_Obj *const *objv); +static int AttribTableProc(void *dummy, Tcl_Interp *interp, + Tcl_Size objc, Tcl_Obj *const *objv); +static void AttribTableDeleteProc(void *dummy); +static void AttribTableDestroyHandler(void *dummy, + XEvent *eventPtr); static int CaretCmd(void *dummy, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const *objv); static int InactiveCmd(void *dummy, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const *objv); static int ScalingCmd(void *dummy, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const *objv); -static int UseinputmethodsCmd(void *dummy, - Tcl_Interp *interp, Tcl_Size objc, - Tcl_Obj *const *objv); -static int WindowingsystemCmd(void *dummy, - Tcl_Interp *interp, Tcl_Size objc, - Tcl_Obj *const *objv); +static int UseinputmethodsCmd(void *dummy, Tcl_Interp *interp, + Tcl_Size objc, Tcl_Obj *const *objv); +static int WindowingsystemCmd(void *dummy, Tcl_Interp *interp, + Tcl_Size objc, Tcl_Obj *const *objv); #if defined(_WIN32) || defined(MAC_OSX_TK) MODULE_SCOPE const TkEnsemble tkFontchooserEnsemble[]; @@ -62,6 +67,7 @@ MODULE_SCOPE const TkEnsemble tkFontchooserEnsemble[]; static const TkEnsemble tkCmdMap[] = { {"fontchooser", NULL, tkFontchooserEnsemble}, {"appname", AppnameCmd, NULL }, + {"attribtable", AttribtableCmd, NULL }, {"busy", Tk_BusyObjCmd, NULL }, {"caret", CaretCmd, NULL }, {"inactive", InactiveCmd, NULL }, @@ -664,8 +670,8 @@ TkInitTkCmd( /* *---------------------------------------------------------------------- * - * AppnameCmd, CaretCmd, ScalingCmd, UseinputmethodsCmd, - * WindowingsystemCmd, InactiveCmd -- + * AppnameCmd, AttribtableCmd, CaretCmd, InactiveCmd, ScalingCmd, + * UseinputmethodsCmd, WindowingsystemCmd -- * * These functions are invoked to process the "tk" ensemble subcommands. * See the user documentation for details on what they do. @@ -710,6 +716,422 @@ AppnameCmd( return TCL_OK; } +typedef struct AttribTableData { + Tcl_HashTable *tablePtr; +} AttribTableData; + +typedef struct AttribTableValue { + Tk_Window tkwin; + Tcl_HashTable *tablePtr; + Tcl_Obj *dictPtr; +} AttribTableValue; + +int +AttribtableCmd( + TCL_UNUSED(void *), /* Main window associated with interpreter. */ + Tcl_Interp *interp, /* Current interpreter. */ + Tcl_Size objc, /* Number of arguments. */ + Tcl_Obj *const objv[]) /* Argument objects. */ +{ + const char *tableName; + Tcl_Size nameLen; + Tcl_DString dsCmdName; + const char *cmdName; + AttribTableData *tblData; + + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "tableName"); + return TCL_ERROR; + } + + /* + * Get tableName and build the fully qualified name cmdName from it + */ + + tableName = Tcl_GetStringFromObj(objv[1], &nameLen); + Tcl_DStringInit(&dsCmdName); + if (nameLen < 2 || tableName[0] != ':' || tableName[1] != ':') { + Tcl_Namespace *curNs = Tcl_GetCurrentNamespace(interp); + + Tcl_DStringAppend(&dsCmdName, curNs->fullName, TCL_INDEX_NONE); + if (strlen(curNs->fullName) != 2) { + Tcl_DStringAppend(&dsCmdName, "::", TCL_INDEX_NONE); + } + } + Tcl_DStringAppend(&dsCmdName, tableName, TCL_INDEX_NONE); + cmdName = Tcl_DStringValue(&dsCmdName); + + /* + * Create an attribute table command of the name cmdName + */ + + tblData = (AttribTableData *)ckalloc(sizeof(AttribTableData)); + tblData->tablePtr = (Tcl_HashTable *)ckalloc(sizeof(Tcl_HashTable)); + Tcl_InitHashTable(tblData->tablePtr, TCL_ONE_WORD_KEYS); + + Tcl_CreateObjCommand2(interp, cmdName, + AttribTableProc, tblData, AttribTableDeleteProc); + + Tcl_SetObjResult(interp, Tcl_NewStringObj(cmdName, TCL_INDEX_NONE)); + Tcl_DStringFree(&dsCmdName); + + return TCL_OK; +} + +/* + * Called whenever the attribute table is invoked as command. + */ + +int +AttribTableProc( + void *clientData, /* Pointer to an AttribTableData struct. */ + Tcl_Interp *interp, /* Current interpreter. */ + Tcl_Size objc, /* Number of arguments. */ + Tcl_Obj *const objv[]) /* Argument objects. */ +{ + AttribTableData *tblData = (AttribTableData *)clientData; + static const char *const optionStrings[] = { + "set", "get", "unset", "clear", "exists", "names", "pathnames", NULL + }; + enum options { + TABLE_SET, TABLE_GET, TABLE_UNSET, TABLE_CLEAR, + TABLE_EXISTS, TABLE_NAMES, TABLE_PATHNAMES + }; + int index; + Tk_Window tkwin; /* Used in all subcommands except the last. */ + Tcl_HashEntry *entryPtr; /* Used in all subcommands. */ + AttribTableValue *value; /* Used in all subcommands. */ + + if (objc < 2) { + Tcl_WrongNumArgs(interp, 1, objv, + "set|get|unset|clear|exists|names|pathnames args"); + return TCL_ERROR; + } + + if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "subcommand", 0, + &index) != TCL_OK) { + return TCL_ERROR; + } + + if (objc > 2) { + tkwin = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), + Tk_MainWindow(interp)); + if (tkwin == NULL) { + if (index == TABLE_EXISTS || index == TABLE_PATHNAMES) { + Tcl_ResetResult(interp); + } else { + return TCL_ERROR; + } + } + } + + switch ((enum options) index) { + case TABLE_SET: { + int isNew; + Tcl_Size i; + + if (objc < 5 || objc % 2 == 0) { + Tcl_WrongNumArgs(interp, 2, objv, + "pathName name value ?name value ...?"); + return TCL_ERROR; + } + + entryPtr = Tcl_CreateHashEntry(tblData->tablePtr, tkwin, &isNew); + if (isNew) { + /* + * Create an AttribTableValue struct and insert it into the table. + */ + + value = (AttribTableValue *)ckalloc(sizeof(AttribTableValue)); + value->tkwin = tkwin; + value->tablePtr = tblData->tablePtr; + value->dictPtr = Tcl_NewDictObj(); + Tcl_IncrRefCount(value->dictPtr); + Tcl_SetHashValue(entryPtr, value); + + /* + * Arrange for AttribTableDestroyHandler to be invoked + * when the window identified by tkwin gets destroyed. + */ + + Tk_CreateEventHandler(tkwin, StructureNotifyMask, + AttribTableDestroyHandler, value); + } else { + value = (AttribTableValue *)Tcl_GetHashValue(entryPtr); + if (Tcl_IsShared(value->dictPtr)) { + /* + * For Tcl_DictObjPut below the dictionary must not be shared. + */ + + Tcl_DecrRefCount(value->dictPtr); + value->dictPtr = Tcl_DuplicateObj(value->dictPtr); + Tcl_IncrRefCount(value->dictPtr); + } + } + + for (i = 3; i < objc; i += 2) { + Tcl_DictObjPut(NULL, value->dictPtr, objv[i], objv[i+1]); + } + break; + } + + case TABLE_GET: { + if (objc < 3 || objc > 5) { + Tcl_WrongNumArgs(interp, 2, objv, + "pathName ?name ?defaultValue??"); + return TCL_ERROR; + } + + entryPtr = Tcl_FindHashEntry(tblData->tablePtr, tkwin); + if (entryPtr != NULL) { + value = Tcl_GetHashValue(entryPtr); + } + + if (objc == 3) { + if (entryPtr != NULL) { + Tcl_SetObjResult(interp, value->dictPtr); + } + } else { + Tcl_Obj *defaultValuePtr = (objc == 5 ? objv[4] : Tcl_NewObj()); + + if (entryPtr == NULL) { + Tcl_SetObjResult(interp, defaultValuePtr); + } else { + Tcl_Obj *resultPtr; + + Tcl_DictObjGet(NULL, value->dictPtr, objv[3], &resultPtr); + if (resultPtr == NULL) { + resultPtr = defaultValuePtr; + } + Tcl_SetObjResult(interp, resultPtr); + } + } + break; + } + + case TABLE_UNSET: { + Tcl_Size i; + + if (objc < 4) { + Tcl_WrongNumArgs(interp, 2, objv, "pathName name ?name ...?"); + return TCL_ERROR; + } + + entryPtr = Tcl_FindHashEntry(tblData->tablePtr, tkwin); + if (entryPtr == NULL) { + return TCL_OK; + } + + value = (AttribTableValue *)Tcl_GetHashValue(entryPtr); + if (Tcl_IsShared(value->dictPtr)) { + /* + * For Tcl_DictObjRemove below the dictionary must not be shared. + */ + + Tcl_DecrRefCount(value->dictPtr); + value->dictPtr = Tcl_DuplicateObj(value->dictPtr); + Tcl_IncrRefCount(value->dictPtr); + } + + for (i = 3; i < objc; i++) { + Tcl_DictObjRemove(NULL, value->dictPtr, objv[i]); + } + break; + } + + case TABLE_CLEAR: { + if (objc != 3) { + Tcl_WrongNumArgs(interp, 2, objv, "pathName"); + return TCL_ERROR; + } + + entryPtr = Tcl_FindHashEntry(tblData->tablePtr, tkwin); + if (entryPtr == NULL) { + return TCL_OK; + } + + /* + * Delete the event handler associated with value->tkwin. + */ + + value = (AttribTableValue *)Tcl_GetHashValue(entryPtr); + Tk_DeleteEventHandler(value->tkwin, StructureNotifyMask, + AttribTableDestroyHandler, value); + + /* + * Remove the entry from the hash table. + */ + + Tcl_DecrRefCount(value->dictPtr); + Tcl_DeleteHashEntry(entryPtr); + ckfree(value); + break; + } + + case TABLE_EXISTS: { + Tcl_Obj *resultPtr; + + if (objc != 3 && objc != 4) { + Tcl_WrongNumArgs(interp, 2, objv, "pathName ?name?"); + return TCL_ERROR; + } + + if (tkwin == NULL) { + resultPtr = Tcl_NewIntObj(0); + } else { + entryPtr = Tcl_FindHashEntry(tblData->tablePtr, tkwin); + if (entryPtr == NULL) { + resultPtr = Tcl_NewIntObj(0); + } else { + value = Tcl_GetHashValue(entryPtr); + if (objc == 3) { + Tcl_Size size; + + Tcl_DictObjSize(interp, value->dictPtr, &size); + resultPtr = Tcl_NewIntObj(size != 0); + } else { + Tcl_Obj *testObj; + + Tcl_DictObjGet(NULL, value->dictPtr, objv[3], &testObj); + resultPtr = Tcl_NewIntObj(testObj != NULL); + } + } + } + + Tcl_SetObjResult(interp, resultPtr); + break; + } + + case TABLE_NAMES: { + Tcl_Obj *resultPtr; + Tcl_DictSearch search; + Tcl_Obj *key; + int done; + + if (objc != 3) { + Tcl_WrongNumArgs(interp, 2, objv, "pathName"); + return TCL_ERROR; + } + + entryPtr = Tcl_FindHashEntry(tblData->tablePtr, tkwin); + if (entryPtr == NULL) { + return TCL_OK; + } + + resultPtr = Tcl_NewObj(); + value = Tcl_GetHashValue(entryPtr); + Tcl_DictObjFirst(interp, value->dictPtr, &search, &key, NULL, &done); + while (!done) { + Tcl_ListObjAppendElement(NULL, resultPtr, key); + Tcl_DictObjNext(&search, &key, NULL, &done); + } + Tcl_DictObjDone(&search); + + Tcl_SetObjResult(interp, resultPtr); + break; + } + + case TABLE_PATHNAMES: { + Tcl_Obj *resultPtr; + Tcl_HashSearch search; + + if (objc != 2) { + Tcl_WrongNumArgs(interp, 2, objv, NULL); + return TCL_ERROR; + } + + resultPtr = Tcl_NewObj(); + for (entryPtr = Tcl_FirstHashEntry(tblData->tablePtr, &search); + entryPtr != NULL; entryPtr = Tcl_NextHashEntry(&search)) { + Tcl_Size size; + + value = Tcl_GetHashValue(entryPtr); + Tcl_DictObjSize(interp, value->dictPtr, &size); + if (size != 0) { + Tcl_ListObjAppendElement(NULL, resultPtr, + Tcl_NewStringObj(Tk_PathName(value->tkwin), -1)); + } + } + + Tcl_SetObjResult(interp, resultPtr); + break; + } + } /* switch */ + + return TCL_OK; +} + +/* + * Called before the attribute table command is deleted from the interpreter. + */ + +void +AttribTableDeleteProc( + void *clientData) /* Pointer to an AttribTableData struct. */ +{ + AttribTableData *tblData = (AttribTableData *)clientData; + Tcl_HashEntry *entryPtr; + Tcl_HashSearch search; + + for (entryPtr = Tcl_FirstHashEntry(tblData->tablePtr, &search); + entryPtr != NULL; entryPtr = Tcl_NextHashEntry(&search)) { + AttribTableValue *value = Tcl_GetHashValue(entryPtr); + + /* + * Delete the event handler associated with value->tkwin. + */ + + Tk_DeleteEventHandler(value->tkwin, StructureNotifyMask, + AttribTableDestroyHandler, value); + + /* + * Remove the entry from the hash table. + */ + + Tcl_DecrRefCount(value->dictPtr); + Tcl_DeleteHashEntry(entryPtr); + ckfree(value); + } + + /* + * Free up the memory used by the hash table. + */ + + Tcl_DeleteHashTable(tblData->tablePtr); + ckfree(tblData->tablePtr); + ckfree(tblData); +} + +/* + * Called when the window identified by the first argument gets destroyed. + */ + +void +AttribTableDestroyHandler( + void *clientData, /* Pointer to an AttribTableValue struct. */ + XEvent *eventPtr) /* Information about event. */ +{ + AttribTableValue *value = (AttribTableValue *)clientData; + Tcl_HashEntry *entryPtr; + + if (eventPtr->type != DestroyNotify) { + return; + } + + entryPtr = Tcl_FindHashEntry(value->tablePtr, value->tkwin); + if (entryPtr == NULL) { + return; + } + + /* + * Remove the entry from the hash table. + */ + + Tcl_DecrRefCount(value->dictPtr); + Tcl_DeleteHashEntry(entryPtr); + ckfree(value); +} + int CaretCmd( void *clientData, /* Main window associated with interpreter. */ @@ -804,6 +1226,52 @@ CaretCmd( } int +InactiveCmd( + void *clientData, /* Main window associated with interpreter. */ + Tcl_Interp *interp, /* Current interpreter. */ + Tcl_Size objc, /* Number of arguments. */ + Tcl_Obj *const objv[]) /* Argument objects. */ +{ + Tk_Window tkwin = (Tk_Window)clientData; + Tcl_Size skip = TkGetDisplayOf(interp, objc - 1, objv + 1, &tkwin); + + if (skip < 0) { + return TCL_ERROR; + } + if (objc == 1 + skip) { + Tcl_WideInt inactive; + + inactive = (Tcl_IsSafe(interp) ? -1 : + Tk_GetUserInactiveTime(Tk_Display(tkwin))); + Tcl_SetObjResult(interp, Tcl_NewWideIntObj(inactive)); + } else if (objc == 2 + skip) { + const char *string; + + string = Tcl_GetString(objv[objc-1]); + if (strcmp(string, "reset") != 0) { + Tcl_SetObjResult(interp, Tcl_ObjPrintf( + "bad option \"%s\": must be reset", string)); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "INDEX", "option", + string, (char *)NULL); + return TCL_ERROR; + } + if (Tcl_IsSafe(interp)) { + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "resetting the user inactivity timer " + "is not allowed in a safe interpreter", TCL_INDEX_NONE)); + Tcl_SetErrorCode(interp, "TK", "SAFE", "INACTIVITY_TIMER", (char *)NULL); + return TCL_ERROR; + } + Tk_ResetUserInactiveTime(Tk_Display(tkwin)); + Tcl_ResetResult(interp); + } else { + Tcl_WrongNumArgs(interp, 1, objv, "?-displayof window? ?reset?"); + return TCL_ERROR; + } + return TCL_OK; +} + +int ScalingCmd( void *clientData, /* Main window associated with interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ @@ -945,52 +1413,6 @@ WindowingsystemCmd( Tcl_SetObjResult(interp, Tcl_NewStringObj(windowingsystem, TCL_INDEX_NONE)); return TCL_OK; } - -int -InactiveCmd( - void *clientData, /* Main window associated with interpreter. */ - Tcl_Interp *interp, /* Current interpreter. */ - Tcl_Size objc, /* Number of arguments. */ - Tcl_Obj *const objv[]) /* Argument objects. */ -{ - Tk_Window tkwin = (Tk_Window)clientData; - Tcl_Size skip = TkGetDisplayOf(interp, objc - 1, objv + 1, &tkwin); - - if (skip < 0) { - return TCL_ERROR; - } - if (objc == 1 + skip) { - Tcl_WideInt inactive; - - inactive = (Tcl_IsSafe(interp) ? -1 : - Tk_GetUserInactiveTime(Tk_Display(tkwin))); - Tcl_SetObjResult(interp, Tcl_NewWideIntObj(inactive)); - } else if (objc == 2 + skip) { - const char *string; - - string = Tcl_GetString(objv[objc-1]); - if (strcmp(string, "reset") != 0) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "bad option \"%s\": must be reset", string)); - Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "INDEX", "option", - string, (char *)NULL); - return TCL_ERROR; - } - if (Tcl_IsSafe(interp)) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "resetting the user inactivity timer " - "is not allowed in a safe interpreter", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "SAFE", "INACTIVITY_TIMER", (char *)NULL); - return TCL_ERROR; - } - Tk_ResetUserInactiveTime(Tk_Display(tkwin)); - Tcl_ResetResult(interp); - } else { - Tcl_WrongNumArgs(interp, 1, objv, "?-displayof window? ?reset?"); - return TCL_ERROR; - } - return TCL_OK; -} /* *---------------------------------------------------------------------- diff --git a/generic/tkColor.c b/generic/tkColor.c index feaf93c..37df563 100644 --- a/generic/tkColor.c +++ b/generic/tkColor.c @@ -232,11 +232,11 @@ Tk_GetColor( if (*name == '#') { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "invalid color name \"%s\"", name)); - Tcl_SetErrorCode(interp, "TK", "VALUE", "COLOR", NULL); + Tcl_SetErrorCode(interp, "TK", "VALUE", "COLOR", (char *)NULL); } else { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown color name \"%s\"", name)); - Tcl_SetErrorCode(interp, "TK", "LOOKUP", "COLOR", name, NULL); + Tcl_SetErrorCode(interp, "TK", "LOOKUP", "COLOR", name, (char *)NULL); } } if (isNew) { diff --git a/generic/tkColor.h b/generic/tkColor.h index d4a1fa7..ffc6f89 100644 --- a/generic/tkColor.h +++ b/generic/tkColor.h @@ -69,7 +69,7 @@ typedef struct TkColor { #ifndef TkpFreeColor MODULE_SCOPE void TkpFreeColor(TkColor *tkColPtr); #endif -MODULE_SCOPE TkColor * TkpGetColor(Tk_Window tkwin, Tk_Uid name); +MODULE_SCOPE TkColor * TkpGetColor(Tk_Window tkwin, const char *name); MODULE_SCOPE TkColor * TkpGetColorByValue(Tk_Window tkwin, XColor *colorPtr); #endif /* _TKCOLOR */ diff --git a/generic/tkConfig.c b/generic/tkConfig.c index 8dec92c..b0d6025 100644 --- a/generic/tkConfig.c +++ b/generic/tkConfig.c @@ -1113,15 +1113,15 @@ DoObjConfig( #if defined(USE_TCL_STUBS) # undef Tcl_IsEmpty # define Tcl_IsEmpty \ - ((int (*)(Tcl_Obj *))(void *)((&(tclStubsPtr->tcl_PkgProvideEx))[690])) + ((bool (*)(Tcl_Obj *))(void *)((&(tclStubsPtr->tcl_PkgProvideEx))[690])) #endif -int +bool TkObjIsEmpty( Tcl_Obj *objPtr) /* Object to test. May be NULL. */ { if (objPtr == NULL) { - return 1; + return true; } if (objPtr->bytes == NULL) { #if defined(USE_TCL_STUBS) diff --git a/generic/tkConsole.c b/generic/tkConsole.c index 6768dac..4e268d3 100644 --- a/generic/tkConsole.c +++ b/generic/tkConsole.c @@ -759,7 +759,7 @@ ConsoleObjCmd( } else { Tcl_SetObjResult(interp, Tcl_NewStringObj( "no active console interp", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "CONSOLE", "NONE", NULL); + Tcl_SetErrorCode(interp, "TK", "CONSOLE", "NONE", (char *)NULL); result = TCL_ERROR; } Tcl_DecrRefCount(cmd); @@ -810,7 +810,7 @@ InterpreterObjCmd( if ((otherInterp == NULL) || Tcl_InterpDeleted(otherInterp)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "no active parent interp", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "CONSOLE", "NO_INTERP", NULL); + Tcl_SetErrorCode(interp, "TK", "CONSOLE", "NO_INTERP", (char *)NULL); return TCL_ERROR; } diff --git a/generic/tkCursor.c b/generic/tkCursor.c index f2d3af0..d402961 100644 --- a/generic/tkCursor.c +++ b/generic/tkCursor.c @@ -360,13 +360,13 @@ Tk_GetCursorFromData( if (TkParseColor(dataKey.display, Tk_Colormap(tkwin), fg, &fgColor) == 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "invalid color name \"%s\"", fg)); - Tcl_SetErrorCode(interp, "TK", "VALUE", "CURSOR", "COLOR", NULL); + Tcl_SetErrorCode(interp, "TK", "VALUE", "CURSOR", "COLOR", (char *)NULL); goto error; } if (TkParseColor(dataKey.display, Tk_Colormap(tkwin), bg, &bgColor) == 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "invalid color name \"%s\"", bg)); - Tcl_SetErrorCode(interp, "TK", "VALUE", "CURSOR", "COLOR", NULL); + Tcl_SetErrorCode(interp, "TK", "VALUE", "CURSOR", "COLOR", (char *)NULL); goto error; } diff --git a/generic/tkFileFilter.c b/generic/tkFileFilter.c index cac1c78..7ceeadb 100644 --- a/generic/tkFileFilter.c +++ b/generic/tkFileFilter.c @@ -124,7 +124,7 @@ TkGetFileFilters( "\"typeName {extension ?extensions ...?} " "?{macType ?macTypes ...?}?\"", Tcl_GetString(listObjv[i]))); - Tcl_SetErrorCode(interp, "TK", "VALUE", "FILE_TYPE", NULL); + Tcl_SetErrorCode(interp, "TK", "VALUE", "FILE_TYPE", (char *)NULL); return TCL_ERROR; } @@ -294,7 +294,7 @@ AddClause( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad Macintosh file type \"%s\"", Tcl_GetString(ostypeList[i]))); - Tcl_SetErrorCode(interp, "TK", "VALUE", "MAC_TYPE", NULL); + Tcl_SetErrorCode(interp, "TK", "VALUE", "MAC_TYPE", (char *)NULL); code = TCL_ERROR; goto done; } diff --git a/generic/tkFont.c b/generic/tkFont.c index cc1beb8..02ccb3a 100644 --- a/generic/tkFont.c +++ b/generic/tkFont.c @@ -585,7 +585,7 @@ Tk_FontObjCmd( TCL_INDEX_NONE, 40, "..."); Tcl_AppendToObj(resultPtr, "\"", TCL_INDEX_NONE); Tcl_SetObjResult(interp, resultPtr); - Tcl_SetErrorCode(interp, "TK", "VALUE", "FONT_SAMPLE", NULL); + Tcl_SetErrorCode(interp, "TK", "VALUE", "FONT_SAMPLE", (char *)NULL); return TCL_ERROR; } } @@ -634,7 +634,7 @@ Tk_FontObjCmd( if ((namedHashPtr == NULL) || nfPtr->deletePending) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "named font \"%s\" does not exist", string)); - Tcl_SetErrorCode(interp, "TK", "LOOKUP", "FONT", string, NULL); + Tcl_SetErrorCode(interp, "TK", "LOOKUP", "FONT", string, (char *)NULL); return TCL_ERROR; } if (objc == 3) { @@ -977,7 +977,7 @@ TkCreateNamedFont( if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "named font \"%s\" already exists", name)); - Tcl_SetErrorCode(interp, "TK", "FONT", "EXISTS", NULL); + Tcl_SetErrorCode(interp, "TK", "FONT", "EXISTS", (char *)NULL); } return TCL_ERROR; } @@ -1029,7 +1029,7 @@ TkDeleteNamedFont( if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "named font \"%s\" does not exist", name)); - Tcl_SetErrorCode(interp, "TK", "LOOKUP", "FONT", name, NULL); + Tcl_SetErrorCode(interp, "TK", "LOOKUP", "FONT", name, (char *)NULL); } return TCL_ERROR; } @@ -1216,7 +1216,7 @@ Tk_AllocFontFromObj( Tcl_SetObjResult(interp, Tcl_NewStringObj( "failed to allocate font due to internal system font engine" " problem", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "FONT", "INTERNAL_PROBLEM", NULL); + Tcl_SetErrorCode(interp, "TK", "FONT", "INTERNAL_PROBLEM", (char *)NULL); return NULL; } @@ -3443,7 +3443,7 @@ ConfigAttributesObj( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "value for \"%s\" option missing", Tcl_GetString(optionPtr))); - Tcl_SetErrorCode(interp, "TK", "FONT", "NO_ATTRIBUTE", NULL); + Tcl_SetErrorCode(interp, "TK", "FONT", "NO_ATTRIBUTE", (char *)NULL); } return TCL_ERROR; } @@ -3744,7 +3744,7 @@ ParseFontNameObj( if (interp != NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "font \"%s\" does not exist", string)); - Tcl_SetErrorCode(interp, "TK", "LOOKUP", "FONT", string, NULL); + Tcl_SetErrorCode(interp, "TK", "LOOKUP", "FONT", string, (char *)NULL); } return TCL_ERROR; } diff --git a/generic/tkFrame.c b/generic/tkFrame.c index 3da7069..dc04ddc 100644 --- a/generic/tkFrame.c +++ b/generic/tkFrame.c @@ -537,7 +537,7 @@ TkCreateFrame( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unable to create widget \"%s\"", Tcl_GetString(objv[1]))); - Tcl_SetErrorCode(interp, "TK", "APPLICATION_GONE", NULL); + Tcl_SetErrorCode(interp, "TK", "APPLICATION_GONE", (char *)NULL); return TCL_ERROR; } else { /* @@ -657,7 +657,7 @@ TkCreateFrame( Tcl_SetObjResult(interp, Tcl_NewStringObj( "windows cannot have both the -use and the -container" " option set", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "FRAME", "CONTAINMENT", NULL); + Tcl_SetErrorCode(interp, "TK", "FRAME", "CONTAINMENT", (char *)NULL); goto error; } Tk_MakeContainer(framePtr->tkwin); @@ -1044,7 +1044,7 @@ ConfigureFrame( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "can't use %s as label in this frame", Tk_PathName(labelframePtr->labelWin))); - Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "HIERARCHY", NULL); + Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "HIERARCHY", (char *)NULL); labelframePtr->labelWin = NULL; return TCL_ERROR; } diff --git a/generic/tkImgGIF.c b/generic/tkImgGIF.c index 0a842fd..c07d986 100644 --- a/generic/tkImgGIF.c +++ b/generic/tkImgGIF.c @@ -935,7 +935,7 @@ ReadOneByte( Tcl_SetObjResult(interp, Tcl_NewStringObj( "premature end of image data", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "GIF", "PREMATURE_END", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "GIF", "PREMATURE_END", (char *)NULL); return -1; } return buf[0]; diff --git a/generic/tkImgPNG.c b/generic/tkImgPNG.c index a49ed15..50861bc 100644 --- a/generic/tkImgPNG.c +++ b/generic/tkImgPNG.c @@ -355,7 +355,7 @@ InitPNGImage( if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "zlib initialization failed", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "ZLIB_INIT", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "ZLIB_INIT", (char *)NULL); } if (objPtr) { Tcl_DecrRefCount(objPtr); @@ -546,7 +546,7 @@ ReadBase64( if (destSz) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "unexpected end of image data", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EARLY_END", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EARLY_END", (char *)NULL); return TCL_ERROR; } @@ -590,7 +590,7 @@ ReadByteArray( if (pngPtr->strDataLen < destSz) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "unexpected end of image data", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EARLY_END", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EARLY_END", (char *)NULL); return TCL_ERROR; } @@ -678,7 +678,7 @@ ReadData( if (destSz && Tcl_Eof(pngPtr->channel)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "unexpected end of file", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EOF", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EOF", (char *)NULL); return TCL_ERROR; } } @@ -764,7 +764,7 @@ CheckCRC( if (calculated != chunked) { Tcl_SetObjResult(interp, Tcl_NewStringObj("CRC check failed", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "CRC", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "CRC", (char *)NULL); return TCL_ERROR; } @@ -917,7 +917,7 @@ ReadChunkHeader( Tcl_SetObjResult(interp, Tcl_NewStringObj( "chunk size is out of supported range on this architecture", -1)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "OUTSIZE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "OUTSIZE", (char *)NULL); return TCL_ERROR; } @@ -1137,7 +1137,7 @@ CheckColor( unsupportedDepth: Tcl_SetObjResult(interp, Tcl_NewStringObj( "bit depth is not allowed for given color type", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_DEPTH", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_DEPTH", (char *)NULL); return TCL_ERROR; } break; @@ -1145,7 +1145,7 @@ CheckColor( default: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown color type field %d", pngPtr->colorType)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "UNKNOWN_COLOR", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "UNKNOWN_COLOR", (char *)NULL); return TCL_ERROR; } @@ -1176,7 +1176,7 @@ CheckColor( Tcl_SetObjResult(interp, Tcl_NewStringObj( "image pitch is out of supported range on this architecture", -1)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "PITCH", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "PITCH", (char *)NULL); return TCL_ERROR; } @@ -1191,7 +1191,7 @@ CheckColor( Tcl_SetObjResult(interp, Tcl_NewStringObj( "image total size is out of supported range on this architecture", -1)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "SIZE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "SIZE", (char *)NULL); return TCL_ERROR; } @@ -1220,7 +1220,7 @@ CheckColor( default: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown color type %d", pngPtr->colorType)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "UNKNOWN_COLOR", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "UNKNOWN_COLOR", (char *)NULL); return TCL_ERROR; } @@ -1302,7 +1302,7 @@ ReadIHDR( if (mismatch) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "data stream does not have a PNG signature", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "NO_SIG", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "NO_SIG", (char *)NULL); return TCL_ERROR; } @@ -1320,14 +1320,14 @@ ReadIHDR( if (chunkType != CHUNK_IHDR) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "expected IHDR chunk type", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "NO_IHDR", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "NO_IHDR", (char *)NULL); return TCL_ERROR; } if (chunkSz != 13) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "invalid IHDR chunk size", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_IHDR", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_IHDR", (char *)NULL); return TCL_ERROR; } @@ -1349,7 +1349,7 @@ ReadIHDR( Tcl_SetObjResult(interp, Tcl_NewStringObj( "image dimensions are invalid or beyond architecture limits", -1)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "DIMENSIONS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "DIMENSIONS", (char *)NULL); return TCL_ERROR; } @@ -1394,7 +1394,7 @@ ReadIHDR( if (pngPtr->compression != PNG_COMPRESS_DEFLATE) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown compression method %d", pngPtr->compression)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_COMPRESS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_COMPRESS", (char *)NULL); return TCL_ERROR; } @@ -1410,7 +1410,7 @@ ReadIHDR( if (pngPtr->filter != PNG_FILTMETH_STANDARD) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown filter method %d", pngPtr->filter)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_FILTER", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_FILTER", (char *)NULL); return TCL_ERROR; } @@ -1426,7 +1426,7 @@ ReadIHDR( default: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown interlace method %d", pngPtr->interlace)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_INTERLACE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_INTERLACE", (char *)NULL); return TCL_ERROR; } @@ -1472,7 +1472,7 @@ ReadPLTE( Tcl_SetObjResult(interp, Tcl_NewStringObj( "PLTE chunk type forbidden for grayscale", TCL_INDEX_NONE)); Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "PLTE_UNEXPECTED", - NULL); + (char *)NULL); return TCL_ERROR; default: @@ -1488,7 +1488,7 @@ ReadPLTE( if (!chunkSz || (chunkSz > PNG_PLTE_MAXSZ) || (chunkSz % 3)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "invalid palette chunk size", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_PLTE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_PLTE", (char *)NULL); return TCL_ERROR; } @@ -1553,7 +1553,7 @@ ReadTRNS( Tcl_SetObjResult(interp, Tcl_NewStringObj( "tRNS chunk not allowed color types with a full alpha channel", -1)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "INVALID_TRNS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "INVALID_TRNS", (char *)NULL); return TCL_ERROR; } @@ -1565,7 +1565,7 @@ ReadTRNS( if (chunkSz > PNG_TRNS_MAXSZ) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "invalid tRNS chunk size", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_TRNS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_TRNS", (char *)NULL); return TCL_ERROR; } @@ -1596,7 +1596,7 @@ ReadTRNS( if (chunkSz > pngPtr->paletteLen) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "size of tRNS chunk is too large for the palette", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "TRNS_SIZE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "TRNS_SIZE", (char *)NULL); return TCL_ERROR; } @@ -1615,7 +1615,7 @@ ReadTRNS( Tcl_SetObjResult(interp, Tcl_NewStringObj( "invalid tRNS chunk size - must 2 bytes for grayscale", -1)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_TRNS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_TRNS", (char *)NULL); return TCL_ERROR; } @@ -1641,7 +1641,7 @@ ReadTRNS( if (chunkSz != 6) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "invalid tRNS chunk size - must 6 bytes for RGB", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_TRNS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_TRNS", (char *)NULL); return TCL_ERROR; } @@ -1701,7 +1701,7 @@ ReadPHYS( if (chunkSz != 9) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "invalid physical chunk size", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_PHYS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_PHYS", (char *)NULL); return TCL_ERROR; } @@ -1730,7 +1730,7 @@ ReadPHYS( || unitSpecifier > 1 ) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "invalid physical size value", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_PHYS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_PHYS", (char *)NULL); return TCL_ERROR; } @@ -1902,7 +1902,7 @@ UnfilterLine( default: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "invalid filter type %d", *thisLine)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_FILTER", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_FILTER", (char *)NULL); return TCL_ERROR; } @@ -1952,7 +1952,7 @@ DecodeLine( if (pngPtr->currentLine >= pngPtr->block.height) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "PNG image data overflow")); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "DATA_OVERFLOW", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "DATA_OVERFLOW", (char *)NULL); return TCL_ERROR; } @@ -2310,7 +2310,7 @@ ReadIDAT( if (chunkSz != 0) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "compressed data after stream finalize in PNG data", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EXTRA_DATA", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EXTRA_DATA", (char *)NULL); return TCL_ERROR; } @@ -2566,7 +2566,7 @@ DecodePNG( } else if (PNG_COLOR_PLTE == pngPtr->colorType) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "PLTE chunk required for indexed color", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "NEED_PLTE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "NEED_PLTE", (char *)NULL); return TCL_ERROR; } @@ -2627,7 +2627,7 @@ DecodePNG( if (chunkType != CHUNK_IDAT) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "at least one IDAT chunk is required", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "NEED_IDAT", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "NEED_IDAT", (char *)NULL); return TCL_ERROR; } @@ -2651,7 +2651,7 @@ DecodePNG( Tcl_SetObjResult(interp, Tcl_NewStringObj( "line size is out of supported range on this architecture", -1)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "LINE_SIZE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "LINE_SIZE", (char *)NULL); return TCL_ERROR; } @@ -2678,7 +2678,7 @@ DecodePNG( if (!pngPtr->block.pixelPtr) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "memory allocation failed", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "MALLOC", NULL); + Tcl_SetErrorCode(interp, "TK", "MALLOC", (char *)NULL); return TCL_ERROR; } @@ -2730,7 +2730,7 @@ DecodePNG( if (!Tcl_ZlibStreamEof(pngPtr->stream)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "unfinalized data stream in PNG data", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EXTRA_DATA", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "EXTRA_DATA", (char *)NULL); return TCL_ERROR; } @@ -2756,7 +2756,7 @@ DecodePNG( if (chunkSz) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "IEND chunk contents must be empty", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_IEND", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_IEND", (char *)NULL); return TCL_ERROR; } @@ -2777,7 +2777,7 @@ DecodePNG( if (ReadData(interp, pngPtr, &c, 1, NULL) != TCL_ERROR) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "extra data following IEND chunk", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_IEND", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "BAD_IEND", (char *)NULL); return TCL_ERROR; } #endif @@ -3056,7 +3056,7 @@ WriteData( if (objSz + srcSz > INT_MAX) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "image too large to store completely in byte array", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "TOO_LARGE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "TOO_LARGE", (char *)NULL); return TCL_ERROR; } @@ -3065,7 +3065,7 @@ WriteData( if (!destPtr) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "memory allocation failed", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "MALLOC", NULL); + Tcl_SetErrorCode(interp, "TK", "MALLOC", (char *)NULL); return TCL_ERROR; } @@ -3413,7 +3413,7 @@ WriteIDAT( flush) != TCL_OK) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "deflate() returned error", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "DEFLATE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "DEFLATE", (char *)NULL); return TCL_ERROR; } @@ -3574,7 +3574,7 @@ WriteExtraChunks( if ( PPUx > 2147483647 || PPUy > 2147483647 ) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "DPI or aspect out of range", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "PHYS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "PHYS", (char *)NULL); return TCL_ERROR; } @@ -3664,7 +3664,7 @@ EncodePNG( (blockPtr->height > INT_MAX / pngPtr->lineSize)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "image is too large to encode pixel data", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "TOO_LARGE", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PNG", "TOO_LARGE", (char *)NULL); return TCL_ERROR; } diff --git a/generic/tkImgPPM.c b/generic/tkImgPPM.c index a9d0391..f3f7c60 100644 --- a/generic/tkImgPPM.c +++ b/generic/tkImgPPM.c @@ -154,20 +154,20 @@ FileReadPPM( if (type == 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "couldn't read raw PPM header from file \"%s\"", fileName)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "NO_HEADER", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "NO_HEADER", (char *)NULL); return TCL_ERROR; } if ((fileWidth <= 0) || (fileHeight <= 0)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "PPM image file \"%s\" has dimension(s) <= 0", fileName)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "DIMENSIONS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "DIMENSIONS", (char *)NULL); return TCL_ERROR; } if ((maxIntensity <= 0) || (maxIntensity > 0xffff)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "PPM image file \"%s\" has bad maximum intensity value %d", fileName, maxIntensity)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "INTENSITY", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "INTENSITY", (char *)NULL); return TCL_ERROR; } else if (maxIntensity > 0x00ff) { bytesPerChannel = 2; @@ -230,7 +230,7 @@ FileReadPPM( "error reading PPM image file \"%s\": %s", fileName, Tcl_Eof(chan)?"not enough data":Tcl_PosixError(interp))); if (Tcl_Eof(chan)) { - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "EOF", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "EOF", (char *)NULL); } ckfree(pixelPtr); return TCL_ERROR; @@ -499,20 +499,20 @@ StringReadPPM( if (type == 0) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "couldn't read raw PPM header from string", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "NO_HEADER", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "NO_HEADER", (char *)NULL); return TCL_ERROR; } if ((fileWidth <= 0) || (fileHeight <= 0)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "PPM image data has dimension(s) <= 0", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "DIMENSIONS", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "DIMENSIONS", (char *)NULL); return TCL_ERROR; } if ((maxIntensity <= 0) || (maxIntensity > 0xffff)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "PPM image data has bad maximum intensity value %d", maxIntensity)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "INTENSITY", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "INTENSITY", (char *)NULL); return TCL_ERROR; } else if (maxIntensity > 0x00ff) { bytesPerChannel = 2; @@ -557,7 +557,7 @@ StringReadPPM( if (block.pitch*height > dataSize) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "truncated PPM data", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "TRUNCATED", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "TRUNCATED", (char *)NULL); return TCL_ERROR; } block.pixelPtr = dataBuffer + srcX * block.pixelSize; @@ -593,7 +593,7 @@ StringReadPPM( ckfree(pixelPtr); Tcl_SetObjResult(interp, Tcl_NewStringObj( "truncated PPM data", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "TRUNCATED", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "PPM", "TRUNCATED", (char *)NULL); return TCL_ERROR; } if (maxIntensity < 0x00ff) { diff --git a/generic/tkImgPhoto.c b/generic/tkImgPhoto.c index 1dbadf6..fcb1c1c 100644 --- a/generic/tkImgPhoto.c +++ b/generic/tkImgPhoto.c @@ -4143,6 +4143,9 @@ ImgGetPhoto( int x, y, greenOffset, blueOffset, alphaOffset; Tk_PhotoGetImage((Tk_PhotoHandle) modelPtr, blockPtr); + if (!blockPtr->pixelPtr) { + return NULL; + } blockPtr->pixelPtr += optPtr->fromY * blockPtr->pitch + optPtr->fromX * blockPtr->pixelSize; blockPtr->width = optPtr->fromX2 - optPtr->fromX; diff --git a/generic/tkImgSVGnano.c b/generic/tkImgSVGnano.c index 29b0e0e..4c46f86 100644 --- a/generic/tkImgSVGnano.c +++ b/generic/tkImgSVGnano.c @@ -249,7 +249,7 @@ FileReadSVG( /* in case of an error reading the file */ Tcl_DecrRefCount(dataObj); Tcl_SetObjResult(interp, Tcl_NewStringObj("read error", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "READ_ERROR", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "READ_ERROR", (char *)NULL); return TCL_ERROR; } data = Tcl_GetStringFromObj(dataObj, &length); @@ -406,7 +406,7 @@ ParseSVGWithOptions( inputCopy = (char *)attemptckalloc(length+1); if (inputCopy == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj("cannot alloc data buffer", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "OUT_OF_MEMORY", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "OUT_OF_MEMORY", (char *)NULL); goto error; } memcpy(inputCopy, input, length); @@ -530,7 +530,7 @@ ParseSVGWithOptions( nsvgImage = nsvgParse(inputCopy, "px", (float) dpi); if (nsvgImage == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj("cannot parse SVG image", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "PARSE_ERROR", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "PARSE_ERROR", (char *)NULL); goto error; } ckfree(inputCopy); @@ -594,14 +594,14 @@ RasterizeSVG( wh = (Tcl_WideUInt)w * (Tcl_WideUInt)h; if ( w < 0 || h < 0 || wh > INT_MAX / 4) { Tcl_SetObjResult(interp, Tcl_NewStringObj("image size overflow", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "IMAGE_SIZE_OVERFLOW", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "IMAGE_SIZE_OVERFLOW", (char *)NULL); goto cleanRAST; } imgData = (unsigned char *)attemptckalloc(wh * 4); if (imgData == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj("cannot alloc image buffer", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "OUT_OF_MEMORY", NULL); + Tcl_SetErrorCode(interp, "TK", "IMAGE", "SVG", "OUT_OF_MEMORY", (char *)NULL); goto cleanRAST; } nsvgRasterize(rast, nsvgImage, 0, 0, diff --git a/generic/tkInt.decls b/generic/tkInt.decls index c6b61e0..a2baa7f 100644 --- a/generic/tkInt.decls +++ b/generic/tkInt.decls @@ -212,7 +212,7 @@ declare 54 { double width, int filled, double pointPtr[]) } declare 55 { - int TkpChangeFocus(TkWindow *winPtr, int force) + size_t TkpChangeFocus(TkWindow *winPtr, int force) } declare 56 { void TkpCloseDisplay(TkDisplay *dispPtr) @@ -718,7 +718,7 @@ declare 16 win { HDC TkWinGetDrawableDC(Display *display, Drawable d, TkWinDCState *state) } declare 17 win { - int TkWinGetModifierState(void) + unsigned int TkWinGetModifierState(void) } declare 18 win { HPALETTE TkWinGetSystemPalette(void) @@ -779,9 +779,11 @@ declare 33 win { declare 34 win { void TkWinSetHINSTANCE(HINSTANCE hInstance) } -declare 35 win { - int TkWinGetPlatformTheme(void) -} + +# removed in Tk 9.1 +#declare 35 win { +# int TkWinGetPlatformTheme(void) +#} # Exported through stub table since Tk 8.4.20/8.5.9 @@ -915,7 +917,7 @@ declare 38 aqua { int TkSetMacColor(unsigned long pixel, void *macColor) } declare 39 aqua { - void TkSetWMName(TkWindow *winPtr, Tk_Uid titleUid) + void TkSetWMName(TkWindow *winPtr, const char *title) } declare 41 aqua { int TkMacOSXZoomToplevel(void *whichWindow, short zoomPart) @@ -1427,6 +1429,12 @@ declare 142 win { declare 143 win { void XSetICFocus(XIC xic) } +declare 144 win { + int XXorRegion(Region sra, Region srb, Region dr_return) +} +declare 145 win { + Bool XEqualRegion(Region r1, Region r2) +} declare 147 win { void XFreeFontSet(Display *display, XFontSet fontset) } @@ -1933,6 +1941,12 @@ declare 142 macosx { declare 143 macosx { void XSetICFocus(XIC xic) } +declare 144 macosx { + int XXorRegion(Region sra, Region srb, Region dr_return) +} +declare 145 macosx { + Bool XEqualRegion(Region r1, Region r2) +} declare 147 macosx { void XFreeFontSet(Display *display, XFontSet fontset) } diff --git a/generic/tkInt.h b/generic/tkInt.h index 50ddff6..4b879af 100644 --- a/generic/tkInt.h +++ b/generic/tkInt.h @@ -33,6 +33,9 @@ #endif #include <stdint.h> #include <stdlib.h> +#if defined(_MSC_VER) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ < 202311L)) +#include <stdbool.h> +#endif #ifdef BYTE_ORDER # ifdef BIG_ENDIAN # if BYTE_ORDER == BIG_ENDIAN @@ -1112,7 +1115,7 @@ void Tcl_Panic(const char *, ...) __attribute__((analyzer_noreturn)); * Exported internals. */ -#include "tkIntDecls.h" +#include "tkIntDecls.h" /* IWYU pragma: export */ #ifdef __cplusplus extern "C" { @@ -1236,7 +1239,7 @@ MODULE_SCOPE Tcl_Command TkMakeEnsemble(Tcl_Interp *interp, const char *nsname, const char *name, void *clientData, const TkEnsemble *map); MODULE_SCOPE double TkScalingLevel(Tk_Window tkwin); -MODULE_SCOPE int TkObjIsEmpty(Tcl_Obj *objPtr); +MODULE_SCOPE bool TkObjIsEmpty(Tcl_Obj *objPtr); MODULE_SCOPE int TkInitTkCmd(Tcl_Interp *interp, void *clientData); MODULE_SCOPE int TkInitFontchooser(Tcl_Interp *interp, diff --git a/generic/tkIntDecls.h b/generic/tkIntDecls.h index bd4912f..f657af2 100644 --- a/generic/tkIntDecls.h +++ b/generic/tkIntDecls.h @@ -193,7 +193,7 @@ EXTERN int TkOvalToArea(double *ovalPtr, double *rectPtr); EXTERN double TkOvalToPoint(double ovalPtr[], double width, int filled, double pointPtr[]); /* 55 */ -EXTERN int TkpChangeFocus(TkWindow *winPtr, int force); +EXTERN size_t TkpChangeFocus(TkWindow *winPtr, int force); /* 56 */ EXTERN void TkpCloseDisplay(TkDisplay *dispPtr); /* 57 */ @@ -605,7 +605,7 @@ typedef struct TkIntStubs { void (*tkOptionDeadWindow) (TkWindow *winPtr); /* 52 */ int (*tkOvalToArea) (double *ovalPtr, double *rectPtr); /* 53 */ double (*tkOvalToPoint) (double ovalPtr[], double width, int filled, double pointPtr[]); /* 54 */ - int (*tkpChangeFocus) (TkWindow *winPtr, int force); /* 55 */ + size_t (*tkpChangeFocus) (TkWindow *winPtr, int force); /* 55 */ void (*tkpCloseDisplay) (TkDisplay *dispPtr); /* 56 */ void (*tkpClaimFocus) (TkWindow *topLevelPtr, int force); /* 57 */ void (*tkpDisplayWarning) (const char *msg, const char *title); /* 58 */ diff --git a/generic/tkIntPlatDecls.h b/generic/tkIntPlatDecls.h index 7d55a30..5142caa 100644 --- a/generic/tkIntPlatDecls.h +++ b/generic/tkIntPlatDecls.h @@ -75,7 +75,7 @@ EXTERN COLORREF TkWinGetBorderPixels(Tk_Window tkwin, EXTERN HDC TkWinGetDrawableDC(Display *display, Drawable d, TkWinDCState *state); /* 17 */ -EXTERN int TkWinGetModifierState(void); +EXTERN unsigned int TkWinGetModifierState(void); /* 18 */ EXTERN HPALETTE TkWinGetSystemPalette(void); /* 19 */ @@ -117,8 +117,7 @@ EXTERN char * TkAlignImageData(XImage *image, int alignment, int bitOrder); /* 34 */ EXTERN void TkWinSetHINSTANCE(HINSTANCE hInstance); -/* 35 */ -EXTERN int TkWinGetPlatformTheme(void); +/* Slot 35 is reserved */ /* 36 */ EXTERN LRESULT __stdcall TkWinChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); @@ -220,7 +219,7 @@ EXTERN void TkMacOSXWindowOffset(void *wRef, int *xOffset, /* 38 */ EXTERN int TkSetMacColor(unsigned long pixel, void *macColor); /* 39 */ -EXTERN void TkSetWMName(TkWindow *winPtr, Tk_Uid titleUid); +EXTERN void TkSetWMName(TkWindow *winPtr, const char *title); /* Slot 40 is reserved */ /* 41 */ EXTERN int TkMacOSXZoomToplevel(void *whichWindow, @@ -333,7 +332,7 @@ typedef struct TkIntPlatStubs { void (*tkWinFillRect) (HDC dc, int x, int y, int width, int height, int pixel); /* 14 */ COLORREF (*tkWinGetBorderPixels) (Tk_Window tkwin, Tk_3DBorder border, int which); /* 15 */ HDC (*tkWinGetDrawableDC) (Display *display, Drawable d, TkWinDCState *state); /* 16 */ - int (*tkWinGetModifierState) (void); /* 17 */ + unsigned int (*tkWinGetModifierState) (void); /* 17 */ HPALETTE (*tkWinGetSystemPalette) (void); /* 18 */ HWND (*tkWinGetWrapperWindow) (Tk_Window tkwin); /* 19 */ int (*tkWinHandleMenuEvent) (HWND *phwnd, UINT *pMessage, WPARAM *pwParam, LPARAM *plParam, LRESULT *plResult); /* 20 */ @@ -351,7 +350,7 @@ typedef struct TkIntPlatStubs { Tcl_Obj * (*tkWinGetMenuSystemDefault) (Tk_Window tkwin, const char *dbName, const char *className); /* 32 */ char * (*tkAlignImageData) (XImage *image, int alignment, int bitOrder); /* 33 */ void (*tkWinSetHINSTANCE) (HINSTANCE hInstance); /* 34 */ - int (*tkWinGetPlatformTheme) (void); /* 35 */ + void (*reserved35)(void); LRESULT (__stdcall *tkWinChildProc) (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); /* 36 */ void (*reserved37)(void); int (*tkpCmapStressed) (Tk_Window tkwin, Colormap colormap); /* 38 */ @@ -405,7 +404,7 @@ typedef struct TkIntPlatStubs { void (*tkMacOSXWinBounds) (TkWindow *winPtr, void *geometry); /* 36 */ void (*tkMacOSXWindowOffset) (void *wRef, int *xOffset, int *yOffset); /* 37 */ int (*tkSetMacColor) (unsigned long pixel, void *macColor); /* 38 */ - void (*tkSetWMName) (TkWindow *winPtr, Tk_Uid titleUid); /* 39 */ + void (*tkSetWMName) (TkWindow *winPtr, const char *title); /* 39 */ void (*reserved40)(void); int (*tkMacOSXZoomToplevel) (void *whichWindow, short zoomPart); /* 41 */ Tk_Window (*tk_TopCoordsToWindow) (Tk_Window tkwin, int rootX, int rootY, int *newX, int *newY); /* 42 */ @@ -551,8 +550,7 @@ extern const TkIntPlatStubs *tkIntPlatStubsPtr; (tkIntPlatStubsPtr->tkAlignImageData) /* 33 */ #define TkWinSetHINSTANCE \ (tkIntPlatStubsPtr->tkWinSetHINSTANCE) /* 34 */ -#define TkWinGetPlatformTheme \ - (tkIntPlatStubsPtr->tkWinGetPlatformTheme) /* 35 */ +/* Slot 35 is reserved */ #define TkWinChildProc \ (tkIntPlatStubsPtr->tkWinChildProc) /* 36 */ /* Slot 37 is reserved */ @@ -738,6 +736,7 @@ extern const TkIntPlatStubs *tkIntPlatStubsPtr; #ifndef TK_NO_DEPRECATED # define TkMacOSXDrawable Tk_MacOSXGetNSWindowForDrawable +# define TkWinGetPlatformTheme() 3 #endif #undef TCL_STORAGE_CLASS diff --git a/generic/tkIntXlibDecls.h b/generic/tkIntXlibDecls.h index 39258ba..29c5043 100644 --- a/generic/tkIntXlibDecls.h +++ b/generic/tkIntXlibDecls.h @@ -434,8 +434,10 @@ EXTERN char * XSetICValues(XIC xic, ...); EXTERN char * XGetICValues(XIC xic, ...); /* 143 */ EXTERN void XSetICFocus(XIC xic); -/* Slot 144 is reserved */ -/* Slot 145 is reserved */ +/* 144 */ +EXTERN int XXorRegion(Region sra, Region srb, Region dr_return); +/* 145 */ +EXTERN Bool XEqualRegion(Region r1, Region r2); /* Slot 146 is reserved */ /* 147 */ EXTERN void XFreeFontSet(Display *display, XFontSet fontset); @@ -854,8 +856,10 @@ EXTERN char * XSetICValues(XIC xic, ...); EXTERN char * XGetICValues(XIC xic, ...); /* 143 */ EXTERN void XSetICFocus(XIC xic); -/* Slot 144 is reserved */ -/* Slot 145 is reserved */ +/* 144 */ +EXTERN int XXorRegion(Region sra, Region srb, Region dr_return); +/* 145 */ +EXTERN Bool XEqualRegion(Region r1, Region r2); /* Slot 146 is reserved */ /* 147 */ EXTERN void XFreeFontSet(Display *display, XFontSet fontset); @@ -1046,8 +1050,8 @@ typedef struct TkIntXlibStubs { char * (*xSetICValues) (XIC xic, ...); /* 141 */ char * (*xGetICValues) (XIC xic, ...); /* 142 */ void (*xSetICFocus) (XIC xic); /* 143 */ - void (*reserved144)(void); - void (*reserved145)(void); + int (*xXorRegion) (Region sra, Region srb, Region dr_return); /* 144 */ + Bool (*xEqualRegion) (Region r1, Region r2); /* 145 */ void (*reserved146)(void); void (*xFreeFontSet) (Display *display, XFontSet fontset); /* 147 */ int (*xCloseIM) (XIM im); /* 148 */ @@ -1207,8 +1211,8 @@ typedef struct TkIntXlibStubs { char * (*xSetICValues) (XIC xic, ...); /* 141 */ char * (*xGetICValues) (XIC xic, ...); /* 142 */ void (*xSetICFocus) (XIC xic); /* 143 */ - void (*reserved144)(void); - void (*reserved145)(void); + int (*xXorRegion) (Region sra, Region srb, Region dr_return); /* 144 */ + Bool (*xEqualRegion) (Region r1, Region r2); /* 145 */ void (*reserved146)(void); void (*xFreeFontSet) (Display *display, XFontSet fontset); /* 147 */ int (*xCloseIM) (XIM im); /* 148 */ @@ -1515,8 +1519,10 @@ extern const TkIntXlibStubs *tkIntXlibStubsPtr; (tkIntXlibStubsPtr->xGetICValues) /* 142 */ #define XSetICFocus \ (tkIntXlibStubsPtr->xSetICFocus) /* 143 */ -/* Slot 144 is reserved */ -/* Slot 145 is reserved */ +#define XXorRegion \ + (tkIntXlibStubsPtr->xXorRegion) /* 144 */ +#define XEqualRegion \ + (tkIntXlibStubsPtr->xEqualRegion) /* 145 */ /* Slot 146 is reserved */ #define XFreeFontSet \ (tkIntXlibStubsPtr->xFreeFontSet) /* 147 */ @@ -1821,8 +1827,10 @@ extern const TkIntXlibStubs *tkIntXlibStubsPtr; (tkIntXlibStubsPtr->xGetICValues) /* 142 */ #define XSetICFocus \ (tkIntXlibStubsPtr->xSetICFocus) /* 143 */ -/* Slot 144 is reserved */ -/* Slot 145 is reserved */ +#define XXorRegion \ + (tkIntXlibStubsPtr->xXorRegion) /* 144 */ +#define XEqualRegion \ + (tkIntXlibStubsPtr->xEqualRegion) /* 145 */ /* Slot 146 is reserved */ #define XFreeFontSet \ (tkIntXlibStubsPtr->xFreeFontSet) /* 147 */ diff --git a/generic/tkMain.c b/generic/tkMain.c index ab5bcf4..f06c0eb 100644 --- a/generic/tkMain.c +++ b/generic/tkMain.c @@ -73,10 +73,10 @@ NewNativeObj( #if defined(_WIN32) && defined(UNICODE) Tcl_DStringInit(&ds); - Tcl_WCharToUtfDString(string, wcslen(string), &ds); + Tcl_WCharToUtfDString(string, -1, &ds); str = Tcl_DStringValue(&ds); #else - str = Tcl_ExternalToUtfDString(NULL, (char *)string, strlen(string), &ds); + str = Tcl_ExternalToUtfDString(NULL, (char *)string, -1, &ds); #endif obj = Tcl_NewStringObj(str, Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); @@ -109,7 +109,7 @@ static int WinIsTty(int fd) { return tclIntPlatStubsPtr->tclpIsAtty(fd); } #endif - handle = GetStdHandle(STD_INPUT_HANDLE + fd); + handle = GetStdHandle(STD_INPUT_HANDLE + (DWORD)fd); /* * If it's a bad or closed handle, then it's been connected to a wish * console window. A character file handle is a tty by definition. @@ -199,7 +199,7 @@ Tk_MainEx( /* We are running win32 Tk under Cygwin, so let's check * whether the env("DISPLAY") variable or the -display * argument is set. If so, we really want to run the - * Tk_MainEx function of libtcl9tk9.?.dll, not this one. */ + * Tk_MainEx function of cygtcl9tk9.?.dll, not this one. */ if (Tcl_GetVar2(interp, "env", "DISPLAY", TCL_GLOBAL_ONLY)) { loadCygwinTk: TkCygwinMainEx(argc, argv, appInitProc, interp); diff --git a/generic/tkPack.c b/generic/tkPack.c index d54c03e..09fe4c3 100644 --- a/generic/tkPack.c +++ b/generic/tkPack.c @@ -233,7 +233,7 @@ Tk_PackObjCmd( if (argv2[0] != '.') { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad argument \"%s\": must be name of window", argv2)); - Tcl_SetErrorCode(interp, "TK", "VALUE", "WINDOW_PATH", NULL); + Tcl_SetErrorCode(interp, "TK", "VALUE", "WINDOW_PATH", (char *)NULL); return TCL_ERROR; } return ConfigureContent(interp, tkwin, objc-2, objv+2); @@ -279,7 +279,7 @@ Tk_PackObjCmd( if (contentPtr->containerPtr == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "window \"%s\" isn't packed", argv2)); - Tcl_SetErrorCode(interp, "TK", "PACK", "NOT_PACKED", NULL); + Tcl_SetErrorCode(interp, "TK", "PACK", "NOT_PACKED", (char *)NULL); return TCL_ERROR; } @@ -1252,7 +1252,7 @@ ConfigureContent( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "can't pack \"%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; } if (!(contentPtr = GetPacker(content))) { @@ -1281,7 +1281,7 @@ ConfigureContent( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "extra option \"%s\" (option with no value?)", Tcl_GetString(objv[i]))); - Tcl_SetErrorCode(interp, "TK", "PACK", "BAD_PARAMETER", NULL); + Tcl_SetErrorCode(interp, "TK", "PACK", "BAD_PARAMETER", (char *)NULL); return TCL_ERROR; } if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings, @@ -1365,7 +1365,7 @@ ConfigureContent( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad fill style \"%s\": must be " "none, x, y, or both", string)); - Tcl_SetErrorCode(interp, "TK", "VALUE", "FILL", NULL); + Tcl_SetErrorCode(interp, "TK", "VALUE", "FILL", (char *)NULL); return TCL_ERROR; } break; @@ -1393,7 +1393,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; @@ -1404,7 +1404,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; @@ -1486,14 +1486,14 @@ ConfigureContent( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "can't pack \"%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); return TCL_ERROR; } } if (content == containerPtr->tkwin) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "can't pack \"%s\" inside itself", Tcl_GetString(objv[j]))); - Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "SELF", NULL); + Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "SELF", (char *)NULL); return TCL_ERROR; } @@ -1507,7 +1507,7 @@ ConfigureContent( 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_SetErrorCode(interp, "TK", "GEOMETRY", "LOOP", (char *)NULL); return TCL_ERROR; } } diff --git a/generic/tkPanedWindow.c b/generic/tkPanedWindow.c index 04494f0..e6c0884 100644 --- a/generic/tkPanedWindow.c +++ b/generic/tkPanedWindow.c @@ -2490,7 +2490,7 @@ SetSticky( internalPtr = ComputeSlotAddress(recordPtr, internalOffset); - if (flags & TK_OPTION_NULL_OK && TkObjIsEmpty(*value)) { + if ((flags & TK_OPTION_NULL_OK) && TkObjIsEmpty(*value)) { *value = NULL; } else { /* diff --git a/generic/tkSelect.h b/generic/tkSelect.h index bac24d7..e6aaff2 100644 --- a/generic/tkSelect.h +++ b/generic/tkSelect.h @@ -123,6 +123,16 @@ typedef struct TkClipboardTarget { } TkClipboardTarget; /* + * Options enum for the TkClipboardObjCmd. These are defined here + * so they can be used as an argument to TkSelUpdateClipboard. + */ + +typedef enum { + CLIPBOARD_APPEND, CLIPBOARD_CLEAR, CLIPBOARD_GET +} clipboardOption; + + +/* * It is possible for a Tk_SelectionProc to delete the handler that it * represents. If this happens, the code that is retrieving the selection * needs to know about it so it doesn't use the now-defunct handler structure. @@ -160,8 +170,7 @@ MODULE_SCOPE Tcl_Size TkSelDefaultSelection(TkSelectionInfo *infoPtr, Atom target, char *buffer, Tcl_Size maxBytes, Atom *typePtr); #ifndef TkSelUpdateClipboard -MODULE_SCOPE void TkSelUpdateClipboard(TkWindow *winPtr, - TkClipboardTarget *targetPtr); +MODULE_SCOPE void TkSelUpdateClipboard(TkWindow *winPtr, clipboardOption option); #endif #endif /* _TKSELECT */ diff --git a/generic/tkSquare.c b/generic/tkSquare.c index b647861..b9a7f18 100644 --- a/generic/tkSquare.c +++ b/generic/tkSquare.c @@ -23,7 +23,6 @@ # define USE_TK_STUBS #endif #include "tkInt.h" -#include <stdbool.h> /* * A data structure of the following type is kept for each square widget diff --git a/generic/tkStubInit.c b/generic/tkStubInit.c index b3fe123..929d5f9 100644 --- a/generic/tkStubInit.c +++ b/generic/tkStubInit.c @@ -188,7 +188,6 @@ TkPutImage( # define TkWinDialogDebug 0 # define TkWinGetMenuSystemDefault 0 # define TkWinSetHINSTANCE 0 -# define TkWinGetPlatformTheme 0 # define TkWinChildProc 0 # endif @@ -466,7 +465,7 @@ static const TkIntPlatStubs tkIntPlatStubs = { TkWinGetMenuSystemDefault, /* 32 */ TkAlignImageData, /* 33 */ TkWinSetHINSTANCE, /* 34 */ - TkWinGetPlatformTheme, /* 35 */ + 0, /* 35 */ TkWinChildProc, /* 36 */ 0, /* 37 */ TkpCmapStressed, /* 38 */ @@ -732,8 +731,8 @@ static const TkIntXlibStubs tkIntXlibStubs = { XSetICValues, /* 141 */ XGetICValues, /* 142 */ XSetICFocus, /* 143 */ - 0, /* 144 */ - 0, /* 145 */ + XXorRegion, /* 144 */ + XEqualRegion, /* 145 */ 0, /* 146 */ XFreeFontSet, /* 147 */ XCloseIM, /* 148 */ @@ -893,8 +892,8 @@ static const TkIntXlibStubs tkIntXlibStubs = { XSetICValues, /* 141 */ XGetICValues, /* 142 */ XSetICFocus, /* 143 */ - 0, /* 144 */ - 0, /* 145 */ + XXorRegion, /* 144 */ + XEqualRegion, /* 145 */ 0, /* 146 */ XFreeFontSet, /* 147 */ XCloseIM, /* 148 */ diff --git a/generic/tkText.c b/generic/tkText.c index 8079e60..6ac61cb 100644 --- a/generic/tkText.c +++ b/generic/tkText.c @@ -720,7 +720,7 @@ TextWidgetObjCmd( goto done; } if (TkTextIndexBbox(textPtr, indexPtr, &x, &y, &width, &height, - NULL) == 0) { + NULL, NULL) == 0) { Tcl_Obj *listObj = Tcl_NewListObj(0, NULL); Tcl_ListObjAppendElement(interp, listObj, Tcl_NewWideIntObj(x)); @@ -3647,12 +3647,13 @@ TextBlinkProc( } redrawInsert: TkTextMarkSegToIndex(textPtr, textPtr->insertMarkPtr, &index); - if (TkTextIndexBbox(textPtr, &index, &x, &y, &w, &h, &charWidth) == 0) { + if (TkTextIndexBbox(textPtr, &index, &x, &y, &w, &h, + &charWidth, NULL) == 0) { int insertWidth; Tk_GetPixelsFromObj(NULL, textPtr->tkwin, textPtr->insertWidthObj, &insertWidth); if (textPtr->insertCursorType) { /* Block cursor */ - TkTextRedrawRegion(textPtr, x - textPtr->width / 2, y, + TkTextRedrawRegion(textPtr, x - insertWidth / 2, y, charWidth + insertWidth / 2, h); } else { /* I-beam cursor */ @@ -6798,7 +6799,7 @@ SetLineStartEnd( internalPtr = NULL; } - if (flags & TK_OPTION_NULL_OK && TkObjIsEmpty(*value)) { + if ((flags & TK_OPTION_NULL_OK) && TkObjIsEmpty(*value)) { *value = NULL; } else { int line; diff --git a/generic/tkText.h b/generic/tkText.h index 8f5481a..f8ca191 100644 --- a/generic/tkText.h +++ b/generic/tkText.h @@ -1035,7 +1035,8 @@ MODULE_SCOPE void TkTextBindProc(void *clientData, MODULE_SCOPE void TkTextSelectionEvent(TkText *textPtr); MODULE_SCOPE int TkTextIndexBbox(TkText *textPtr, const TkTextIndex *indexPtr, int *xPtr, int *yPtr, - int *widthPtr, int *heightPtr, int *charWidthPtr); + int *widthPtr, int *heightPtr, int *charWidthPtr, + int *cursorWidthPtr); MODULE_SCOPE int TkTextCharLayoutProc(TkText *textPtr, TkTextIndex *indexPtr, TkTextSegment *segPtr, Tcl_Size offset, int maxX, Tcl_Size maxChars, int noBreakYet, @@ -1092,7 +1093,7 @@ MODULE_SCOPE TkTextIndex *TkTextMakeCharIndex(TkTextBTree tree, TkText *textPtr, MODULE_SCOPE int TkTextMeasureDown(TkText *textPtr, TkTextIndex *srcPtr, int distance); MODULE_SCOPE void TkTextFreeElideInfo(TkTextElideInfo *infoPtr); -MODULE_SCOPE int TkTextIsElided(const TkText *textPtr, +MODULE_SCOPE bool TkTextIsElided(const TkText *textPtr, const TkTextIndex *indexPtr, TkTextElideInfo *infoPtr); MODULE_SCOPE int TkTextMakePixelIndex(TkText *textPtr, diff --git a/generic/tkTextBTree.c b/generic/tkTextBTree.c index 7a65ee1..8187ff5 100644 --- a/generic/tkTextBTree.c +++ b/generic/tkTextBTree.c @@ -3507,7 +3507,7 @@ TkBTreeGetTags( *---------------------------------------------------------------------- */ -int +bool TkTextIsElided( const TkText *textPtr, /* Overall information about text widget. */ const TkTextIndex *indexPtr,/* The character in the text for which display @@ -3523,7 +3523,8 @@ TkTextIsElided( Tcl_Size i; TkTextElideInfo *infoPtr; TkTextLine *linePtr; - int elide, index; + bool elide; + int index; if (elideInfo == NULL) { infoPtr = (TkTextElideInfo *)ckalloc(sizeof(TkTextElideInfo)); @@ -3653,7 +3654,7 @@ TkTextIsElided( } } - elide = infoPtr->elide; + elide = (infoPtr->elide != 0); if (elideInfo == NULL) { if (LOTSA_TAGS < infoPtr->numTags) { diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c index c8df68b..93e9c26 100644 --- a/generic/tkTextDisp.c +++ b/generic/tkTextDisp.c @@ -1170,7 +1170,8 @@ LayoutDLine( * numBytes > 0. Used to drop 0-sized chunks * from the end of the line. */ Tcl_Size byteOffset; - int ascent, descent, code, elide, elidesize; + int ascent, descent, code, elidesize; + bool elide; StyleValues *sValuePtr; TkTextElideInfo info; /* Keep track of elide state. */ @@ -7357,15 +7358,24 @@ TkTextIndexBbox( * coordinate. */ int *widthPtr, int *heightPtr, /* Filled in with index's dimensions. */ - int *charWidthPtr) /* If the 'index' is at the end of a display + int *charWidthPtr, /* If the 'index' is at the end of a display * line and therefore takes up a very large * width, this is used to return the smaller * width actually desired by the index. */ + int *cursorWidthPtr) /* Receives the same value as 'charWidthPtr' + * except when indexPtr points to a Tab. Then + * 'cursorWidthPtr' gets reduced to the width + * of a single space. */ { TextDInfo *dInfoPtr = textPtr->dInfoPtr; DLine *dlPtr; TkTextDispChunk *chunkPtr; Tcl_Size byteCount; + int dummy; + + if (charWidthPtr == NULL) { + charWidthPtr = &dummy; + } /* * Make sure that all of the screen layout information is up to date. @@ -7431,20 +7441,16 @@ TkTextIndexBbox( * line. */ - if (charWidthPtr != NULL) { - *charWidthPtr = dInfoPtr->maxX - *xPtr; - if (*charWidthPtr > textPtr->charWidth) { - *charWidthPtr = textPtr->charWidth; - } + *charWidthPtr = dInfoPtr->maxX - *xPtr; + if (*charWidthPtr > textPtr->charWidth) { + *charWidthPtr = textPtr->charWidth; } if (*xPtr > dInfoPtr->maxX) { *xPtr = dInfoPtr->maxX; } *widthPtr = dInfoPtr->maxX - *xPtr; } else { - if (charWidthPtr != NULL) { - *charWidthPtr = *widthPtr; - } + *charWidthPtr = *widthPtr; } if (*widthPtr == 0) { /* @@ -7472,6 +7478,30 @@ TkTextIndexBbox( return -1; } } + + /* + * For a block cursor on a tab, cursorWidthPtr is the whitespace width. + */ + + if (cursorWidthPtr != NULL) { + *cursorWidthPtr = *charWidthPtr; + if (chunkPtr->bboxProc == CharBboxProc) { + CharInfo *ciPtr = (CharInfo*)chunkPtr->clientData; +#ifdef TK_LAYOUT_WITH_BASE_CHUNKS + BaseCharInfo *bciPtr = + (BaseCharInfo*)ciPtr->baseChunkPtr->clientData; + char *chars = Tcl_DStringValue(&bciPtr->baseChars); + + if (chars[ciPtr->baseOffset + byteCount] == '\t') +#else + if (ciPtr->chars[byteCount] == '\t') +#endif + { + CharChunkMeasureChars(chunkPtr, " ", 1, 0, 1, + 0, -1, 0, cursorWidthPtr); + } + } + } return 0; } diff --git a/generic/tkTextIndex.c b/generic/tkTextIndex.c index a77fd9a..6b7f872 100644 --- a/generic/tkTextIndex.c +++ b/generic/tkTextIndex.c @@ -1559,7 +1559,7 @@ TkTextIndexForwChars( Tcl_Size byteOffset; char *start, *end, *p; int ch; - int elide = 0; + bool elide = false; int checkElided = (type & COUNT_DISPLAY); if (charCount < 0) { @@ -1636,7 +1636,7 @@ TkTextIndexForwChars( * elide will be zero, of course). */ - elide = 0; + elide = false; while (--infoPtr->elidePriority > 0) { if (infoPtr->tagCnts[infoPtr->elidePriority] & 1) { @@ -1822,8 +1822,8 @@ TkTextIndexCount( TkTextSegment *segPtr, *seg2Ptr = NULL; TkTextElideInfo *infoPtr = NULL; Tcl_Size byteOffset, maxBytes, count = 0; - int elide = 0; - int checkElided = (type & COUNT_DISPLAY); + bool elide = false; + bool checkElided = (type & COUNT_DISPLAY) != 0; /* * Find seg that contains src index, and remember how many bytes not to @@ -2086,8 +2086,8 @@ TkTextIndexBackChars( TkTextElideInfo *infoPtr = NULL; int lineIndex, segSize; const char *p, *start, *end; - int elide = 0; - int checkElided = (type & COUNT_DISPLAY); + bool elide = false; + bool checkElided = (type & COUNT_DISPLAY) != 0; if (charCount < 0) { TkTextIndexForwChars(textPtr, srcPtr, -charCount, dstPtr, type); @@ -2174,7 +2174,7 @@ TkTextIndexBackChars( * will be zero, of course). */ - elide = 0; + elide = false; while (--infoPtr->elidePriority > 0) { if (infoPtr->tagCnts[infoPtr->elidePriority] & 1) { elide = infoPtr->tagPtrs[ diff --git a/generic/tkTextMark.c b/generic/tkTextMark.c index fe25f3c..cdb0612 100644 --- a/generic/tkTextMark.c +++ b/generic/tkTextMark.c @@ -625,15 +625,17 @@ TkTextInsertDisplayProc( TkTextIndex index; int halfWidth, insertWidth, insertBorderWidth; int rightSideWidth; - int ix = 0, iy = 0, iw = 0, ih = 0, charWidth = 0; + int ix = 0, iy = 0, iw = 0, ih = 0, charWidth = 0, cursorWidth = 0; Tk_GetPixelsFromObj(NULL, textPtr->tkwin, textPtr->insertWidthObj, &insertWidth); Tk_GetPixelsFromObj(NULL, textPtr->tkwin, textPtr->insertBorderWidthObj, &insertBorderWidth); halfWidth = insertWidth/2; if (textPtr->insertCursorType) { TkTextMarkSegToIndex(textPtr, textPtr->insertMarkPtr, &index); - TkTextIndexBbox(textPtr, &index, &ix, &iy, &iw, &ih, &charWidth); + TkTextIndexBbox(textPtr, &index, &ix, &iy, &iw, &ih, &charWidth, + &cursorWidth); rightSideWidth = charWidth + halfWidth; + charWidth = cursorWidth; } else { rightSideWidth = halfWidth; } diff --git a/generic/tkTextTag.c b/generic/tkTextTag.c index 9c65f1b..4ecf446 100644 --- a/generic/tkTextTag.c +++ b/generic/tkTextTag.c @@ -281,7 +281,7 @@ TkTextTagCmd( Tcl_SetObjResult(interp, Tcl_NewStringObj( "requested illegal events; only key, button, motion," " enter, leave, and virtual events may be used", TCL_INDEX_NONE)); - Tcl_SetErrorCode(interp, "TK", "TEXT", "TAG_BIND_EVENT",NULL); + Tcl_SetErrorCode(interp, "TK", "TEXT", "TAG_BIND_EVENT", (char *)NULL); return TCL_ERROR; } } else if (objc == 5) { diff --git a/generic/tkWindow.c b/generic/tkWindow.c index a454d1a..5fd58bf 100644 --- a/generic/tkWindow.c +++ b/generic/tkWindow.c @@ -1037,6 +1037,9 @@ TkCreateMainWindow( #ifdef STATIC_BUILD ".static" #endif +#if (defined(__MSVCRT__) || defined(_UCRT)) && (!defined(__USE_MINGW_ANSI_STDIO) || __USE_MINGW_ANSI_STDIO) + ".stdio-mingw" +#endif #if defined(_WIN32) ".win32" #endif @@ -2985,7 +2988,7 @@ DeleteWindowsExitProc( static HMODULE tkcygwindll = NULL; /* - * Run Tk_MainEx from libtcl9tk9.?.dll + * Run Tk_MainEx from cygtcl9tk9.?.dll * * This function is only ever called from wish9.?.exe, the cygwin port of Tcl. * This means that the system encoding is utf-8, so we don't have to do any @@ -3006,12 +3009,12 @@ TkCygwinMainEx( size_t len; void (*tkmainex)(Tcl_Size, char **, Tcl_AppInitProc *, Tcl_Interp *); - /* construct "<path>/libtcl9tk9.?.dll", from "<path>/tcl9tk9?.dll" */ + /* construct "<path>/cygtcl9tk9.?.dll", from "<path>/tcl9tk9?.dll" */ len = GetModuleFileNameW((HINSTANCE)Tk_GetHINSTANCE(), name, MAX_PATH); - name[len-2] = '.'; - name[len-1] = name[len-5]; - wcscpy(name+len, L".dll"); - memcpy(name+len-12, L"libtcl9tk9", 10 * sizeof(WCHAR)); + name[len-2] = '.'; /* "<path>/tcl9tk9?.d.l" */ + name[len-1] = name[len-5]; /* "<path>/tcl9tk9?.d.?" */ + wcscpy(name+len, L".dll"); /* "<path>/tcl9tk9?.d.?.dll" */ + memcpy(name+len-12, L"cygtcl9tk9", 10 * sizeof(WCHAR)); /* "<path>/cygtcl9tk9.?.dll" */ tkcygwindll = LoadLibraryW(name); if (tkcygwindll) { diff --git a/generic/ttk/ttk.decls b/generic/ttk/ttk.decls index ff2c18d..55be583 100644 --- a/generic/ttk/ttk.decls +++ b/generic/ttk/ttk.decls @@ -21,7 +21,7 @@ declare 4 { Tcl_Interp *interp, void *deleteData, Ttk_CleanupProc *cleanupProc) } -declare 5 { +declare 5 {deprecated {Use Ttk_RegisterElement}} { int Ttk_RegisterElementSpec( Ttk_Theme theme, const char *elementName, diff --git a/generic/ttk/ttkBlink.c b/generic/ttk/ttkBlink.c index 8f4c8af..5fddbc8 100644 --- a/generic/ttk/ttkBlink.c +++ b/generic/ttk/ttkBlink.c @@ -97,7 +97,7 @@ CursorBlinkProc(void *clientData) int blinkTime; if (cm->owner->flags & CURSOR_ON) { - cm->owner->flags &= ~CURSOR_ON; + cm->owner->flags &= ~(unsigned)CURSOR_ON; blinkTime = cm->offTime; } else { cm->owner->flags |= CURSOR_ON; @@ -113,7 +113,7 @@ CursorBlinkProc(void *clientData) static void LoseCursor(CursorManager *cm, WidgetCore *corePtr) { if (corePtr->flags & CURSOR_ON) { - corePtr->flags &= ~CURSOR_ON; + corePtr->flags &= ~(unsigned)CURSOR_ON; TtkRedisplayWidget(corePtr); } if (cm->owner == corePtr) { @@ -130,10 +130,12 @@ static void LoseCursor(CursorManager *cm, WidgetCore *corePtr) */ static void ClaimCursor(CursorManager *cm, WidgetCore *corePtr) { - if (cm->owner == corePtr) + if (cm->owner == corePtr) { return; - if (cm->owner) + } + if (cm->owner) { LoseCursor(cm, cm->owner); + } corePtr->flags |= CURSOR_ON; TtkRedisplayWidget(corePtr); @@ -161,18 +163,21 @@ CursorEventProc(void *clientData, XEvent *eventPtr) switch (eventPtr->type) { case DestroyNotify: - if (cm->owner == corePtr) + if (cm->owner == corePtr) { LoseCursor(cm, corePtr); + } Tk_DeleteEventHandler( corePtr->tkwin, CursorEventMask, CursorEventProc, clientData); break; case FocusIn: - if (RealFocusEvent(eventPtr->xfocus.detail)) + if (RealFocusEvent(eventPtr->xfocus.detail)) { ClaimCursor(cm, corePtr); + } break; case FocusOut: - if (RealFocusEvent(eventPtr->xfocus.detail)) + if (RealFocusEvent(eventPtr->xfocus.detail)) { LoseCursor(cm, corePtr); + } break; } } @@ -181,16 +186,18 @@ void TtkSetBlinkCursorOnTime(Tcl_Interp* interp, int onTime) { CursorManager* cm = GetCursorManager(interp); - if (onTime >= 0) + if (onTime >= 0) { cm->onTime = onTime; + } } void TtkSetBlinkCursorOffTime(Tcl_Interp* interp, int offTime) { CursorManager* cm = GetCursorManager(interp); - if (offTime >= 0) + if (offTime >= 0) { cm->offTime = offTime; + } } /* diff --git a/generic/ttk/ttkButton.c b/generic/ttk/ttkButton.c index 0cf0517..1db042f 100644 --- a/generic/ttk/ttkButton.c +++ b/generic/ttk/ttkButton.c @@ -533,10 +533,12 @@ CheckbuttonPostConfigure(Tcl_Interp *interp, void *recordPtr, int mask) Checkbutton *checkPtr = (Checkbutton *)recordPtr; int status = TCL_OK; - if (checkPtr->checkbutton.variableTrace) + if (checkPtr->checkbutton.variableTrace) { status = Ttk_FireTrace(checkPtr->checkbutton.variableTrace); - if (status == TCL_OK && !WidgetDestroyed(&checkPtr->core)) + } + if (status == TCL_OK && !WidgetDestroyed(&checkPtr->core)) { status = BasePostConfigure(interp, recordPtr, mask); + } return status; } @@ -556,16 +558,17 @@ CheckbuttonInvokeCommand( Tcl_WrongNumArgs(interp, 1, objv, "invoke"); return TCL_ERROR; } - if (corePtr->state & TTK_STATE_DISABLED) + if (corePtr->state & TTK_STATE_DISABLED) { return TCL_OK; - + } /* * Toggle the selected state. */ - if (corePtr->state & TTK_STATE_SELECTED) + if (corePtr->state & TTK_STATE_SELECTED) { newValue = checkPtr->checkbutton.offValueObj; - else + } else { newValue = checkPtr->checkbutton.onValueObj; + } if (checkPtr->checkbutton.variableObj == NULL || *Tcl_GetString(checkPtr->checkbutton.variableObj) == '\0') @@ -576,8 +579,9 @@ CheckbuttonInvokeCommand( == NULL) return TCL_ERROR; - if (WidgetDestroyed(corePtr)) + if (WidgetDestroyed(corePtr)) { return TCL_ERROR; + } return Tcl_EvalObjEx(interp, checkPtr->checkbutton.commandObj, TCL_EVAL_GLOBAL); @@ -721,10 +725,12 @@ RadiobuttonPostConfigure(Tcl_Interp *interp, void *recordPtr, int mask) Radiobutton *radioPtr = (Radiobutton *)recordPtr; int status = TCL_OK; - if (radioPtr->radiobutton.variableTrace) + if (radioPtr->radiobutton.variableTrace) { status = Ttk_FireTrace(radioPtr->radiobutton.variableTrace); - if (status == TCL_OK && !WidgetDestroyed(&radioPtr->core)) + } + if (status == TCL_OK && !WidgetDestroyed(&radioPtr->core)) { status = BasePostConfigure(interp, recordPtr, mask); + } return status; } @@ -743,8 +749,9 @@ RadiobuttonInvokeCommand( Tcl_WrongNumArgs(interp, 1, objv, "invoke"); return TCL_ERROR; } - if (corePtr->state & TTK_STATE_DISABLED) + if (corePtr->state & TTK_STATE_DISABLED) { return TCL_OK; + } if (Tcl_ObjSetVar2(interp, radioPtr->radiobutton.variableObj, NULL, @@ -753,8 +760,9 @@ RadiobuttonInvokeCommand( == NULL) return TCL_ERROR; - if (WidgetDestroyed(corePtr)) + if (WidgetDestroyed(corePtr)) { return TCL_ERROR; + } return Tcl_EvalObjEx(interp, radioPtr->radiobutton.commandObj, TCL_EVAL_GLOBAL); diff --git a/generic/ttk/ttkClamTheme.c b/generic/ttk/ttkClamTheme.c index 91c15fc..a8c42e0 100644 --- a/generic/ttk/ttkClamTheme.c +++ b/generic/ttk/ttkClamTheme.c @@ -378,8 +378,8 @@ static void IndicatorElementSize( double scalingLevel = TkScalingLevel(tkwin); Ttk_GetPaddingFromObj(NULL, tkwin, indicator->marginObj, &margins); - *widthPtr = spec->width * scalingLevel + Ttk_PaddingWidth(margins); - *heightPtr = spec->height * scalingLevel + Ttk_PaddingHeight(margins); + *widthPtr = (int)(spec->width * scalingLevel) + Ttk_PaddingWidth(margins); + *heightPtr = (int)(spec->height * scalingLevel) + Ttk_PaddingHeight(margins); } static void ColorToStr( @@ -408,8 +408,8 @@ static void IndicatorElementDraw( Ttk_Padding padding; const IndicatorSpec *spec = (const IndicatorSpec *)clientData; double scalingLevel = TkScalingLevel(tkwin); - int width = spec->width * scalingLevel; - int height = spec->height * scalingLevel; + int width = (int)(spec->width * scalingLevel); + int height = (int)(spec->height * scalingLevel); char upperBdColorStr[7], lowerBdColorStr[7], bgColorStr[7], fgColorStr[7]; unsigned int selected = (state & TTK_STATE_SELECTED); @@ -675,8 +675,8 @@ static void TroughElementDraw( GC gcb = Ttk_GCForColor(tkwin,sb->borderColorObj,d); GC gct = Ttk_GCForColor(tkwin,sb->troughColorObj,d); - XFillRectangle(Tk_Display(tkwin), d, gct, b.x, b.y, b.width-1, b.height-1); - XDrawRectangle(Tk_Display(tkwin), d, gcb, b.x, b.y, b.width-1, b.height-1); + XFillRectangle(Tk_Display(tkwin), d, gct, b.x, b.y, (unsigned)b.width-1, (unsigned)b.height-1); + XDrawRectangle(Tk_Display(tkwin), d, gcb, b.x, b.y, (unsigned)b.width-1, (unsigned)b.height-1); } static const Ttk_ElementSpec TroughElementSpec = { @@ -721,7 +721,7 @@ static void ThumbElementDraw( sb->borderColorObj, sb->lightColorObj, sb->darkColorObj); XFillRectangle( Tk_Display(tkwin), d, BackgroundGC(tkwin, sb->backgroundObj), - b.x+2, b.y+2, b.width-4, b.height-4); + b.x+2, b.y+2, (unsigned)b.width-4, (unsigned)b.height-4); /* * Draw grip: @@ -824,7 +824,7 @@ static void PbarElementDraw( sb->borderColorObj, sb->lightColorObj, sb->darkColorObj); XFillRectangle(Tk_Display(tkwin), d, BackgroundGC(tkwin, sb->backgroundObj), - b.x+2, b.y+2, b.width-4, b.height-4); + b.x+2, b.y+2, (unsigned)b.width-4, (unsigned)b.height-4); } } @@ -847,7 +847,7 @@ static void ArrowElementSize( ScrollbarElement *sb = (ScrollbarElement *)elementRecord; ArrowDirection direction = (ArrowDirection)PTR2INT(clientData); double scalingLevel = TkScalingLevel(tkwin); - Ttk_Padding padding = Ttk_UniformPadding(round(3 * scalingLevel)); + Ttk_Padding padding = Ttk_UniformPadding((short)round(3 * scalingLevel)); int size = SCROLLBAR_THICKNESS; Tk_GetPixelsFromObj(NULL, tkwin, sb->arrowSizeObj, &size); @@ -870,7 +870,7 @@ static void ArrowElementDraw( ScrollbarElement *sb = (ScrollbarElement *)elementRecord; ArrowDirection direction = (ArrowDirection)PTR2INT(clientData); double scalingLevel = TkScalingLevel(tkwin); - Ttk_Padding padding = Ttk_UniformPadding(round(3 * scalingLevel)); + Ttk_Padding padding = Ttk_UniformPadding((short)round(3 * scalingLevel)); int cx, cy; GC gc = Ttk_GCForColor(tkwin, sb->arrowColorObj, d); @@ -879,7 +879,7 @@ static void ArrowElementDraw( XFillRectangle( Tk_Display(tkwin), d, BackgroundGC(tkwin, sb->backgroundObj), - b.x+2, b.y+2, b.width-4, b.height-4); + b.x+2, b.y+2, (unsigned)b.width-4, (unsigned)b.height-4); b = Ttk_PadBox(b, padding); @@ -925,7 +925,7 @@ static void SpinboxArrowElementSize( ScrollbarElement *sb = (ScrollbarElement *)elementRecord; ArrowDirection direction = (ArrowDirection)PTR2INT(clientData); double scalingLevel = TkScalingLevel(tkwin); - Ttk_Padding padding = Ttk_UniformPadding(round(3 * scalingLevel)); + Ttk_Padding padding = Ttk_UniformPadding((short)round(3 * scalingLevel)); int size = 10; Tk_GetPixelsFromObj(NULL, tkwin, sb->arrowSizeObj, &size); diff --git a/generic/ttk/ttkClassicTheme.c b/generic/ttk/ttkClassicTheme.c index e4dffff..c178ccb 100644 --- a/generic/ttk/ttkClassicTheme.c +++ b/generic/ttk/ttkClassicTheme.c @@ -67,7 +67,7 @@ static void HighlightElementDraw( GC gc = Tk_GCForColor(highlightColor, d); if (defaultState == TTK_BUTTON_DEFAULT_NORMAL) { TkDrawInsetFocusHighlight(tkwin, gc, highlightThickness, d, - round(5 * TkScalingLevel(tkwin))); + (int)round(5 * TkScalingLevel(tkwin))); } else { Tk_DrawFocusHighlight(tkwin, gc, highlightThickness, d); } @@ -129,7 +129,7 @@ static void ButtonBorderElementSize( Ttk_GetButtonDefaultStateFromObj(NULL, bd->defaultStateObj, &defaultState); if (defaultState != TTK_BUTTON_DEFAULT_DISABLED) { - borderWidth += round(5 * TkScalingLevel(tkwin)); + borderWidth += (int)round(5 * TkScalingLevel(tkwin)); } *paddingPtr = Ttk_UniformPadding((short)borderWidth); } @@ -169,7 +169,7 @@ static void ButtonBorderElementDraw( case TTK_BUTTON_DEFAULT_DISABLED : break; case TTK_BUTTON_DEFAULT_NORMAL : - inset += round(5 * TkScalingLevel(tkwin)); + inset += (int)round(5 * TkScalingLevel(tkwin)); break; case TTK_BUTTON_DEFAULT_ACTIVE : Tk_Draw3DRectangle(tkwin, d, border, @@ -342,14 +342,14 @@ static void DiamondIndicatorElementDraw( diameter = b.width < b.height ? b.width : b.height; radius = diameter / 2; - points[0].x = b.x; - points[0].y = b.y + radius; - points[1].x = b.x + radius; - points[1].y = b.y + 2*radius; - points[2].x = b.x + 2*radius; - points[2].y = b.y + radius; - points[3].x = b.x + radius; - points[3].y = b.y; + points[0].x = (short)b.x; + points[0].y = (short)(b.y + radius); + points[1].x = (short)(b.x + radius); + points[1].y = (short)(b.y + 2*radius); + points[2].x = (short)(b.x + 2*radius); + points[2].y = (short)(b.y + radius); + points[3].x = (short)(b.x + radius); + points[3].y = (short)b.y; Tk_Fill3DPolygon(tkwin,d,interior,points,4,borderWidth,TK_RELIEF_FLAT); Tk_Draw3DPolygon(tkwin,d,border,points,4,borderWidth,relief); @@ -518,24 +518,24 @@ static void ArrowElementDraw( switch (direction) { case ARROW_UP: - points[2].x = b.x; points[2].y = b.y + size; - points[1].x = b.x + size/2; points[1].y = b.y; - points[0].x = b.x + size; points[0].y = b.y + size; + points[2].x = (short)b.x; points[2].y = (short)(b.y + size); + points[1].x = (short)(b.x + size/2); points[1].y = (short)b.y; + points[0].x = (short)(b.x + size); points[0].y = (short)(b.y + size); break; case ARROW_DOWN: - points[0].x = b.x; points[0].y = b.y; - points[1].x = b.x + size/2; points[1].y = b.y + size; - points[2].x = b.x + size; points[2].y = b.y; + points[0].x = (short)b.x; points[0].y = (short)b.y; + points[1].x = (short)(b.x + size/2); points[1].y = (short)(b.y + size); + points[2].x = (short)(b.x + size); points[2].y = (short)b.y; break; case ARROW_LEFT: - points[0].x = b.x; points[0].y = b.y + size / 2; - points[1].x = b.x + size; points[1].y = b.y + size; - points[2].x = b.x + size; points[2].y = b.y; + points[0].x = (short)b.x; points[0].y = (short)(b.y + size / 2); + points[1].x = (short)(b.x + size); points[1].y = (short)(b.y + size); + points[2].x = (short)(b.x + size); points[2].y = (short)b.y; break; case ARROW_RIGHT: - points[0].x = b.x + size; points[0].y = b.y + size / 2; - points[1].x = b.x; points[1].y = b.y; - points[2].x = b.x; points[2].y = b.y + size; + points[0].x = (short)(b.x + size); points[0].y = (short)(b.y + size / 2); + points[1].x = (short)b.x; points[1].y = (short)b.y; + points[2].x = (short)b.x; points[2].y = (short)(b.y + size); break; } @@ -718,13 +718,15 @@ static void SashElementSize( Tk_GetPixelsFromObj(NULL, tkwin, sash->handleSizeObj, &handleSize); Tk_GetPixelsFromObj(NULL, tkwin, sash->sashPadObj, &sashPad); - if (sashThickness < handleSize + 2*sashPad) + if (sashThickness < handleSize + 2*sashPad) { sashThickness = handleSize + 2*sashPad; + } - if (orient == TTK_ORIENT_HORIZONTAL) + if (orient == TTK_ORIENT_HORIZONTAL) { *heightPtr = sashThickness; - else + } else { *widthPtr = sashThickness; + } } static void SashElementDraw( diff --git a/generic/ttk/ttkDecls.h b/generic/ttk/ttkDecls.h index 9c40904..83a2bca 100644 --- a/generic/ttk/ttkDecls.h +++ b/generic/ttk/ttkDecls.h @@ -54,7 +54,8 @@ TTKAPI void Ttk_RegisterCleanup(Tcl_Interp *interp, void *deleteData, Ttk_CleanupProc *cleanupProc); /* 5 */ -TTKAPI int Ttk_RegisterElementSpec(Ttk_Theme theme, +TTK_DEPRECATED("Use Ttk_RegisterElement") +int Ttk_RegisterElementSpec(Ttk_Theme theme, const char *elementName, const Ttk_ElementSpec *elementSpec, void *clientData); @@ -153,7 +154,7 @@ typedef struct TtkStubs { Ttk_Theme (*ttk_GetCurrentTheme) (Tcl_Interp *interp); /* 2 */ Ttk_Theme (*ttk_CreateTheme) (Tcl_Interp *interp, const char *name, Ttk_Theme parent); /* 3 */ void (*ttk_RegisterCleanup) (Tcl_Interp *interp, void *deleteData, Ttk_CleanupProc *cleanupProc); /* 4 */ - int (*ttk_RegisterElementSpec) (Ttk_Theme theme, const char *elementName, const Ttk_ElementSpec *elementSpec, void *clientData); /* 5 */ + TCL_DEPRECATED_API("Use Ttk_RegisterElement") int (*ttk_RegisterElementSpec) (Ttk_Theme theme, const char *elementName, const Ttk_ElementSpec *elementSpec, void *clientData); /* 5 */ Ttk_ElementClass * (*ttk_RegisterElement) (Tcl_Interp *interp, Ttk_Theme theme, const char *elementName, const Ttk_ElementSpec *elementSpec, void *clientData); /* 6 */ int (*ttk_RegisterElementFactory) (Tcl_Interp *interp, const char *name, Ttk_ElementFactory factoryProc, void *clientData); /* 7 */ void (*ttk_RegisterLayout) (Ttk_Theme theme, const char *className, Ttk_LayoutSpec layoutSpec); /* 8 */ @@ -280,4 +281,8 @@ extern const TtkStubs *ttkStubsPtr; /* !END!: Do not edit above this line. */ +#ifdef TK_NO_DEPRECATED +# undef Ttk_RegisterElementSpec +#endif + #endif /* _TTKDECLS */ diff --git a/generic/ttk/ttkDefaultTheme.c b/generic/ttk/ttkDefaultTheme.c index f1c37a6..9f3c282 100644 --- a/generic/ttk/ttkDefaultTheme.c +++ b/generic/ttk/ttkDefaultTheme.c @@ -59,24 +59,31 @@ static const enum BorderColor thinShadowColors[6][4] = { static void DrawCorner( Tk_Window tkwin, Drawable d, - Tk_3DBorder border, /* get most GCs from here... */ - GC borderGC, /* "window border" color GC */ - int x,int y, int width,int height, /* where to draw */ - int corner, /* 0 => top left; 1 => bottom right */ + Tk_3DBorder border, /* get most GCs from here... */ + GC borderGC, /* "window border" color GC */ + int x, int y, int width, int height, /* where to draw */ + bool corner, /* false => top left; true => bottom right */ enum BorderColor color) { XPoint points[3]; GC gc; --width; --height; - points[0].x = x; points[0].y = y+height; - points[1].x = x+width*corner; points[1].y = y+height*corner; - points[2].x = x+width; points[2].y = y; + points[0].x = x; points[0].y = y+height; + points[1].x = corner ? x + width : x; points[1].y = corner ? y + height : y; + points[2].x = x+width; points[2].y = y; - if (color == BRDR) + if (corner) { + points[2].y -= WIN32_XDRAWLINE_HACK; + } else { + points[2].x += WIN32_XDRAWLINE_HACK; + } + + if (color == BRDR) { gc = borderGC; - else + } else { gc = Tk_3DBorderGC(tkwin, border, (int)color); + } XDrawLines(Tk_Display(tkwin), d, gc, points, 3, CoordModeOrigin); } @@ -90,19 +97,19 @@ static void DrawBorder( switch (borderWidth) { case 2: /* "thick" border */ DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 0,shadowColors[relief][0]); + b.x, b.y, b.width, b.height, false, shadowColors[relief][0]); DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 0,shadowColors[relief][1]); + b.x+1, b.y+1, b.width-2, b.height-2, false, shadowColors[relief][1]); DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 1,shadowColors[relief][2]); + b.x+1, b.y+1, b.width-2, b.height-2, true, shadowColors[relief][2]); DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 1,shadowColors[relief][3]); + b.x, b.y, b.width, b.height, true, shadowColors[relief][3]); break; case 1: /* "thin" border */ DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 0, thinShadowColors[relief][0]); + b.x, b.y, b.width, b.height, false, thinShadowColors[relief][0]); DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 1, thinShadowColors[relief][1]); + b.x, b.y, b.width, b.height, true, thinShadowColors[relief][1]); break; case 0: /* no border -- do nothing */ break; @@ -122,13 +129,13 @@ static void DrawFieldBorder( { GC borderGC = Tk_GCForColor(borderColor, d); DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 0, DARK); + b.x, b.y, b.width, b.height, false, DARK); DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 0, BRDR); + b.x+1, b.y+1, b.width-2, b.height-2, false, BRDR); DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 1, LITE); + b.x+1, b.y+1, b.width-2, b.height-2, true, LITE); DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 1, FLAT); + b.x, b.y, b.width, b.height, true, FLAT); return; } @@ -372,10 +379,11 @@ static void FieldElementDraw( XColor *focusColor = Tk_GetColorFromObj(tkwin, field->focusColorObj); GC focusGC = Tk_GCForColor(focusColor, d); - if (focusWidth > 1) { + if (focusWidth > 1 && b.width >= 2 && b.height >= 2) { int x1 = b.x, x2 = b.x + b.width - 1; int y1 = b.y, y2 = b.y + b.height - 1; int w = WIN32_XDRAWLINE_HACK; + GC bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); /* * Draw the outer rounded rectangle @@ -394,7 +402,6 @@ static void FieldElementDraw( /* * Fill the inner rectangle */ - GC bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); XFillRectangle(disp, d, bgGC, b.x+1, b.y+1, b.width-2, b.height-2); } else { /* @@ -1091,8 +1098,9 @@ static void ThumbElementDraw( /* * Don't draw the thumb if we are disabled. * This makes it behave like Windows ... if that's what we want. - if (state & TTK_STATE_DISABLED) + if (state & TTK_STATE_DISABLED) { return; + } */ Tk_GetReliefFromObj(NULL, thumb->reliefObj, &relief); diff --git a/generic/ttk/ttkElements.c b/generic/ttk/ttkElements.c index e8ff680..304f8ff 100644 --- a/generic/ttk/ttkElements.c +++ b/generic/ttk/ttkElements.c @@ -19,6 +19,69 @@ #define DEFAULT_ARROW_SIZE "15" #define MIN_THUMB_SIZE 10 +/* + *---------------------------------------------------------------------- + * + * Helper routine for drawing a few style elements: + * + * The following function is needed when drawing the trough element + * (which is used in scrollbars, scales, and progressbars) and the + * arrow and thumb elements of a scrollbar. It draws the light or dark + * border color along the entire bottom and right edges, contrary to + * the Tk_Fill3DRectangle function, which on the windowing systems x11 + * and aqua draws the light or dark border color along the entire top + * and left edges instead. + * + * An alternative approach would be to modify the function + * Tk_3DHorizontalBevel in the file unix/tkUnix3d.c. That function is + * called in Tk_Draw3DRectangle, which in turn is invoked in + * Tk_Fill3DRectangle (both functions are implemented in the file + * generic/tk3d.c). With that approach there would be no need for the + * Fill3DRectangle function below, but it would result in some (minor) + * changes related to the appearance of most Tk and Ttk widgets on x11 + * and aqua. + */ + +#if defined(_WIN32) +#define Fill3DRectangle Tk_Fill3DRectangle +#else +static void Fill3DRectangle( + Tk_Window tkwin, /* Window for which border was allocated. */ + Drawable drawable, /* X window or pixmap in which to draw. */ + Tk_3DBorder border, /* Token for border to draw. */ + int x, int y, /* Upper-left corner of the rectangle. */ + int width, int height, /* The width and height of the rectangle. */ + int borderWidth, /* Desired width for border, in pixels. Border + * will be *inside* region. */ + int relief) /* Indicates 3D effect: TK_RELIEF_FLAT, + * TK_RELIEF_RAISED, TK_RELIEF_SUNKEN, etc. */ +{ + if (borderWidth == 1 && width >= 2 && height >= 2 && + (relief == TK_RELIEF_RAISED || relief == TK_RELIEF_SUNKEN)) { + GC flatGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); + GC lightGC = Tk_3DBorderGC(tkwin, border, TK_3D_LIGHT_GC); + GC darkGC = Tk_3DBorderGC(tkwin, border, TK_3D_DARK_GC); + GC nGC, wGC, sGC, eGC; + int x1 = x, x2 = x + width - 1; + int y1 = y, y2 = y + height - 1; + + XFillRectangle(Tk_Display(tkwin), drawable, flatGC, + x + 1, y + 1, width - 2, height - 2); + + nGC = wGC = (relief == TK_RELIEF_RAISED ? lightGC : darkGC); + sGC = eGC = (relief == TK_RELIEF_RAISED ? darkGC : lightGC); + + XDrawLine(Tk_Display(tkwin), drawable, nGC, x1, y1, x2-1, y1); /* N */ + XDrawLine(Tk_Display(tkwin), drawable, wGC, x1, y1, x1, y2-1); /* W */ + XDrawLine(Tk_Display(tkwin), drawable, sGC, x1, y2, x2, y2); /* S */ + XDrawLine(Tk_Display(tkwin), drawable, eGC, x2, y1, x2, y2); /* E */ + } else { + Tk_Fill3DRectangle(tkwin, drawable, border, x, y, width, height, + borderWidth, relief); + } +} +#endif + /*---------------------------------------------------------------------- * +++ Null element. Does nothing; used as a stub. * Null element methods, option table and element spec are public, @@ -243,11 +306,11 @@ static void FieldElementDraw( XColor *focusColor = Tk_GetColorFromObj(tkwin, field->focusColorObj); GC focusGC = Tk_GCForColor(focusColor, d); - if (focusWidth > 1) { + if (focusWidth > 1 && b.width >= 2 && b.height >= 2) { int x1 = b.x, x2 = b.x + b.width - 1; int y1 = b.y, y2 = b.y + b.height - 1; int w = WIN32_XDRAWLINE_HACK; - GC bgGC; + GC bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); /* * Draw the outer rounded rectangle @@ -266,7 +329,6 @@ static void FieldElementDraw( /* * Fill the inner rectangle */ - bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); XFillRectangle(disp, d, bgGC, b.x+1, b.y+1, b.width-2, b.height-2); } else { /* @@ -384,15 +446,25 @@ static void DrawFocusRing( gc = Tk_GetGC(tkwin, GCForeground, &gcValues); if (solid) { - XRectangle rects[4] = { - {(short)b.x, (short)b.y, (unsigned short)b.width, (unsigned short)thickness}, /* N */ - {(short)b.x, (short)(b.y + b.height - thickness), (unsigned short)b.width, (unsigned short)thickness}, /* S */ - {(short)b.x, (short)(b.y + thickness), (unsigned short)thickness, (unsigned short)(b.height - 2*thickness)}, /* W */ - {(short)(b.x + b.width - thickness), (short)(b.y + thickness), /* E */ - (unsigned short)thickness, (unsigned short)(b.height - 2*thickness)} - }; - - XFillRectangles(disp, d, gc, rects, 4); + if (b.width >= 2*thickness && b.height >= 2*thickness) { + XRectangle rects[4] = { + {(short)b.x, (short)b.y, + (unsigned short)b.width, (unsigned short)thickness}, /* N */ + + {(short)b.x, (short)(b.y + b.height - thickness), + (unsigned short)b.width, (unsigned short)thickness}, /* S */ + + {(short)b.x, (short)(b.y + thickness), + (unsigned short)thickness, + (unsigned short)(b.height - 2*thickness)}, /* W */ + + {(short)(b.x + b.width - thickness), (short)(b.y + thickness), + (unsigned short)thickness, + (unsigned short)(b.height - 2*thickness)} /* E */ + }; + + XFillRectangles(disp, d, gc, rects, 4); + } } else { TkDrawDottedRect(disp, d, gc, b.x, b.y, b.width, b.height); } @@ -609,6 +681,7 @@ static void SizegripDraw( GC lightGC = Tk_3DBorderGC(tkwin, border, TK_3D_LIGHT_GC); GC darkGC = Tk_3DBorderGC(tkwin, border, TK_3D_DARK_GC); int x1 = b.x + b.width-1, y1 = b.y + b.height-1, x2 = x1, y2 = y1; + int w = WIN32_XDRAWLINE_HACK; Tk_GetPixelsFromObj(NULL, tkwin, grip->gripSizeObj, &gripSize); gripThickness = gripSize * 3 / (gripCount * 5); @@ -616,9 +689,11 @@ static void SizegripDraw( while (gripCount--) { x1 -= gripSpace; y2 -= gripSpace; for (int i = 1; i < gripThickness; i++) { - XDrawLine(Tk_Display(tkwin), d, darkGC, x1,y1, x2,y2); --x1; --y2; + XDrawLine(Tk_Display(tkwin), d, darkGC, + x1, y1, x2+w, y2-w); --x1; --y2; } - XDrawLine(Tk_Display(tkwin), d, lightGC, x1,y1, x2,y2); --x1; --y2; + XDrawLine(Tk_Display(tkwin), d, lightGC, + x1, y1, x2+w, y2-w); --x1; --y2; } } @@ -976,7 +1051,7 @@ static void ArrowElementDraw( Tk_GetPixelsFromObj(NULL, tkwin, arrow->borderWidthObj, &borderWidth); Tk_GetReliefFromObj(NULL, arrow->reliefObj, &relief); - Tk_Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, + Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, borderWidth, relief); padding.left = round(ArrowPadding.left * scalingLevel); @@ -1257,7 +1332,7 @@ static void TroughElementDraw( } } - Tk_Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, + Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, borderWidth, relief); } @@ -1332,7 +1407,7 @@ static void ThumbElementDraw( Tk_GetPixelsFromObj(NULL, tkwin, thumb->borderWidthObj, &borderWidth); Tk_GetReliefFromObj(NULL, thumb->reliefObj, &relief); - Tk_Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, + Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, borderWidth, relief); } @@ -1818,20 +1893,30 @@ static void TabElementDraw( switch (nbTabsStickBit) { default: case TTK_STICK_S: - XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), - b.x + cut, b.y, b.width - 2*cut, cut); + if (b.width >= 2*cut) { + XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), + b.x + cut, b.y, b.width - 2*cut, cut); + } break; case TTK_STICK_N: - XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), - b.x + cut, b.y + b.height - cut, b.width - 2*cut, cut); + if (b.width >= 2*cut) { + XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), + b.x + cut, b.y + b.height - cut, + b.width - 2*cut, cut); + } break; case TTK_STICK_E: - XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), - b.x, b.y + cut, cut, b.height - 2*cut); + if (b.height >= 2*cut) { + XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), + b.x, b.y + cut, cut, b.height - 2*cut); + } break; case TTK_STICK_W: - XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), - b.x + b.width - cut, b.y + cut, cut, b.height - 2*cut); + if (b.height >= 2*cut) { + XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), + b.x + b.width - cut, b.y + cut, + cut, b.height - 2*cut); + } break; } } diff --git a/generic/ttk/ttkEntry.c b/generic/ttk/ttkEntry.c index cd10a12..578e9df 100644 --- a/generic/ttk/ttkEntry.c +++ b/generic/ttk/ttkEntry.c @@ -548,8 +548,9 @@ static int RunValidationScript( Tcl_DStringValue(&script), Tcl_DStringLength(&script), TCL_EVAL_GLOBAL); Tcl_DStringFree(&script); - if (WidgetDestroyed(&entryPtr->core)) + if (WidgetDestroyed(&entryPtr->core)) { return TCL_ERROR; + } if (code != TCL_OK && code != TCL_RETURN) { Tcl_AddErrorInfo(interp, "\n\t(in "); @@ -606,8 +607,7 @@ EntryValidateChange( if ((entryPtr->entry.validateCmdObj == NULL) || (entryPtr->core.flags & VALIDATING) - || !EntryNeedsValidation(vmode, reason)) - { + || !EntryNeedsValidation(vmode, reason)) { return TCL_OK; } @@ -726,8 +726,9 @@ static void AdjustIndices(Entry *entryPtr, int index, int nChars) e->selectLast = AdjustIndex(e->selectLast, index+g, nChars); e->xscroll.first= AdjustIndex(e->xscroll.first, index+g, nChars); - if (e->selectLast <= e->selectFirst) + if (e->selectLast <= e->selectFirst) { e->selectFirst = e->selectLast = TCL_INDEX_NONE; + } } /* EntryStoreValue -- @@ -742,18 +743,21 @@ EntryStoreValue(Entry *entryPtr, const char *value) size_t numBytes = strlen(value); Tcl_Size numChars = Tcl_NumUtfChars(value, numBytes); - if (entryPtr->core.flags & VALIDATING) + if (entryPtr->core.flags & VALIDATING) { entryPtr->core.flags |= VALIDATION_SET_VALUE; + } /* Make sure all indices remain in bounds: */ - if (numChars < entryPtr->entry.numChars) + if (numChars < entryPtr->entry.numChars) { AdjustIndices(entryPtr, numChars, numChars - entryPtr->entry.numChars); + } /* Free old value: */ - if (entryPtr->entry.displayString != entryPtr->entry.string) + if (entryPtr->entry.displayString != entryPtr->entry.string) { ckfree(entryPtr->entry.displayString); + } ckfree(entryPtr->entry.string); /* Store new value: @@ -990,8 +994,9 @@ EntryCleanup(void *recordPtr) { Entry *entryPtr = (Entry *)recordPtr; - if (entryPtr->entry.textVariableTrace) + if (entryPtr->entry.textVariableTrace) { Ttk_UntraceVariable(entryPtr->entry.textVariableTrace); + } TtkFreeScrollHandle(entryPtr->entry.xscrollHandle); @@ -1000,8 +1005,9 @@ EntryCleanup(void *recordPtr) Tk_DeleteSelHandler(entryPtr->core.tkwin, XA_PRIMARY, XA_STRING); Tk_FreeTextLayout(entryPtr->entry.textLayout); - if (entryPtr->entry.displayString != entryPtr->entry.string) + if (entryPtr->entry.displayString != entryPtr->entry.string) { ckfree(entryPtr->entry.displayString); + } ckfree(entryPtr->entry.string); } @@ -1030,8 +1036,9 @@ static int EntryConfigure(Tcl_Interp *interp, void *recordPtr, int mask) /* Update derived resources: */ if (mask & TEXTVAR_CHANGED) { - if (entryPtr->entry.textVariableTrace) + if (entryPtr->entry.textVariableTrace) { Ttk_UntraceVariable(entryPtr->entry.textVariableTrace); + } entryPtr->entry.textVariableTrace = vt; } @@ -1056,8 +1063,9 @@ static int EntryConfigure(Tcl_Interp *interp, void *recordPtr, int mask) /* Recompute the displayString, in case showChar changed: */ - if (entryPtr->entry.displayString != entryPtr->entry.string) + if (entryPtr->entry.displayString != entryPtr->entry.string) { ckfree(entryPtr->entry.displayString); + } entryPtr->entry.displayString = entryPtr->entry.showCharObj @@ -1237,10 +1245,12 @@ static void EntryDisplay(void *clientData, Drawable d) /* Adjust selection range to keep in display bounds. */ if (showSelection) { - if (selFirst < leftIndex) + if (selFirst < leftIndex) { selFirst = leftIndex; - if (selLast > rightIndex) + } + if (selLast > rightIndex) { selLast = rightIndex; + } } /* Draw widget background & border @@ -1260,14 +1270,16 @@ static void EntryDisplay(void *clientData, Drawable d) if (selBorder) { int selWidth; int textareaEnd = textarea.x + textarea.width; - if (selEndX > textareaEnd) + if (selEndX > textareaEnd) { selEndX = textareaEnd; + } selWidth = selEndX - selStartX + 2 * borderWidth; - if (selWidth > 0) + if (selWidth > 0) { Tk_Fill3DRectangle(tkwin, d, selBorder, selStartX - borderWidth, entryPtr->entry.layoutY - borderWidth, selWidth, entryPtr->entry.layoutHeight + 2*borderWidth, borderWidth, TK_RELIEF_RAISED); + } } } @@ -1430,7 +1442,7 @@ EntryIndex( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "selection isn't in widget %s", Tk_PathName(entryPtr->core.tkwin))); - Tcl_SetErrorCode(interp, "TTK", "ENTRY", "NO_SELECTION", NULL); + Tcl_SetErrorCode(interp, "TTK", "ENTRY", "NO_SELECTION", (char *)NULL); return TCL_ERROR; } if (strncmp(string, "sel.first", length) == 0) { @@ -1478,7 +1490,7 @@ EntryIndex( badIndex: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad entry index \"%s\"", string)); - Tcl_SetErrorCode(interp, "TTK", "ENTRY", "INDEX", NULL); + Tcl_SetErrorCode(interp, "TTK", "ENTRY", "INDEX", (char *)NULL); return TCL_ERROR; } @@ -1725,8 +1737,9 @@ static int EntryValidateCommand( code = EntryRevalidate(interp, entryPtr, VALIDATE_FORCED); - if (code == TCL_ERROR) + if (code == TCL_ERROR) { return code; + } Tcl_SetObjResult(interp, Tcl_NewBooleanObj(code == TCL_OK)); return TCL_OK; @@ -1841,8 +1854,9 @@ ComboboxConfigure(Tcl_Interp *interp, void *recordPtr, int mask) /* Make sure -values is a valid list: */ - if (Tcl_ListObjLength(interp,cbPtr->combobox.valuesObj,&unused) != TCL_OK) + if (Tcl_ListObjLength(interp,cbPtr->combobox.valuesObj,&unused) != TCL_OK) { return TCL_ERROR; + } return EntryConfigure(interp, recordPtr, mask); } @@ -1894,14 +1908,14 @@ static int ComboboxCurrentCommand( if (idx < 0 || idx >= nValues) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "index \"%s\" out of range", Tcl_GetString(objv[2]))); - Tcl_SetErrorCode(interp, "TTK", "COMBOBOX", "IDX_RANGE", NULL); + Tcl_SetErrorCode(interp, "TTK", "COMBOBOX", "IDX_RANGE", (char *)NULL); return TCL_ERROR; } currentIndex = idx; } else { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad index \"%s\"", Tcl_GetString(objv[2]))); - Tcl_SetErrorCode(interp, "TTK", "COMBOBOX", "IDX_VALUE", NULL); + Tcl_SetErrorCode(interp, "TTK", "COMBOBOX", "IDX_VALUE", (char *)NULL); return TCL_ERROR; } @@ -2026,8 +2040,9 @@ SpinboxConfigure(Tcl_Interp *interp, void *recordPtr, int mask) /* Make sure -values is a valid list: */ - if (Tcl_ListObjLength(interp,sb->spinbox.valuesObj,&unused) != TCL_OK) + if (Tcl_ListObjLength(interp,sb->spinbox.valuesObj,&unused) != TCL_OK) { return TCL_ERROR; + } return EntryConfigure(interp, recordPtr, mask); } @@ -2103,8 +2118,9 @@ static void TextareaElementSize( Tk_GetFontMetrics(font, &fm); Tcl_GetIntFromObj(NULL, textarea->widthObj, &prefWidth); - if (prefWidth <= 0) + if (prefWidth <= 0) { prefWidth = 1; + } *heightPtr = fm.linespace; *widthPtr = prefWidth * avgWidth; diff --git a/generic/ttk/ttkFrame.c b/generic/ttk/ttkFrame.c index b4c6e35..a1a37b2 100644 --- a/generic/ttk/ttkFrame.c +++ b/generic/ttk/ttkFrame.c @@ -211,7 +211,7 @@ error: if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Bad label anchor specification %s", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "LABEL", "ANCHOR", NULL); + Tcl_SetErrorCode(interp, "TTK", "LABEL", "ANCHOR", (char *)NULL); } return TCL_ERROR; } @@ -303,10 +303,10 @@ static void LabelframeStyleOptions(Labelframe *lf, LabelframeStyle *style) } else { if (style->labelAnchor & (TTK_PACK_TOP|TTK_PACK_BOTTOM)) { style->labelMargins = - Ttk_MakePadding(DEFAULT_LABELINSET,0,DEFAULT_LABELINSET,0); + Ttk_MakePadding(DEFAULT_LABELINSET, 0, DEFAULT_LABELINSET, 0); } else { style->labelMargins = - Ttk_MakePadding(0,DEFAULT_LABELINSET,0,DEFAULT_LABELINSET); + Ttk_MakePadding(0, DEFAULT_LABELINSET, 0, DEFAULT_LABELINSET); } } if ((objPtr = Ttk_QueryOption(layout,"-labeloutside", 0)) != NULL) { @@ -366,10 +366,10 @@ static int LabelframeSize( labelHeight += Ttk_PaddingHeight(style.labelMargins); switch (LabelAnchorSide(style.labelAnchor)) { - case TTK_SIDE_LEFT: margins.left += labelWidth; break; - case TTK_SIDE_RIGHT: margins.right += labelWidth; break; - case TTK_SIDE_TOP: margins.top += labelHeight; break; - case TTK_SIDE_BOTTOM: margins.bottom += labelHeight; break; + case TTK_SIDE_LEFT: margins.left += (short)labelWidth; break; + case TTK_SIDE_RIGHT: margins.right += (short)labelWidth; break; + case TTK_SIDE_TOP: margins.top += (short)labelHeight; break; + case TTK_SIDE_BOTTOM: margins.bottom += (short)labelHeight; break; } Ttk_SetMargins(corePtr->tkwin,margins); diff --git a/generic/ttk/ttkImage.c b/generic/ttk/ttkImage.c index d46b420..357caab 100644 --- a/generic/ttk/ttkImage.c +++ b/generic/ttk/ttkImage.c @@ -100,7 +100,7 @@ TtkGetImageSpecEx(Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr, Tcl_SetObjResult(interp, Tcl_NewStringObj( "image specification must contain an odd number of elements", -1)); - Tcl_SetErrorCode(interp, "TTK", "IMAGE", "SPEC", NULL); + Tcl_SetErrorCode(interp, "TTK", "IMAGE", "SPEC", (char *)NULL); } goto error; } @@ -222,8 +222,9 @@ static void Ttk_Fill( int db = dst.y + dst.height; int x,y; - if (!(src.width && src.height && dst.width && dst.height)) + if (!(src.width && src.height && dst.width && dst.height)) { return; + } for (x = dst.x; x < dr; x += src.width) { int cw = MIN(src.width, dr - x); @@ -380,7 +381,7 @@ Ttk_CreateImageElement( if (objc + 1 < 2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Must supply a base image", -1)); - Tcl_SetErrorCode(interp, "TTK", "IMAGE", "BASE", NULL); + Tcl_SetErrorCode(interp, "TTK", "IMAGE", "BASE", (char *)NULL); return TCL_ERROR; } @@ -405,7 +406,7 @@ Ttk_CreateImageElement( if (i == objc - 1) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Value for %s missing", Tcl_GetString(objv[i]))); - Tcl_SetErrorCode(interp, "TTK", "IMAGE", "VALUE", NULL); + Tcl_SetErrorCode(interp, "TTK", "IMAGE", "VALUE", (char *)NULL); goto error; } diff --git a/generic/ttk/ttkInit.c b/generic/ttk/ttkInit.c index 38bbbaa..96c2766 100644 --- a/generic/ttk/ttkInit.c +++ b/generic/ttk/ttkInit.c @@ -201,6 +201,7 @@ MODULE_SCOPE void TtkProgressbar_Init(Tcl_Interp *); MODULE_SCOPE void TtkScale_Init(Tcl_Interp *); MODULE_SCOPE void TtkScrollbar_Init(Tcl_Interp *); MODULE_SCOPE void TtkSeparator_Init(Tcl_Interp *); +MODULE_SCOPE void TtkToggleswitch_Init(Tcl_Interp *); MODULE_SCOPE void TtkTreeview_Init(Tcl_Interp *); #ifdef TTK_SQUARE_WIDGET @@ -218,6 +219,7 @@ static void RegisterWidgets(Tcl_Interp *interp) TtkScale_Init(interp); TtkScrollbar_Init(interp); TtkSeparator_Init(interp); + TtkToggleswitch_Init(interp); TtkTreeview_Init(interp); #ifdef TTK_SQUARE_WIDGET TtkSquareWidget_Init(interp); diff --git a/generic/ttk/ttkLabel.c b/generic/ttk/ttkLabel.c index a59f1fe..85629bf 100644 --- a/generic/ttk/ttkLabel.c +++ b/generic/ttk/ttkLabel.c @@ -104,8 +104,9 @@ static int TextReqWidth(TextElement *text) int avgWidth = Tk_TextWidth(text->tkfont, "0", 1); if (reqWidth <= 0) { int specWidth = avgWidth * -reqWidth; - if (specWidth > text->width) + if (specWidth > text->width) { return specWidth; + } } else { return avgWidth * reqWidth; } @@ -209,8 +210,9 @@ static void TextElementSize( { TextElement *text = (TextElement *)elementRecord; - if (!TextSetup(text, tkwin)) + if (!TextSetup(text, tkwin)) { return; + } *heightPtr = text->height; *widthPtr = TextReqWidth(text); @@ -270,8 +272,9 @@ static void cTextElementSize( { TextElement *text = (TextElement *)elementRecord; - if (!cTextSetup(text, tkwin)) + if (!cTextSetup(text, tkwin)) { return; + } *heightPtr = text->height; *widthPtr = TextReqWidth(text); @@ -580,8 +583,9 @@ static void LabelSetup( c->compound = TTK_COMPOUND_TEXT; } } - if (c->compound != TTK_COMPOUND_IMAGE) + if (c->compound != TTK_COMPOUND_IMAGE) { TextSetup(&c->text, tkwin); + } /* * ASSERT: @@ -623,10 +627,12 @@ static void LabelSetup( static void LabelCleanup(LabelElement *c) { - if (c->compound != TTK_COMPOUND_TEXT) + if (c->compound != TTK_COMPOUND_TEXT) { ImageCleanup(&c->image); - if (c->compound != TTK_COMPOUND_IMAGE) + } + if (c->compound != TTK_COMPOUND_IMAGE) { TextCleanup(&c->text); + } } static void LabelElementSize( @@ -646,8 +652,9 @@ static void LabelElementSize( /* Requested width based on -width option, not actual text width: */ - if (label->compound != TTK_COMPOUND_IMAGE) + if (label->compound != TTK_COMPOUND_IMAGE) { textReqWidth = TextReqWidth(&label->text); + } switch (label->compound) { diff --git a/generic/ttk/ttkLayout.c b/generic/ttk/ttkLayout.c index 48cf615..b77db39 100644 --- a/generic/ttk/ttkLayout.c +++ b/generic/ttk/ttkLayout.c @@ -335,7 +335,7 @@ int Ttk_GetPaddingFromObj( if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Wrong #elements in padding spec", -1)); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "PADDING", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "PADDING", (char *)NULL); } goto error; } @@ -374,7 +374,7 @@ int Ttk_GetBorderFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, Ttk_Padding *pad) if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Wrong #elements in padding spec", -1)); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "BORDER", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "BORDER", (char *)NULL); } goto error; } @@ -489,7 +489,7 @@ int Ttk_GetStickyFromObj( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Bad -sticky specification %s", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "STICKY", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "STICKY", (char *)NULL); } return TCL_ERROR; } @@ -625,8 +625,9 @@ Ttk_LayoutTemplate Ttk_ParseLayoutTemplate(Tcl_Interp *interp, Tcl_Obj *objPtr) Tcl_Obj **objv; Ttk_TemplateNode *head = 0, *tail = 0; - if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) + if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) { return 0; + } while (i < objc) { const char *elementName = Tcl_GetString(objv[i]); @@ -641,8 +642,9 @@ Ttk_LayoutTemplate Ttk_ParseLayoutTemplate(Tcl_Interp *interp, Tcl_Obj *objPtr) const char *optName = Tcl_GetString(objv[i]); int option, value; - if (optName[0] != '-') + if (optName[0] != '-') { break; + } if (Tcl_GetIndexFromObjStruct(interp, objv[i], optStrings, sizeof(char *), "option", 0, &option) @@ -655,41 +657,47 @@ Ttk_LayoutTemplate Ttk_ParseLayoutTemplate(Tcl_Interp *interp, Tcl_Obj *objPtr) Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Missing value for option %s", Tcl_GetString(objv[i-1]))); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "LAYOUT", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "LAYOUT", (char *)NULL); goto error; } switch (option) { case OP_SIDE: /* <<NOTE-PACKSIDE>> */ if (Tcl_GetIndexFromObjStruct(interp, objv[i], packSideStrings, - sizeof(char *), "side", 0, &value) != TCL_OK) - { + sizeof(char *), "side", 0, &value) != TCL_OK) { goto error; } flags |= (TTK_PACK_LEFT << value); break; case OP_STICKY: - if (Ttk_GetStickyFromObj(interp,objv[i],&sticky) != TCL_OK) + if (Ttk_GetStickyFromObj(interp,objv[i],&sticky) != TCL_OK) { goto error; + } break; case OP_EXPAND: - if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) + if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) { goto error; - if (value) + } + if (value) { flags |= TTK_EXPAND; + } break; case OP_BORDER: - if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) + if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) { goto error; - if (value) + } + if (value) { flags |= TTK_BORDER; + } break; case OP_UNIT: - if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) + if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) { goto error; - if (value) + } + if (value) { flags |= TTK_UNIT; + } break; case OP_CHILDREN: childSpec = objv[i]; @@ -711,7 +719,7 @@ Ttk_LayoutTemplate Ttk_ParseLayoutTemplate(Tcl_Interp *interp, Tcl_Obj *objPtr) tail->child = Ttk_ParseLayoutTemplate(interp, childSpec); if (!tail->child) { Tcl_SetObjResult(interp, Tcl_ObjPrintf("Invalid -children value")); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "CHILDREN", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "CHILDREN", (char *)NULL); goto error; } } @@ -890,7 +898,7 @@ Ttk_Layout Ttk_CreateLayout( if (!layoutTemplate) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Layout %s not found", styleName)); - Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "LAYOUT", styleName, NULL); + Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "LAYOUT", styleName, (char *)NULL); return 0; } @@ -931,7 +939,7 @@ Ttk_CreateSublayout( if (!layoutTemplate) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Layout %s not found", styleName)); - Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "LAYOUT", styleName, NULL); + Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "LAYOUT", styleName, (char *)NULL); return 0; } @@ -1121,19 +1129,22 @@ static void Ttk_DrawNodeList( int border = node->flags & TTK_BORDER; int substate = state; - if (node->flags & TTK_UNIT) + if (node->flags & TTK_UNIT) { substate |= node->state; + } - if (node->child && border) + if (node->child && border) { Ttk_DrawNodeList(layout, substate, node->child, d); + } Ttk_DrawElement( node->eclass, layout->style,layout->recordPtr,layout->optionTable,layout->tkwin, d, node->parcel, state | node->state); - if (node->child && !border) + if (node->child && !border) { Ttk_DrawNodeList(layout, substate, node->child, d); + } } } @@ -1194,13 +1205,15 @@ static Ttk_Element FindNode(Ttk_Element node, const char *nodeName) { for (; node ; node = node->next) { - if (!strcmp(tail(Ttk_ElementName(node)), nodeName)) + if (!strcmp(tail(Ttk_ElementName(node)), nodeName)) { return node; + } if (node->child) { Ttk_Element childNode = FindNode(node->child, nodeName); - if (childNode) + if (childNode) { return childNode; + } } } return 0; diff --git a/generic/ttk/ttkManager.c b/generic/ttk/ttkManager.c index 8ce7b3d..e660538 100644 --- a/generic/ttk/ttkManager.c +++ b/generic/ttk/ttkManager.c @@ -429,8 +429,9 @@ Tcl_Size Ttk_ContentIndex(Ttk_Manager *mgr, Tk_Window window) { Tcl_Size index; for (index = 0; index < mgr->nContent; ++index) - if (mgr->content[index]->window == window) + if (mgr->content[index]->window == window) { return index; + } return -1; } @@ -465,7 +466,7 @@ int Ttk_GetContentIndexFromObj( if (index < 0 || (index - !!lastOK) >= mgr->nContent) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Managed window index \"%s\" out of bounds", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "MANAGED", "INDEX", NULL); + Tcl_SetErrorCode(interp, "TTK", "MANAGED", "INDEX", (char *)NULL); return TCL_ERROR; } *indexPtr = index; @@ -481,7 +482,7 @@ int Ttk_GetContentIndexFromObj( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s is not managed by %s", string, Tk_PathName(mgr->window))); - Tcl_SetErrorCode(interp, "TTK", "MANAGED", "MANAGER", NULL); + Tcl_SetErrorCode(interp, "TTK", "MANAGED", "MANAGER", (char *)NULL); return TCL_ERROR; } *indexPtr = index; @@ -490,7 +491,7 @@ int Ttk_GetContentIndexFromObj( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid managed window specification %s", string)); - Tcl_SetErrorCode(interp, "TTK", "MANAGED", "SPEC", NULL); + Tcl_SetErrorCode(interp, "TTK", "MANAGED", "SPEC", (char *)NULL); return TCL_ERROR; } @@ -551,7 +552,7 @@ int Ttk_Maintainable(Tcl_Interp *interp, Tk_Window window, Tk_Window container) badWindow: Tcl_SetObjResult(interp, Tcl_ObjPrintf("cannot add \"%s\" as content of \"%s\"", Tk_PathName(window), Tk_PathName(container))); - Tcl_SetErrorCode(interp, "TTK", "GEOMETRY", "MAINTAINABLE", NULL); + Tcl_SetErrorCode(interp, "TTK", "GEOMETRY", "MAINTAINABLE", (char *)NULL); return 0; } diff --git a/generic/ttk/ttkNotebook.c b/generic/ttk/ttkNotebook.c index 6b730b9..649964a 100644 --- a/generic/ttk/ttkNotebook.c +++ b/generic/ttk/ttkNotebook.c @@ -227,21 +227,18 @@ static int ConfigureTab( int mask = 0; if (Tk_SetOptions(interp, tab, nb->notebook.paneOptionTable, - objc, objv, window, &savedOptions, &mask) != TCL_OK) - { + objc, objv, window, &savedOptions, &mask) != TCL_OK) { return TCL_ERROR; } /* Check options: * @@@ TODO: validate -image option. */ - if (Ttk_GetStickyFromObj(interp, tab->stickyObj, &sticky) != TCL_OK) - { + if (Ttk_GetStickyFromObj(interp, tab->stickyObj, &sticky) != TCL_OK) { goto error; } if (Ttk_GetPaddingFromObj(interp, window, tab->paddingObj, &padding) - != TCL_OK) - { + != TCL_OK) { goto error; } @@ -268,9 +265,8 @@ static Tcl_Size IdentifyTab(Notebook *nb, int x, int y) Tcl_Size index; for (index = 0; index < Ttk_NumberContent(nb->notebook.mgr); ++index) { Tab *tab = (Tab *)Ttk_ContentData(nb->notebook.mgr,index); - if ( tab->state != TAB_STATE_HIDDEN - && Ttk_BoxContains(tab->parcel, x,y)) - { + if (tab->state != TAB_STATE_HIDDEN + && Ttk_BoxContains(tab->parcel, x,y)) { return index; } } @@ -423,10 +419,12 @@ static int NotebookSize(void *clientData, int *widthPtr, int *heightPtr) */ Tk_GetPixelsFromObj(NULL, nbwin, nb->notebook.widthObj, &reqWidth); Tk_GetPixelsFromObj(NULL, nbwin, nb->notebook.heightObj, &reqHeight); - if (reqWidth > 0) + if (reqWidth > 0) { clientWidth = reqWidth; - if (reqHeight > 0) + } + if (reqHeight > 0) { clientHeight = reqHeight; + } /* Tab row: */ @@ -754,7 +752,7 @@ static int AddTab( if (Ttk_ContentIndex(nb->notebook.mgr, window) >= 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf("%s already added", Tk_PathName(window))); - Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "PRESENT", NULL); + Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "PRESENT", (char *)NULL); return TCL_ERROR; } #endif @@ -870,7 +868,7 @@ static int FindTabIndex( if (*index_rtn == Ttk_NumberContent(nb->notebook.mgr)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid tab specification %s", string)); - Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "SPEC", NULL); + Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "SPEC", (char *)NULL); return TCL_ERROR; } @@ -891,14 +889,14 @@ static int GetTabIndex( if (status == TCL_OK && *index_rtn >= Ttk_NumberContent(nb->notebook.mgr)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Tab index \"%s\" out of bounds", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "INDEX", NULL); + Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "INDEX", (char *)NULL); return TCL_ERROR; } if (status == TCL_OK && *index_rtn < 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Tab '%s' not found", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "TAB", NULL); + Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "TAB", (char *)NULL); status = TCL_ERROR; } return status; @@ -1309,8 +1307,9 @@ static void NotebookCleanup(void *recordPtr) Notebook *nb = (Notebook *)recordPtr; Ttk_DeleteManager(nb->notebook.mgr); - if (nb->notebook.tabLayout) + if (nb->notebook.tabLayout) { Ttk_FreeLayout(nb->notebook.tabLayout); + } } static int NotebookConfigure(Tcl_Interp *interp, void *clientData, int mask) diff --git a/generic/ttk/ttkPanedwindow.c b/generic/ttk/ttkPanedwindow.c index 15f6d59..43271e5 100644 --- a/generic/ttk/ttkPanedwindow.c +++ b/generic/ttk/ttkPanedwindow.c @@ -158,7 +158,7 @@ static int ConfigurePane( if (pane->weight < 0) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "-weight must be non-negative", -1)); - Tcl_SetErrorCode(interp, "TTK", "PANE", "WEIGHT", NULL); + Tcl_SetErrorCode(interp, "TTK", "PANE", "WEIGHT", (char *)NULL); goto error; } @@ -192,12 +192,14 @@ static int ShoveUp(Paned *pw, int i, int pos) int sashThickness = pw->paned.sashThickness; if (i == 0) { - if (pos < 0) + if (pos < 0) { pos = 0; + } } else { Pane *prevPane = (Pane *)Ttk_ContentData(pw->paned.mgr, i-1); - if (pos < prevPane->sashPos + sashThickness) + if (pos < prevPane->sashPos + sashThickness) { pos = ShoveUp(pw, i-1, pos - sashThickness) + sashThickness; + } } return pane->sashPos = pos; } @@ -215,8 +217,9 @@ static int ShoveDown(Paned *pw, Tcl_Size i, int pos) pos = pane->sashPos; /* Sentinel value == container window size */ } else { Pane *nextPane = (Pane *)Ttk_ContentData(pw->paned.mgr,i+1); - if (pos + sashThickness > nextPane->sashPos) + if (pos + sashThickness > nextPane->sashPos) { pos = ShoveDown(pw, i+1, pos + sashThickness) - sashThickness; + } } return pane->sashPos = pos; } @@ -241,8 +244,9 @@ static int PanedSize(void *recordPtr, int *widthPtr, int *heightPtr) Pane *pane = (Pane *)Ttk_ContentData(pw->paned.mgr, index); Tk_Window window = Ttk_ContentWindow(pw->paned.mgr, index); - if (height < Tk_ReqHeight(window)) + if (height < Tk_ReqHeight(window)) { height = Tk_ReqHeight(window); + } width += pane->reqSize; } width += nSashes * sashThickness; @@ -251,8 +255,9 @@ static int PanedSize(void *recordPtr, int *widthPtr, int *heightPtr) Pane *pane = (Pane *)Ttk_ContentData(pw->paned.mgr, index); Tk_Window window = Ttk_ContentWindow(pw->paned.mgr, index); - if (width < Tk_ReqWidth(window)) + if (width < Tk_ReqWidth(window)) { width = Tk_ReqWidth(window); + } height += pane->reqSize; } height += nSashes * sashThickness; @@ -310,8 +315,9 @@ static void PlaceSashes(Paned *pw, int width, int height) int reqSize = 0, totalWeight = 0; int difference, delta, remainder, pos, i; - if (nPanes == 0) + if (nPanes == 0) { return; + } /* Compute total required size and total available weight: */ @@ -344,13 +350,15 @@ static void PlaceSashes(Paned *pw, int width, int height) int weight = pane->weight * (pane->reqSize != 0); int size = pane->reqSize + delta * weight; - if (weight > remainder) + if (weight > remainder) { weight = remainder; + } remainder -= weight; size += weight; - if (size < 0) + if (size < 0) { size = 0; + } pane->sashPos = (pos += size); pos += sashThickness; @@ -422,7 +430,7 @@ static int AddPane( if (Ttk_ContentIndex(pw->paned.mgr, window) >= 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s already added", Tk_PathName(window))); - Tcl_SetErrorCode(interp, "TTK", "PANE", "PRESENT", NULL); + Tcl_SetErrorCode(interp, "TTK", "PANE", "PRESENT", (char *)NULL); return TCL_ERROR; } @@ -512,8 +520,9 @@ static void PanedCleanup(void *recordPtr) { Paned *pw = (Paned *)recordPtr; - if (pw->paned.sashLayout) + if (pw->paned.sashLayout) { Ttk_FreeLayout(pw->paned.sashLayout); + } Tk_DeleteEventHandler(pw->core.tkwin, PanedEventMask, PanedEventProc, recordPtr); Ttk_DeleteManager(pw->paned.mgr); @@ -563,8 +572,9 @@ static Ttk_Layout PanedGetLayout( Ttk_LayoutSize(sashLayout, 0, &sashWidth, &sashHeight); pw->paned.sashThickness = horizontal ? sashWidth : sashHeight; - if (pw->paned.sashLayout) + if (pw->paned.sashLayout) { Ttk_FreeLayout(pw->paned.sashLayout); + } pw->paned.sashLayout = sashLayout; } else { Ttk_FreeLayout(panedLayout); @@ -677,8 +687,9 @@ static int PanedInsertCommand( return AddPane(interp, pw, destIndex, window, objc-4, objv+4); } /* else -- move existing content: */ - if (destIndex >= nContent) + if (destIndex >= nContent) { destIndex = nContent - 1; + } Ttk_ReorderContent(pw->paned.mgr, srcIndex, destIndex); return objc == 4 ? TCL_OK : @@ -852,7 +863,7 @@ static int PanedSashposCommand( if (sashIndex < 0 || sashIndex >= Ttk_NumberContent(pw->paned.mgr) - 1) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "sash index %" TCL_LL_MODIFIER "d out of range", sashIndex)); - Tcl_SetErrorCode(interp, "TTK", "PANE", "SASH_INDEX", NULL); + Tcl_SetErrorCode(interp, "TTK", "PANE", "SASH_INDEX", (char *)NULL); return TCL_ERROR; } diff --git a/generic/ttk/ttkProgress.c b/generic/ttk/ttkProgress.c index af8c527..74cced3 100644 --- a/generic/ttk/ttkProgress.c +++ b/generic/ttk/ttkProgress.c @@ -220,10 +220,12 @@ static void ProgressbarInitialize( static void ProgressbarCleanup(void *recordPtr) { Progressbar *pb = (Progressbar *)recordPtr; - if (pb->progress.variableTrace) + if (pb->progress.variableTrace) { Ttk_UntraceVariable(pb->progress.variableTrace); - if (pb->progress.timer) + } + if (pb->progress.timer) { Tcl_DeleteTimerHandler(pb->progress.timer); + } } /* @@ -405,10 +407,12 @@ static Ttk_Layout ProgressbarGetLayout( if (layout) { Tcl_Obj *periodObj = Ttk_QueryOption(layout, "-period", 0); Tcl_Obj *maxPhaseObj = Ttk_QueryOption(layout, "-maxphase", 0); - if (periodObj) + if (periodObj) { Tcl_GetIntFromObj(NULL, periodObj, &pb->progress.period); - if (maxPhaseObj) + } + if (maxPhaseObj) { Tcl_GetIntFromObj(NULL, maxPhaseObj, &pb->progress.maxPhase); + } } return layout; diff --git a/generic/ttk/ttkScale.c b/generic/ttk/ttkScale.c index e318600..36e6946 100644 --- a/generic/ttk/ttkScale.c +++ b/generic/ttk/ttkScale.c @@ -271,8 +271,9 @@ ScaleGetCommand( Tcl_SetObjResult(interp, scalePtr->scale.valueObj); } else if (objc == 4) { r = Tcl_GetIntFromObj(interp, objv[2], &x); - if (r == TCL_OK) + if (r == TCL_OK) { r = Tcl_GetIntFromObj(interp, objv[3], &y); + } if (r == TCL_OK) { value = PointToValue(scalePtr, x, y); Tcl_SetObjResult(interp, Tcl_NewDoubleObj(value)); @@ -440,14 +441,27 @@ static double PointToValue(Scale *scalePtr, int x, int y) { Ttk_Box troughBox = TroughRange(scalePtr); - double from = 0, to = 1, fraction; + double value = 0, from = 0, to = 1, fraction; + Tcl_GetDoubleFromObj(NULL, scalePtr->scale.valueObj, &value); Tcl_GetDoubleFromObj(NULL, scalePtr->scale.fromObj, &from); Tcl_GetDoubleFromObj(NULL, scalePtr->scale.toObj, &to); if (scalePtr->scale.orient == TTK_ORIENT_HORIZONTAL) { + /* + * Bug d25b721f: drag when trough not shown due to missing display place + */ + if (troughBox.width <= 0) { + return value; + } fraction = (double)(x - troughBox.x) / (double)troughBox.width; } else { + /* + * Bug d25b721f: drag when trough not shown due to missing display place + */ + if (troughBox.height <= 0) { + return value; + } fraction = (double)(y - troughBox.y) / (double)troughBox.height; } diff --git a/generic/ttk/ttkScroll.c b/generic/ttk/ttkScroll.c index 61b3273..c1c5d25 100644 --- a/generic/ttk/ttkScroll.c +++ b/generic/ttk/ttkScroll.c @@ -258,12 +258,15 @@ void TtkScrollTo(ScrollHandle h, int newFirst, int updateScrollInfo) TtkUpdateScrollInfo(h); } - if (newFirst >= s->total) + if (newFirst >= s->total) { newFirst = s->total - 1; - if (newFirst > s->first && s->last >= s->total) /* don't scroll past end */ + } + if (newFirst > s->first && s->last >= s->total) {/* don't scroll past end */ newFirst = s->first; - if (newFirst < 0) + } + if (newFirst < 0) { newFirst = 0; + } if (newFirst != s->first) { s->first = newFirst; diff --git a/generic/ttk/ttkSquare.c b/generic/ttk/ttkSquare.c index d0d25b1..c9500e0 100644 --- a/generic/ttk/ttkSquare.c +++ b/generic/ttk/ttkSquare.c @@ -114,8 +114,9 @@ SquareDoLayout(void *clientData) Ttk_Box b; b = Ttk_ElementParcel(squareNode); - if (squarePtr->square.anchorObj != NULL) + if (squarePtr->square.anchorObj != NULL) { Tk_GetAnchorFromObj(NULL, squarePtr->square.anchorObj, &anchor); + } b = Ttk_AnchorBox(winBox, b.width, b.height, anchor); Ttk_PlaceElement(corePtr->layout, squareNode, b); diff --git a/generic/ttk/ttkState.c b/generic/ttk/ttkState.c index 005cd48..4024f0b 100644 --- a/generic/ttk/ttkState.c +++ b/generic/ttk/ttkState.c @@ -79,8 +79,9 @@ static int StateSpecSetFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr) unsigned int onbits = 0, offbits = 0; status = Tcl_ListObjGetElements(interp, objPtr, &objc, &objv); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } for (i = 0; i < objc; ++i) { const char *stateName = Tcl_GetString(objv[i]); @@ -94,15 +95,16 @@ static int StateSpecSetFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr) } for (j = 0; stateNames[j].value; ++j) { - if (strcmp(stateName, stateNames[j].name) == 0) + if (strcmp(stateName, stateNames[j].name) == 0) { break; + } } if (stateNames[j].value == 0) { if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid state name %s", stateName)); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "STATE", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "STATE", (char *)NULL); } return TCL_ERROR; } @@ -185,8 +187,9 @@ int Ttk_GetStateSpecFromObj( { if (objPtr->typePtr != &StateSpecObjType.objType) { int status = StateSpecSetFromAny(interp, objPtr); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } } spec->onbits = objPtr->internalRep.wideValue >> 32; @@ -212,20 +215,23 @@ Tcl_Obj *Ttk_StateMapLookup( int status; status = Tcl_ListObjGetElements(interp, map, &nSpecs, &specs); - if (status != TCL_OK) + if (status != TCL_OK) { return NULL; + } for (j = 0; j < nSpecs; j += 2) { Ttk_StateSpec spec; status = Ttk_GetStateSpecFromObj(interp, specs[j], &spec); - if (status != TCL_OK) + if (status != TCL_OK) { return NULL; - if (Ttk_StateMatches(state, &spec)) + } + if (Ttk_StateMatches(state, &spec)) { return specs[j+1]; + } } if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj("No match in state map", -1)); - Tcl_SetErrorCode(interp, "TTK", "STATE", "UNMATCHED", NULL); + Tcl_SetErrorCode(interp, "TTK", "STATE", "UNMATCHED", (char *)NULL); } return NULL; } @@ -244,22 +250,24 @@ Ttk_StateMap Ttk_GetStateMapFromObj( int status; status = Tcl_ListObjGetElements(interp, mapObj, &nSpecs, &specs); - if (status != TCL_OK) + if (status != TCL_OK) { return NULL; + } if (nSpecs % 2 != 0) { if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "State map must have an even number of elements", -1)); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "STATEMAP", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "STATEMAP", (char *)NULL); } return 0; } for (j = 0; j < nSpecs; j += 2) { Ttk_StateSpec spec; - if (Ttk_GetStateSpecFromObj(interp, specs[j], &spec) != TCL_OK) + if (Ttk_GetStateSpecFromObj(interp, specs[j], &spec) != TCL_OK) { return NULL; + } } return mapObj; diff --git a/generic/ttk/ttkStubInit.c b/generic/ttk/ttkStubInit.c index 9d7d4fc..4dea92d 100644 --- a/generic/ttk/ttkStubInit.c +++ b/generic/ttk/ttkStubInit.c @@ -8,6 +8,11 @@ MODULE_SCOPE const TtkStubs ttkStubs; + +#ifdef TK_NO_DEPRECATED +# define Ttk_RegisterElementSpec 0 +#endif /* TK_NO_DEPRECATED */ + #ifdef __GNUC__ /* * The rest of this file shouldn't warn about deprecated functions; they're diff --git a/generic/ttk/ttkTheme.c b/generic/ttk/ttkTheme.c index 4ecc30b..dff3c72 100644 --- a/generic/ttk/ttkTheme.c +++ b/generic/ttk/ttkTheme.c @@ -102,8 +102,9 @@ Tcl_Obj *Ttk_StyleDefault(Ttk_Style style, const char *optionName) while (style) { Tcl_HashEntry *entryPtr = Tcl_FindHashEntry(&style->defaultsTable, optionName); - if (entryPtr) + if (entryPtr) { return (Tcl_Obj *)Tcl_GetHashValue(entryPtr); + } style= style->parentStyle; } return 0; @@ -137,8 +138,9 @@ static const Tk_OptionSpec *TTKGetOptionSpec( { const Tk_OptionSpec *optionSpec = TkGetOptionSpec(optionName, optionTable); - if (!optionSpec) + if (!optionSpec) { return 0; + } /* Make sure widget option has a Tcl_Obj* entry: */ @@ -568,7 +570,7 @@ Ttk_CreateTheme( if (!newEntry) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Theme %s already exists", name)); - Tcl_SetErrorCode(interp, "TTK", "THEME", "EXISTS", NULL); + Tcl_SetErrorCode(interp, "TTK", "THEME", "EXISTS", (char *)NULL); return NULL; } @@ -612,7 +614,7 @@ static Ttk_Theme LookupTheme( if (!entryPtr) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "theme \"%s\" does not exist", name)); - Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "THEME", name, NULL); + Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "THEME", name, (char *)NULL); return NULL; } @@ -910,7 +912,7 @@ Ttk_ElementClass *Ttk_RegisterElement( Tcl_ResetResult(interp); Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Duplicate element %s", name)); - Tcl_SetErrorCode(interp, "TTK", "REGISTER_ELEMENT", "DUPE", NULL); + Tcl_SetErrorCode(interp, "TTK", "REGISTER_ELEMENT", "DUPE", (char *)NULL); } return 0; } @@ -922,6 +924,7 @@ Ttk_ElementClass *Ttk_RegisterElement( return elementClass; } +#ifndef TK_NO_DEPRECATED /* Ttk_RegisterElementSpec (deprecated) -- * Register a new element. */ @@ -931,6 +934,7 @@ int Ttk_RegisterElementSpec(Ttk_Theme theme, return Ttk_RegisterElement(NULL, theme, name, specPtr, clientData) ? TCL_OK : TCL_ERROR; } +#endif /* TK_NO_DEPRECATED */ /*------------------------------------------------------------------------ * +++ Element record initialization. @@ -1121,11 +1125,11 @@ Ttk_DrawElement( Ttk_Box b, /* Element area */ Ttk_State state) /* Widget or element state flags. */ { - if (b.width <= 0 || b.height <= 0) + if (b.width <= 0 || b.height <= 0) { return; + } if (!InitializeElementRecord( - eclass, style, recordPtr, optionTable, tkwin, state)) - { + eclass, style, recordPtr, optionTable, tkwin, state)) { return; } eclass->specPtr->draw( @@ -1239,8 +1243,9 @@ usage: * (@@@ SHOULD: check for valid resource values as well, * but we don't know what types they should be at this level.) */ - if (!Ttk_GetStateMapFromObj(interp, stateMap)) + if (!Ttk_GetStateMapFromObj(interp, stateMap)) { return TCL_ERROR; + } entryPtr = Tcl_CreateHashEntry( &stylePtr->settingsTable,optionName,&newEntry); @@ -1380,7 +1385,7 @@ static int StyleThemeCurrentCmd( if (name == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "error: failed to get theme name", -1)); - Tcl_SetErrorCode(interp, "TTK", "THEME", "NAMELESS", NULL); + Tcl_SetErrorCode(interp, "TTK", "THEME", "NAMELESS", (char *)NULL); return TCL_ERROR; } @@ -1421,8 +1426,9 @@ static int StyleThemeCreateCmd( case OP_PARENT: parentTheme = LookupTheme( interp, pkgPtr, Tcl_GetString(objv[i+1])); - if (!parentTheme) + if (!parentTheme) { return TCL_ERROR; + } break; case OP_SETTINGS: settingsScript = objv[i+1]; @@ -1488,8 +1494,9 @@ StyleThemeSettingsCmd( } newTheme = LookupTheme(interp, pkgPtr, Tcl_GetString(objv[3])); - if (!newTheme) + if (!newTheme) { return TCL_ERROR; + } pkgPtr->currentTheme = newTheme; status = Tcl_EvalObjEx(interp, objv[4], 0); @@ -1583,7 +1590,7 @@ static int StyleElementOptionsCmd( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "element %s not found", elementName)); - Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "ELEMENT", elementName, NULL); + Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "ELEMENT", elementName, (char *)NULL); return TCL_ERROR; } @@ -1647,8 +1654,9 @@ static int StyleThemeStylesCmd( } else { themePtr = Ttk_GetTheme(interp, Tcl_GetString(objv[3])); } - if (!themePtr) + if (!themePtr) { return TCL_ERROR; + } return TtkEnumerateHashTable(interp, &themePtr->styleTable); } diff --git a/generic/ttk/ttkTheme.h b/generic/ttk/ttkTheme.h index 5049b23..fc45157 100644 --- a/generic/ttk/ttkTheme.h +++ b/generic/ttk/ttkTheme.h @@ -391,7 +391,7 @@ MODULE_SCOPE int TtkEnumerateHashTable(Tcl_Interp *, Tcl_HashTable *); * +++ Stub table declarations. */ -#include "ttkDecls.h" +#include "ttkDecls.h" /* IWYU pragma: export */ /* * Drawing utilities for theme code: diff --git a/generic/ttk/ttkToggleswitch.c b/generic/ttk/ttkToggleswitch.c new file mode 100644 index 0000000..04cae23 --- /dev/null +++ b/generic/ttk/ttkToggleswitch.c @@ -0,0 +1,638 @@ +/* + * Copyright © 2025 Csaba Nemethi <csaba.nemethi@t-online.de> + * + * ttk::toggleswitch widget. + */ + +#include "tkInt.h" +#include "ttkTheme.h" +#include "ttkWidget.h" + +/* + * Tglswitch widget record + */ +typedef struct +{ + /* widget options */ + Tcl_Obj *commandObj; + Tcl_Obj *offValueObj; + Tcl_Obj *onValueObj; + Tcl_Obj *sizeObj; + Tcl_Obj *variableObj; + + /* internal state */ + Tcl_Obj *minValObj; /* minimum value */ + Tcl_Obj *maxValObj; /* maximum value */ + Tcl_Obj *curValObj; /* current value */ + Ttk_TraceHandle *varTrace; + double minVal, maxVal; +} TglswitchPart; + +typedef struct +{ + WidgetCore core; + TglswitchPart tglsw; +} Tglswitch; + +static const char *const sizeStrings[] = { "1", "2", "3", NULL }; + +static const Tk_OptionSpec TglswitchOptionSpecs[] = +{ + {TK_OPTION_STRING, "-command", "command", "Command", "", + offsetof(Tglswitch, tglsw.commandObj), TCL_INDEX_NONE, + 0, 0, 0}, + {TK_OPTION_STRING, "-offvalue", "offValue", "OffValue", "0", + offsetof(Tglswitch, tglsw.offValueObj), TCL_INDEX_NONE, + 0, 0, 0}, + {TK_OPTION_STRING, "-onvalue", "onValue", "OnValue", "1", + offsetof(Tglswitch, tglsw.onValueObj), TCL_INDEX_NONE, + 0, 0, 0}, + {TK_OPTION_STRING_TABLE, "-size", "size", "Size", "2", + offsetof(Tglswitch, tglsw.sizeObj), TCL_INDEX_NONE, + 0, sizeStrings, GEOMETRY_CHANGED}, + {TK_OPTION_STRING, "-variable", "variable", "Variable", NULL, + offsetof(Tglswitch, tglsw.variableObj), TCL_INDEX_NONE, + TK_OPTION_NULL_OK, 0, 0}, + + WIDGET_TAKEFOCUS_TRUE, + WIDGET_INHERIT_OPTIONS(ttkCoreOptionSpecs) +}; + +/* + * TglswitchVariableChanged -- + * Variable trace procedure for the ttk::toggleswitch -variable option. + * Updates the ttk::toggleswitch widget's switch state. + */ +static void TglswitchVariableChanged(void *clientData, const char *value) +{ + Tglswitch *tglswPtr = (Tglswitch *)clientData; + + if (WidgetDestroyed(&tglswPtr->core)) { + return; + } + + if (value == NULL) { + TtkWidgetChangeState(&tglswPtr->core, TTK_STATE_INVALID, 0); + } else { + Tcl_DecrRefCount(tglswPtr->tglsw.curValObj); + if (!strcmp(value, Tcl_GetString(tglswPtr->tglsw.onValueObj))) { + TtkWidgetChangeState(&tglswPtr->core, TTK_STATE_SELECTED, 0); + tglswPtr->tglsw.curValObj = tglswPtr->tglsw.maxValObj; + } else { + TtkWidgetChangeState(&tglswPtr->core, 0, TTK_STATE_SELECTED); + tglswPtr->tglsw.curValObj = tglswPtr->tglsw.minValObj; + } + Tcl_IncrRefCount(tglswPtr->tglsw.curValObj); + + TtkWidgetChangeState(&tglswPtr->core, 0, TTK_STATE_INVALID); + } + + TtkRedisplayWidget(&tglswPtr->core); +} + +/* + * TglswitchInitialize -- + * ttk::toggleswitch widget initialization hook. + */ +static void TglswitchInitialize(Tcl_Interp *interp, void *recordPtr) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + + /* + * Create the *Tglswitch*.trough and *Tglswitch*.slider + * elements for the Toggleswitch* styles if necessary + */ + int code = Tcl_EvalEx(interp, "ttk::toggleswitch::CondMakeElements", + TCL_INDEX_NONE, TCL_EVAL_GLOBAL); + if (code != TCL_OK) { + Tcl_BackgroundException(interp, code); + } + + /* + * Initialize the minimum, maximum, and current values + */ + + tglswPtr->tglsw.minVal = 0.0; + tglswPtr->tglsw.minValObj = Tcl_NewDoubleObj(tglswPtr->tglsw.minVal); + Tcl_IncrRefCount(tglswPtr->tglsw.minValObj); + + tglswPtr->tglsw.maxVal = 20.0; + tglswPtr->tglsw.maxValObj = Tcl_NewDoubleObj(tglswPtr->tglsw.maxVal); + Tcl_IncrRefCount(tglswPtr->tglsw.maxValObj); + + tglswPtr->tglsw.curValObj = Tcl_NewDoubleObj(0.0); + Tcl_IncrRefCount(tglswPtr->tglsw.curValObj); + + /* + * Set the -variable option to the widget's path name + */ + tglswPtr->tglsw.variableObj = + Tcl_NewStringObj(Tk_PathName(tglswPtr->core.tkwin), -1); + Tcl_IncrRefCount(tglswPtr->tglsw.variableObj); + + TtkTrackElementState(&tglswPtr->core); +} + +/* + * TglswitchCleanup -- + * Cleanup hook. + */ +static void TglswitchCleanup(void *recordPtr) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + + if (tglswPtr->tglsw.varTrace) { + Ttk_UntraceVariable(tglswPtr->tglsw.varTrace); + tglswPtr->tglsw.varTrace = 0; + } +} + +/* + * TglswitchConfigure -- + * Configuration hook. + */ +static int TglswitchConfigure(Tcl_Interp *interp, void *recordPtr, int mask) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + Tcl_Obj *variableObj = tglswPtr->tglsw.variableObj; + Ttk_TraceHandle *varTrace = NULL; + + if (mask & GEOMETRY_CHANGED) { + /* + * Processing the "-size" option: Set the "-style" option to + * "(*.)Toggleswitch{1|2|3}" if its value is of the same form. + */ + + const char *styleName = 0, *lastDot = 0, *nameTail = 0; + + if (tglswPtr->core.styleObj) { + styleName = Tcl_GetString(tglswPtr->core.styleObj); + } + if (!styleName || *styleName == '\0') { + styleName = "Toggleswitch2"; + } + lastDot = strrchr(styleName, '.'); + nameTail = lastDot ? lastDot + 1 : styleName; + + if (!strcmp(nameTail, "Toggleswitch1") + || !strcmp(nameTail, "Toggleswitch2") + || !strcmp(nameTail, "Toggleswitch3")) { + size_t length = strlen(styleName); + char *styleName2 = (char *)ckalloc(length + 1); + const char *sizeStr = Tcl_GetString(tglswPtr->tglsw.sizeObj); + + memcpy(styleName2, styleName, length + 1); + styleName2[length-1] = *sizeStr; + + Tcl_DecrRefCount(tglswPtr->core.styleObj); + tglswPtr->core.styleObj = Tcl_NewStringObj(styleName2, -1); + Tcl_IncrRefCount(tglswPtr->core.styleObj); + + ckfree(styleName2); + + /* + * Update the layout according to the new style + */ + TtkCoreConfigure(interp, recordPtr, STYLE_CHANGED); + } + } else if (mask & STYLE_CHANGED) { /* intentionally "else if" */ + /* + * Processing the "-style" option: Set the "-size" option + * to "1|2|3" if the style is "(*.)Toggleswitch{1|2|3}" + */ + + const char *sizeStr = 0; + const char *styleName = Tcl_GetString(tglswPtr->core.styleObj); + const char *lastDot = strrchr(styleName, '.'); + const char *nameTail = lastDot ? lastDot + 1 : styleName; + + if (!strcmp(nameTail, "Toggleswitch1")) { + sizeStr = "1"; + } else if (!strcmp(nameTail, "Toggleswitch2")) { + sizeStr = "2"; + } else if (!strcmp(nameTail, "Toggleswitch3")) { + sizeStr = "3"; + } + + if (sizeStr) { + Tcl_DecrRefCount(tglswPtr->tglsw.sizeObj); + tglswPtr->tglsw.sizeObj = Tcl_NewStringObj(sizeStr, -1); + Tcl_IncrRefCount(tglswPtr->tglsw.sizeObj); + } + } + + if (variableObj != NULL && *Tcl_GetString(variableObj) != '\0') { + varTrace = Ttk_TraceVariable(interp, variableObj, + TglswitchVariableChanged, recordPtr); + if (!varTrace) { + return TCL_ERROR; + } + } + + if (TtkCoreConfigure(interp, recordPtr, mask) != TCL_OK) { + Ttk_UntraceVariable(varTrace); + return TCL_ERROR; + } + + if (tglswPtr->tglsw.varTrace) { + Ttk_UntraceVariable(tglswPtr->tglsw.varTrace); + } + tglswPtr->tglsw.varTrace = varTrace; + + return TCL_OK; +} + +/* + * TglswitchPostConfigure -- + * Post-configuration hook. + */ +static int TglswitchPostConfigure( + TCL_UNUSED(Tcl_Interp *), + void *recordPtr, + TCL_UNUSED(int)) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + int status = TCL_OK; + + if (tglswPtr->tglsw.varTrace) { + status = Ttk_FireTrace(tglswPtr->tglsw.varTrace); + if (WidgetDestroyed(&tglswPtr->core)) { + return TCL_ERROR; + } + } + + return status; +} + +/* + * TglswitchGetLayout -- + * getLayout hook. + */ +static Ttk_Layout TglswitchGetLayout( + Tcl_Interp *interp, Ttk_Theme themePtr, void *recordPtr) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + const char *styleName = 0; + Tcl_DString dsStyleName; + Ttk_Layout layout; + + Tcl_DStringInit(&dsStyleName); + + if (tglswPtr->core.styleObj) { + styleName = Tcl_GetString(tglswPtr->core.styleObj); + Tcl_DStringAppend(&dsStyleName, styleName, TCL_INDEX_NONE); + } + if (!styleName || *styleName == '\0') { + const char *sizeStr = Tcl_GetString(tglswPtr->tglsw.sizeObj); + + styleName = tglswPtr->core.widgetSpec->className; + Tcl_DStringAppend(&dsStyleName, styleName, TCL_INDEX_NONE); + Tcl_DStringAppend(&dsStyleName, sizeStr, TCL_INDEX_NONE); + } + + layout = Ttk_CreateLayout(interp, themePtr, Tcl_DStringValue(&dsStyleName), + recordPtr, tglswPtr->core.optionTable, tglswPtr->core.tkwin); + + Tcl_DStringFree(&dsStyleName); + + return layout; +} + +/* + * TroughRange -- + * Returns the value area of the trough element, adjusted for slider size. + */ +static Ttk_Box TroughRange(Tglswitch *tglswPtr) +{ + Ttk_Box troughBox = Ttk_ClientRegion(tglswPtr->core.layout, "trough"); + Ttk_Element slider = Ttk_FindElement(tglswPtr->core.layout, "slider"); + + if (slider) { + Ttk_Box sliderBox = Ttk_ElementParcel(slider); + troughBox.x += sliderBox.width / 2; + troughBox.width -= sliderBox.width; + } + + return troughBox; +} + +/* + * ValueToFraction -- + * Returns the fraction corresponding to a given value. + */ +static double ValueToFraction(Tglswitch *tglswPtr, double value) +{ + double minVal = tglswPtr->tglsw.minVal; + double maxVal = tglswPtr->tglsw.maxVal; + double fraction = (value - minVal) / (maxVal - minVal); + + return fraction < 0 ? 0 : fraction > 1 ? 1 : fraction; +} + +/* + * ValueToPoint -- + * Returns the x coordinate corresponding to a given value. + */ +static int ValueToPoint(Tglswitch *tglswPtr, double value) +{ + Ttk_Box troughBox = TroughRange(tglswPtr); + double fraction = ValueToFraction(tglswPtr, value); + + return troughBox.x + (int)(fraction * troughBox.width); +} + +/* + * PointToValue -- + * Returns the value corresponding to a given x coordinate. + */ +static double PointToValue(Tglswitch *tglswPtr, int x) +{ + Ttk_Box troughBox = TroughRange(tglswPtr); + double minVal = tglswPtr->tglsw.minVal; + double maxVal = tglswPtr->tglsw.maxVal; + double value = 0.0, fraction; + + Tcl_GetDoubleFromObj(NULL, tglswPtr->tglsw.curValObj, &value); + if (troughBox.width <= 0) { + return value; + } + + fraction = (double)(x - troughBox.x) / (double)troughBox.width; + fraction = fraction < 0 ? 0 : fraction > 1 ? 1 : fraction; + + return minVal + fraction * (maxVal - minVal); +} + +/* + * TglswitchDoLayout -- + */ +static void TglswitchDoLayout(void *clientData) +{ + WidgetCore *corePtr = (WidgetCore *)clientData; + Ttk_Element slider = Ttk_FindElement(corePtr->layout, "slider"); + + Ttk_PlaceLayout(corePtr->layout, corePtr->state, + Ttk_WinBox(corePtr->tkwin)); + + /* + * Adjust the slider position + */ + if (slider) { + Tglswitch *tglswPtr = (Tglswitch *)clientData; + Ttk_Box troughBox = Ttk_ClientRegion(tglswPtr->core.layout, "trough"); + Ttk_Box sliderBox = Ttk_ElementParcel(slider); + double value = 0.0; + double fraction; + int range; + + Tcl_GetDoubleFromObj(NULL, tglswPtr->tglsw.curValObj, &value); + fraction = ValueToFraction(tglswPtr, value); + range = troughBox.width - sliderBox.width; + + sliderBox.x += (int)(fraction * range); + Ttk_PlaceElement(corePtr->layout, slider, sliderBox); + } +} + +/* + * $toggleswitch get ?min|max|$x? -- + * Returns the ttk::toggleswitch widget's current/minimum/maximum value, + * or the value corresponding to $x. + */ +static int TglswitchGetCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + char *arg2 = NULL; + int x, res = TCL_OK; + double value = 0.0; + + if (objc == 2) { + Tcl_SetObjResult(interp, tglswPtr->tglsw.curValObj); + } else if (objc == 3) { + arg2 = Tcl_GetString(objv[2]); + if (!strcmp(arg2, "min")) { + Tcl_SetObjResult(interp, tglswPtr->tglsw.minValObj); + } else if (!strcmp(arg2, "max")) { + Tcl_SetObjResult(interp, tglswPtr->tglsw.maxValObj); + } else { + res = Tcl_GetIntFromObj(interp, objv[2], &x); + if (res == TCL_OK) { + value = PointToValue(tglswPtr, x); + Tcl_SetObjResult(interp, Tcl_NewDoubleObj(value)); + } + } + } else { + Tcl_WrongNumArgs(interp, 1, objv, "get ?min|max|x?"); + return TCL_ERROR; + } + + return res; +} + +/* + * $toggleswitch set $newValue + * Sets the ttk::toggleswitch widget's value to $newValue. + */ +static int TglswitchSetCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + double minVal = tglswPtr->tglsw.minVal; + double maxVal = tglswPtr->tglsw.maxVal; + double value; + + if (objc != 3) { + Tcl_WrongNumArgs(interp, 1, objv, "set value"); + return TCL_ERROR; + } + + if (Tcl_GetDoubleFromObj(interp, objv[2], &value) != TCL_OK) { + return TCL_ERROR; + } + + if (tglswPtr->core.state & TTK_STATE_DISABLED) { + return TCL_OK; + } + + /* + * Limit new value to between minVal and maxVal + */ + value = value < minVal ? minVal : value > maxVal ? maxVal : value; + + /* + * Set value + */ + Tcl_DecrRefCount(tglswPtr->tglsw.curValObj); + tglswPtr->tglsw.curValObj = Tcl_NewDoubleObj(value); + Tcl_IncrRefCount(tglswPtr->tglsw.curValObj); + TtkRedisplayWidget(&tglswPtr->core); + + if (WidgetDestroyed(&tglswPtr->core)) { + return TCL_ERROR; + } + + return TCL_OK; +} + +/* + * $toggleswitch switchstate ?$boolean? -- + * Modifies or inquires the widget's switch state. + */ +static int TglswitchSwitchstateCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + Ttk_State selState = (tglswPtr->core.state & TTK_STATE_SELECTED); + Tcl_Obj *variableObj = tglswPtr->tglsw.variableObj; + int arg2 = 0; + + if (objc == 2) { + /* + * Return the widget's current switch state + */ + Tcl_SetObjResult(interp, Tcl_NewBooleanObj(selState)); + } else if (objc == 3) { + if (Tcl_GetBooleanFromObj(interp, objv[2], &arg2) != TCL_OK) { + return TCL_ERROR; + } + + if (tglswPtr->core.state & TTK_STATE_DISABLED) { + return TCL_OK; + } + + /* + * Update the widget's selected state and current value + */ + Tcl_DecrRefCount(tglswPtr->tglsw.curValObj); + if (arg2) { + TtkWidgetChangeState(&tglswPtr->core, TTK_STATE_SELECTED, 0); + tglswPtr->tglsw.curValObj = tglswPtr->tglsw.maxValObj; + } else { + TtkWidgetChangeState(&tglswPtr->core, 0, TTK_STATE_SELECTED); + tglswPtr->tglsw.curValObj = tglswPtr->tglsw.minValObj; + } + Tcl_IncrRefCount(tglswPtr->tglsw.curValObj); + + if (variableObj != NULL && *Tcl_GetString(variableObj) != '\0') { + /* + * Update the associated variable + */ + Tcl_Obj *newOnOffValueObj = arg2 ? tglswPtr->tglsw.onValueObj + : tglswPtr->tglsw.offValueObj; + if (Tcl_ObjSetVar2(interp, variableObj, NULL, newOnOffValueObj, + TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG) == NULL) { + return TCL_ERROR; + } + } + + if (WidgetDestroyed(&tglswPtr->core)) { + return TCL_ERROR; + } + + if ((tglswPtr->core.state & TTK_STATE_SELECTED) != selState) { + /* + * Evaluate the associated command at global scope + */ + return Tcl_EvalObjEx(interp, tglswPtr->tglsw.commandObj, + TCL_EVAL_GLOBAL); + } + } else { + Tcl_WrongNumArgs(interp, 1, objv, "switchstate ?boolean?"); + return TCL_ERROR; + } + + return TCL_OK; +} + +/* + * $toggleswitch toggle -- + * Toggles the widget's switch state. + */ +static int TglswitchToggleCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + static Tcl_Obj *newObjv[3]; + + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "toggle"); + return TCL_ERROR; + } + + newObjv[0] = objv[0]; + newObjv[1] = Tcl_NewStringObj("switchstate", -1); + newObjv[2] = (tglswPtr->core.state & TTK_STATE_SELECTED) ? + Tcl_NewBooleanObj(0) : Tcl_NewBooleanObj(1); + + return TglswitchSwitchstateCommand(recordPtr, interp, 3, newObjv); +} + +/* + * $toggleswitch xcoord ?$value? -- + * Returns the x coordinate corresponding to $value, or to the current + * value if $value is omitted. + */ +static int TglswitchXcoordCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + double value; + int res = TCL_OK; + + if (objc == 3) { + res = Tcl_GetDoubleFromObj(interp, objv[2], &value); + } else if (objc == 2) { + res = Tcl_GetDoubleFromObj(interp, tglswPtr->tglsw.curValObj, &value); + } else { + Tcl_WrongNumArgs(interp, 1, objv, "xcoord ?value?"); + return TCL_ERROR; + } + + if (res == TCL_OK) { + int x = ValueToPoint(tglswPtr, value); + Tcl_SetObjResult(interp, Tcl_NewIntObj(x)); + } + + return res; +} + +static const Ttk_Ensemble TglswitchCommands[] = +{ + { "cget", TtkWidgetCgetCommand, 0 }, + { "configure", TtkWidgetConfigureCommand, 0 }, + { "get", TglswitchGetCommand, 0 }, + { "identify", TtkWidgetIdentifyCommand, 0 }, + { "instate", TtkWidgetInstateCommand, 0 }, + { "set", TglswitchSetCommand, 0 }, + { "state", TtkWidgetStateCommand, 0 }, + { "style", TtkWidgetStyleCommand, 0 }, + { "switchstate", TglswitchSwitchstateCommand, 0 }, + { "toggle", TglswitchToggleCommand, 0 }, + { "xcoord", TglswitchXcoordCommand, 0 }, + { 0, 0, 0 } +}; + +static const WidgetSpec TglswitchWidgetSpec = +{ + "Toggleswitch", /* Class name */ + sizeof(Tglswitch), /* record size */ + TglswitchOptionSpecs, /* option specs */ + TglswitchCommands, /* widget commands */ + TglswitchInitialize, /* initialization proc */ + TglswitchCleanup, /* cleanup proc */ + TglswitchConfigure, /* configure proc */ + TglswitchPostConfigure, /* postConfigure */ + TglswitchGetLayout, /* getLayoutProc */ + TtkWidgetSize, /* sizeProc */ + TglswitchDoLayout, /* layoutProc */ + TtkWidgetDisplay /* displayProc */ +}; + +/* + * Initialization. + */ +MODULE_SCOPE void TtkToggleswitch_Init(Tcl_Interp *interp) +{ + RegisterWidget(interp, "ttk::toggleswitch", &TglswitchWidgetSpec); +} diff --git a/generic/ttk/ttkTrack.c b/generic/ttk/ttkTrack.c index 032a672..cce6259 100644 --- a/generic/ttk/ttkTrack.c +++ b/generic/ttk/ttkTrack.c @@ -69,8 +69,9 @@ static void ActivateElement(ElementStateTracker *es, Ttk_Element element) */ static void ReleaseElement(ElementStateTracker *es) { - if (!es->pressedElement) + if (!es->pressedElement) { return; + } Ttk_ChangeElementState( es->pressedElement, 0,TTK_STATE_PRESSED|TTK_STATE_ACTIVE); @@ -78,8 +79,9 @@ static void ReleaseElement(ElementStateTracker *es) /* Reactivate element under the mouse cursor: */ - if (es->activeElement) - Ttk_ChangeElementState(es->activeElement, TTK_STATE_ACTIVE,0); + if (es->activeElement) { + Ttk_ChangeElementState(es->activeElement, TTK_STATE_ACTIVE, 0); + } TtkRedisplayWidget(es->corePtr); } @@ -138,8 +140,9 @@ ElementStateEventProc(void *clientData, XEvent *ev) break; case LeaveNotify: ActivateElement(es, 0); - if (ev->xcrossing.mode == NotifyGrab) + if (ev->xcrossing.mode == NotifyGrab) { PressElement(es, 0); + } break; case EnterNotify: element = Ttk_IdentifyElement( @@ -149,8 +152,9 @@ ElementStateEventProc(void *clientData, XEvent *ev) case ButtonPress: element = Ttk_IdentifyElement( layout, ev->xbutton.x, ev->xbutton.y); - if (element) + if (element) { PressElement(es, element); + } break; case ButtonRelease: ReleaseElement(es); diff --git a/generic/ttk/ttkTreeview.c b/generic/ttk/ttkTreeview.c index f430aec..ea01b25 100644 --- a/generic/ttk/ttkTreeview.c +++ b/generic/ttk/ttkTreeview.c @@ -172,12 +172,15 @@ static void FreeItemCB(void *clientData) { FreeItem((TreeItem *)clientData); } */ static void DetachItem(TreeItem *item) { - if (item->parent && item->parent->children == item) + if (item->parent && item->parent->children == item) { item->parent->children = item->next; - if (item->prev) + } + if (item->prev) { item->prev->next = item->next; - if (item->next) + } + if (item->next) { item->next->prev = item->prev; + } item->next = item->prev = item->parent = NULL; } @@ -210,12 +213,14 @@ static void InsertItem(TreeItem *parent, TreeItem *prev, TreeItem *item) static TreeItem *NextPreorder(TreeItem *item) { - if (item->children) + if (item->children) { return item->children; + } while (!item->next) { item = item->parent; - if (!item) + if (!item) { return 0; + } } return item->next; } @@ -404,8 +409,9 @@ static int GetEnumSetFromObj( Tcl_Size i, objc; Tcl_Obj **objv; - if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) + if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) { return TCL_ERROR; + } for (i = 0; i < objc; ++i) { int index; @@ -668,7 +674,7 @@ static TreeColumn *GetColumn( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Column index \"%s\" out of bounds", Tcl_GetString(columnIDObj))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLBOUND", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLBOUND", (char *)NULL); return NULL; } @@ -676,7 +682,7 @@ static TreeColumn *GetColumn( } Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid column index \"%s\"", Tcl_GetString(columnIDObj))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN", (char *)NULL); return NULL; } @@ -688,15 +694,15 @@ static TreeColumn *FindColumn( { Tcl_WideInt colno; - if (sscanf(Tcl_GetString(columnIDObj), "#%" TCL_LL_MODIFIER "d", &colno) == 1) - { /* Display column specification, #n */ + if (sscanf(Tcl_GetString(columnIDObj), "#%" TCL_LL_MODIFIER "d", &colno) == 1) { + /* Display column specification, #n */ if (colno >= 0 && colno < tv->tree.nDisplayColumns) { return tv->tree.displayColumns[colno]; } /* else */ Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Column %s out of range", Tcl_GetString(columnIDObj))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN", (char *)NULL); return NULL; } @@ -716,7 +722,7 @@ static TreeItem *FindItem( if (!entryPtr) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Item %s not found", itemName)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ITEM", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ITEM", (char *)NULL); return 0; } return (TreeItem *)Tcl_GetHashValue(entryPtr); @@ -876,8 +882,9 @@ static int TreeviewInitDisplayColumns(Tcl_Interp *interp, Treeview *tv) } displayColumns[0] = &tv->tree.column0; - if (tv->tree.displayColumns) + if (tv->tree.displayColumns) { ckfree(tv->tree.displayColumns); + } tv->tree.displayColumns = displayColumns; tv->tree.nDisplayColumns = ndcols + 1; @@ -1082,7 +1089,7 @@ static int GetCellFromObj( if (nElements != 2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Cell id must be a list of two elements", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "CELL", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "CELL", (char *)NULL); return TCL_ERROR; } /* Valid item/column in each pair? */ @@ -1107,7 +1114,7 @@ static int GetCellFromObj( if (i == tv->tree.nDisplayColumns) { /* specified column unviewable */ Tcl_SetObjResult(interp, Tcl_NewStringObj( "Cell id must be in a visible column", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "CELL", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "CELL", (char *)NULL); return TCL_ERROR; } if (displayColumn != NULL) { @@ -1347,8 +1354,9 @@ static void TreeviewCleanup(void *recordPtr) FreeColumn(&tv->tree.column0); TreeviewFreeColumns(tv); - if (tv->tree.displayColumns) + if (tv->tree.displayColumns) { ckfree(tv->tree.displayColumns); + } foreachHashEntry(&tv->tree.items, FreeItemCB); Tcl_DeleteHashTable(&tv->tree.items); @@ -1370,13 +1378,15 @@ TreeviewConfigure(Tcl_Interp *interp, void *recordPtr, int mask) unsigned showFlags = tv->tree.showFlags; if (mask & COLUMNS_CHANGED) { - if (TreeviewInitColumns(interp, tv) != TCL_OK) + if (TreeviewInitColumns(interp, tv) != TCL_OK) { return TCL_ERROR; + } mask |= DCOLUMNS_CHANGED; } if (mask & DCOLUMNS_CHANGED) { - if (TreeviewInitDisplayColumns(interp, tv) != TCL_OK) + if (TreeviewInitDisplayColumns(interp, tv) != TCL_OK) { return TCL_ERROR; + } } if (mask & COLUMNS_CHANGED) { CellSelectionClear(tv); @@ -1385,14 +1395,14 @@ TreeviewConfigure(Tcl_Interp *interp, void *recordPtr, int mask) Tcl_SetObjResult(interp, Tcl_ObjPrintf( "\"#%" TCL_SIZE_MODIFIER "d\" is out of range", tv->tree.nTitleColumns)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "TITLECOLUMNS", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "TITLECOLUMNS", (char *)NULL); return TCL_ERROR; } if (tv->tree.nTitleItems < 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "\"%" TCL_SIZE_MODIFIER "d\" is out of range", tv->tree.nTitleItems)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "TITLEITEMS", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "TITLEITEMS", (char *)NULL); return TCL_ERROR; } if (mask & SCROLLCMD_CHANGED) { @@ -1441,8 +1451,9 @@ static int ConfigureItem( */ if (item->valuesObj) { Tcl_Size unused; - if (Tcl_ListObjLength(interp, item->valuesObj, &unused) != TCL_OK) + if (Tcl_ListObjLength(interp, item->valuesObj, &unused) != TCL_OK) { goto error; + } } /* Check -height @@ -1450,7 +1461,7 @@ static int ConfigureItem( if (item->height < 1) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid item height %d", item->height)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "HEIGHT", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "HEIGHT", (char *)NULL); goto error; } @@ -1480,12 +1491,14 @@ static int ConfigureItem( */ if (item->openObj) { int isOpen; - if (Tcl_GetBooleanFromObj(interp, item->openObj, &isOpen) != TCL_OK) + if (Tcl_GetBooleanFromObj(interp, item->openObj, &isOpen) != TCL_OK) { goto error; - if (isOpen) + } + if (isOpen) { item->state |= TTK_STATE_OPEN; - else + } else { item->state &= ~TTK_STATE_OPEN; + } } /* All OK. @@ -1530,7 +1543,7 @@ static int ConfigureColumn( if (mask & READONLY_OPTION) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Attempt to change read-only option", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "READONLY", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "READONLY", (char *)NULL); goto error; } @@ -1889,8 +1902,9 @@ static Ttk_Layout GetSublayout( interp, themePtr, parentLayout, layoutName, optionTable); if (newLayout) { - if (*layoutPtr) + if (*layoutPtr) { Ttk_FreeLayout(*layoutPtr); + } *layoutPtr = newLayout; } return newLayout; @@ -2036,10 +2050,12 @@ static int TreeviewSize(void *clientData, int *widthPtr, int *heightPtr) static Ttk_State ItemState(Treeview *tv, TreeItem *item) { Ttk_State state = tv->core.state | item->state; - if (!item->children) + if (!item->children) { state |= TTK_STATE_LEAF; - if (item != tv->tree.focus) + } + if (item != tv->tree.focus) { state &= ~TTK_STATE_FOCUS; + } return state; } @@ -2591,7 +2607,7 @@ static int AncestryCheck( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Cannot insert %s as descendant of %s", ItemName(tv, item), ItemName(tv, parent))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ANCESTRY", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ANCESTRY", (char *)NULL); return 0; } p = p->parent; @@ -2653,8 +2669,9 @@ static int TreeviewChildrenCommand( TreeItem *child; int i; - if (!newChildren) + if (!newChildren) { return TCL_ERROR; + } /* Sanity-check: */ @@ -2935,10 +2952,12 @@ static int TreeviewHorribleIdentify( done: result = Tcl_NewListObj(0,0); Tcl_ListObjAppendElement(NULL, result, Tcl_NewStringObj(what, -1)); - if (item) + if (item) { Tcl_ListObjAppendElement(NULL, result, ItemID(tv, item)); - if (detail) + } + if (detail) { Tcl_ListObjAppendElement(NULL, result, Tcl_NewStringObj(detail, -1)); + } Tcl_SetObjResult(interp, result); return TCL_OK; @@ -3170,8 +3189,9 @@ static int TreeviewSetCommand( Tcl_WrongNumArgs(interp, 2, objv, "item ?column ?value??"); return TCL_ERROR; } - if (!(item = FindItem(interp, tv, objv[2]))) + if (!(item = FindItem(interp, tv, objv[2]))) { return TCL_ERROR; + } /* Make sure -values exists: */ @@ -3199,14 +3219,15 @@ static int TreeviewSetCommand( /* else -- get or set column */ - if (!(column = FindColumn(interp, tv, objv[3]))) + if (!(column = FindColumn(interp, tv, objv[3]))) { return TCL_ERROR; + } if (column == &tv->tree.column0) { /* @@@ Maybe set -text here instead? */ Tcl_SetObjResult(interp, Tcl_NewStringObj( "Display column #0 cannot be set", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN_0", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN_0", (char *)NULL); return TCL_ERROR; } @@ -3277,8 +3298,9 @@ static int TreeviewInsertCommand( sibling = EndPosition(tv, parent); } else { int index; - if (Tcl_GetIntFromObj(interp, objv[3], &index) != TCL_OK) + if (Tcl_GetIntFromObj(interp, objv[3], &index) != TCL_OK) { return TCL_ERROR; + } sibling = InsertPosition(parent, index); } @@ -3294,7 +3316,7 @@ static int TreeviewInsertCommand( if (!isNew) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Item %s already exists", itemName)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ITEM_EXISTS", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ITEM_EXISTS", (char *)NULL); return TCL_ERROR; } objc -= 2; objv += 2; @@ -3354,7 +3376,7 @@ static int TreeviewDetachCommand( if (items[i] == tv->tree.root) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Cannot detach root item", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ROOT", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ROOT", (char *)NULL); ckfree(items); return TCL_ERROR; } @@ -3443,7 +3465,7 @@ static int TreeviewDeleteCommand( ckfree(items); Tcl_SetObjResult(interp, Tcl_NewStringObj( "Cannot delete root item", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ROOT", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ROOT", (char *)NULL); return TCL_ERROR; } } @@ -3468,10 +3490,12 @@ static int TreeviewDeleteCommand( */ while (delq) { TreeItem *next = delq->next; - if (tv->tree.focus == delq) + if (tv->tree.focus == delq) { tv->tree.focus = 0; - if (tv->tree.endPtr == delq) + } + if (tv->tree.endPtr == delq) { tv->tree.endPtr = 0; + } FreeItem(delq); delq = next; } @@ -3676,7 +3700,7 @@ static int TreeviewDragCommand( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "column %s is not displayed", Tcl_GetString(objv[2]))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN_INVISIBLE", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN_INVISIBLE", (char *)NULL); return TCL_ERROR; } @@ -3712,8 +3736,9 @@ static int TreeviewFocusCommand( return TCL_OK; } else if (objc == 3) { TreeItem *newFocus = FindItem(interp, tv, objv[2]); - if (!newFocus) + if (!newFocus) { return TCL_ERROR; + } tv->tree.focus = newFocus; TtkRedisplayWidget(&tv->core); return TCL_OK; @@ -3742,8 +3767,9 @@ static int TreeviewSelectionCommand( if (objc == 2) { Tcl_Obj *result = Tcl_NewListObj(0,0); for (item = tv->tree.root->children; item; item = NextPreorder(item)) { - if (item->state & TTK_STATE_SELECTED) + if (item->state & TTK_STATE_SELECTED) { Tcl_ListObjAppendElement(NULL, result, ItemID(tv, item)); + } } Tcl_SetObjResult(interp, result); return TCL_OK; @@ -4106,7 +4132,7 @@ static int TreeviewTagBindCommand( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unsupported event %s\nonly key, button, motion, and" " virtual events supported", sequence)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "BIND_EVENTS", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "BIND_EVENTS", (char *)NULL); return TCL_ERROR; } } diff --git a/generic/ttk/ttkWidget.c b/generic/ttk/ttkWidget.c index 3c345d2..40b8ee1 100644 --- a/generic/ttk/ttkWidget.c +++ b/generic/ttk/ttkWidget.c @@ -202,8 +202,9 @@ WidgetInstanceObjCmdDeleted(void *clientData) { WidgetCore *corePtr = (WidgetCore *)clientData; corePtr->widgetCmd = NULL; - if (corePtr->tkwin != NULL) + if (corePtr->tkwin != NULL) { Tk_DestroyWindow(corePtr->tkwin); + } } /* DestroyWidget -- @@ -288,10 +289,11 @@ static void CoreEventProc(void *clientData, XEvent *eventPtr) || eventPtr->xfocus.detail == NotifyAncestor || eventPtr->xfocus.detail == NotifyNonlinear) { - if (eventPtr->type == FocusIn) + if (eventPtr->type == FocusIn) { corePtr->state |= TTK_STATE_FOCUS; - else + } else { corePtr->state &= ~TTK_STATE_FOCUS; + } TtkRedisplayWidget(corePtr); } break; @@ -367,8 +369,9 @@ int TtkWidgetConstructorObjCmd( tkwin = Tk_CreateWindowFromPath( interp, Tk_MainWindow(interp), Tcl_GetString(objv[1]), NULL); - if (tkwin == NULL) + if (tkwin == NULL) { return TCL_ERROR; + } /* * Allocate and initialize the widget record. @@ -411,13 +414,16 @@ int TtkWidgetConstructorObjCmd( } else { Tk_FreeSavedOptions(&savedOptions); } - if (widgetSpec->configureProc(interp, recordPtr, ~0) != TCL_OK) + if (widgetSpec->configureProc(interp, recordPtr, ~0) != TCL_OK) { goto error; - if (widgetSpec->postConfigureProc(interp, recordPtr, ~0) != TCL_OK) + } + if (widgetSpec->postConfigureProc(interp, recordPtr, ~0) != TCL_OK) { goto error; + } - if (WidgetDestroyed(corePtr)) + if (WidgetDestroyed(corePtr)) { goto error; + } Tcl_Release(corePtr); @@ -453,11 +459,13 @@ Ttk_Layout TtkWidgetGetLayout( WidgetCore *corePtr = (WidgetCore *)recordPtr; const char *styleName = 0; - if (corePtr->styleObj) + if (corePtr->styleObj) { styleName = Tcl_GetString(corePtr->styleObj); + } - if (!styleName || *styleName == '\0') + if (!styleName || *styleName == '\0') { styleName = corePtr->widgetSpec->className; + } return Ttk_CreateLayout(interp, themePtr, styleName, recordPtr, corePtr->optionTable, corePtr->tkwin); @@ -483,17 +491,20 @@ Ttk_Layout TtkWidgetGetOrientedLayout( /* Prefix: */ Ttk_GetOrientFromObj(NULL, orientObj, &orient); - if (orient == TTK_ORIENT_HORIZONTAL) + if (orient == TTK_ORIENT_HORIZONTAL) { Tcl_DStringAppend(&styleName, "Horizontal.", TCL_INDEX_NONE); - else + } else { Tcl_DStringAppend(&styleName, "Vertical.", TCL_INDEX_NONE); + } /* Add base style name: */ - if (corePtr->styleObj) + if (corePtr->styleObj) { baseStyleName = Tcl_GetString(corePtr->styleObj); - if (!baseStyleName || *baseStyleName == '\0') + } + if (!baseStyleName || *baseStyleName == '\0') { baseStyleName = corePtr->widgetSpec->className; + } Tcl_DStringAppend(&styleName, baseStyleName, TCL_INDEX_NONE); @@ -598,8 +609,9 @@ int TtkWidgetCgetCommand( } result = Tk_GetOptionValue(interp, recordPtr, corePtr->optionTable, objv[2], corePtr->tkwin); - if (result == NULL) + if (result == NULL) { return TCL_ERROR; + } Tcl_SetObjResult(interp, result); return TCL_OK; } @@ -626,8 +638,9 @@ int TtkWidgetConfigureCommand( status = Tk_SetOptions(interp, recordPtr, corePtr->optionTable, objc - 2, objv + 2, corePtr->tkwin, &savedOptions, &mask); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } if (mask & READONLY_OPTION) { Tcl_SetObjResult(interp, Tcl_NewStringObj( @@ -695,8 +708,9 @@ int TtkWidgetStateCommand( return TCL_ERROR; } status = Ttk_GetStateSpecFromObj(interp, objv[2], &spec); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } oldState = corePtr->state; corePtr->state = Ttk_ModifyState(corePtr->state, &spec); @@ -729,8 +743,9 @@ int TtkWidgetInstateCommand( return TCL_ERROR; } status = Ttk_GetStateSpecFromObj(interp, objv[2], &spec); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } if (objc == 3) { Tcl_SetObjResult(interp, |
