Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
Support building :mod:`tkinter` with Tcl 9.0.
38 changes: 24 additions & 14 deletions Modules/_tkinter.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,6 +71,12 @@ Copyright (C) 1994 Steen Lumholt.
#define USE_DEPRECATED_TOMMATH_API 1
#endif

// As suggested by https://core.tcl-lang.org/tcl/wiki?name=Migrating+C+extensions+to+Tcl+9
#ifndef TCL_SIZE_MAX
typedef int Tcl_Size;
#define TCL_SIZE_MAX INT_MAX
#endif

#if !(defined(MS_WINDOWS) || defined(__CYGWIN__))
#define HAVE_CREATEFILEHANDLER
#endif
Expand DownExpand Up@@ -493,7 +499,7 @@ unicodeFromTclString(const char *s)
static PyObject *
unicodeFromTclObj(Tcl_Obj *value)
{
int len;
Tcl_Size len;
#if USE_TCL_UNICODE
int byteorder = NATIVE_BYTEORDER;
const Tcl_UniChar *u = Tcl_GetUnicodeFromObj(value, &len);
Expand DownExpand Up@@ -521,6 +527,10 @@ class _tkinter.tktimertoken "TkttObject *" "&Tktt_Type_spec"

/**** Tkapp Object ****/

#if TK_MAJOR_VERSION >= 9
int Tcl_AppInit(Tcl_Interp *);
#endif

#ifndef WITH_APPINIT
int
Tcl_AppInit(Tcl_Interp *interp)
Expand DownExpand Up@@ -1148,7 +1158,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
}

if (value->typePtr == tkapp->ByteArrayType) {
int size;
Tcl_Size size;
char *data = (char*)Tcl_GetByteArrayFromObj(value, &size);
return PyBytes_FromStringAndSize(data, size);
}
Expand All@@ -1174,8 +1184,8 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
}

if (value->typePtr == tkapp->ListType) {
int size;
int i, status;
Tcl_Size i, size;
int status;
PyObject *elem;
Tcl_Obj *tcl_elem;

Expand DownExpand Up@@ -1231,9 +1241,9 @@ typedef struct Tkapp_CallEvent {
} Tkapp_CallEvent;

static void
Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc)
Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, Tcl_Size objc)
{
int i;
Tcl_Size i;
for (i = 0; i < objc; i++)
Tcl_DecrRefCount(objv[i]);
if (objv != objStore)
Expand All@@ -1244,7 +1254,7 @@ Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc)
interpreter thread, which may or may not be the calling thread. */

static Tcl_Obj**
Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc)
Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, Tcl_Size *pobjc)
{
Tcl_Obj **objv = objStore;
Py_ssize_t objc = 0, i;
Expand DownExpand Up@@ -1292,10 +1302,10 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc)
Tcl_IncrRefCount(objv[i]);
}
}
*pobjc = (int)objc;
*pobjc = (Tcl_Size)objc;
return objv;
finally:
Tkapp_CallDeallocArgs(objv, objStore, (int)objc);
Tkapp_CallDeallocArgs(objv, objStore, (Tcl_Size)objc);
return NULL;
}

Expand DownExpand Up@@ -1361,7 +1371,7 @@ Tkapp_CallProc(Tkapp_CallEvent *e, int flags)
{
Tcl_Obj *objStore[ARGSZ];
Tcl_Obj **objv;
int objc;
Tcl_Size objc;
int i;
ENTER_PYTHON
if (e->self->trace && !Tkapp_Trace(e->self, PyTuple_Pack(1, e->args))) {
Expand DownExpand Up@@ -1417,7 +1427,7 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
{
Tcl_Obj *objStore[ARGSZ];
Tcl_Obj **objv = NULL;
int objc, i;
Tcl_Size objc;
PyObject *res = NULL;
TkappObject *self = (TkappObject*)selfptr;
int flags = TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL;
Expand DownExpand Up@@ -1464,6 +1474,7 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
{
TRACE(self, ("(O)", args));

int i;
objv = Tkapp_CallArgs(args, objStore, &objc);
if (!objv)
return NULL;
Expand DownExpand Up@@ -2197,13 +2208,12 @@ _tkinter_tkapp_splitlist(TkappObject *self, PyObject *arg)
/*[clinic end generated code: output=13b51d34386d36fb input=2b2e13351e3c0b53]*/
{
char *list;
int argc;
Tcl_Size argc, i;
const char **argv;
PyObject *v;
int i;

if (PyTclObject_Check(arg)) {
int objc;
Tcl_Size objc;
Tcl_Obj **objv;
if (Tcl_ListObjGetElements(Tkapp_Interp(self),
((PyTclObject*)arg)->value,
Expand Down