Back to index

python3.2  3.2.2
Classes | Defines | Typedefs | Functions | Variables
_tkinter.c File Reference
#include "Python.h"
#include <ctype.h>
#include <tcl.h>
#include <tk.h>
#include "tkinter.h"

Go to the source code of this file.

Classes

struct  TkappObject
struct  PyTclObject
 Tcl Eval. More...
struct  PythonCmd_ClientData
 Tcl Command. More...
struct  _fhcdata
 File Handler. More...
struct  TkttObject
struct  FlattenContext

Defines

#define PyDoc_STRVAR(name, str)   static char name[] = str
#define PyMODINIT_FUNC   void
#define PyBool_Check(o)   0
#define PyBool_FromLong   PyLong_FromLong
#define USE_COMPAT_CONST
#define TCL_THREADS
#define CONST84_RETURN
#define CONST
#define HAVE_CREATEFILEHANDLER
#define TCL_UNIX_FD   1
#define FHANDLETYPE   TCL_UNIX_FD
#define WAIT_FOR_STDIN
#define ENTER_TCL
#define LEAVE_TCL
#define ENTER_OVERLAP
#define LEAVE_OVERLAP_TCL
#define ENTER_PYTHON
#define LEAVE_PYTHON
#define CHECK_TCL_APPARTMENT
#define FREECAST   (char *)
#define Tkapp_Check(v)   (Py_TYPE(v) == &Tkapp_Type)
#define Tkapp_Interp(v)   (((TkappObject *) (v))->interp)
#define Tkapp_Result(v)   Tcl_GetStringResult(Tkapp_Interp(v))
#define DEBUG_REFCNT(v)
#define ARGSZ   64
#define PyTclObject_Check(v)   ((v)->ob_type == &PyTclObject_Type)
#define TEST_COND(cond)   ((cond) ? Py_True : Py_False)

Typedefs

typedef PyObject *(* EventFunc )(PyObject *, PyObject *args, int flags)
 Tcl Variable.
typedef struct _fhcdata FileHandler_ClientData
 File Handler.

Functions

static PyObjectTkinter_Error (PyObject *v)
static char * AsString (PyObject *value, PyObject *tmp)
static char * Merge (PyObject *args)
static PyObjectSplit (char *list)
static PyObjectSplitObj (PyObject *arg)
int Tcl_AppInit (Tcl_Interp *interp)
static void EnableEventHook (void)
static void DisableEventHook (void)
static TkappObjectTkapp_New (char *screenName, char *className, int interactive, int wantobjects, int wantTk, int sync, char *use)
static PyObjectnewPyTclObject (Tcl_Obj *arg)
static void PyTclObject_dealloc (PyTclObject *self)
static char * PyTclObject_TclString (PyObject *self)
 PyDoc_STRVAR (PyTclObject_string__doc__,"the string representation of this object, either as str or bytes")
static PyObjectPyTclObject_string (PyTclObject *self, void *ignored)
static PyObjectPyTclObject_str (PyTclObject *self, void *ignored)
static PyObjectPyTclObject_repr (PyTclObject *self)
static PyObjectPyTclObject_richcompare (PyObject *self, PyObject *other, int op)
 PyDoc_STRVAR (get_typename__doc__,"name of the Tcl type")
static PyObjectget_typename (PyTclObject *obj, void *ignored)
static Tcl_Obj * AsObj (PyObject *value)
static PyObjectFromObj (PyObject *tkapp, Tcl_Obj *value)
void Tkapp_CallDeallocArgs (Tcl_Obj **objv, Tcl_Obj **objStore, int objc)
static Tcl_Obj ** Tkapp_CallArgs (PyObject *args, Tcl_Obj **objStore, int *pobjc)
static PyObjectTkapp_CallResult (TkappObject *self)
static PyObjectTkapp_Call (PyObject *selfptr, PyObject *args)
static PyObjectTkapp_GlobalCall (PyObject *self, PyObject *args)
static PyObjectTkapp_Eval (PyObject *self, PyObject *args)
static PyObjectTkapp_GlobalEval (PyObject *self, PyObject *args)
static PyObjectTkapp_EvalFile (PyObject *self, PyObject *args)
static PyObjectTkapp_Record (PyObject *self, PyObject *args)
static PyObjectTkapp_AddErrorInfo (PyObject *self, PyObject *args)
static int varname_converter (PyObject *in, void *_out)
static PyObjectvar_invoke (EventFunc func, PyObject *selfptr, PyObject *args, int flags)
static PyObjectSetVar (PyObject *self, PyObject *args, int flags)
static PyObjectTkapp_SetVar (PyObject *self, PyObject *args)
static PyObjectTkapp_GlobalSetVar (PyObject *self, PyObject *args)
static PyObjectGetVar (PyObject *self, PyObject *args, int flags)
static PyObjectTkapp_GetVar (PyObject *self, PyObject *args)
static PyObjectTkapp_GlobalGetVar (PyObject *self, PyObject *args)
static PyObjectUnsetVar (PyObject *self, PyObject *args, int flags)
static PyObjectTkapp_UnsetVar (PyObject *self, PyObject *args)
static PyObjectTkapp_GlobalUnsetVar (PyObject *self, PyObject *args)
static PyObjectTkapp_GetInt (PyObject *self, PyObject *args)
 Tcl to Python.
static PyObjectTkapp_GetDouble (PyObject *self, PyObject *args)
static PyObjectTkapp_GetBoolean (PyObject *self, PyObject *args)
static PyObjectTkapp_ExprString (PyObject *self, PyObject *args)
static PyObjectTkapp_ExprLong (PyObject *self, PyObject *args)
static PyObjectTkapp_ExprDouble (PyObject *self, PyObject *args)
static PyObjectTkapp_ExprBoolean (PyObject *self, PyObject *args)
static PyObjectTkapp_SplitList (PyObject *self, PyObject *args)
static PyObjectTkapp_Split (PyObject *self, PyObject *args)
static PyObjectTkapp_Merge (PyObject *self, PyObject *args)
static int PythonCmd_Error (Tcl_Interp *interp)
static int PythonCmd (ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
static void PythonCmdDelete (ClientData clientData)
static PyObjectTkapp_CreateCommand (PyObject *selfptr, PyObject *args)
static PyObjectTkapp_DeleteCommand (PyObject *selfptr, PyObject *args)
static FileHandler_ClientDataNewFHCD (PyObject *func, PyObject *file, int id)
static void DeleteFHCD (int id)
static void FileHandler (ClientData clientData, int mask)
static PyObjectTkapp_CreateFileHandler (PyObject *self, PyObject *args)
static PyObjectTkapp_DeleteFileHandler (PyObject *self, PyObject *args)
static PyObjectTktt_DeleteTimerHandler (PyObject *self, PyObject *args)
static TkttObjectTktt_New (PyObject *func)
static void Tktt_Dealloc (PyObject *self)
static PyObjectTktt_Repr (PyObject *self)
static void TimerHandler (ClientData clientData)
 Timer Handler.
static PyObjectTkapp_CreateTimerHandler (PyObject *self, PyObject *args)
static PyObjectTkapp_MainLoop (PyObject *selfptr, PyObject *args)
 Event Loop.
static PyObjectTkapp_DoOneEvent (PyObject *self, PyObject *args)
static PyObjectTkapp_Quit (PyObject *self, PyObject *args)
static PyObjectTkapp_InterpAddr (PyObject *self, PyObject *args)
static PyObjectTkapp_TkInit (PyObject *self, PyObject *args)
static PyObjectTkapp_WantObjects (PyObject *self, PyObject *args)
static PyObjectTkapp_WillDispatch (PyObject *self, PyObject *args)
static void Tkapp_Dealloc (PyObject *self)
static int _bump (FlattenContext *context, int size)
static int _flatten1 (FlattenContext *context, PyObject *item, int depth)
static PyObjectTkinter_Flatten (PyObject *self, PyObject *args)
static PyObjectTkinter_Create (PyObject *self, PyObject *args)
static PyObjectTkinter_setbusywaitinterval (PyObject *self, PyObject *args)
static PyObjectTkinter_getbusywaitinterval (PyObject *self, PyObject *args)
static void MyFileProc (void *clientData, int mask)
static int EventHook (void)
static void ins_long (PyObject *d, char *name, long val)
static void ins_string (PyObject *d, char *name, char *val)
PyMODINIT_FUNC PyInit__tkinter (void)

Variables

static PyTypeObject Tkapp_Type
static PyObjectTkinter_TclError
static int quitMainLoop = 0
static int errorInCmd = 0
static PyObjectexcInCmd
static PyObjectvalInCmd
static PyObjecttrbInCmd
static int tk_load_failed = 0
static int Tkinter_busywaitinterval = 20
static PyTypeObject PyTclObject_Type
static PyGetSetDef PyTclObject_getsetlist []
static FileHandler_ClientDataHeadFHCD
static PyTypeObject Tktt_Type
static PyMethodDef Tktt_methods []
static PyMethodDef Tkapp_methods []
static char setbusywaitinterval_doc []
static char getbusywaitinterval_doc []
static PyMethodDef moduleMethods []
static int stdin_ready = 0
static struct PyModuleDef

Class Documentation

struct TkappObject

Definition at line 247 of file _tkinter.c.

Class Members
Tcl_ObjType * BooleanType
Tcl_ObjType * ByteArrayType
int dispatching
Tcl_ObjType * DoubleType
PyObject_HEAD Tcl_Interp * interp
Tcl_ObjType * IntType
Tcl_ObjType * ListType
Tcl_ObjType * ProcBodyType
Tcl_ObjType * StringType
Tcl_ThreadId thread_id
int threaded
int wantobjects
struct PyTclObject

Tcl Eval.

Definition at line 753 of file _tkinter.c.

Collaboration diagram for PyTclObject:
Class Members
PyObject * string
PyObject_HEAD Tcl_Obj * value
struct PythonCmd_ClientData

Tcl Command.

Definition at line 1987 of file _tkinter.c.

Collaboration diagram for PythonCmd_ClientData:
Class Members
PyObject * func
PyObject * self
struct _fhcdata

File Handler.

Definition at line 2219 of file _tkinter.c.

Collaboration diagram for _fhcdata:
Class Members
PyObject * file
PyObject * func
int id
struct _fhcdata * next
struct TkttObject

Definition at line 2350 of file _tkinter.c.

Collaboration diagram for TkttObject:
Class Members
PyObject * func
PyObject_HEAD Tcl_TimerToken token
struct FlattenContext

Definition at line 2786 of file _tkinter.c.

Collaboration diagram for FlattenContext:
Class Members
int maxsize
int size
PyObject * tuple

Define Documentation

#define ARGSZ   64

Definition at line 369 of file _tkinter.c.

Definition at line 235 of file _tkinter.c.

#define CONST

Definition at line 76 of file _tkinter.c.

#define CONST84_RETURN

Definition at line 74 of file _tkinter.c.

#define DEBUG_REFCNT (   v)
Value:
(printf("DEBUG: id=%p, refcnt=%i\n", \
(void *) v, Py_REFCNT(v)))

Definition at line 269 of file _tkinter.c.

#define ENTER_OVERLAP

Definition at line 231 of file _tkinter.c.

#define ENTER_PYTHON

Definition at line 233 of file _tkinter.c.

#define ENTER_TCL

Definition at line 229 of file _tkinter.c.

#define FHANDLETYPE   TCL_UNIX_FD

Definition at line 119 of file _tkinter.c.

#define FREECAST   (char *)

Definition at line 240 of file _tkinter.c.

Definition at line 96 of file _tkinter.c.

Definition at line 232 of file _tkinter.c.

#define LEAVE_PYTHON

Definition at line 234 of file _tkinter.c.

#define LEAVE_TCL

Definition at line 230 of file _tkinter.c.

#define PyBool_Check (   o)    0

Definition at line 46 of file _tkinter.c.

Definition at line 47 of file _tkinter.c.

#define PyDoc_STRVAR (   name,
  str 
)    static char name[] = str

Definition at line 38 of file _tkinter.c.

#define PyMODINIT_FUNC   void

Definition at line 42 of file _tkinter.c.

#define PyTclObject_Check (   v)    ((v)->ob_type == &PyTclObject_Type)

Definition at line 760 of file _tkinter.c.

#define TCL_THREADS

Definition at line 60 of file _tkinter.c.

#define TCL_UNIX_FD   1

Definition at line 107 of file _tkinter.c.

#define TEST_COND (   cond)    ((cond) ? Py_True : Py_False)

Definition at line 829 of file _tkinter.c.

#define Tkapp_Check (   v)    (Py_TYPE(v) == &Tkapp_Type)

Definition at line 265 of file _tkinter.c.

#define Tkapp_Interp (   v)    (((TkappObject *) (v))->interp)

Definition at line 266 of file _tkinter.c.

#define Tkapp_Result (   v)    Tcl_GetStringResult(Tkapp_Interp(v))

Definition at line 267 of file _tkinter.c.

Definition at line 55 of file _tkinter.c.

#define WAIT_FOR_STDIN

Definition at line 126 of file _tkinter.c.


Typedef Documentation

Tcl Variable.

Definition at line 1493 of file _tkinter.c.

File Handler.


Function Documentation

static int _bump ( FlattenContext context,
int  size 
) [static]

Definition at line 2793 of file _tkinter.c.

{
    /* expand tuple to hold (at least) size new items.
       return true if successful, false if an exception was raised */

    int maxsize = context->maxsize * 2;

    if (maxsize < context->size + size)
        maxsize = context->size + size;

    context->maxsize = maxsize;

    return _PyTuple_Resize(&context->tuple, maxsize) >= 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int _flatten1 ( FlattenContext context,
PyObject item,
int  depth 
) [static]

Definition at line 2809 of file _tkinter.c.

{
    /* add tuple or list to argument tuple (recursively) */

    int i, size;

    if (depth > 1000) {
        PyErr_SetString(PyExc_ValueError,
                        "nesting too deep in _flatten");
        return 0;
    } else if (PyList_Check(item)) {
        size = PyList_GET_SIZE(item);
        /* preallocate (assume no nesting) */
        if (context->size + size > context->maxsize &&
            !_bump(context, size))
            return 0;
        /* copy items to output tuple */
        for (i = 0; i < size; i++) {
            PyObject *o = PyList_GET_ITEM(item, i);
            if (PyList_Check(o) || PyTuple_Check(o)) {
                if (!_flatten1(context, o, depth + 1))
                    return 0;
            } else if (o != Py_None) {
                if (context->size + 1 > context->maxsize &&
                    !_bump(context, 1))
                    return 0;
                Py_INCREF(o);
                PyTuple_SET_ITEM(context->tuple,
                                 context->size++, o);
            }
        }
    } else if (PyTuple_Check(item)) {
        /* same, for tuples */
        size = PyTuple_GET_SIZE(item);
        if (context->size + size > context->maxsize &&
            !_bump(context, size))
            return 0;
        for (i = 0; i < size; i++) {
            PyObject *o = PyTuple_GET_ITEM(item, i);
            if (PyList_Check(o) || PyTuple_Check(o)) {
                if (!_flatten1(context, o, depth + 1))
                    return 0;
            } else if (o != Py_None) {
                if (context->size + 1 > context->maxsize &&
                    !_bump(context, 1))
                    return 0;
                Py_INCREF(o);
                PyTuple_SET_ITEM(context->tuple,
                                 context->size++, o);
            }
        }
    } else {
        PyErr_SetString(PyExc_TypeError, "argument must be sequence");
        return 0;
    }
    return 1;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static Tcl_Obj* AsObj ( PyObject value) [static]

Definition at line 945 of file _tkinter.c.

{
    Tcl_Obj *result;
    long longVal;
    int overflow;

    if (PyBytes_Check(value))
        return Tcl_NewStringObj(PyBytes_AS_STRING(value),
                                PyBytes_GET_SIZE(value));
    else if (PyBool_Check(value))
        return Tcl_NewBooleanObj(PyObject_IsTrue(value));
    else if (PyLong_CheckExact(value) &&
             ((longVal = PyLong_AsLongAndOverflow(value, &overflow)),
              !overflow)) {
        /* If there is an overflow in the long conversion,
           fall through to default object handling. */
        return Tcl_NewLongObj(longVal);
    }
    else if (PyFloat_Check(value))
        return Tcl_NewDoubleObj(PyFloat_AS_DOUBLE(value));
    else if (PyTuple_Check(value)) {
        Tcl_Obj **argv = (Tcl_Obj**)
            ckalloc(PyTuple_Size(value)*sizeof(Tcl_Obj*));
        int i;
        if(!argv)
          return 0;
        for(i=0;i<PyTuple_Size(value);i++)
          argv[i] = AsObj(PyTuple_GetItem(value,i));
        result = Tcl_NewListObj(PyTuple_Size(value), argv);
        ckfree(FREECAST argv);
        return result;
    }
    else if (PyUnicode_Check(value)) {
        Py_UNICODE *inbuf = PyUnicode_AS_UNICODE(value);
        Py_ssize_t size = PyUnicode_GET_SIZE(value);
        /* This #ifdef assumes that Tcl uses UCS-2.
           See TCL_UTF_MAX test above. */
#if defined(Py_UNICODE_WIDE) && TCL_UTF_MAX == 3
        Tcl_UniChar *outbuf = NULL;
        Py_ssize_t i;
        size_t allocsize = ((size_t)size) * sizeof(Tcl_UniChar);
        if (allocsize >= size)
            outbuf = (Tcl_UniChar*)ckalloc(allocsize);
        /* Else overflow occurred, and we take the next exit */
        if (!outbuf) {
            PyErr_NoMemory();
            return NULL;
        }
        for (i = 0; i < size; i++) {
            if (inbuf[i] >= 0x10000) {
                /* Tcl doesn't do UTF-16, yet. */
                PyErr_SetString(PyExc_ValueError,
                                "unsupported character");
                ckfree(FREECAST outbuf);
                return NULL;
            }
            outbuf[i] = inbuf[i];
        }
        result = Tcl_NewUnicodeObj(outbuf, size);
        ckfree(FREECAST outbuf);
        return result;
#else
        return Tcl_NewUnicodeObj(inbuf, size);
#endif

    }
    else if(PyTclObject_Check(value)) {
        Tcl_Obj *v = ((PyTclObject*)value)->value;
        Tcl_IncrRefCount(v);
        return v;
    }
    else {
        PyObject *v = PyObject_Str(value);
        if (!v)
            return 0;
        result = AsObj(v);
        Py_DECREF(v);
        return result;
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static char* AsString ( PyObject value,
PyObject tmp 
) [static]

Definition at line 339 of file _tkinter.c.

{
    if (PyBytes_Check(value))
        return PyBytes_AsString(value);
    else if (PyUnicode_Check(value)) {
        PyObject *v = PyUnicode_AsUTF8String(value);
        if (v == NULL)
            return NULL;
        if (PyList_Append(tmp, v) != 0) {
            Py_DECREF(v);
            return NULL;
        }
        Py_DECREF(v);
        return PyBytes_AsString(v);
    }
    else {
        PyObject *v = PyObject_Str(value);
        if (v == NULL)
            return NULL;
        if (PyList_Append(tmp, v) != 0) {
            Py_DECREF(v);
            return NULL;
        }
        Py_DECREF(v);
        return PyBytes_AsString(v);
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void DeleteFHCD ( int  id) [static]

Definition at line 2246 of file _tkinter.c.

{
    FileHandler_ClientData *p, **pp;

    pp = &HeadFHCD;
    while ((p = *pp) != NULL) {
        if (p->id == id) {
            *pp = p->next;
            Py_XDECREF(p->func);
            Py_XDECREF(p->file);
            PyMem_DEL(p);
        }
        else
            pp = &p->next;
    }
}

Here is the caller graph for this function:

static void DisableEventHook ( void  ) [static]

Definition at line 3059 of file _tkinter.c.

{
#ifdef WAIT_FOR_STDIN
    if (Tk_GetNumMainWindows() == 0 && PyOS_InputHook == EventHook) {
        PyOS_InputHook = NULL;
    }
#endif
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void EnableEventHook ( void  ) [static]

Definition at line 3046 of file _tkinter.c.

{
#ifdef WAIT_FOR_STDIN
    if (PyOS_InputHook == NULL) {
#ifdef WITH_THREAD
        event_tstate = PyThreadState_Get();
#endif
        PyOS_InputHook = EventHook;
    }
#endif
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int EventHook ( void  ) [static]

Definition at line 2987 of file _tkinter.c.

{
#ifndef MS_WINDOWS
    int tfile;
#endif
#ifdef WITH_THREAD
    PyEval_RestoreThread(event_tstate);
#endif
    stdin_ready = 0;
    errorInCmd = 0;
#ifndef MS_WINDOWS
    tfile = fileno(stdin);
    Tcl_CreateFileHandler(tfile, TCL_READABLE, MyFileProc, NULL);
#endif
    while (!errorInCmd && !stdin_ready) {
        int result;
#ifdef MS_WINDOWS
        if (_kbhit()) {
            stdin_ready = 1;
            break;
        }
#endif
#if defined(WITH_THREAD) || defined(MS_WINDOWS)
        Py_BEGIN_ALLOW_THREADS
        if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1);
        tcl_tstate = event_tstate;

        result = Tcl_DoOneEvent(TCL_DONT_WAIT);

        tcl_tstate = NULL;
        if(tcl_lock)PyThread_release_lock(tcl_lock);
        if (result == 0)
            Sleep(Tkinter_busywaitinterval);
        Py_END_ALLOW_THREADS
#else
        result = Tcl_DoOneEvent(0);
#endif

        if (result < 0)
            break;
    }
#ifndef MS_WINDOWS
    Tcl_DeleteFileHandler(tfile);
#endif
    if (errorInCmd) {
        errorInCmd = 0;
        PyErr_Restore(excInCmd, valInCmd, trbInCmd);
        excInCmd = valInCmd = trbInCmd = NULL;
        PyErr_Print();
    }
#ifdef WITH_THREAD
    PyEval_SaveThread();
#endif
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void FileHandler ( ClientData  clientData,
int  mask 
) [static]

Definition at line 2264 of file _tkinter.c.

{
    FileHandler_ClientData *data = (FileHandler_ClientData *)clientData;
    PyObject *func, *file, *arg, *res;

    ENTER_PYTHON
    func = data->func;
    file = data->file;

    arg = Py_BuildValue("(Oi)", file, (long) mask);
    res = PyEval_CallObject(func, arg);
    Py_DECREF(arg);

    if (res == NULL) {
        errorInCmd = 1;
        PyErr_Fetch(&excInCmd, &valInCmd, &trbInCmd);
    }
    Py_XDECREF(res);
    LEAVE_PYTHON
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* FromObj ( PyObject tkapp,
Tcl_Obj *  value 
) [static]

Definition at line 1027 of file _tkinter.c.

{
    PyObject *result = NULL;
    TkappObject *app = (TkappObject*)tkapp;

    if (value->typePtr == NULL) {
        return PyUnicode_FromStringAndSize(value->bytes,
                                           value->length);
    }

    if (value->typePtr == app->BooleanType) {
        result = value->internalRep.longValue ? Py_True : Py_False;
        Py_INCREF(result);
        return result;
    }

    if (value->typePtr == app->ByteArrayType) {
        int size;
        char *data = (char*)Tcl_GetByteArrayFromObj(value, &size);
        return PyBytes_FromStringAndSize(data, size);
    }

    if (value->typePtr == app->DoubleType) {
        return PyFloat_FromDouble(value->internalRep.doubleValue);
    }

    if (value->typePtr == app->IntType) {
        return PyLong_FromLong(value->internalRep.longValue);
    }

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

        status = Tcl_ListObjLength(Tkapp_Interp(tkapp), value, &size);
        if (status == TCL_ERROR)
            return Tkinter_Error(tkapp);
        result = PyTuple_New(size);
        if (!result)
            return NULL;
        for (i = 0; i < size; i++) {
            status = Tcl_ListObjIndex(Tkapp_Interp(tkapp),
                                      value, i, &tcl_elem);
            if (status == TCL_ERROR) {
                Py_DECREF(result);
                return Tkinter_Error(tkapp);
            }
            elem = FromObj(tkapp, tcl_elem);
            if (!elem) {
                Py_DECREF(result);
                return NULL;
            }
            PyTuple_SetItem(result, i, elem);
        }
        return result;
    }

    if (value->typePtr == app->ProcBodyType) {
      /* fall through: return tcl object. */
    }

    if (value->typePtr == app->StringType) {
#if defined(Py_UNICODE_WIDE) && TCL_UTF_MAX==3
        PyObject *result;
        int size;
        Tcl_UniChar *input;
        Py_UNICODE *output;

        size = Tcl_GetCharLength(value);
        result = PyUnicode_FromUnicode(NULL, size);
        if (!result)
            return NULL;
        input = Tcl_GetUnicode(value);
        output = PyUnicode_AS_UNICODE(result);
        while (size--)
            *output++ = *input++;
        return result;
#else
        return PyUnicode_FromUnicode(Tcl_GetUnicode(value),
                                     Tcl_GetCharLength(value));
#endif
    }

    return newPyTclObject(value);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* get_typename ( PyTclObject obj,
void ignored 
) [static]

Definition at line 887 of file _tkinter.c.

{
    return PyUnicode_FromString(obj->value->typePtr->name);
}

Here is the call graph for this function:

static PyObject* GetVar ( PyObject self,
PyObject args,
int  flags 
) [static]

Definition at line 1670 of file _tkinter.c.

{
    char *name1, *name2=NULL;
    PyObject *res = NULL;
    Tcl_Obj *tres;

    if (!PyArg_ParseTuple(args, "O&|s:getvar",
                          varname_converter, &name1, &name2))
        return NULL;

    ENTER_TCL
    tres = Tcl_GetVar2Ex(Tkapp_Interp(self), name1, name2, flags);
    ENTER_OVERLAP
    if (tres == NULL) {
        PyErr_SetString(Tkinter_TclError, Tcl_GetStringResult(Tkapp_Interp(self)));
    } else {
        if (((TkappObject*)self)->wantobjects) {
            res = FromObj(self, tres);
        }
        else {
            res = PyUnicode_FromString(Tcl_GetString(tres));
        }
    }
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void ins_long ( PyObject d,
char *  name,
long  val 
) [static]

Definition at line 3071 of file _tkinter.c.

{
    PyObject *v = PyLong_FromLong(val);
    if (v) {
        PyDict_SetItemString(d, name, v);
        Py_DECREF(v);
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void ins_string ( PyObject d,
char *  name,
char *  val 
) [static]

Definition at line 3080 of file _tkinter.c.

{
    PyObject *v = PyUnicode_FromString(val);
    if (v) {
        PyDict_SetItemString(d, name, v);
        Py_DECREF(v);
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static char* Merge ( PyObject args) [static]

Definition at line 372 of file _tkinter.c.

{
    PyObject *tmp = NULL;
    char *argvStore[ARGSZ];
    char **argv = NULL;
    int fvStore[ARGSZ];
    int *fv = NULL;
    int argc = 0, fvc = 0, i;
    char *res = NULL;

    if (!(tmp = PyList_New(0)))
        return NULL;

    argv = argvStore;
    fv = fvStore;

    if (args == NULL)
        argc = 0;

    else if (!PyTuple_Check(args)) {
        argc = 1;
        fv[0] = 0;
        if (!(argv[0] = AsString(args, tmp)))
            goto finally;
    }
    else {
        argc = PyTuple_Size(args);

        if (argc > ARGSZ) {
            argv = (char **)ckalloc(argc * sizeof(char *));
            fv = (int *)ckalloc(argc * sizeof(int));
            if (argv == NULL || fv == NULL) {
                PyErr_NoMemory();
                goto finally;
            }
        }

        for (i = 0; i < argc; i++) {
            PyObject *v = PyTuple_GetItem(args, i);
            if (PyTuple_Check(v)) {
                fv[i] = 1;
                if (!(argv[i] = Merge(v)))
                    goto finally;
                fvc++;
            }
            else if (v == Py_None) {
                argc = i;
                break;
            }
            else {
                fv[i] = 0;
                if (!(argv[i] = AsString(v, tmp)))
                    goto finally;
                fvc++;
            }
        }
    }
    res = Tcl_Merge(argc, argv);
    if (res == NULL)
        PyErr_SetString(Tkinter_TclError, "merge failed");

  finally:
    for (i = 0; i < fvc; i++)
        if (fv[i]) {
            ckfree(argv[i]);
        }
    if (argv != argvStore)
        ckfree(FREECAST argv);
    if (fv != fvStore)
        ckfree(FREECAST fv);

    Py_DECREF(tmp);
    return res;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void MyFileProc ( void clientData,
int  mask 
) [static]

Definition at line 2976 of file _tkinter.c.

{
    stdin_ready = 1;
}

Here is the caller graph for this function:

static FileHandler_ClientData* NewFHCD ( PyObject func,
PyObject file,
int  id 
) [static]

Definition at line 2229 of file _tkinter.c.

{
    FileHandler_ClientData *p;
    p = PyMem_NEW(FileHandler_ClientData, 1);
    if (p != NULL) {
        Py_XINCREF(func);
        Py_XINCREF(file);
        p->func = func;
        p->file = file;
        p->id = id;
        p->next = HeadFHCD;
        HeadFHCD = p;
    }
    return p;
}

Here is the caller graph for this function:

static PyObject* newPyTclObject ( Tcl_Obj *  arg) [static]

Definition at line 763 of file _tkinter.c.

{
    PyTclObject *self;
    self = PyObject_New(PyTclObject, &PyTclObject_Type);
    if (self == NULL)
        return NULL;
    Tcl_IncrRefCount(arg);
    self->value = arg;
    self->string = NULL;
    return (PyObject*)self;
}

Here is the caller graph for this function:

PyDoc_STRVAR ( PyTclObject_string__doc__  ,
"the string representation of this  object,
either as str or bytes  
)
PyDoc_STRVAR ( get_typename__doc__  ,
"name of the Tcl type  
)

Definition at line 3103 of file _tkinter.c.

{
    PyObject *m, *d, *uexe, *cexe;

    if (PyType_Ready(&Tkapp_Type) < 0)
        return NULL;

#ifdef WITH_THREAD
    tcl_lock = PyThread_allocate_lock();
#endif

    m = PyModule_Create(&_tkintermodule);
    if (m == NULL)
        return NULL;

    d = PyModule_GetDict(m);
    Tkinter_TclError = PyErr_NewException("_tkinter.TclError", NULL, NULL);
    PyDict_SetItemString(d, "TclError", Tkinter_TclError);

    ins_long(d, "READABLE", TCL_READABLE);
    ins_long(d, "WRITABLE", TCL_WRITABLE);
    ins_long(d, "EXCEPTION", TCL_EXCEPTION);
    ins_long(d, "WINDOW_EVENTS", TCL_WINDOW_EVENTS);
    ins_long(d, "FILE_EVENTS", TCL_FILE_EVENTS);
    ins_long(d, "TIMER_EVENTS", TCL_TIMER_EVENTS);
    ins_long(d, "IDLE_EVENTS", TCL_IDLE_EVENTS);
    ins_long(d, "ALL_EVENTS", TCL_ALL_EVENTS);
    ins_long(d, "DONT_WAIT", TCL_DONT_WAIT);
    ins_string(d, "TK_VERSION", TK_VERSION);
    ins_string(d, "TCL_VERSION", TCL_VERSION);

    PyDict_SetItemString(d, "TkappType", (PyObject *)&Tkapp_Type);

    if (PyType_Ready(&Tktt_Type) < 0)
        return NULL;
    PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_Type);

    Py_TYPE(&PyTclObject_Type) = &PyType_Type;
    PyDict_SetItemString(d, "Tcl_Obj", (PyObject *)&PyTclObject_Type);

#ifdef TK_AQUA
    /* Tk_MacOSXSetupTkNotifier must be called before Tcl's subsystems
     * start waking up.  Note that Tcl_FindExecutable will do this, this
     * code must be above it! The original warning from
     * tkMacOSXAppInit.c is copied below.
     *
     * NB - You have to swap in the Tk Notifier BEFORE you start up the
     * Tcl interpreter for now.  It probably should work to do this
     * in the other order, but for now it doesn't seem to.
     *
     */
    Tk_MacOSXSetupTkNotifier();
#endif


    /* This helps the dynamic loader; in Unicode aware Tcl versions
       it also helps Tcl find its encodings. */
    uexe = PyUnicode_FromWideChar(Py_GetProgramName(), -1);
    if (uexe) {
        cexe = PyUnicode_EncodeFSDefault(uexe);
        if (cexe)
            Tcl_FindExecutable(PyBytes_AsString(cexe));
        Py_XDECREF(cexe);
        Py_DECREF(uexe);
    }

    if (PyErr_Occurred()) {
        Py_DECREF(m);
        return NULL;
    }

#if 0
    /* This was not a good idea; through <Destroy> bindings,
       Tcl_Finalize() may invoke Python code but at that point the
       interpreter and thread state have already been destroyed! */
    Py_AtExit(Tcl_Finalize);
#endif
    return m;
}

Here is the call graph for this function:

static void PyTclObject_dealloc ( PyTclObject self) [static]

Definition at line 776 of file _tkinter.c.

{
    Tcl_DecrRefCount(self->value);
    Py_XDECREF(self->string);
    PyObject_Del(self);
}
static PyObject* PyTclObject_repr ( PyTclObject self) [static]

Definition at line 823 of file _tkinter.c.

{
    return PyUnicode_FromFormat("<%s object at %p>",
                                self->value->typePtr->name, self->value);
}
static PyObject* PyTclObject_richcompare ( PyObject self,
PyObject other,
int  op 
) [static]

Definition at line 832 of file _tkinter.c.

{
    int result;
    PyObject *v;

    /* neither argument should be NULL, unless something's gone wrong */
    if (self == NULL || other == NULL) {
        PyErr_BadInternalCall();
        return NULL;
    }

    /* both arguments should be instances of PyTclObject */
    if (!PyTclObject_Check(self) || !PyTclObject_Check(other)) {
        v = Py_NotImplemented;
        goto finished;
    }

    if (self == other)
        /* fast path when self and other are identical */
        result = 0;
    else
        result = strcmp(Tcl_GetString(((PyTclObject *)self)->value),
                        Tcl_GetString(((PyTclObject *)other)->value));
    /* Convert return value to a Boolean */
    switch (op) {
    case Py_EQ:
        v = TEST_COND(result == 0);
        break;
    case Py_NE:
        v = TEST_COND(result != 0);
        break;
    case Py_LE:
        v = TEST_COND(result <= 0);
        break;
    case Py_GE:
        v = TEST_COND(result >= 0);
        break;
    case Py_LT:
        v = TEST_COND(result < 0);
        break;
    case Py_GT:
        v = TEST_COND(result > 0);
        break;
    default:
        PyErr_BadArgument();
        return NULL;
    }
  finished:
    Py_INCREF(v);
    return v;
}

Here is the call graph for this function:

static PyObject* PyTclObject_str ( PyTclObject self,
void ignored 
) [static]

Definition at line 809 of file _tkinter.c.

{
    char *s;
    int len;
    if (self->string && PyUnicode_Check(self->string)) {
        Py_INCREF(self->string);
        return self->string;
    }
    /* XXX Could chache result if it is non-ASCII. */
    s = Tcl_GetStringFromObj(self->value, &len);
    return PyUnicode_DecodeUTF8(s, len, "strict");
}

Here is the call graph for this function:

static PyObject* PyTclObject_string ( PyTclObject self,
void ignored 
) [static]

Definition at line 794 of file _tkinter.c.

{
    char *s;
    int len;
    if (!self->string) {
        s = Tcl_GetStringFromObj(self->value, &len);
        self->string = PyUnicode_FromStringAndSize(s, len);
        if (!self->string)
            return NULL;
    }
    Py_INCREF(self->string);
    return self->string;
}

Here is the call graph for this function:

static char* PyTclObject_TclString ( PyObject self) [static]

Definition at line 784 of file _tkinter.c.

{
    return Tcl_GetString(((PyTclObject*)self)->value);
}

Here is the caller graph for this function:

static int PythonCmd ( ClientData  clientData,
Tcl_Interp *  interp,
int  argc,
char *  argv[] 
) [static]

Definition at line 2005 of file _tkinter.c.

{
    PythonCmd_ClientData *data = (PythonCmd_ClientData *)clientData;
    PyObject *self, *func, *arg, *res;
    int i, rv;
    Tcl_Obj *obj_res;

    ENTER_PYTHON

    /* TBD: no error checking here since we know, via the
     * Tkapp_CreateCommand() that the client data is a two-tuple
     */
    self = data->self;
    func = data->func;

    /* Create argument list (argv1, ..., argvN) */
    if (!(arg = PyTuple_New(argc - 1)))
        return PythonCmd_Error(interp);

    for (i = 0; i < (argc - 1); i++) {
        PyObject *s = PyUnicode_FromString(argv[i + 1]);
        if (!s) {
            /* Is Tk leaking 0xC080 in %A - a "modified" utf-8 null? */
            if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError) &&
                !strcmp(argv[i + 1], "\xC0\x80")) {
                PyErr_Clear();
                /* Convert to "strict" utf-8 null */
                s = PyUnicode_FromString("\0");
            } else {
                Py_DECREF(arg);
                return PythonCmd_Error(interp);
            }
        }
        if (PyTuple_SetItem(arg, i, s)) {
            Py_DECREF(arg);
            return PythonCmd_Error(interp);
        }
    }
    res = PyEval_CallObject(func, arg);
    Py_DECREF(arg);

    if (res == NULL)
        return PythonCmd_Error(interp);

    obj_res = AsObj(res);
    if (obj_res == NULL) {
        Py_DECREF(res);
        return PythonCmd_Error(interp);
    }
    else {
        Tcl_SetObjResult(interp, obj_res);
        rv = TCL_OK;
    }

    Py_DECREF(res);

    LEAVE_PYTHON

    return rv;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int PythonCmd_Error ( Tcl_Interp *  interp) [static]

Definition at line 1993 of file _tkinter.c.

{
    errorInCmd = 1;
    PyErr_Fetch(&excInCmd, &valInCmd, &trbInCmd);
    LEAVE_PYTHON
    return TCL_ERROR;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void PythonCmdDelete ( ClientData  clientData) [static]

Definition at line 2067 of file _tkinter.c.

Here is the caller graph for this function:

static PyObject* SetVar ( PyObject self,
PyObject args,
int  flags 
) [static]

Definition at line 1606 of file _tkinter.c.

{
    char *name1, *name2;
    PyObject *newValue;
    PyObject *res = NULL;
    Tcl_Obj *newval, *ok;

    if (PyArg_ParseTuple(args, "O&O:setvar",
                         varname_converter, &name1, &newValue)) {
        /* XXX Acquire tcl lock??? */
        newval = AsObj(newValue);
        if (newval == NULL)
            return NULL;
        ENTER_TCL
        ok = Tcl_SetVar2Ex(Tkapp_Interp(self), name1, NULL,
                           newval, flags);
        ENTER_OVERLAP
        if (!ok)
            Tkinter_Error(self);
        else {
            res = Py_None;
            Py_INCREF(res);
        }
        LEAVE_OVERLAP_TCL
    }
    else {
        PyErr_Clear();
        if (PyArg_ParseTuple(args, "ssO:setvar",
                             &name1, &name2, &newValue)) {
            /* XXX must hold tcl lock already??? */
            newval = AsObj(newValue);
            ENTER_TCL
            ok = Tcl_SetVar2Ex(Tkapp_Interp(self), name1, name2, newval, flags);
            ENTER_OVERLAP
            if (!ok)
                Tkinter_Error(self);
            else {
                res = Py_None;
                Py_INCREF(res);
            }
            LEAVE_OVERLAP_TCL
        }
        else {
            return NULL;
        }
    }
    return res;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* Split ( char *  list) [static]

Definition at line 450 of file _tkinter.c.

{
    int argc;
    char **argv;
    PyObject *v;

    if (list == NULL) {
        Py_INCREF(Py_None);
        return Py_None;
    }

    if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) {
        /* Not a list.
         * Could be a quoted string containing funnies, e.g. {"}.
         * Return the string itself.
         */
        return PyUnicode_FromString(list);
    }

    if (argc == 0)
        v = PyUnicode_FromString("");
    else if (argc == 1)
        v = PyUnicode_FromString(argv[0]);
    else if ((v = PyTuple_New(argc)) != NULL) {
        int i;
        PyObject *w;

        for (i = 0; i < argc; i++) {
            if ((w = Split(argv[i])) == NULL) {
                Py_DECREF(v);
                v = NULL;
                break;
            }
            PyTuple_SetItem(v, i, w);
        }
    }
    Tcl_Free(FREECAST argv);
    return v;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* SplitObj ( PyObject arg) [static]

Definition at line 495 of file _tkinter.c.

{
    if (PyTuple_Check(arg)) {
        int i, size;
        PyObject *elem, *newelem, *result;

        size = PyTuple_Size(arg);
        result = NULL;
        /* Recursively invoke SplitObj for all tuple items.
           If this does not return a new object, no action is
           needed. */
        for(i = 0; i < size; i++) {
            elem = PyTuple_GetItem(arg, i);
            newelem = SplitObj(elem);
            if (!newelem) {
                Py_XDECREF(result);
                return NULL;
            }
            if (!result) {
                int k;
                if (newelem == elem) {
                    Py_DECREF(newelem);
                    continue;
                }
                result = PyTuple_New(size);
                if (!result)
                    return NULL;
                for(k = 0; k < i; k++) {
                    elem = PyTuple_GetItem(arg, k);
                    Py_INCREF(elem);
                    PyTuple_SetItem(result, k, elem);
                }
            }
            PyTuple_SetItem(result, i, newelem);
        }
        if (result)
            return result;
        /* Fall through, returning arg. */
    }
    else if (PyBytes_Check(arg)) {
        int argc;
        char **argv;
        char *list = PyBytes_AsString(arg);

        if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) {
            Py_INCREF(arg);
            return arg;
        }
        Tcl_Free(FREECAST argv);
        if (argc > 1)
            return Split(PyBytes_AsString(arg));
        /* Fall through, returning arg. */
    }
    Py_INCREF(arg);
    return arg;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int Tcl_AppInit ( Tcl_Interp *  interp)

Definition at line 557 of file _tkinter.c.

{
    const char * _tkinter_skip_tk_init;

    if (Tcl_Init(interp) == TCL_ERROR) {
        PySys_WriteStderr("Tcl_Init error: %s\n", Tcl_GetStringResult(interp));
        return TCL_ERROR;
    }

    _tkinter_skip_tk_init = Tcl_GetVar(interp,
                    "_tkinter_skip_tk_init", TCL_GLOBAL_ONLY);
    if (_tkinter_skip_tk_init != NULL &&
                    strcmp(_tkinter_skip_tk_init, "1") == 0) {
        return TCL_OK;
    }

#ifdef TKINTER_PROTECT_LOADTK
    if (tk_load_failed) {
        PySys_WriteStderr("Tk_Init error: %s\n", TKINTER_LOADTK_ERRMSG);
        return TCL_ERROR;
    }
#endif

    if (Tk_Init(interp) == TCL_ERROR) {
#ifdef TKINTER_PROTECT_LOADTK
        tk_load_failed = 1;
#endif
        PySys_WriteStderr("Tk_Init error: %s\n", Tcl_GetStringResult(interp));
        return TCL_ERROR;
    }

    return TCL_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void TimerHandler ( ClientData  clientData) [static]

Timer Handler.

Definition at line 2460 of file _tkinter.c.

{
    TkttObject *v = (TkttObject *)clientData;
    PyObject *func = v->func;
    PyObject *res;

    if (func == NULL)
        return;

    v->func = NULL;

    ENTER_PYTHON

    res  = PyEval_CallObject(func, NULL);
    Py_DECREF(func);
    Py_DECREF(v); /* See Tktt_New() */

    if (res == NULL) {
        errorInCmd = 1;
        PyErr_Fetch(&excInCmd, &valInCmd, &trbInCmd);
    }
    else
        Py_DECREF(res);

    LEAVE_PYTHON
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* Tkapp_AddErrorInfo ( PyObject self,
PyObject args 
) [static]

Definition at line 1473 of file _tkinter.c.

{
    char *msg;

    if (!PyArg_ParseTuple(args, "s:adderrorinfo", &msg))
        return NULL;
    CHECK_TCL_APPARTMENT;

    ENTER_TCL
    Tcl_AddErrorInfo(Tkapp_Interp(self), msg);
    LEAVE_TCL

    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static PyObject* Tkapp_Call ( PyObject selfptr,
PyObject args 
) [static]

Definition at line 1277 of file _tkinter.c.

{
    Tcl_Obj *objStore[ARGSZ];
    Tcl_Obj **objv = NULL;
    int objc, i;
    PyObject *res = NULL;
    TkappObject *self = (TkappObject*)selfptr;
    int flags = TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL;

    /* If args is a single tuple, replace with contents of tuple */
    if (1 == PyTuple_Size(args)){
        PyObject* item = PyTuple_GetItem(args, 0);
        if (PyTuple_Check(item))
            args = item;
    }
#ifdef WITH_THREAD
    if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
        /* We cannot call the command directly. Instead, we must
           marshal the parameters to the interpreter thread. */
        Tkapp_CallEvent *ev;
        Tcl_Condition cond = NULL;
        PyObject *exc_type, *exc_value, *exc_tb;
        if (!WaitForMainloop(self))
            return NULL;
        ev = (Tkapp_CallEvent*)ckalloc(sizeof(Tkapp_CallEvent));
        ev->ev.proc = (Tcl_EventProc*)Tkapp_CallProc;
        ev->self = self;
        ev->args = args;
        ev->res = &res;
        ev->exc_type = &exc_type;
        ev->exc_value = &exc_value;
        ev->exc_tb = &exc_tb;
        ev->done = &cond;

        Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond, &call_mutex);

        if (res == NULL) {
            if (exc_type)
                PyErr_Restore(exc_type, exc_value, exc_tb);
            else
                PyErr_SetObject(Tkinter_TclError, exc_value);
        }
        Tcl_ConditionFinalize(&cond);
    }
    else
#endif
    {

        objv = Tkapp_CallArgs(args, objStore, &objc);
        if (!objv)
            return NULL;

        ENTER_TCL

        i = Tcl_EvalObjv(self->interp, objc, objv, flags);

        ENTER_OVERLAP

        if (i == TCL_ERROR)
            Tkinter_Error(selfptr);
        else
            res = Tkapp_CallResult(self);

        LEAVE_OVERLAP_TCL

        Tkapp_CallDeallocArgs(objv, objStore, objc);
    }
    return res;
}

Here is the call graph for this function:

static Tcl_Obj** Tkapp_CallArgs ( PyObject args,
Tcl_Obj **  objStore,
int pobjc 
) [static]

Definition at line 1144 of file _tkinter.c.

{
    Tcl_Obj **objv = objStore;
    int objc = 0, i;
    if (args == NULL)
        /* do nothing */;

    else if (!PyTuple_Check(args)) {
        objv[0] = AsObj(args);
        if (objv[0] == 0)
            goto finally;
        objc = 1;
        Tcl_IncrRefCount(objv[0]);
    }
    else {
        objc = PyTuple_Size(args);

        if (objc > ARGSZ) {
            objv = (Tcl_Obj **)ckalloc(objc * sizeof(char *));
            if (objv == NULL) {
                PyErr_NoMemory();
                objc = 0;
                goto finally;
            }
        }

        for (i = 0; i < objc; i++) {
            PyObject *v = PyTuple_GetItem(args, i);
            if (v == Py_None) {
                objc = i;
                break;
            }
            objv[i] = AsObj(v);
            if (!objv[i]) {
                /* Reset objc, so it attempts to clear
                   objects only up to i. */
                objc = i;
                goto finally;
            }
            Tcl_IncrRefCount(objv[i]);
        }
    }
    *pobjc = objc;
    return objv;
finally:
    Tkapp_CallDeallocArgs(objv, objStore, objc);
    return NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void Tkapp_CallDeallocArgs ( Tcl_Obj **  objv,
Tcl_Obj **  objStore,
int  objc 
)

Definition at line 1131 of file _tkinter.c.

{
    int i;
    for (i = 0; i < objc; i++)
        Tcl_DecrRefCount(objv[i]);
    if (objv != objStore)
        ckfree(FREECAST objv);
}

Here is the caller graph for this function:

static PyObject* Tkapp_CallResult ( TkappObject self) [static]

Definition at line 1196 of file _tkinter.c.

{
    PyObject *res = NULL;
    if(self->wantobjects) {
        Tcl_Obj *value = Tcl_GetObjResult(self->interp);
        /* Not sure whether the IncrRef is necessary, but something
           may overwrite the interpreter result while we are
           converting it. */
        Tcl_IncrRefCount(value);
        res = FromObj((PyObject*)self, value);
        Tcl_DecrRefCount(value);
    } else {
        const char *s = Tcl_GetStringResult(self->interp);
        const char *p = s;

        res = PyUnicode_FromStringAndSize(s, (int)(p-s));
    }
    return res;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* Tkapp_CreateCommand ( PyObject selfptr,
PyObject args 
) [static]

Definition at line 2111 of file _tkinter.c.

{
    TkappObject *self = (TkappObject*)selfptr;
    PythonCmd_ClientData *data;
    char *cmdName;
    PyObject *func;
    int err;

    if (!PyArg_ParseTuple(args, "sO:createcommand", &cmdName, &func))
        return NULL;
    if (!PyCallable_Check(func)) {
        PyErr_SetString(PyExc_TypeError, "command not callable");
        return NULL;
    }

#ifdef WITH_THREAD
    if (self->threaded && self->thread_id != Tcl_GetCurrentThread() &&
        !WaitForMainloop(self))
        return NULL;
#endif

    data = PyMem_NEW(PythonCmd_ClientData, 1);
    if (!data)
        return PyErr_NoMemory();
    Py_INCREF(self);
    Py_INCREF(func);
    data->self = selfptr;
    data->func = func;
#ifdef WITH_THREAD
    if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
        Tcl_Condition cond = NULL;
        CommandEvent *ev = (CommandEvent*)ckalloc(sizeof(CommandEvent));
        ev->ev.proc = (Tcl_EventProc*)Tkapp_CommandProc;
        ev->interp = self->interp;
        ev->create = 1;
        ev->name = cmdName;
        ev->data = (ClientData)data;
        ev->status = &err;
        ev->done = &cond;
        Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond, &command_mutex);
        Tcl_ConditionFinalize(&cond);
    }
    else
#endif
    {
        ENTER_TCL
        err = Tcl_CreateCommand(
            Tkapp_Interp(self), cmdName, PythonCmd,
            (ClientData)data, PythonCmdDelete) == NULL;
        LEAVE_TCL
    }
    if (err) {
        PyErr_SetString(Tkinter_TclError, "can't create Tcl command");
        PyMem_DEL(data);
        return NULL;
    }

    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static PyObject* Tkapp_CreateFileHandler ( PyObject self,
PyObject args 
) [static]

Definition at line 2286 of file _tkinter.c.

{
    FileHandler_ClientData *data;
    PyObject *file, *func;
    int mask, tfile;

    if (!PyArg_ParseTuple(args, "OiO:createfilehandler",
                          &file, &mask, &func))
        return NULL;

    CHECK_TCL_APPARTMENT;

    tfile = PyObject_AsFileDescriptor(file);
    if (tfile < 0)
        return NULL;
    if (!PyCallable_Check(func)) {
        PyErr_SetString(PyExc_TypeError, "bad argument list");
        return NULL;
    }

    data = NewFHCD(func, file, tfile);
    if (data == NULL)
        return NULL;

    /* Ought to check for null Tcl_File object... */
    ENTER_TCL
    Tcl_CreateFileHandler(tfile, mask, FileHandler, (ClientData) data);
    LEAVE_TCL
    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static PyObject* Tkapp_CreateTimerHandler ( PyObject self,
PyObject args 
) [static]

Definition at line 2488 of file _tkinter.c.

{
    int milliseconds;
    PyObject *func;
    TkttObject *v;

    if (!PyArg_ParseTuple(args, "iO:createtimerhandler",
                          &milliseconds, &func))
        return NULL;
    if (!PyCallable_Check(func)) {
        PyErr_SetString(PyExc_TypeError, "bad argument list");
        return NULL;
    }

    CHECK_TCL_APPARTMENT;

    v = Tktt_New(func);
    if (v) {
        v->token = Tcl_CreateTimerHandler(milliseconds, TimerHandler,
                                          (ClientData)v);
    }

    return (PyObject *) v;
}

Here is the call graph for this function:

static void Tkapp_Dealloc ( PyObject self) [static]

Definition at line 2740 of file _tkinter.c.

{
    /*CHECK_TCL_APPARTMENT;*/
    ENTER_TCL
    Tcl_DeleteInterp(Tkapp_Interp(self));
    LEAVE_TCL
    PyObject_Del(self);
    DisableEventHook();
}

Here is the call graph for this function:

static PyObject* Tkapp_DeleteCommand ( PyObject selfptr,
PyObject args 
) [static]

Definition at line 2175 of file _tkinter.c.

{
    TkappObject *self = (TkappObject*)selfptr;
    char *cmdName;
    int err;

    if (!PyArg_ParseTuple(args, "s:deletecommand", &cmdName))
        return NULL;

#ifdef WITH_THREAD
    if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
        Tcl_Condition cond = NULL;
        CommandEvent *ev;
        ev = (CommandEvent*)ckalloc(sizeof(CommandEvent));
        ev->ev.proc = (Tcl_EventProc*)Tkapp_CommandProc;
        ev->interp = self->interp;
        ev->create = 0;
        ev->name = cmdName;
        ev->status = &err;
        ev->done = &cond;
        Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond,
                         &command_mutex);
        Tcl_ConditionFinalize(&cond);
    }
    else
#endif
    {
        ENTER_TCL
        err = Tcl_DeleteCommand(self->interp, cmdName);
        LEAVE_TCL
    }
    if (err == -1) {
        PyErr_SetString(Tkinter_TclError, "can't delete Tcl command");
        return NULL;
    }
    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static PyObject* Tkapp_DeleteFileHandler ( PyObject self,
PyObject args 
) [static]

Definition at line 2320 of file _tkinter.c.

{
    PyObject *file;
    int tfile;

    if (!PyArg_ParseTuple(args, "O:deletefilehandler", &file))
        return NULL;

    CHECK_TCL_APPARTMENT;

    tfile = PyObject_AsFileDescriptor(file);
    if (tfile < 0)
        return NULL;

    DeleteFHCD(tfile);

    /* Ought to check for null Tcl_File object... */
    ENTER_TCL
    Tcl_DeleteFileHandler(tfile);
    LEAVE_TCL
    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static PyObject* Tkapp_DoOneEvent ( PyObject self,
PyObject args 
) [static]

Definition at line 2581 of file _tkinter.c.

{
    int flags = 0;
    int rv;

    if (!PyArg_ParseTuple(args, "|i:dooneevent", &flags))
        return NULL;

    ENTER_TCL
    rv = Tcl_DoOneEvent(flags);
    LEAVE_TCL
    return Py_BuildValue("i", rv);
}

Here is the call graph for this function:

static PyObject* Tkapp_Eval ( PyObject self,
PyObject args 
) [static]

Definition at line 1380 of file _tkinter.c.

{
    char *script;
    PyObject *res = NULL;
    int err;

    if (!PyArg_ParseTuple(args, "s:eval", &script))
        return NULL;

    CHECK_TCL_APPARTMENT;

    ENTER_TCL
    err = Tcl_Eval(Tkapp_Interp(self), script);
    ENTER_OVERLAP
    if (err == TCL_ERROR)
        res = Tkinter_Error(self);
    else
        res = PyUnicode_FromString(Tkapp_Result(self));
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

static PyObject* Tkapp_EvalFile ( PyObject self,
PyObject args 
) [static]

Definition at line 1426 of file _tkinter.c.

{
    char *fileName;
    PyObject *res = NULL;
    int err;

    if (!PyArg_ParseTuple(args, "s:evalfile", &fileName))
        return NULL;

    CHECK_TCL_APPARTMENT;

    ENTER_TCL
    err = Tcl_EvalFile(Tkapp_Interp(self), fileName);
    ENTER_OVERLAP
    if (err == TCL_ERROR)
        res = Tkinter_Error(self);

    else
        res = PyUnicode_FromString(Tkapp_Result(self));
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

static PyObject* Tkapp_ExprBoolean ( PyObject self,
PyObject args 
) [static]

Definition at line 1882 of file _tkinter.c.

{
    char *s;
    PyObject *res = NULL;
    int retval;
    int v;

    if (!PyArg_ParseTuple(args, "s:exprboolean", &s))
        return NULL;
    CHECK_TCL_APPARTMENT;
    ENTER_TCL
    retval = Tcl_ExprBoolean(Tkapp_Interp(self), s, &v);
    ENTER_OVERLAP
    if (retval == TCL_ERROR)
        res = Tkinter_Error(self);
    else
        res = Py_BuildValue("i", v);
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

static PyObject* Tkapp_ExprDouble ( PyObject self,
PyObject args 
) [static]

Definition at line 1858 of file _tkinter.c.

{
    char *s;
    PyObject *res = NULL;
    double v;
    int retval;

    if (!PyArg_ParseTuple(args, "s:exprdouble", &s))
        return NULL;
    CHECK_TCL_APPARTMENT;
    PyFPE_START_PROTECT("Tkapp_ExprDouble", return 0)
    ENTER_TCL
    retval = Tcl_ExprDouble(Tkapp_Interp(self), s, &v);
    ENTER_OVERLAP
    PyFPE_END_PROTECT(retval)
    if (retval == TCL_ERROR)
        res = Tkinter_Error(self);
    else
        res = Py_BuildValue("d", v);
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

static PyObject* Tkapp_ExprLong ( PyObject self,
PyObject args 
) [static]

Definition at line 1834 of file _tkinter.c.

{
    char *s;
    PyObject *res = NULL;
    int retval;
    long v;

    if (!PyArg_ParseTuple(args, "s:exprlong", &s))
        return NULL;

    CHECK_TCL_APPARTMENT;

    ENTER_TCL
    retval = Tcl_ExprLong(Tkapp_Interp(self), s, &v);
    ENTER_OVERLAP
    if (retval == TCL_ERROR)
        res = Tkinter_Error(self);
    else
        res = Py_BuildValue("l", v);
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

static PyObject* Tkapp_ExprString ( PyObject self,
PyObject args 
) [static]

Definition at line 1811 of file _tkinter.c.

{
    char *s;
    PyObject *res = NULL;
    int retval;

    if (!PyArg_ParseTuple(args, "s:exprstring", &s))
        return NULL;

    CHECK_TCL_APPARTMENT;

    ENTER_TCL
    retval = Tcl_ExprString(Tkapp_Interp(self), s);
    ENTER_OVERLAP
    if (retval == TCL_ERROR)
        res = Tkinter_Error(self);
    else
        res = Py_BuildValue("s", Tkapp_Result(self));
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

static PyObject* Tkapp_GetBoolean ( PyObject self,
PyObject args 
) [static]

Definition at line 1791 of file _tkinter.c.

{
    char *s;
    int v;

    if (PyTuple_Size(args) == 1) {
        PyObject *o = PyTuple_GetItem(args, 0);
        if (PyLong_Check(o)) {
            Py_INCREF(o);
            return o;
        }
    }
    if (!PyArg_ParseTuple(args, "s:getboolean", &s))
        return NULL;
    if (Tcl_GetBoolean(Tkapp_Interp(self), s, &v) == TCL_ERROR)
        return Tkinter_Error(self);
    return PyBool_FromLong(v);
}

Here is the call graph for this function:

static PyObject* Tkapp_GetDouble ( PyObject self,
PyObject args 
) [static]

Definition at line 1771 of file _tkinter.c.

{
    char *s;
    double v;

    if (PyTuple_Size(args) == 1) {
        PyObject *o = PyTuple_GetItem(args, 0);
        if (PyFloat_Check(o)) {
            Py_INCREF(o);
            return o;
        }
    }
    if (!PyArg_ParseTuple(args, "s:getdouble", &s))
        return NULL;
    if (Tcl_GetDouble(Tkapp_Interp(self), s, &v) == TCL_ERROR)
        return Tkinter_Error(self);
    return Py_BuildValue("d", v);
}

Here is the call graph for this function:

static PyObject* Tkapp_GetInt ( PyObject self,
PyObject args 
) [static]

Tcl to Python.

Definition at line 1751 of file _tkinter.c.

{
    char *s;
    int v;

    if (PyTuple_Size(args) == 1) {
        PyObject* o = PyTuple_GetItem(args, 0);
        if (PyLong_Check(o)) {
            Py_INCREF(o);
            return o;
        }
    }
    if (!PyArg_ParseTuple(args, "s:getint", &s))
        return NULL;
    if (Tcl_GetInt(Tkapp_Interp(self), s, &v) == TCL_ERROR)
        return Tkinter_Error(self);
    return Py_BuildValue("i", v);
}

Here is the call graph for this function:

static PyObject* Tkapp_GetVar ( PyObject self,
PyObject args 
) [static]

Definition at line 1698 of file _tkinter.c.

{
    return var_invoke(GetVar, self, args, TCL_LEAVE_ERR_MSG);
}

Here is the call graph for this function:

static PyObject* Tkapp_GlobalCall ( PyObject self,
PyObject args 
) [static]

Definition at line 1349 of file _tkinter.c.

{
    /* Could do the same here as for Tkapp_Call(), but this is not used
       much, so I can't be bothered.  Unfortunately Tcl doesn't export a
       way for the user to do what all its Global* variants do (save and
       reset the scope pointer, call the local version, restore the saved
       scope pointer). */

    char *cmd;
    PyObject *res = NULL;

    CHECK_TCL_APPARTMENT;

    cmd  = Merge(args);
    if (cmd) {
        int err;
        ENTER_TCL
        err = Tcl_GlobalEval(Tkapp_Interp(self), cmd);
        ENTER_OVERLAP
        if (err == TCL_ERROR)
            res = Tkinter_Error(self);
        else
            res = PyUnicode_FromString(Tkapp_Result(self));
        LEAVE_OVERLAP_TCL
        ckfree(cmd);
    }

    return res;
}

Here is the call graph for this function:

static PyObject* Tkapp_GlobalEval ( PyObject self,
PyObject args 
) [static]

Definition at line 1403 of file _tkinter.c.

{
    char *script;
    PyObject *res = NULL;
    int err;

    if (!PyArg_ParseTuple(args, "s:globaleval", &script))
        return NULL;

    CHECK_TCL_APPARTMENT;

    ENTER_TCL
    err = Tcl_GlobalEval(Tkapp_Interp(self), script);
    ENTER_OVERLAP
    if (err == TCL_ERROR)
        res = Tkinter_Error(self);
    else
        res = PyUnicode_FromString(Tkapp_Result(self));
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

static PyObject* Tkapp_GlobalGetVar ( PyObject self,
PyObject args 
) [static]

Definition at line 1704 of file _tkinter.c.

{
    return var_invoke(GetVar, self, args, TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY);
}

Here is the call graph for this function:

static PyObject* Tkapp_GlobalSetVar ( PyObject self,
PyObject args 
) [static]

Definition at line 1662 of file _tkinter.c.

{
    return var_invoke(SetVar, self, args, TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY);
}

Here is the call graph for this function:

static PyObject* Tkapp_GlobalUnsetVar ( PyObject self,
PyObject args 
) [static]

Definition at line 1741 of file _tkinter.c.

{
    return var_invoke(UnsetVar, self, args, TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY);
}

Here is the call graph for this function:

static PyObject* Tkapp_InterpAddr ( PyObject self,
PyObject args 
) [static]

Definition at line 2608 of file _tkinter.c.

{

    if (!PyArg_ParseTuple(args, ":interpaddr"))
        return NULL;

    return PyLong_FromLong((long)Tkapp_Interp(self));
}

Here is the call graph for this function:

static PyObject* Tkapp_MainLoop ( PyObject selfptr,
PyObject args 
) [static]

Event Loop.

Definition at line 2517 of file _tkinter.c.

{
    int threshold = 0;
    TkappObject *self = (TkappObject*)selfptr;
#ifdef WITH_THREAD
    PyThreadState *tstate = PyThreadState_Get();
#endif

    if (!PyArg_ParseTuple(args, "|i:mainloop", &threshold))
        return NULL;

    CHECK_TCL_APPARTMENT;
    self->dispatching = 1;

    quitMainLoop = 0;
    while (Tk_GetNumMainWindows() > threshold &&
           !quitMainLoop &&
           !errorInCmd)
    {
        int result;

#ifdef WITH_THREAD
        if (self->threaded) {
            /* Allow other Python threads to run. */
            ENTER_TCL
            result = Tcl_DoOneEvent(0);
            LEAVE_TCL
        }
        else {
            Py_BEGIN_ALLOW_THREADS
            if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1);
            tcl_tstate = tstate;
            result = Tcl_DoOneEvent(TCL_DONT_WAIT);
            tcl_tstate = NULL;
            if(tcl_lock)PyThread_release_lock(tcl_lock);
            if (result == 0)
                Sleep(Tkinter_busywaitinterval);
            Py_END_ALLOW_THREADS
        }
#else
        result = Tcl_DoOneEvent(0);
#endif

        if (PyErr_CheckSignals() != 0) {
            self->dispatching = 0;
            return NULL;
        }
        if (result < 0)
            break;
    }
    self->dispatching = 0;
    quitMainLoop = 0;

    if (errorInCmd) {
        errorInCmd = 0;
        PyErr_Restore(excInCmd, valInCmd, trbInCmd);
        excInCmd = valInCmd = trbInCmd = NULL;
        return NULL;
    }
    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static PyObject* Tkapp_Merge ( PyObject self,
PyObject args 
) [static]

Definition at line 1969 of file _tkinter.c.

{
    char *s = Merge(args);
    PyObject *res = NULL;

    if (s) {
        res = PyUnicode_FromString(s);
        ckfree(s);
    }

    return res;
}

Here is the call graph for this function:

static TkappObject* Tkapp_New ( char *  screenName,
char *  className,
int  interactive,
int  wantobjects,
int  wantTk,
int  sync,
char *  use 
) [static]

Definition at line 603 of file _tkinter.c.

{
    TkappObject *v;
    char *argv0;

    v = PyObject_New(TkappObject, &Tkapp_Type);
    if (v == NULL)
        return NULL;

    v->interp = Tcl_CreateInterp();
    v->wantobjects = wantobjects;
    v->threaded = Tcl_GetVar2Ex(v->interp, "tcl_platform", "threaded",
                                TCL_GLOBAL_ONLY) != NULL;
    v->thread_id = Tcl_GetCurrentThread();
    v->dispatching = 0;

#ifndef TCL_THREADS
    if (v->threaded) {
        PyErr_SetString(PyExc_RuntimeError, "Tcl is threaded but _tkinter is not");
        Py_DECREF(v);
        return 0;
    }
#endif
#ifdef WITH_THREAD
    if (v->threaded && tcl_lock) {
        /* If Tcl is threaded, we don't need the lock. */
        PyThread_free_lock(tcl_lock);
        tcl_lock = NULL;
    }
#endif

    v->BooleanType = Tcl_GetObjType("boolean");
    v->ByteArrayType = Tcl_GetObjType("bytearray");
    v->DoubleType = Tcl_GetObjType("double");
    v->IntType = Tcl_GetObjType("int");
    v->ListType = Tcl_GetObjType("list");
    v->ProcBodyType = Tcl_GetObjType("procbody");
    v->StringType = Tcl_GetObjType("string");

    /* Delete the 'exit' command, which can screw things up */
    Tcl_DeleteCommand(v->interp, "exit");

    if (screenName != NULL)
        Tcl_SetVar2(v->interp, "env", "DISPLAY",
                    screenName, TCL_GLOBAL_ONLY);

    if (interactive)
        Tcl_SetVar(v->interp, "tcl_interactive", "1", TCL_GLOBAL_ONLY);
    else
        Tcl_SetVar(v->interp, "tcl_interactive", "0", TCL_GLOBAL_ONLY);

    /* This is used to get the application class for Tk 4.1 and up */
    argv0 = (char*)ckalloc(strlen(className) + 1);
    if (!argv0) {
        PyErr_NoMemory();
        Py_DECREF(v);
        return NULL;
    }

    strcpy(argv0, className);
    if (isupper(Py_CHARMASK(argv0[0])))
        argv0[0] = tolower(Py_CHARMASK(argv0[0]));
    Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY);
    ckfree(argv0);

    if (! wantTk) {
        Tcl_SetVar(v->interp,
                        "_tkinter_skip_tk_init", "1", TCL_GLOBAL_ONLY);
    }
#ifdef TKINTER_PROTECT_LOADTK
    else if (tk_load_failed) {
        Tcl_SetVar(v->interp,
                        "_tkinter_tk_failed", "1", TCL_GLOBAL_ONLY);
    }
#endif

    /* some initial arguments need to be in argv */
    if (sync || use) {
        char *args;
        int len = 0;

        if (sync)
            len += sizeof "-sync";
        if (use)
            len += strlen(use) + sizeof "-use ";

        args = (char*)ckalloc(len);
        if (!args) {
            PyErr_NoMemory();
            Py_DECREF(v);
            return NULL;
        }

        args[0] = '\0';
        if (sync)
            strcat(args, "-sync");
        if (use) {
            if (sync)
                strcat(args, " ");
            strcat(args, "-use ");
            strcat(args, use);
        }

        Tcl_SetVar(v->interp, "argv", args, TCL_GLOBAL_ONLY);
        ckfree(args);
    }

    if (Tcl_AppInit(v->interp) != TCL_OK) {
        PyObject *result = Tkinter_Error((PyObject *)v);
#ifdef TKINTER_PROTECT_LOADTK
        if (wantTk) {
            const char *_tkinter_tk_failed;
            _tkinter_tk_failed = Tcl_GetVar(v->interp,
                            "_tkinter_tk_failed", TCL_GLOBAL_ONLY);

            if ( _tkinter_tk_failed != NULL &&
                            strcmp(_tkinter_tk_failed, "1") == 0) {
                tk_load_failed = 1;
            }
        }
#endif
        Py_DECREF((PyObject *)v);
        return (TkappObject *)result;
    }

    EnableEventHook();

    return v;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* Tkapp_Quit ( PyObject self,
PyObject args 
) [static]

Definition at line 2596 of file _tkinter.c.

{

    if (!PyArg_ParseTuple(args, ":quit"))
        return NULL;

    quitMainLoop = 1;
    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static PyObject* Tkapp_Record ( PyObject self,
PyObject args 
) [static]

Definition at line 1450 of file _tkinter.c.

{
    char *script;
    PyObject *res = NULL;
    int err;

    if (!PyArg_ParseTuple(args, "s", &script))
        return NULL;

    CHECK_TCL_APPARTMENT;

    ENTER_TCL
    err = Tcl_RecordAndEval(Tkapp_Interp(self), script, TCL_NO_EVAL);
    ENTER_OVERLAP
    if (err == TCL_ERROR)
        res = Tkinter_Error(self);
    else
        res = PyUnicode_FromString(Tkapp_Result(self));
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

static PyObject* Tkapp_SetVar ( PyObject self,
PyObject args 
) [static]

Definition at line 1656 of file _tkinter.c.

{
    return var_invoke(SetVar, self, args, TCL_LEAVE_ERR_MSG);
}

Here is the call graph for this function:

static PyObject* Tkapp_Split ( PyObject self,
PyObject args 
) [static]

Definition at line 1949 of file _tkinter.c.

{
    PyObject *v;
    char *list;

    if (PyTuple_Size(args) == 1) {
        PyObject* o = PyTuple_GetItem(args, 0);
        if (PyTuple_Check(o)) {
            o = SplitObj(o);
            return o;
        }
    }
    if (!PyArg_ParseTuple(args, "et:split", "utf-8", &list))
        return NULL;
    v = Split(list);
    PyMem_Free(list);
    return v;
}

Here is the call graph for this function:

static PyObject* Tkapp_SplitList ( PyObject self,
PyObject args 
) [static]

Definition at line 1906 of file _tkinter.c.

{
    char *list;
    int argc;
    char **argv;
    PyObject *v;
    int i;

    if (PyTuple_Size(args) == 1) {
        v = PyTuple_GetItem(args, 0);
        if (PyTuple_Check(v)) {
            Py_INCREF(v);
            return v;
        }
    }
    if (!PyArg_ParseTuple(args, "et:splitlist", "utf-8", &list))
        return NULL;

    if (Tcl_SplitList(Tkapp_Interp(self), list,
                      &argc, &argv) == TCL_ERROR)  {
        PyMem_Free(list);
        return Tkinter_Error(self);
    }

    if (!(v = PyTuple_New(argc)))
        goto finally;

    for (i = 0; i < argc; i++) {
        PyObject *s = PyUnicode_FromString(argv[i]);
        if (!s || PyTuple_SetItem(v, i, s)) {
            Py_DECREF(v);
            v = NULL;
            goto finally;
        }
    }

  finally:
    ckfree(FREECAST argv);
    PyMem_Free(list);
    return v;
}

Here is the call graph for this function:

static PyObject* Tkapp_TkInit ( PyObject self,
PyObject args 
) [static]

Definition at line 2618 of file _tkinter.c.

{
    Tcl_Interp *interp = Tkapp_Interp(self);
    const char * _tk_exists = NULL;
    int err;

#ifdef TKINTER_PROTECT_LOADTK
    /* Up to Tk 8.4.13, Tk_Init deadlocks on the second call when the
     * first call failed.
     * To avoid the deadlock, we just refuse the second call through
     * a static variable.
     */
    if (tk_load_failed) {
        PyErr_SetString(Tkinter_TclError, TKINTER_LOADTK_ERRMSG);
        return NULL;
    }
#endif

    /* We want to guard against calling Tk_Init() multiple times */
    CHECK_TCL_APPARTMENT;
    ENTER_TCL
    err = Tcl_Eval(Tkapp_Interp(self), "info exists     tk_version");
    ENTER_OVERLAP
    if (err == TCL_ERROR) {
        /* This sets an exception, but we cannot return right
           away because we need to exit the overlap first. */
        Tkinter_Error(self);
    } else {
        _tk_exists = Tkapp_Result(self);
    }
    LEAVE_OVERLAP_TCL
    if (err == TCL_ERROR) {
        return NULL;
    }
    if (_tk_exists == NULL || strcmp(_tk_exists, "1") != 0)     {
        if (Tk_Init(interp)             == TCL_ERROR) {
            PyErr_SetString(Tkinter_TclError, Tcl_GetStringResult(Tkapp_Interp(self)));
#ifdef TKINTER_PROTECT_LOADTK
            tk_load_failed = 1;
#endif
            return NULL;
        }
    }
    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static PyObject* Tkapp_UnsetVar ( PyObject self,
PyObject args 
) [static]

Definition at line 1735 of file _tkinter.c.

{
    return var_invoke(UnsetVar, self, args, TCL_LEAVE_ERR_MSG);
}

Here is the call graph for this function:

static PyObject* Tkapp_WantObjects ( PyObject self,
PyObject args 
) [static]

Definition at line 2666 of file _tkinter.c.

{

    int wantobjects = -1;
    if (!PyArg_ParseTuple(args, "|i:wantobjects", &wantobjects))
        return NULL;
    if (wantobjects == -1)
        return PyBool_FromLong(((TkappObject*)self)->wantobjects);
    ((TkappObject*)self)->wantobjects = wantobjects;

    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static PyObject* Tkapp_WillDispatch ( PyObject self,
PyObject args 
) [static]

Definition at line 2681 of file _tkinter.c.

{

    ((TkappObject*)self)->dispatching = 1;

    Py_INCREF(Py_None);
    return Py_None;
}
static PyObject* Tkinter_Create ( PyObject self,
PyObject args 
) [static]

Definition at line 2898 of file _tkinter.c.

{
    char *screenName = NULL;
    char *baseName = NULL; /* XXX this is not used anymore;
                              try getting rid of it. */
    char *className = NULL;
    int interactive = 0;
    int wantobjects = 0;
    int wantTk = 1;     /* If false, then Tk_Init() doesn't get called */
    int sync = 0; /* pass -sync to wish */
    char *use = NULL; /* pass -use to wish */

    className = "Tk";

    if (!PyArg_ParseTuple(args, "|zssiiiiz:create",
                          &screenName, &baseName, &className,
                          &interactive, &wantobjects, &wantTk,
                          &sync, &use))
        return NULL;

    return (PyObject *) Tkapp_New(screenName, className,
                                  interactive, wantobjects,     wantTk,
                                  sync, use);
}

Here is the call graph for this function:

static PyObject* Tkinter_Error ( PyObject v) [static]

Definition at line 289 of file _tkinter.c.

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* Tkinter_Flatten ( PyObject self,
PyObject args 
) [static]

Definition at line 2868 of file _tkinter.c.

{
    FlattenContext context;
    PyObject* item;

    if (!PyArg_ParseTuple(args, "O:_flatten", &item))
        return NULL;

    context.maxsize = PySequence_Size(item);
    if (context.maxsize < 0)
        return NULL;
    if (context.maxsize == 0)
        return PyTuple_New(0);

    context.tuple = PyTuple_New(context.maxsize);
    if (!context.tuple)
        return NULL;

    context.size = 0;

    if (!_flatten1(&context, item,0))
        return NULL;

    if (_PyTuple_Resize(&context.tuple, context.size))
        return NULL;

    return context.tuple;
}

Here is the call graph for this function:

static PyObject* Tkinter_getbusywaitinterval ( PyObject self,
PyObject args 
) [static]

Definition at line 2948 of file _tkinter.c.

Here is the call graph for this function:

static PyObject* Tkinter_setbusywaitinterval ( PyObject self,
PyObject args 
) [static]

Definition at line 2924 of file _tkinter.c.

{
    int new_val;
    if (!PyArg_ParseTuple(args, "i:setbusywaitinterval", &new_val))
        return NULL;
    if (new_val < 0) {
        PyErr_SetString(PyExc_ValueError,
                        "busywaitinterval must be >= 0");
        return NULL;
    }
    Tkinter_busywaitinterval = new_val;
    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static void Tktt_Dealloc ( PyObject self) [static]

Definition at line 2402 of file _tkinter.c.

{
    TkttObject *v = (TkttObject *)self;
    PyObject *func = v->func;

    Py_XDECREF(func);

    PyObject_Del(self);
}
static PyObject* Tktt_DeleteTimerHandler ( PyObject self,
PyObject args 
) [static]

Definition at line 2357 of file _tkinter.c.

{
    TkttObject *v = (TkttObject *)self;
    PyObject *func = v->func;

    if (!PyArg_ParseTuple(args, ":deletetimerhandler"))
        return NULL;
    if (v->token != NULL) {
        Tcl_DeleteTimerHandler(v->token);
        v->token = NULL;
    }
    if (func != NULL) {
        v->func = NULL;
        Py_DECREF(func);
        Py_DECREF(v); /* See Tktt_New() */
    }
    Py_INCREF(Py_None);
    return Py_None;
}

Here is the call graph for this function:

static TkttObject* Tktt_New ( PyObject func) [static]

Definition at line 2384 of file _tkinter.c.

{
    TkttObject *v;

    v = PyObject_New(TkttObject, &Tktt_Type);
    if (v == NULL)
        return NULL;

    Py_INCREF(func);
    v->token = NULL;
    v->func = func;

    /* Extra reference, deleted when called or when handler is deleted */
    Py_INCREF(v);
    return v;
}

Here is the caller graph for this function:

static PyObject* Tktt_Repr ( PyObject self) [static]

Definition at line 2413 of file _tkinter.c.

{
    TkttObject *v = (TkttObject *)self;
    char buf[100];

    PyOS_snprintf(buf, sizeof(buf), "<tktimertoken at %p%s>", v,
                    v->func == NULL ? ", handler deleted" : "");
    return PyUnicode_FromString(buf);
}

Here is the call graph for this function:

static PyObject* UnsetVar ( PyObject self,
PyObject args,
int  flags 
) [static]

Definition at line 1712 of file _tkinter.c.

{
    char *name1, *name2=NULL;
    int code;
    PyObject *res = NULL;

    if (!PyArg_ParseTuple(args, "s|s:unsetvar", &name1, &name2))
        return NULL;

    ENTER_TCL
    code = Tcl_UnsetVar2(Tkapp_Interp(self), name1, name2, flags);
    ENTER_OVERLAP
    if (code == TCL_ERROR)
        res = Tkinter_Error(self);
    else {
        Py_INCREF(Py_None);
        res = Py_None;
    }
    LEAVE_OVERLAP_TCL
    return res;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* var_invoke ( EventFunc  func,
PyObject selfptr,
PyObject args,
int  flags 
) [static]

Definition at line 1563 of file _tkinter.c.

{
#ifdef WITH_THREAD
    TkappObject *self = (TkappObject*)selfptr;
    if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
        TkappObject *self = (TkappObject*)selfptr;
        VarEvent *ev;
        PyObject *res, *exc_type, *exc_val;
        Tcl_Condition cond = NULL;

        /* The current thread is not the interpreter thread.  Marshal
           the call to the interpreter thread, then wait for
           completion. */
        if (!WaitForMainloop(self))
            return NULL;

        ev = (VarEvent*)ckalloc(sizeof(VarEvent));

        ev->self = selfptr;
        ev->args = args;
        ev->flags = flags;
        ev->func = func;
        ev->res = &res;
        ev->exc_type = &exc_type;
        ev->exc_val = &exc_val;
        ev->cond = &cond;
        ev->ev.proc = (Tcl_EventProc*)var_proc;
        Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond, &var_mutex);
        Tcl_ConditionFinalize(&cond);
        if (!res) {
            PyErr_SetObject(exc_type, exc_val);
            Py_DECREF(exc_type);
            Py_DECREF(exc_val);
            return NULL;
        }
        return res;
    }
#endif
    /* Tcl is not threaded, or this is the interpreter thread. */
    return func(selfptr, args, flags);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int varname_converter ( PyObject in,
void _out 
) [static]

Definition at line 1512 of file _tkinter.c.

{
    char **out = (char**)_out;
    if (PyBytes_Check(in)) {
        *out = PyBytes_AsString(in);
        return 1;
    }
    if (PyUnicode_Check(in)) {
        *out = _PyUnicode_AsString(in);
        return 1;
    }
    if (PyTclObject_Check(in)) {
        *out = PyTclObject_TclString(in);
        return 1;
    }
    /* XXX: Should give diagnostics. */
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

int errorInCmd = 0 [static]

Definition at line 278 of file _tkinter.c.

PyObject* excInCmd [static]

Definition at line 279 of file _tkinter.c.

char getbusywaitinterval_doc[] [static]
Initial value:
"getbusywaitinterval() -> int\n\
\n\
Return the current busy-wait interval between successive\n\
calls to Tcl_DoOneEvent in a threaded Python interpreter."

Definition at line 2953 of file _tkinter.c.

Definition at line 2226 of file _tkinter.c.

Initial value:

Definition at line 2959 of file _tkinter.c.

struct PyModuleDef [static]
Initial value:
 {
    PyModuleDef_HEAD_INIT,
    "_tkinter",
    NULL,
    -1,
    moduleMethods,
    NULL,
    NULL,
    NULL,
    NULL
}

Definition at line 3090 of file _tkinter.c.

Initial value:
 {
    {"typename", (getter)get_typename, NULL, get_typename__doc__},
    {"string", (getter)PyTclObject_string, NULL,
     PyTclObject_string__doc__},
    {0},
}

Definition at line 893 of file _tkinter.c.

static PyTypeObject PyTclObject_Type [static]

Definition at line 759 of file _tkinter.c.

int quitMainLoop = 0 [static]

Definition at line 277 of file _tkinter.c.

char setbusywaitinterval_doc[] [static]
Initial value:
"setbusywaitinterval(n) -> None\n\
\n\
Set the busy-wait interval in milliseconds between successive\n\
calls to Tcl_DoOneEvent in a threaded Python interpreter.\n\
It should be set to a divisor of the maximum time between\n\
frames in an animation."

Definition at line 2939 of file _tkinter.c.

int stdin_ready = 0 [static]

Definition at line 2972 of file _tkinter.c.

int tk_load_failed = 0 [static]

Definition at line 284 of file _tkinter.c.

Definition at line 2693 of file _tkinter.c.

static PyTypeObject Tkapp_Type [static]

Definition at line 245 of file _tkinter.c.

Definition at line 299 of file _tkinter.c.

Definition at line 276 of file _tkinter.c.

Initial value:
{
    {"deletetimerhandler", Tktt_DeleteTimerHandler, METH_VARARGS},
    {NULL, NULL}
}

Definition at line 2377 of file _tkinter.c.

static PyTypeObject Tktt_Type [static]

Definition at line 2348 of file _tkinter.c.

PyObject* trbInCmd [static]

Definition at line 281 of file _tkinter.c.

PyObject* valInCmd [static]

Definition at line 280 of file _tkinter.c.