summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2025-10-31 19:28:42 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2025-10-31 19:28:42 (GMT)
commitc25f14940d3c7823cae0a783f34c6f147518a1b3 (patch)
treed598543193e4ffbb2336840441fd696a854ab6cc /generic
parent3d21e16ae679d4c1ae0b73441536c7429a72657d (diff)
parent2f48a0563a693aeccaf7550989d0539a3c940d95 (diff)
downloadtk-core-tk-print-fixes.zip
tk-core-tk-print-fixes.tar.gz
tk-core-tk-print-fixes.tar.bz2
Diffstat (limited to 'generic')
-rw-r--r--generic/nanosvg.h34
-rw-r--r--generic/nanosvgrast.h99
-rw-r--r--generic/tk.h6
-rw-r--r--generic/tkClipboard.c17
-rw-r--r--generic/tkCmds.c530
-rw-r--r--generic/tkColor.c4
-rw-r--r--generic/tkColor.h2
-rw-r--r--generic/tkConfig.c6
-rw-r--r--generic/tkConsole.c4
-rw-r--r--generic/tkCursor.c4
-rw-r--r--generic/tkFileFilter.c4
-rw-r--r--generic/tkFont.c14
-rw-r--r--generic/tkFrame.c6
-rw-r--r--generic/tkImgGIF.c2
-rw-r--r--generic/tkImgPNG.c84
-rw-r--r--generic/tkImgPPM.c18
-rw-r--r--generic/tkImgPhoto.c3
-rw-r--r--generic/tkImgSVGnano.c10
-rw-r--r--generic/tkInt.decls26
-rw-r--r--generic/tkInt.h7
-rw-r--r--generic/tkIntDecls.h4
-rw-r--r--generic/tkIntPlatDecls.h17
-rw-r--r--generic/tkIntXlibDecls.h32
-rw-r--r--generic/tkMain.c8
-rw-r--r--generic/tkPack.c20
-rw-r--r--generic/tkPanedWindow.c2
-rw-r--r--generic/tkSelect.h13
-rw-r--r--generic/tkSquare.c1
-rw-r--r--generic/tkStubInit.c11
-rw-r--r--generic/tkText.c9
-rw-r--r--generic/tkText.h5
-rw-r--r--generic/tkTextBTree.c7
-rw-r--r--generic/tkTextDisp.c50
-rw-r--r--generic/tkTextIndex.c14
-rw-r--r--generic/tkTextMark.c6
-rw-r--r--generic/tkTextTag.c2
-rw-r--r--generic/tkWindow.c15
-rw-r--r--generic/ttk/ttk.decls2
-rw-r--r--generic/ttk/ttkBlink.c25
-rw-r--r--generic/ttk/ttkButton.c30
-rw-r--r--generic/ttk/ttkClamTheme.c24
-rw-r--r--generic/ttk/ttkClassicTheme.c54
-rw-r--r--generic/ttk/ttkDecls.h9
-rw-r--r--generic/ttk/ttkDefaultTheme.c52
-rw-r--r--generic/ttk/ttkElements.c135
-rw-r--r--generic/ttk/ttkEntry.c62
-rw-r--r--generic/ttk/ttkFrame.c14
-rw-r--r--generic/ttk/ttkImage.c9
-rw-r--r--generic/ttk/ttkInit.c2
-rw-r--r--generic/ttk/ttkLabel.c21
-rw-r--r--generic/ttk/ttkLayout.c59
-rw-r--r--generic/ttk/ttkManager.c11
-rw-r--r--generic/ttk/ttkNotebook.c31
-rw-r--r--generic/ttk/ttkPanedwindow.c39
-rw-r--r--generic/ttk/ttkProgress.c12
-rw-r--r--generic/ttk/ttkScale.c18
-rw-r--r--generic/ttk/ttkScroll.c9
-rw-r--r--generic/ttk/ttkSquare.c3
-rw-r--r--generic/ttk/ttkState.c30
-rw-r--r--generic/ttk/ttkStubInit.c5
-rw-r--r--generic/ttk/ttkTheme.c36
-rw-r--r--generic/ttk/ttkTheme.h2
-rw-r--r--generic/ttk/ttkToggleswitch.c638
-rw-r--r--generic/ttk/ttkTrack.c14
-rw-r--r--generic/ttk/ttkTreeview.c118
-rw-r--r--generic/ttk/ttkWidget.c49
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,