| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  | /***********************************************************
 | 
					
						
							|  |  |  | Copyright (C) 1994 Steen Lumholt. | 
					
						
							|  |  |  | Copyright 1994-1995 by Stichting Mathematisch Centrum, Amsterdam, | 
					
						
							|  |  |  | The Netherlands. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         All Rights Reserved | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | Permission to use, copy, modify, and distribute this software and its | 
					
						
							|  |  |  | documentation for any purpose and without fee is hereby granted, | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  | provided that the above copyright notice appear in all copies and that | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | both that copyright notice and this permission notice appear in | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  | supporting documentation, and that the names of Stichting Mathematisch | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | Centrum or CWI or Corporation for National Research Initiatives or | 
					
						
							|  |  |  | CNRI not be used in advertising or publicity pertaining to | 
					
						
							|  |  |  | distribution of the software without specific, written prior | 
					
						
							|  |  |  | permission. | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | While CWI is the initial source for this software, a modified version | 
					
						
							|  |  |  | is made available by the Corporation for National Research Initiatives | 
					
						
							|  |  |  | (CNRI) at the Internet address ftp://ftp.python.org.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH | 
					
						
							|  |  |  | REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF | 
					
						
							|  |  |  | MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH | 
					
						
							|  |  |  | CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL | 
					
						
							|  |  |  | DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR | 
					
						
							|  |  |  | PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | 
					
						
							|  |  |  | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | 
					
						
							|  |  |  | PERFORMANCE OF THIS SOFTWARE. | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ******************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* _tkinter.c -- Interface to libtk.a and libtcl.a. */ | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  | /* TCL/TK VERSION INFO:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Unix: | 
					
						
							|  |  |  | 	This should work with any version from Tcl 4.0 / Tck 7.4. | 
					
						
							|  |  |  | 	Do not use older versions. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Mac and Windows: | 
					
						
							|  |  |  | 	Use Tcl 4.1p1 / Tk 7.5p1 or possibly newer. | 
					
						
							|  |  |  | 	It does not seem to work reliably with the original 4.1/7.5 | 
					
						
							|  |  |  | 	release.  (4.0/7.4 were never released for these platforms.) | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											1996-08-08 19:09:53 +00:00
										 |  |  | #include <ctype.h>
 | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-20 20:49:56 +00:00
										 |  |  | #ifdef macintosh
 | 
					
						
							|  |  |  | #define MAC_TCL
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | #include <tcl.h>
 | 
					
						
							|  |  |  | #include <tk.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-31 19:51:15 +00:00
										 |  |  | extern char *Py_GetProgramName (); | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | /* Internal declarations from tkInt.h.  */ | 
					
						
							|  |  |  | #if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
 | 
					
						
							|  |  |  | extern int Tk_GetNumMainWindows(); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | extern int tk_NumMainWindows; | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | #define Tk_GetNumMainWindows() (tk_NumMainWindows)
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | #define NEED_TKCREATEMAINWINDOW 1
 | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if TK_MAJOR_VERSION < 4
 | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  | extern struct { Tk_Window win; } *tkMainWindowList; | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | #ifdef macintosh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | ** Additional cruft needed by Tcl/Tk on the Mac. | 
					
						
							| 
									
										
										
										
											1996-08-08 19:09:53 +00:00
										 |  |  | ** This is for Tcl 7.5 and Tk 4.1 (patch release 1). | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  | /* ckfree() expects a char* */ | 
					
						
							| 
									
										
										
										
											1996-08-08 19:09:53 +00:00
										 |  |  | #define FREECAST (char *)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | #include <Events.h> /* For EventRecord */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef int (*TclMacConvertEventPtr) Py_PROTO((EventRecord *eventPtr)); | 
					
						
							|  |  |  | void TclMacSetEventProc Py_PROTO((TclMacConvertEventPtr procPtr)); | 
					
						
							|  |  |  | int TkMacConvertEvent Py_PROTO((EventRecord *eventPtr)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | staticforward int PyMacConvertEvent Py_PROTO((EventRecord *eventPtr)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* macintosh */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-08 19:09:53 +00:00
										 |  |  | #ifndef FREECAST
 | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  | #define FREECAST (char *)
 | 
					
						
							| 
									
										
										
										
											1996-08-08 19:09:53 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | /**** Tkapp Object Declaration ****/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | staticforward PyTypeObject Tkapp_Type; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     PyObject_HEAD | 
					
						
							|  |  |  |     Tcl_Interp *interp; | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | #ifdef NEED_TKCREATEMAINWINDOW
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     Tk_Window tkwin; | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | TkappObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define Tkapp_Check(v) ((v)->ob_type == &Tkapp_Type)
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | #ifdef NEED_TKCREATEMAINWINDOW
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | #define Tkapp_Tkwin(v)  (((TkappObject *) (v))->tkwin)
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | #define Tkapp_Interp(v) (((TkappObject *) (v))->interp)
 | 
					
						
							|  |  |  | #define Tkapp_Result(v) (((TkappObject *) (v))->interp->result)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define DEBUG_REFCNT(v) (printf ("DEBUG: id=%p, refcnt=%i\n", \
 | 
					
						
							|  |  |  | 				 (void *) v, ((PyObject *) v)->ob_refcnt)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**** Error Handling ****/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject *Tkinter_TclError; | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  | static int quitMainLoop = 0; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | static int errorInCmd = 0; | 
					
						
							|  |  |  | static PyObject *excInCmd; | 
					
						
							|  |  |  | static PyObject *valInCmd; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:30:30 +00:00
										 |  |  | static PyObject *trbInCmd; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkinter_Error (v) | 
					
						
							|  |  |  |      PyObject *v; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PyErr_SetString (Tkinter_TclError, Tkapp_Result (v)); | 
					
						
							|  |  |  |   return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | PythonCmd_Error (interp) | 
					
						
							|  |  |  |      Tcl_Interp *interp; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   errorInCmd = 1; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:30:30 +00:00
										 |  |  |   PyErr_Fetch (&excInCmd, &valInCmd, &trbInCmd); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   return TCL_ERROR; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**** Utils ****/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char * | 
					
						
							|  |  |  | AsString (value, tmp) | 
					
						
							|  |  |  |      PyObject *value; | 
					
						
							|  |  |  |      PyObject *tmp; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (PyString_Check (value)) | 
					
						
							|  |  |  |     return PyString_AsString (value); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       PyObject *v; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-17 16:13:48 +00:00
										 |  |  |       v = PyObject_Str (value); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |       PyList_Append (tmp, v); | 
					
						
							|  |  |  |       Py_DECREF (v); | 
					
						
							|  |  |  |       return PyString_AsString (v); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define ARGSZ 64
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char * | 
					
						
							|  |  |  | Merge (args) | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PyObject *tmp; | 
					
						
							|  |  |  |   char *argvStore[ARGSZ]; | 
					
						
							|  |  |  |   char **argv; | 
					
						
							|  |  |  |   int fvStore[ARGSZ]; | 
					
						
							|  |  |  |   int *fv; | 
					
						
							|  |  |  |   int argc; | 
					
						
							|  |  |  |   char *res; | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tmp = PyList_New (0); | 
					
						
							|  |  |  |   argv = argvStore; | 
					
						
							|  |  |  |   fv = fvStore; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  |   if (args == NULL) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       argc = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   else if (!PyTuple_Check (args)) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       argc = 1; | 
					
						
							|  |  |  |       fv[0] = 0; | 
					
						
							|  |  |  |       argv[0] = AsString (args, tmp); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       PyObject *v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (PyTuple_Size (args) > ARGSZ) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  | 	  argv = (char **) ckalloc (PyTuple_Size (args) * sizeof (char *)); | 
					
						
							|  |  |  | 	  fv = (int *) ckalloc (PyTuple_Size (args) * sizeof (int)); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 	  if (argv == NULL || fv == NULL) | 
					
						
							|  |  |  | 	    PyErr_NoMemory (); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       argc = PyTuple_Size (args); | 
					
						
							|  |  |  |       for (i = 0; i < argc; i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  v = PyTuple_GetItem (args, i); | 
					
						
							|  |  |  | 	  if (PyTuple_Check (v)) | 
					
						
							|  |  |  | 	    { | 
					
						
							|  |  |  | 	      fv[i] = 1; | 
					
						
							|  |  |  | 	      argv[i] = Merge (v); | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 	  else if (v == Py_None) | 
					
						
							|  |  |  | 	    { | 
					
						
							|  |  |  | 	      argc = i; | 
					
						
							|  |  |  | 	      break; | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 	  else | 
					
						
							|  |  |  | 	    { | 
					
						
							|  |  |  | 	      fv[i] = 0; | 
					
						
							|  |  |  | 	      argv[i] = AsString (v, tmp); | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   res = Tcl_Merge (argc, argv); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Py_DECREF (tmp); | 
					
						
							|  |  |  |   for (i = 0; i < argc; i++) | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |     if (fv[i]) ckfree (argv[i]); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   if (argv != argvStore) | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |     ckfree (FREECAST argv); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   if (fv != fvStore) | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |     ckfree (FREECAST fv); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Split (self, list) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      char *list; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   int argc; | 
					
						
							|  |  |  |   char **argv; | 
					
						
							|  |  |  |   PyObject *v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (list == NULL) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       Py_INCREF (Py_None); | 
					
						
							|  |  |  |       return Py_None; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (Tcl_SplitList (Tkapp_Interp (self), list, &argc, &argv) == TCL_ERROR) | 
					
						
							| 
									
										
										
										
											1996-12-17 01:25:36 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       /* Not a list.
 | 
					
						
							|  |  |  | 	 Could be a quoted string containing funnies, e.g. {"}. | 
					
						
							|  |  |  | 	 Return the string itself. */ | 
					
						
							|  |  |  |       PyErr_Clear(); | 
					
						
							|  |  |  |       return PyString_FromString(list); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (argc == 0) | 
					
						
							|  |  |  |     v = PyString_FromString (""); | 
					
						
							|  |  |  |   else if (argc == 1) | 
					
						
							|  |  |  |     v = PyString_FromString (argv[0]); | 
					
						
							| 
									
										
										
										
											1996-12-17 01:02:18 +00:00
										 |  |  |   else if ((v = PyTuple_New (argc)) != NULL) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       int i; | 
					
						
							| 
									
										
										
										
											1996-12-17 01:02:18 +00:00
										 |  |  |       PyObject *w; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       for (i = 0; i < argc; i++) { | 
					
						
							|  |  |  | 	if ((w = Split (self, argv[i])) == NULL) | 
					
						
							|  |  |  | 	  { | 
					
						
							|  |  |  | 	    Py_DECREF(v); | 
					
						
							|  |  |  | 	    v = NULL; | 
					
						
							|  |  |  | 	    break; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	PyTuple_SetItem (v, i, w); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |   ckfree (FREECAST argv); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**** Tkapp Object ****/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef WITH_APPINIT
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | Tcl_AppInit (interp) | 
					
						
							|  |  |  |      Tcl_Interp *interp; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  |   Tk_Window main; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   main = Tk_MainWindow(interp); | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  |   if (Tcl_Init (interp) == TCL_ERROR) { | 
					
						
							|  |  |  |     fprintf(stderr, "Tcl_Init error: %s\n", interp->result); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     return TCL_ERROR; | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (Tk_Init (interp) == TCL_ERROR) { | 
					
						
							|  |  |  |     fprintf(stderr, "Tk_Init error: %s\n", interp->result); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     return TCL_ERROR; | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   return TCL_OK; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | #endif /* !WITH_APPINIT */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Initialize the Tk application; see the `main' function in
 | 
					
						
							|  |  |  |    `tkMain.c'.  */ | 
					
						
							|  |  |  | static TkappObject * | 
					
						
							|  |  |  | Tkapp_New (screenName, baseName, className, interactive) | 
					
						
							|  |  |  |      char *screenName; | 
					
						
							|  |  |  |      char *baseName; | 
					
						
							|  |  |  |      char *className; | 
					
						
							|  |  |  |      int interactive; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   TkappObject *v; | 
					
						
							| 
									
										
										
										
											1996-08-08 19:09:53 +00:00
										 |  |  |   char *argv0; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   v = PyObject_NEW (TkappObject, &Tkapp_Type); | 
					
						
							|  |  |  |   if (v == NULL) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   v->interp = Tcl_CreateInterp (); | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef NEED_TKCREATEMAINWINDOW
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   v->tkwin = Tk_CreateMainWindow (v->interp, screenName,  | 
					
						
							|  |  |  | 				  baseName, className); | 
					
						
							|  |  |  |   if (v->tkwin == NULL) | 
					
						
							|  |  |  |     return (TkappObject *) Tkinter_Error ((PyObject *) v); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Tk_GeometryRequest (v->tkwin, 200, 200); | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-08 19:09:53 +00:00
										 |  |  |   /* This is used to get the application class for Tk 4.1 and up */ | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |   argv0 = (char*) ckalloc (strlen (className) + 1); | 
					
						
							| 
									
										
										
										
											1996-08-08 19:09:53 +00:00
										 |  |  |   if (argv0 != NULL) { | 
					
						
							|  |  |  |     strcpy (argv0, className); | 
					
						
							|  |  |  |     if (isupper (argv0[0])) | 
					
						
							|  |  |  |       argv0[0] = tolower (argv0[0]); | 
					
						
							|  |  |  |     Tcl_SetVar (v->interp, "argv0", argv0, TCL_GLOBAL_ONLY); | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |     ckfree (argv0); | 
					
						
							| 
									
										
										
										
											1996-08-08 19:09:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   if (Tcl_AppInit (v->interp) != TCL_OK) | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  |     return (TkappObject *) Tkinter_Error (v); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Tcl Eval **/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_Call (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *cmd; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cmd = Merge (args); | 
					
						
							|  |  |  |   if (Tcl_Eval (Tkapp_Interp (self), cmd) == TCL_ERROR) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |       ckfree (cmd); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |       return Tkinter_Error (self); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |   ckfree (cmd); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   return PyString_FromString (Tkapp_Result (self)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GlobalCall (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *cmd; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cmd = Merge (args); | 
					
						
							|  |  |  |   if (Tcl_GlobalEval (Tkapp_Interp (self), cmd) == TCL_ERROR) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |       ckfree (cmd); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |       return Tkinter_Error (self); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |   ckfree (cmd); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   return PyString_FromString (Tkapp_Result (self)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_Eval (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *script; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &script)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (Tcl_Eval (Tkapp_Interp (self), script) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   return PyString_FromString (Tkapp_Result (self)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GlobalEval (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *script; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &script)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (Tcl_GlobalEval (Tkapp_Interp (self), script) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return PyString_FromString (Tkapp_Result (self)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_EvalFile (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *fileName; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &fileName)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (Tcl_EvalFile (Tkapp_Interp (self), fileName) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return PyString_FromString (Tkapp_Result (self)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_Record (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *script; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &script)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (Tcl_RecordAndEval (Tkapp_Interp (self),  | 
					
						
							|  |  |  | 			 script, TCL_NO_EVAL) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return PyString_FromString (Tkapp_Result (self)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_AddErrorInfo (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *msg; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &msg)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   Tcl_AddErrorInfo (Tkapp_Interp (self), msg); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Py_INCREF(Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Tcl Variable **/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | SetVar (self, args, flags) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  |      int flags; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *name1, *name2, *ok; | 
					
						
							|  |  |  |   PyObject *newValue; | 
					
						
							|  |  |  |   PyObject *tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tmp = PyList_New (0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (PyArg_Parse (args, "(sO)", &name1, &newValue)) | 
					
						
							|  |  |  |     ok = Tcl_SetVar (Tkapp_Interp (self), name1,  | 
					
						
							|  |  |  | 		     AsString (newValue, tmp), flags); /* XXX Merge? */ | 
					
						
							|  |  |  |   else if (PyArg_Parse (args, "(ssO)", &name1, &name2, &newValue)) | 
					
						
							|  |  |  |     ok = Tcl_SetVar2 (Tkapp_Interp (self), name1, name2,  | 
					
						
							|  |  |  | 		      AsString (newValue, tmp), flags); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       Py_DECREF (tmp); | 
					
						
							|  |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   Py_DECREF (tmp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!ok) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Py_INCREF (Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_SetVar (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return SetVar (self, args, TCL_LEAVE_ERR_MSG); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GlobalSetVar (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return SetVar (self, args, TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | GetVar (self, args, flags) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  |      int flags; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *name1, *name2, *s; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (PyArg_Parse (args, "s", &name1)) | 
					
						
							|  |  |  |     s = Tcl_GetVar (Tkapp_Interp (self), name1, flags); | 
					
						
							|  |  |  |   else if (PyArg_Parse (args, "(ss)", &name1, &name2)) | 
					
						
							|  |  |  |     s = Tcl_GetVar2 (Tkapp_Interp (self), name1, name2, flags); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (s == NULL) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return PyString_FromString (s); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GetVar (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return GetVar (self, args, TCL_LEAVE_ERR_MSG); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GlobalGetVar (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return GetVar (self, args, TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | UnsetVar (self, args, flags) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  |      int flags; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *name1, *name2; | 
					
						
							|  |  |  |   int code; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (PyArg_Parse (args, "s", &name1)) | 
					
						
							|  |  |  |     code = Tcl_UnsetVar (Tkapp_Interp (self), name1, flags); | 
					
						
							|  |  |  |   else if (PyArg_Parse (args, "(ss)", &name1, &name2)) | 
					
						
							|  |  |  |     code = Tcl_UnsetVar2 (Tkapp_Interp (self), name1, name2, flags); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (code == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Py_INCREF (Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_UnsetVar (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return UnsetVar (self, args, TCL_LEAVE_ERR_MSG); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GlobalUnsetVar (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return UnsetVar (self, args, TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Tcl to Python **/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GetInt (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  |   int v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &s)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (Tcl_GetInt (Tkapp_Interp (self), s, &v) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  |   return Py_BuildValue ("i", v); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GetDouble (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  |   double v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &s)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (Tcl_GetDouble (Tkapp_Interp (self), s, &v) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  |   return Py_BuildValue ("d", v); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GetBoolean (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  |   int v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &s)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (Tcl_GetBoolean (Tkapp_Interp (self), s, &v) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  |   return Py_BuildValue ("i", v); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_ExprString (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &s)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (Tcl_ExprString (Tkapp_Interp (self), s) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  |   return Py_BuildValue ("s", Tkapp_Result (self)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_ExprLong (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  |   long v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &s)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (Tcl_ExprLong (Tkapp_Interp (self), s, &v) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  |   return Py_BuildValue ("l", v); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_ExprDouble (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  |   double v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &s)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (Tcl_ExprDouble (Tkapp_Interp (self), s, &v) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  |   return Py_BuildValue ("d", v); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_ExprBoolean (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  |   int v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &s)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (Tcl_ExprBoolean (Tkapp_Interp (self), s, &v) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  |   return Py_BuildValue ("i", v); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_SplitList (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *list; | 
					
						
							|  |  |  |   int argc; | 
					
						
							|  |  |  |   char **argv; | 
					
						
							|  |  |  |   PyObject *v; | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &list)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (Tcl_SplitList (Tkapp_Interp (self), list, &argc, &argv) == TCL_ERROR) | 
					
						
							|  |  |  |     return Tkinter_Error (self); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   v = PyTuple_New (argc); | 
					
						
							|  |  |  |   for (i = 0; i < argc; i++) | 
					
						
							|  |  |  |     PyTuple_SetItem (v, i, PyString_FromString (argv[i])); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |   ckfree (FREECAST argv); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_Split (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *list; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &list)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   return Split (self, list); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_Merge (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  |   PyObject *v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   s = Merge (args); | 
					
						
							|  |  |  |   v = PyString_FromString (s); | 
					
						
							| 
									
										
										
										
											1996-08-13 21:10:16 +00:00
										 |  |  |   ckfree (s); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Tcl Command **/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* This is the Tcl command that acts as a wrapper for Python
 | 
					
						
							|  |  |  |    function or method.  */ | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | PythonCmd (clientData, interp, argc, argv) | 
					
						
							|  |  |  |      ClientData clientData;	/* Is (self, func) */ | 
					
						
							|  |  |  |      Tcl_Interp *interp; | 
					
						
							|  |  |  |      int argc; | 
					
						
							|  |  |  |      char *argv[]; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PyObject *self, *func, *arg, *res, *tmp; | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   self = PyTuple_GetItem ((PyObject *) clientData, 0); | 
					
						
							|  |  |  |   func = PyTuple_GetItem ((PyObject *) clientData, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Create argument list (argv1, ..., argvN) */ | 
					
						
							|  |  |  |   arg = PyTuple_New (argc - 1); | 
					
						
							|  |  |  |   for (i = 0; i < (argc - 1); i++) | 
					
						
							|  |  |  |     PyTuple_SetItem (arg, i, PyString_FromString (argv[i + 1])); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   res = PyEval_CallObject (func, arg); | 
					
						
							|  |  |  |   Py_DECREF (arg); | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   if (res == NULL) | 
					
						
							|  |  |  |     return PythonCmd_Error (interp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tmp = PyList_New (0); | 
					
						
							|  |  |  |   Tcl_SetResult (Tkapp_Interp (self), AsString (res, tmp), TCL_VOLATILE); | 
					
						
							|  |  |  |   Py_DECREF (res); | 
					
						
							|  |  |  |   Py_DECREF (tmp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return TCL_OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | PythonCmdDelete (clientData) | 
					
						
							|  |  |  |      ClientData clientData;	/* Is (self, func) */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Py_DECREF ((PyObject *) clientData); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_CreateCommand (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *cmdName; | 
					
						
							|  |  |  |   PyObject *data; | 
					
						
							|  |  |  |   PyObject *func; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   /* Args is: (cmdName, func) */ | 
					
						
							|  |  |  |   if (!PyTuple_Check (args)  | 
					
						
							|  |  |  |       || !(PyTuple_Size (args) == 2) | 
					
						
							|  |  |  |       || !PyString_Check (PyTuple_GetItem (args, 0)) | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  |       || !PyCallable_Check (PyTuple_GetItem (args, 1))) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       PyErr_SetString (PyExc_TypeError, "bad argument list"); | 
					
						
							|  |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cmdName = PyString_AsString (PyTuple_GetItem (args, 0)); | 
					
						
							|  |  |  |   func = PyTuple_GetItem (args, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   data = PyTuple_New (2);   /* ClientData is: (self, func) */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Py_INCREF (self); | 
					
						
							|  |  |  |   PyTuple_SetItem (data, 0, self); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Py_INCREF (func); | 
					
						
							|  |  |  |   PyTuple_SetItem (data, 1, func); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Tcl_CreateCommand (Tkapp_Interp (self), cmdName, PythonCmd, | 
					
						
							|  |  |  | 		     (ClientData) data, PythonCmdDelete); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Py_INCREF (Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_DeleteCommand (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *cmdName; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "s", &cmdName)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (Tcl_DeleteCommand (Tkapp_Interp (self), cmdName) == -1) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       PyErr_SetString (Tkinter_TclError, "can't delete Tcl command"); | 
					
						
							|  |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   Py_INCREF (Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** File Handler **/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-10 20:56:29 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | FileHandler (clientData, mask) | 
					
						
							| 
									
										
										
										
											1994-06-27 07:59:42 +00:00
										 |  |  |      ClientData clientData;	/* Is: (func, file) */ | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |      int mask; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1994-06-27 07:59:42 +00:00
										 |  |  |   PyObject *func, *file, *arg, *res; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-27 07:59:42 +00:00
										 |  |  |   func = PyTuple_GetItem ((PyObject *) clientData, 0); | 
					
						
							|  |  |  |   file = PyTuple_GetItem ((PyObject *) clientData, 1); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-27 07:59:42 +00:00
										 |  |  |   arg = Py_BuildValue ("(Oi)", file, (long) mask); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   res = PyEval_CallObject (func, arg); | 
					
						
							|  |  |  |   Py_DECREF (arg); | 
					
						
							|  |  |  |   if (res == NULL) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       errorInCmd = 1; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:30:30 +00:00
										 |  |  |       PyErr_Fetch (&excInCmd, &valInCmd, &trbInCmd); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											1994-08-09 14:15:19 +00:00
										 |  |  |   Py_XDECREF (res); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | GetFileNo (file) | 
					
						
							|  |  |  | 	PyObject *file; /* Either an int >= 0 or an object with a
 | 
					
						
							|  |  |  | 			   .fileno() method that returns an int >= 0 */ | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1995-01-10 20:56:29 +00:00
										 |  |  | 	PyObject *meth, *args, *res; | 
					
						
							| 
									
										
										
										
											1994-08-09 14:15:19 +00:00
										 |  |  | 	int id; | 
					
						
							|  |  |  | 	if (PyInt_Check(file)) { | 
					
						
							|  |  |  | 		id = PyInt_AsLong(file); | 
					
						
							|  |  |  | 		if (id < 0) | 
					
						
							|  |  |  | 			PyErr_SetString(PyExc_ValueError, "invalid file id"); | 
					
						
							|  |  |  | 		return id; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	meth = PyObject_GetAttrString(file, "fileno"); | 
					
						
							|  |  |  | 	if (meth == NULL) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	args = PyTuple_New(0); | 
					
						
							|  |  |  | 	if (args == NULL) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	res = PyEval_CallObject(meth, args); | 
					
						
							|  |  |  | 	Py_DECREF(args); | 
					
						
							|  |  |  | 	Py_DECREF(meth); | 
					
						
							|  |  |  | 	if (res == NULL) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	if (PyInt_Check(res)) | 
					
						
							|  |  |  | 		id = PyInt_AsLong(res); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		id = -1; | 
					
						
							|  |  |  | 	if (id < 0) | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_ValueError, | 
					
						
							|  |  |  | 				"invalid fileno() return value"); | 
					
						
							|  |  |  | 	Py_DECREF(res); | 
					
						
							|  |  |  | 	return id; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_CreateFileHandler (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args;		/* Is (file, mask, func) */ | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1994-06-27 07:59:42 +00:00
										 |  |  |   PyObject *file, *func, *data; | 
					
						
							|  |  |  |   int mask, id; | 
					
						
							| 
									
										
										
										
											1996-05-16 17:17:31 +00:00
										 |  |  | #if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
 | 
					
						
							|  |  |  |   Tcl_File tfile; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "(OiO)", &file, &mask, &func)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											1994-08-09 14:15:19 +00:00
										 |  |  |   id = GetFileNo (file); | 
					
						
							|  |  |  |   if (id < 0) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  |   if (!PyCallable_Check(func)) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       PyErr_SetString (PyExc_TypeError, "bad argument list"); | 
					
						
							|  |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-27 07:59:42 +00:00
										 |  |  |   /* ClientData is: (func, file) */ | 
					
						
							|  |  |  |   data = Py_BuildValue ("(OO)", func, file); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-05-16 17:17:31 +00:00
										 |  |  | #if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
 | 
					
						
							| 
									
										
										
										
											1996-09-11 23:31:42 +00:00
										 |  |  | #ifdef MS_WINDOWS
 | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  |   /* We assume this is a socket... */ | 
					
						
							|  |  |  |   tfile = Tcl_GetFile((ClientData)id, TCL_WIN_SOCKET); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											1996-05-16 17:17:31 +00:00
										 |  |  |   tfile = Tcl_GetFile((ClientData)id, TCL_UNIX_FD); | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1996-05-16 17:17:31 +00:00
										 |  |  |   /* Oughtta check for null Tcl_File object... */ | 
					
						
							|  |  |  |   Tcl_CreateFileHandler (tfile, mask, FileHandler, (ClientData) data); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  |   Tk_CreateFileHandler (id, mask, FileHandler, (ClientData) data); | 
					
						
							| 
									
										
										
										
											1996-05-16 17:17:31 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   /* XXX fileHandlerDict */ | 
					
						
							| 
									
										
										
										
											1994-06-27 07:59:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   Py_INCREF (Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_DeleteFileHandler (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args;		/* Args: file */ | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1994-08-09 14:15:19 +00:00
										 |  |  |   PyObject *file; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   int id; | 
					
						
							| 
									
										
										
										
											1996-05-16 17:17:31 +00:00
										 |  |  | #if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
 | 
					
						
							|  |  |  |   Tcl_File tfile; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											1994-08-09 14:15:19 +00:00
										 |  |  |   if (!PyArg_Parse (args, "O", &file)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   id = GetFileNo (file); | 
					
						
							|  |  |  |   if (id < 0) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-05-16 17:17:31 +00:00
										 |  |  | #if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
 | 
					
						
							| 
									
										
										
										
											1996-09-11 23:31:42 +00:00
										 |  |  | #ifdef MS_WINDOWS
 | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  |   /* We assume this is a socket... */ | 
					
						
							|  |  |  |   tfile = Tcl_GetFile((ClientData)id, TCL_WIN_SOCKET); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   tfile = Tcl_GetFile((ClientData)id, TCL_UNIX_FD); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1996-05-16 17:17:31 +00:00
										 |  |  |   /* Oughtta check for null Tcl_File object... */ | 
					
						
							|  |  |  |   Tcl_DeleteFileHandler(tfile); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											1996-06-26 18:26:04 +00:00
										 |  |  |   Tk_DeleteFileHandler (id); | 
					
						
							| 
									
										
										
										
											1996-05-16 17:17:31 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   /* XXX fileHandlerDict */ | 
					
						
							|  |  |  |   Py_INCREF (Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-11-10 22:50:21 +00:00
										 |  |  | /**** Tktt Object (timer token) ****/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | staticforward PyTypeObject Tktt_Type; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     PyObject_HEAD | 
					
						
							|  |  |  |     Tk_TimerToken token; | 
					
						
							|  |  |  |     PyObject *func; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | TkttObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tktt_DeleteTimerHandler (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   TkttObject *v = (TkttObject *) self; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "")) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (v->func != NULL) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       Tk_DeleteTimerHandler (v->token); | 
					
						
							|  |  |  |       PyMem_DEL (v->func); | 
					
						
							|  |  |  |       v->func = NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   Py_INCREF (Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef Tktt_methods[] = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   {"deletetimerhandler", Tktt_DeleteTimerHandler}, | 
					
						
							|  |  |  |   {NULL, NULL} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static TkttObject * | 
					
						
							|  |  |  | Tktt_New (token, func) | 
					
						
							|  |  |  |      Tk_TimerToken token; | 
					
						
							|  |  |  |      PyObject *func; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   TkttObject *v; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   v = PyObject_NEW (TkttObject, &Tktt_Type); | 
					
						
							|  |  |  |   if (v == NULL) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   v->token = token; | 
					
						
							|  |  |  |   v->func = func; | 
					
						
							|  |  |  |   Py_INCREF (v->func); | 
					
						
							|  |  |  |   return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | Tktt_Dealloc (self) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PyMem_DEL (self); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | Tktt_Print (self, fp, flags) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      FILE *fp; | 
					
						
							|  |  |  |      int flags; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   TkttObject *v = (TkttObject *) self; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-05 23:43:35 +00:00
										 |  |  |   fprintf(fp, "<tktimertoken at 0x%lx%s>", (long)v, | 
					
						
							| 
									
										
										
										
											1994-11-10 22:50:21 +00:00
										 |  |  |     v->func == NULL ? ", handler deleted" : ""); | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tktt_GetAttr (self, name) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      char *name; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return Py_FindMethod (Tktt_methods, self, name); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyTypeObject Tktt_Type = | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1996-08-21 19:03:36 +00:00
										 |  |  |   PyObject_HEAD_INIT (NULL) | 
					
						
							| 
									
										
										
										
											1994-11-10 22:50:21 +00:00
										 |  |  |   0,				/*ob_size */ | 
					
						
							|  |  |  |   "tktimertoken",		/*tp_name */ | 
					
						
							|  |  |  |   sizeof (TkttObject),		/*tp_basicsize */ | 
					
						
							|  |  |  |   0,				/*tp_itemsize */ | 
					
						
							|  |  |  |   Tktt_Dealloc,			/*tp_dealloc */ | 
					
						
							|  |  |  |   Tktt_Print,			/*tp_print */ | 
					
						
							|  |  |  |   Tktt_GetAttr,			/*tp_getattr */ | 
					
						
							|  |  |  |   0,				/*tp_setattr */ | 
					
						
							|  |  |  |   0,				/*tp_compare */ | 
					
						
							|  |  |  |   0,				/*tp_repr */ | 
					
						
							|  |  |  |   0,				/*tp_as_number */ | 
					
						
							|  |  |  |   0,				/*tp_as_sequence */ | 
					
						
							|  |  |  |   0,				/*tp_as_mapping */ | 
					
						
							|  |  |  |   0,				/*tp_hash */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Timer Handler **/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | TimerHandler (clientData) | 
					
						
							|  |  |  |      ClientData clientData; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PyObject *func = (PyObject *) clientData; | 
					
						
							|  |  |  |   PyObject *arg, *res; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   arg = PyTuple_New (0); | 
					
						
							|  |  |  |   res = PyEval_CallObject (func, arg); | 
					
						
							|  |  |  |   Py_DECREF (arg); | 
					
						
							|  |  |  |   if (res == NULL) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       errorInCmd = 1; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:30:30 +00:00
										 |  |  |       PyErr_Fetch (&excInCmd, &valInCmd, &trbInCmd); | 
					
						
							| 
									
										
										
										
											1994-11-10 22:50:21 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											1995-01-02 19:30:30 +00:00
										 |  |  |   else | 
					
						
							|  |  |  |     Py_DECREF (res); | 
					
						
							| 
									
										
										
										
											1994-11-10 22:50:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_CreateTimerHandler (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args;		/* Is (milliseconds, func) */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   int milliseconds; | 
					
						
							|  |  |  |   PyObject *func; | 
					
						
							|  |  |  |   Tk_TimerToken token; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "(iO)", &milliseconds, &func)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  |   if (!PyCallable_Check(func)) | 
					
						
							| 
									
										
										
										
											1994-11-10 22:50:21 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       PyErr_SetString (PyExc_TypeError, "bad argument list"); | 
					
						
							|  |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   token = Tk_CreateTimerHandler(milliseconds, TimerHandler, (ClientData) func); | 
					
						
							|  |  |  |   return (PyObject *) Tktt_New (token, func); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | /** Event Loop **/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_MainLoop (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1994-11-10 22:50:21 +00:00
										 |  |  |   int threshold = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-07-26 17:29:45 +00:00
										 |  |  |   if (!PyArg_ParseTuple (args, "|i", &threshold)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   quitMainLoop = 0; | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  |   while (Tk_GetNumMainWindows() > threshold && !quitMainLoop && !errorInCmd) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											1996-12-05 23:43:35 +00:00
										 |  |  | 	    /* XXX Ought to check for other signals! */ | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |       if (PyOS_InterruptOccurred ()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  PyErr_SetNone (PyExc_KeyboardInterrupt); | 
					
						
							|  |  |  | 	  return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       Tk_DoOneEvent (0); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1995-09-30 17:00:24 +00:00
										 |  |  |   quitMainLoop = 0; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (errorInCmd) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       errorInCmd = 0; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:30:30 +00:00
										 |  |  |       PyErr_Restore (excInCmd, valInCmd, trbInCmd); | 
					
						
							|  |  |  |       excInCmd = valInCmd = trbInCmd = NULL; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   Py_INCREF (Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-10 17:42:51 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_DoOneEvent (self, args) | 
					
						
							|  |  |  |     PyObject *self; | 
					
						
							|  |  |  |     PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1995-07-26 17:29:45 +00:00
										 |  |  |     int	flags = TK_ALL_EVENTS; | 
					
						
							| 
									
										
										
										
											1995-01-10 17:42:51 +00:00
										 |  |  |     int rv; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-07-26 17:29:45 +00:00
										 |  |  |     if (!PyArg_ParseTuple (args, "|i", &flags)) | 
					
						
							|  |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											1995-01-10 17:42:51 +00:00
										 |  |  |     rv = Tk_DoOneEvent(flags); | 
					
						
							|  |  |  |     return Py_BuildValue ("i", rv); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_Quit (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!PyArg_Parse (args, "")) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   quitMainLoop = 1; | 
					
						
							|  |  |  |   Py_INCREF (Py_None); | 
					
						
							|  |  |  |   return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**** Tkapp Method List ****/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef Tkapp_methods[] = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   {"call", Tkapp_Call}, | 
					
						
							|  |  |  |   {"globalcall", Tkapp_GlobalCall}, | 
					
						
							|  |  |  |   {"eval", Tkapp_Eval}, | 
					
						
							|  |  |  |   {"globaleval", Tkapp_GlobalEval}, | 
					
						
							|  |  |  |   {"evalfile", Tkapp_EvalFile}, | 
					
						
							|  |  |  |   {"record", Tkapp_Record}, | 
					
						
							|  |  |  |   {"adderrorinfo", Tkapp_AddErrorInfo}, | 
					
						
							|  |  |  |   {"setvar", Tkapp_SetVar}, | 
					
						
							|  |  |  |   {"globalsetvar", Tkapp_GlobalSetVar}, | 
					
						
							|  |  |  |   {"getvar", Tkapp_GetVar}, | 
					
						
							|  |  |  |   {"globalgetvar", Tkapp_GlobalGetVar}, | 
					
						
							|  |  |  |   {"unsetvar", Tkapp_UnsetVar}, | 
					
						
							|  |  |  |   {"globalunsetvar", Tkapp_GlobalUnsetVar}, | 
					
						
							|  |  |  |   {"getint", Tkapp_GetInt}, | 
					
						
							|  |  |  |   {"getdouble", Tkapp_GetDouble}, | 
					
						
							|  |  |  |   {"getboolean", Tkapp_GetBoolean}, | 
					
						
							|  |  |  |   {"exprstring", Tkapp_ExprString}, | 
					
						
							|  |  |  |   {"exprlong", Tkapp_ExprLong}, | 
					
						
							|  |  |  |   {"exprdouble", Tkapp_ExprDouble}, | 
					
						
							|  |  |  |   {"exprboolean", Tkapp_ExprBoolean}, | 
					
						
							|  |  |  |   {"splitlist", Tkapp_SplitList}, | 
					
						
							|  |  |  |   {"split", Tkapp_Split}, | 
					
						
							|  |  |  |   {"merge", Tkapp_Merge}, | 
					
						
							|  |  |  |   {"createcommand", Tkapp_CreateCommand}, | 
					
						
							|  |  |  |   {"deletecommand", Tkapp_DeleteCommand}, | 
					
						
							|  |  |  |   {"createfilehandler", Tkapp_CreateFileHandler}, | 
					
						
							|  |  |  |   {"deletefilehandler", Tkapp_DeleteFileHandler}, | 
					
						
							| 
									
										
										
										
											1994-11-10 22:50:21 +00:00
										 |  |  |   {"createtimerhandler", Tkapp_CreateTimerHandler}, | 
					
						
							| 
									
										
										
										
											1995-07-26 17:29:45 +00:00
										 |  |  |   {"mainloop", Tkapp_MainLoop, 1}, | 
					
						
							|  |  |  |   {"dooneevent", Tkapp_DoOneEvent, 1}, | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   {"quit", Tkapp_Quit}, | 
					
						
							|  |  |  |   {NULL, NULL} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**** Tkapp Type Methods ****/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | Tkapp_Dealloc (self) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | #ifdef NEED_TKCREATEMAINWINDOW
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   Tk_DestroyWindow (Tkapp_Tkwin (self)); | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   Tcl_DeleteInterp (Tkapp_Interp (self)); | 
					
						
							|  |  |  |   PyMem_DEL (self); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkapp_GetAttr (self, name) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      char *name; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return Py_FindMethod (Tkapp_methods, self, name); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyTypeObject Tkapp_Type = | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1996-08-21 19:03:36 +00:00
										 |  |  |   PyObject_HEAD_INIT (NULL) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   0,				/*ob_size */ | 
					
						
							|  |  |  |   "tkapp",			/*tp_name */ | 
					
						
							|  |  |  |   sizeof (TkappObject),		/*tp_basicsize */ | 
					
						
							|  |  |  |   0,				/*tp_itemsize */ | 
					
						
							|  |  |  |   Tkapp_Dealloc,		/*tp_dealloc */ | 
					
						
							|  |  |  |   0,				/*tp_print */ | 
					
						
							|  |  |  |   Tkapp_GetAttr,		/*tp_getattr */ | 
					
						
							|  |  |  |   0,				/*tp_setattr */ | 
					
						
							|  |  |  |   0,				/*tp_compare */ | 
					
						
							|  |  |  |   0,				/*tp_repr */ | 
					
						
							|  |  |  |   0,				/*tp_as_number */ | 
					
						
							|  |  |  |   0,				/*tp_as_sequence */ | 
					
						
							|  |  |  |   0,				/*tp_as_mapping */ | 
					
						
							|  |  |  |   0,				/*tp_hash */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**** Tkinter Module ****/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Tkinter_Create (self, args) | 
					
						
							|  |  |  |      PyObject *self; | 
					
						
							|  |  |  |      PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *screenName = NULL; | 
					
						
							| 
									
										
										
										
											1995-07-26 17:29:45 +00:00
										 |  |  |   char *baseName = NULL; | 
					
						
							|  |  |  |   char *className = NULL; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   int interactive = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-31 19:51:15 +00:00
										 |  |  |   baseName = strrchr (Py_GetProgramName (), '/'); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   if (baseName != NULL) | 
					
						
							|  |  |  |     baseName++; | 
					
						
							|  |  |  |   else | 
					
						
							| 
									
										
										
										
											1996-07-31 19:51:15 +00:00
										 |  |  |     baseName = Py_GetProgramName (); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   className = "Tk"; | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											1995-07-26 17:29:45 +00:00
										 |  |  |   if (!PyArg_ParseTuple (args, "|zssi", | 
					
						
							|  |  |  | 			 &screenName, &baseName, &className, &interactive)) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return (PyObject *) Tkapp_New (screenName, baseName, className,  | 
					
						
							|  |  |  | 				 interactive); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef moduleMethods[] = | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1995-07-26 17:29:45 +00:00
										 |  |  |   {"create", Tkinter_Create, 1}, | 
					
						
							|  |  |  |   {"createfilehandler", Tkapp_CreateFileHandler, 0}, | 
					
						
							|  |  |  |   {"deletefilehandler", Tkapp_DeleteFileHandler, 0}, | 
					
						
							|  |  |  |   {"createtimerhandler", Tkapp_CreateTimerHandler, 0}, | 
					
						
							|  |  |  |   {"mainloop", Tkapp_MainLoop, 1}, | 
					
						
							|  |  |  |   {"dooneevent", Tkapp_DoOneEvent, 1}, | 
					
						
							| 
									
										
										
										
											1994-11-10 22:50:21 +00:00
										 |  |  |   {"quit", Tkapp_Quit}, | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   {NULL, NULL} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  | #undef WITH_READLINE /* XXX */
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | #ifdef WITH_READLINE
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | EventHook () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (errorInCmd)		/* XXX Reset tty */ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       errorInCmd = 0; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:30:30 +00:00
										 |  |  |       PyErr_Restore (excInCmd, valInCmd, trbInCmd); | 
					
						
							|  |  |  |       excInCmd = valInCmd = trbInCmd = NULL; | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |       PyErr_Print (); | 
					
						
							|  |  |  |      } | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  |   if (Tk_GetNumMainWindows() > 0) | 
					
						
							| 
									
										
										
										
											1994-08-03 08:01:43 +00:00
										 |  |  |     Tk_DoOneEvent (TK_DONT_WAIT); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* WITH_READLINE */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | Tkinter_Cleanup () | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  | /* This segfault with Tk 4.0 beta and seems unnecessary there as well */ | 
					
						
							|  |  |  | #if TK_MAJOR_VERSION < 4
 | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  |   /* XXX rl_deprep_terminal is static, damned! */ | 
					
						
							|  |  |  |   while (tkMainWindowList != 0) | 
					
						
							|  |  |  |     Tk_DestroyWindow (tkMainWindowList->win); | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | void | 
					
						
							| 
									
										
										
										
											1996-02-13 00:11:37 +00:00
										 |  |  | init_tkinter () | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  |   static inited = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | #ifdef WITH_READLINE
 | 
					
						
							|  |  |  |   extern int (*rl_event_hook) (); | 
					
						
							|  |  |  | #endif /* WITH_READLINE */
 | 
					
						
							|  |  |  |   PyObject *m, *d, *v; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-21 19:03:36 +00:00
										 |  |  |   Tkapp_Type.ob_type = &PyType_Type; | 
					
						
							|  |  |  |   Tktt_Type.ob_type = &PyType_Type; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-10-23 14:34:14 +00:00
										 |  |  |   m = Py_InitModule ("_tkinter", moduleMethods); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   d = PyModule_GetDict (m); | 
					
						
							|  |  |  |   Tkinter_TclError = Py_BuildValue ("s", "TclError"); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "TclError", Tkinter_TclError); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   v = Py_BuildValue ("i", TK_READABLE); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "READABLE", v); | 
					
						
							|  |  |  |   v = Py_BuildValue ("i", TK_WRITABLE); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "WRITABLE", v); | 
					
						
							|  |  |  |   v = Py_BuildValue ("i", TK_EXCEPTION); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "EXCEPTION", v); | 
					
						
							| 
									
										
										
										
											1995-01-10 17:42:51 +00:00
										 |  |  |   v = Py_BuildValue ("i", TK_X_EVENTS); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "X_EVENTS", v); | 
					
						
							|  |  |  |   v = Py_BuildValue ("i", TK_FILE_EVENTS); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "FILE_EVENTS", v); | 
					
						
							|  |  |  |   v = Py_BuildValue ("i", TK_TIMER_EVENTS); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "TIMER_EVENTS", v); | 
					
						
							|  |  |  |   v = Py_BuildValue ("i", TK_IDLE_EVENTS); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "IDLE_EVENTS", v); | 
					
						
							|  |  |  |   v = Py_BuildValue ("i", TK_ALL_EVENTS); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "ALL_EVENTS", v); | 
					
						
							|  |  |  |   v = Py_BuildValue ("i", TK_DONT_WAIT); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "DONT_WAIT", v); | 
					
						
							| 
									
										
										
										
											1995-02-07 15:41:02 +00:00
										 |  |  |   v = Py_BuildValue ("s", TK_VERSION); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "TK_VERSION", v); | 
					
						
							|  |  |  |   v = Py_BuildValue ("s", TCL_VERSION); | 
					
						
							|  |  |  |   PyDict_SetItemString (d, "TCL_VERSION", v); | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef WITH_READLINE
 | 
					
						
							|  |  |  |   rl_event_hook = EventHook; | 
					
						
							|  |  |  | #endif /* WITH_READLINE */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  |   if (!inited) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       inited = 1; | 
					
						
							| 
									
										
										
										
											1994-09-07 14:32:49 +00:00
										 |  |  |       if (Py_AtExit (Tkinter_Cleanup) != 0) | 
					
						
							|  |  |  | 	fprintf(stderr, | 
					
						
							|  |  |  | 		"Tkinter: warning: cleanup procedure not registered\n"); | 
					
						
							| 
									
										
										
										
											1994-07-07 09:25:12 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |   if (PyErr_Occurred ()) | 
					
						
							| 
									
										
										
										
											1995-10-23 14:34:14 +00:00
										 |  |  |     Py_FatalError ("can't initialize module _tkinter"); | 
					
						
							| 
									
										
										
										
											1995-10-31 16:15:12 +00:00
										 |  |  | #ifdef macintosh
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  |   TclMacSetEventProc(PyMacConvertEvent); | 
					
						
							|  |  |  | #if GENERATINGCFM
 | 
					
						
							| 
									
										
										
										
											1995-10-31 16:15:12 +00:00
										 |  |  |   mac_addlibresources(); | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | #endif /* GENERATINGCFM */
 | 
					
						
							|  |  |  | #endif /* macintosh */
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | #ifdef macintosh
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | ** Anyone who embeds Tcl/Tk on the Mac must define panic(). | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | void | 
					
						
							|  |  |  | panic(char * format, ...) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     va_list varg; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  |     va_start(varg, format); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  |     vfprintf(stderr, format, varg); | 
					
						
							|  |  |  |     (void) fflush(stderr); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  |     va_end(varg); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Py_FatalError("Tcl/Tk panic"); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Pass events to SIOUX before passing them to Tk. | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | static int | 
					
						
							|  |  |  | PyMacConvertEvent(eventPtr) | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  |     EventRecord *eventPtr; | 
					
						
							| 
									
										
										
										
											1995-11-14 10:34:45 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  |   if (SIOUXHandleOneEvent(eventPtr)) | 
					
						
							|  |  |  |     return 0; /* Nothing happened to the Tcl event queue */ | 
					
						
							|  |  |  |   return TkMacConvertEvent(eventPtr); | 
					
						
							| 
									
										
										
										
											1995-11-14 10:34:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | #if GENERATINGCFM
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | ** Additional Mac specific code for dealing with shared libraries. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <Resources.h>
 | 
					
						
							|  |  |  | #include <CodeFragments.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int loaded_from_shlib = 0; | 
					
						
							|  |  |  | static FSSpec library_fss; | 
					
						
							| 
									
										
										
										
											1995-09-22 23:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-10-31 16:15:12 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** If this module is dynamically loaded the following routine should | 
					
						
							|  |  |  | ** be the init routine. It takes care of adding the shared library to | 
					
						
							|  |  |  | ** the resource-file chain, so that the tk routines can find their | 
					
						
							|  |  |  | ** resources. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | OSErr pascal | 
					
						
							|  |  |  | init_tkinter_shlib(InitBlockPtr data) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1996-08-26 14:37:15 +00:00
										 |  |  | 	__initialize(); | 
					
						
							| 
									
										
										
										
											1995-10-31 16:15:12 +00:00
										 |  |  | 	if ( data == nil ) return noErr; | 
					
						
							|  |  |  | 	if ( data->fragLocator.where == kOnDiskFlat ) { | 
					
						
							|  |  |  | 		library_fss = *data->fragLocator.u.onDisk.fileSpec; | 
					
						
							|  |  |  | 		loaded_from_shlib = 1; | 
					
						
							|  |  |  | 	} else if ( data->fragLocator.where == kOnDiskSegmented ) { | 
					
						
							|  |  |  | 		library_fss = *data->fragLocator.u.inSegs.fileSpec; | 
					
						
							|  |  |  | 		loaded_from_shlib = 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return noErr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | ** Insert the library resources into the search path. Put them after | 
					
						
							|  |  |  | ** the resources from the application. Again, we ignore errors. | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											1996-02-25 04:46:40 +00:00
										 |  |  | static | 
					
						
							| 
									
										
										
										
											1995-10-31 16:15:12 +00:00
										 |  |  | mac_addlibresources() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if ( !loaded_from_shlib )  | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	(void)FSpOpenResFile(&library_fss, fsRdPerm); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-02-25 04:50:29 +00:00
										 |  |  | #endif /* GENERATINGCFM */
 | 
					
						
							|  |  |  | #endif /* macintosh */
 |