diff --git a/tix-c89.patch b/tix-c89.patch
new file mode 100644
index 0000000..4a1ac9a
--- /dev/null
+++ b/tix-c89.patch
@@ -0,0 +1,230 @@
+Fix various incompatible pointers by switching to correct
+const-qualified types.
+
+Several problematic casts can be removed, except for the one in the
+masterPtr->data in ImgXpmGetData.
+
+Submitted upstream:
+
+diff --git a/generic/tixDItem.c b/generic/tixDItem.c
+index 602c506d158d8a98..d23a4eb036aa8997 100644
+--- a/generic/tixDItem.c
++++ b/generic/tixDItem.c
+@@ -30,7 +30,7 @@ static int DItemParseProc _ANSI_ARGS_((ClientData clientData,
+ Tcl_Interp *interp, Tk_Window tkwin, CONST84 char *value,
+ char *widRec, int offset));
+
+-static char *DItemPrintProc _ANSI_ARGS_((
++static const char *DItemPrintProc _ANSI_ARGS_((
+ ClientData clientData, Tk_Window tkwin, char *widRec,
+ int offset, Tcl_FreeProc **freeProcPtr));
+
+@@ -548,7 +548,7 @@ static int DItemParseProc(clientData, interp, tkwin, value, widRec,offset)
+ return TCL_OK;
+ }
+
+-static char *DItemPrintProc(clientData, tkwin, widRec,offset, freeProcPtr)
++static const char *DItemPrintProc(clientData, tkwin, widRec,offset, freeProcPtr)
+ ClientData clientData;
+ Tk_Window tkwin;
+ char *widRec;
+diff --git a/generic/tixDiStyle.c b/generic/tixDiStyle.c
+index 3c450cf001d075ba..fba76706afcd16f0 100644
+--- a/generic/tixDiStyle.c
++++ b/generic/tixDiStyle.c
+@@ -31,7 +31,7 @@ typedef struct StyleInfo {
+ static int DItemStyleParseProc _ANSI_ARGS_((ClientData clientData,
+ Tcl_Interp *interp, Tk_Window tkwin,
+ CONST84 char *value,char *widRec, int offset));
+-static char * DItemStylePrintProc _ANSI_ARGS_((
++static const char * DItemStylePrintProc _ANSI_ARGS_((
+ ClientData clientData, Tk_Window tkwin,
+ char *widRec, int offset,
+ Tcl_FreeProc **freeProcPtr));
+@@ -998,7 +998,7 @@ not_found:
+ return TCL_ERROR;
+ }
+
+-static char *DItemStylePrintProc(clientData, tkwin, widRec,offset, freeProcPtr)
++static const char *DItemStylePrintProc(clientData, tkwin, widRec,offset, freeProcPtr)
+ ClientData clientData;
+ Tk_Window tkwin;
+ char *widRec;
+diff --git a/generic/tixImgCmp.c b/generic/tixImgCmp.c
+index 4ba60ca06541156e..5df05c4eb32a4611 100644
+--- a/generic/tixImgCmp.c
++++ b/generic/tixImgCmp.c
+@@ -142,8 +142,8 @@ typedef union CmpItemPtr {
+ * The type record for bitmap images:
+ */
+ static int ImgCmpCreate _ANSI_ARGS_((Tcl_Interp *interp,
+- char *name, int argc, Tcl_Obj *CONST objv[],
+- Tk_ImageType *typePtr, Tk_ImageMaster master,
++ const char *name, int argc, Tcl_Obj *CONST objv[],
++ const Tk_ImageType *typePtr, Tk_ImageMaster master,
+ ClientData *clientDataPtr));
+ static ClientData ImgCmpGet _ANSI_ARGS_((Tk_Window tkwin,
+ ClientData clientData));
+@@ -378,11 +378,11 @@ static int
+ ImgCmpCreate(interp, name, argc, objv, typePtr, master, clientDataPtr)
+ Tcl_Interp *interp; /* Interpreter for application containing
+ * image. */
+- char *name; /* Name to use for image. */
++ const char *name; /* Name to use for image. */
+ int argc; /* Number of arguments. */
+ Tcl_Obj *CONST objv[]; /* Argument strings for options (doesn't
+ * include image name or type). */
+- Tk_ImageType *typePtr; /* Pointer to our type record (not used). */
++ const Tk_ImageType *typePtr;/* Pointer to our type record (not used). */
+ Tk_ImageMaster master; /* Token for image, to be used by us in
+ * later callbacks. */
+ ClientData *clientDataPtr; /* Store manager's token for image here;
+diff --git a/generic/tixImgXpm.c b/generic/tixImgXpm.c
+index 23c3981c6ea29fe8..16afe3b2318cf6e2 100644
+--- a/generic/tixImgXpm.c
++++ b/generic/tixImgXpm.c
+@@ -22,8 +22,8 @@
+ */
+
+ static int ImgXpmCreate _ANSI_ARGS_((Tcl_Interp *interp,
+- char *name, int argc, Tcl_Obj *CONST objv[],
+- Tk_ImageType *typePtr, Tk_ImageMaster master,
++ const char *name, int argc, Tcl_Obj *CONST objv[],
++ const Tk_ImageType *typePtr, Tk_ImageMaster master,
+ ClientData *clientDataPtr));
+ static ClientData ImgXpmGet _ANSI_ARGS_((Tk_Window tkwin,
+ ClientData clientData));
+@@ -45,11 +45,11 @@ static int ImgXpmConfigureMaster _ANSI_ARGS_((
+ int flags));
+ static int ImgXpmGetData _ANSI_ARGS_((Tcl_Interp *interp,
+ PixmapMaster *masterPtr));
+-static char ** ImgXpmGetDataFromFile _ANSI_ARGS_((Tcl_Interp * interp,
++static const char ** ImgXpmGetDataFromFile _ANSI_ARGS_((Tcl_Interp * interp,
+ char * string, int * numLines_return));
+-static char ** ImgXpmGetDataFromId _ANSI_ARGS_((Tcl_Interp * interp,
++static const char ** ImgXpmGetDataFromId _ANSI_ARGS_((Tcl_Interp * interp,
+ CONST84 char * id));
+-static char ** ImgXpmGetDataFromString _ANSI_ARGS_((Tcl_Interp*interp,
++static const char ** ImgXpmGetDataFromString _ANSI_ARGS_((Tcl_Interp*interp,
+ char * string, int * numLines_return));
+ static void ImgXpmGetPixmapFromData _ANSI_ARGS_((
+ Tcl_Interp * interp,
+@@ -115,11 +115,11 @@ static int
+ ImgXpmCreate(interp, name, argc, objv, typePtr, master, clientDataPtr)
+ Tcl_Interp *interp; /* Interpreter for application containing
+ * image. */
+- char *name; /* Name to use for image. */
++ const char *name; /* Name to use for image. */
+ int argc; /* Number of arguments. */
+ Tcl_Obj *CONST objv[]; /* Argument strings for options (doesn't
+ * include image name or type). */
+- Tk_ImageType *typePtr; /* Pointer to our type record (not used). */
++ const Tk_ImageType *typePtr;/* Pointer to our type record (not used). */
+ Tk_ImageMaster master; /* Token for image, to be used by us in
+ * later callbacks. */
+ ClientData *clientDataPtr; /* Store manager's token for image here;
+@@ -286,7 +286,7 @@ ImgXpmGetData(interp, masterPtr)
+ Tcl_Interp *interp; /* For reporting errors. */
+ PixmapMaster *masterPtr;
+ {
+- char ** data = NULL;
++ const char ** data = NULL;
+ int isAllocated = 0; /* do we need to free "data"? */
+ int listArgc;
+ CONST84 char ** listArgv = NULL;
+@@ -342,7 +342,7 @@ ImgXpmGetData(interp, masterPtr)
+ ckfree((char*)masterPtr->data);
+ }
+ masterPtr->isDataAlloced = isAllocated;
+- masterPtr->data = data;
++ masterPtr->data = (char **)data;
+ masterPtr->size[0] = size[0];
+ masterPtr->size[1] = size[1];
+ masterPtr->cpp = cpp;
+@@ -363,7 +363,7 @@ ImgXpmGetData(interp, masterPtr)
+ return code;
+ }
+
+-static char ** ImgXpmGetDataFromId(interp, id)
++static const char ** ImgXpmGetDataFromId(interp, id)
+ Tcl_Interp * interp;
+ CONST84 char * id;
+ {
+@@ -378,13 +378,13 @@ static char ** ImgXpmGetDataFromId(interp, id)
+ if (hashPtr == NULL) {
+ Tcl_AppendResult(interp, "unknown pixmap ID \"", id,
+ "\"", NULL);
+- return (char**)NULL;
++ return NULL;
+ } else {
+- return (char**)Tcl_GetHashValue(hashPtr);
++ return Tcl_GetHashValue(hashPtr);
+ }
+ }
+
+-static char ** ImgXpmGetDataFromString(interp, string, numLines_return)
++static const char ** ImgXpmGetDataFromString(interp, string, numLines_return)
+ Tcl_Interp * interp;
+ char * string;
+ int * numLines_return;
+@@ -392,7 +392,7 @@ static char ** ImgXpmGetDataFromString(interp, string, numLines_return)
+ int quoted;
+ char * p, * list;
+ int numLines;
+- char ** data;
++ const char ** data;
+
+ /* skip the leading blanks (leading blanks are not defined in the
+ * the XPM definition, but skipping them shouldn't hurt. Also, the ability
+@@ -510,17 +510,17 @@ static char ** ImgXpmGetDataFromString(interp, string, numLines_return)
+
+ error:
+ Tcl_AppendResult(interp, "File format error", NULL);
+- return (char**) NULL;
++ return NULL;
+ }
+
+-static char ** ImgXpmGetDataFromFile(interp, fileName, numLines_return)
++static const char ** ImgXpmGetDataFromFile(interp, fileName, numLines_return)
+ Tcl_Interp * interp;
+ char * fileName;
+ int * numLines_return;
+ {
+ FILE * fd = NULL;
+ int size, n;
+- char ** data;
++ const char ** data;
+ char *cmdBuffer = NULL;
+ Tcl_DString buffer; /* initialized by Tcl_TildeSubst */
+
+@@ -588,7 +588,7 @@ static char ** ImgXpmGetDataFromFile(interp, fileName, numLines_return)
+ ckfree(cmdBuffer);
+ }
+ Tcl_DStringFree(&buffer);
+- return (char**)NULL;
++ return NULL;
+ }
+
+
+diff --git a/generic/tixUtils.c b/generic/tixUtils.c
+index 998acb84e3f8c79c..e7967b51ecd3a1e4 100644
+--- a/generic/tixUtils.c
++++ b/generic/tixUtils.c
+@@ -24,7 +24,7 @@
+ static int ReliefParseProc(ClientData clientData,
+ Tcl_Interp *interp, Tk_Window tkwin, CONST84 char *value,
+ char *widRec, int offset);
+-static char * ReliefPrintProc(ClientData clientData,
++static const char * ReliefPrintProc(ClientData clientData,
+ Tk_Window tkwin, char *widRec, int offset,
+ Tix_FreeProc **freeProcPtr);
+
+@@ -637,7 +637,7 @@ ReliefParseProc(clientData, interp, tkwin, value, widRec,offset)
+ return TCL_ERROR;
+ }
+
+-static char *
++static const char *
+ ReliefPrintProc(clientData, tkwin, widRec,offset, freeProcPtr)
+ ClientData clientData;
+ Tk_Window tkwin;
diff --git a/tix.spec b/tix.spec
index c34fbbf..ef8e06a 100644
--- a/tix.spec
+++ b/tix.spec
@@ -8,7 +8,7 @@ Summary: A set of extension widgets for Tk
Name: tix
Epoch: 1
Version: %{tixmajor}.3
-Release: 39%{?dist}
+Release: 40%{?dist}
License: TCL
URL: http://tix.sourceforge.net/
Source0: http://downloads.sourceforge.net/project/%{name}/%{name}/%{version}/Tix%{version}-src.tar.gz
@@ -18,6 +18,7 @@ Patch1: tix-8.4.3-tcl86.patch
Patch2: tix-8.4.3-covscan-fixes.patch
Patch3: tix-implicit-int.patch
Patch4: tix-configure-c99.patch
+Patch5: tix-c89.patch
Requires: tcl(abi) = 8.6
Requires: tcl >= %{tcltkver}, tk >= %{tcltkver}
Requires: /etc/ld.so.conf.d
@@ -58,8 +59,7 @@ appearance and functionality of your application.
This package contains the tix documentation
%prep
-%setup -q -n Tix%{version}
-%autopatch -p1
+%autosetup -p1 -n Tix%{version}
# Remove executable permission of images in html documentation
chmod ugo-x docs/html/gif/tix/*.png docs/html/gif/tix/*.gif \
@@ -128,6 +128,9 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/Tix%{tixmajor}/license.terms
%doc %{tcl_sitelib}/Tix%{tixmajor}
%changelog
+* Mon Jan 29 2024 Florian Weimer - 1:8.4.3-40
+- Fix C89 compatibility issues (GCC 14 build failure)
+
* Sat Jan 27 2024 Fedora Release Engineering - 1:8.4.3-39
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild