Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
7fcef12a
Commit
7fcef12a
authored
Jan 16, 1997
by
Barry Warsaw
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
reformatted
memory leak in Tkapp_(Create|Delete)FileHandler plugged. standard eyeballing
parent
205c878d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
977 additions
and
835 deletions
+977
-835
Modules/_tkinter.c
Modules/_tkinter.c
+977
-835
No files found.
Modules/_tkinter.c
View file @
7fcef12a
...
@@ -98,13 +98,13 @@ staticforward int PyMacConvertEvent Py_PROTO((EventRecord *eventPtr));
...
@@ -98,13 +98,13 @@ staticforward int PyMacConvertEvent Py_PROTO((EventRecord *eventPtr));
staticforward
PyTypeObject
Tkapp_Type
;
staticforward
PyTypeObject
Tkapp_Type
;
typedef
struct
typedef
struct
{
{
PyObject_HEAD
PyObject_HEAD
Tcl_Interp
*
interp
;
Tcl_Interp
*
interp
;
#ifdef NEED_TKCREATEMAINWINDOW
#ifdef NEED_TKCREATEMAINWINDOW
Tk_Window
tkwin
;
Tk_Window
tkwin
;
#endif
#endif
}
}
TkappObject
;
TkappObject
;
#define Tkapp_Check(v) ((v)->ob_type == &Tkapp_Type)
#define Tkapp_Check(v) ((v)->ob_type == &Tkapp_Type)
...
@@ -115,8 +115,10 @@ TkappObject;
...
@@ -115,8 +115,10 @@ TkappObject;
#define Tkapp_Result(v) (((TkappObject *) (v))->interp->result)
#define Tkapp_Result(v) (((TkappObject *) (v))->interp->result)
#define DEBUG_REFCNT(v) (printf ("DEBUG: id=%p, refcnt=%i\n", \
#define DEBUG_REFCNT(v) (printf ("DEBUG: id=%p, refcnt=%i\n", \
(void *) v, ((PyObject *) v)->ob_refcnt))
(void *) v, ((PyObject *) v)->ob_refcnt))
/**** Error Handling ****/
/**** Error Handling ****/
static
PyObject
*
Tkinter_TclError
;
static
PyObject
*
Tkinter_TclError
;
...
@@ -126,767 +128,842 @@ static PyObject *excInCmd;
...
@@ -126,767 +128,842 @@ static PyObject *excInCmd;
static
PyObject
*
valInCmd
;
static
PyObject
*
valInCmd
;
static
PyObject
*
trbInCmd
;
static
PyObject
*
trbInCmd
;
static
PyObject
*
static
PyObject
*
Tkinter_Error
(
v
)
Tkinter_Error
(
v
)
PyObject
*
v
;
PyObject
*
v
;
{
{
PyErr_SetString
(
Tkinter_TclError
,
Tkapp_Result
(
v
));
PyErr_SetString
(
Tkinter_TclError
,
Tkapp_Result
(
v
));
return
NULL
;
return
NULL
;
}
}
int
int
PythonCmd_Error
(
interp
)
PythonCmd_Error
(
interp
)
Tcl_Interp
*
interp
;
Tcl_Interp
*
interp
;
{
{
errorInCmd
=
1
;
errorInCmd
=
1
;
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
return
TCL_ERROR
;
return
TCL_ERROR
;
}
}
/**** Utils ****/
/**** Utils ****/
static
char
*
static
char
*
AsString
(
value
,
tmp
)
AsString
(
value
,
tmp
)
PyObject
*
value
;
PyObject
*
value
;
PyObject
*
tmp
;
PyObject
*
tmp
;
{
{
if
(
PyString_Check
(
value
))
if
(
PyString_Check
(
value
))
return
PyString_AsString
(
value
);
return
PyString_AsString
(
value
);
else
else
{
{
PyObject
*
v
=
PyObject_Str
(
value
);
PyObject
*
v
;
PyList_Append
(
tmp
,
v
);
Py_DECREF
(
v
);
v
=
PyObject_Str
(
value
);
return
PyString_AsString
(
v
);
PyList_Append
(
tmp
,
v
);
}
Py_DECREF
(
v
);
return
PyString_AsString
(
v
);
}
}
}
#define ARGSZ 64
#define ARGSZ 64
static
char
*
static
char
*
Merge
(
args
)
Merge
(
args
)
PyObject
*
args
;
PyObject
*
args
;
{
{
PyObject
*
tmp
;
PyObject
*
tmp
=
NULL
;
char
*
argvStore
[
ARGSZ
];
char
*
argvStore
[
ARGSZ
];
char
**
argv
;
char
**
argv
=
NULL
;
int
fvStore
[
ARGSZ
];
int
fvStore
[
ARGSZ
];
int
*
fv
;
int
*
fv
=
NULL
;
int
argc
;
int
argc
=
0
,
i
;
char
*
res
;
char
*
res
=
NULL
;
int
i
;
tmp
=
PyList_New
(
0
);
argv
=
argvStore
;
fv
=
fvStore
;
if
(
args
==
NULL
)
{
argc
=
0
;
}
else
if
(
!
PyTuple_Check
(
args
))
{
argc
=
1
;
fv
[
0
]
=
0
;
argv
[
0
]
=
AsString
(
args
,
tmp
);
}
else
{
PyObject
*
v
;
if
(
PyTuple_Size
(
args
)
>
ARGSZ
)
{
argv
=
(
char
**
)
ckalloc
(
PyTuple_Size
(
args
)
*
sizeof
(
char
*
));
fv
=
(
int
*
)
ckalloc
(
PyTuple_Size
(
args
)
*
sizeof
(
int
));
if
(
argv
==
NULL
||
fv
==
NULL
)
PyErr_NoMemory
();
}
argc
=
PyTuple_Size
(
args
);
if
(
!
(
tmp
=
PyList_New
(
0
)))
for
(
i
=
0
;
i
<
argc
;
i
++
)
return
NULL
;
{
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
);
argv
=
argvStore
;
fv
=
fvStore
;
Py_DECREF
(
tmp
);
if
(
args
==
NULL
)
for
(
i
=
0
;
i
<
argc
;
i
++
)
argc
=
0
;
if
(
fv
[
i
])
ckfree
(
argv
[
i
]);
if
(
argv
!=
argvStore
)
ckfree
(
FREECAST
argv
);
if
(
fv
!=
fvStore
)
ckfree
(
FREECAST
fv
);
return
res
;
else
if
(
!
PyTuple_Check
(
args
))
{
argc
=
1
;
fv
[
0
]
=
0
;
argv
[
0
]
=
AsString
(
args
,
tmp
);
}
else
{
argc
=
PyTuple_Size
(
args
);
if
(
argc
>
ARGSZ
)
{
argv
=
(
char
**
)
ckalloc
(
argc
*
sizeof
(
char
*
));
fv
=
(
int
*
)
ckalloc
(
argc
*
sizeof
(
int
));
if
(
argv
==
NULL
||
fv
==
NULL
)
{
PyErr_NoMemory
();
goto
finally
;
}
}
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
PyObject
*
v
=
PyTuple_GetItem
(
args
,
i
);
if
(
PyTuple_Check
(
v
))
{
fv
[
i
]
=
1
;
if
(
!
(
argv
[
i
]
=
Merge
(
v
)))
goto
finally
;
}
else
if
(
v
==
Py_None
)
{
argc
=
i
;
break
;
}
else
{
fv
[
i
]
=
0
;
argv
[
i
]
=
AsString
(
v
,
tmp
);
}
}
}
res
=
Tcl_Merge
(
argc
,
argv
);
finally:
for
(
i
=
0
;
i
<
argc
;
i
++
)
if
(
fv
[
i
])
{
ckfree
(
argv
[
i
]);
}
if
(
argv
!=
argvStore
)
ckfree
(
FREECAST
argv
);
if
(
fv
!=
fvStore
)
ckfree
(
FREECAST
fv
);
Py_DECREF
(
tmp
);
return
res
;
}
}
static
PyObject
*
static
PyObject
*
Split
(
self
,
list
)
Split
(
self
,
list
)
PyObject
*
self
;
PyObject
*
self
;
char
*
list
;
char
*
list
;
{
{
int
argc
;
int
argc
;
char
**
argv
;
char
**
argv
;
PyObject
*
v
;
PyObject
*
v
;
if
(
list
==
NULL
)
if
(
list
==
NULL
)
{
{
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
if
(
Tcl_SplitList
(
Tkapp_Interp
(
self
),
list
,
&
argc
,
&
argv
)
==
TCL_ERROR
)
if
(
Tcl_SplitList
(
Tkapp_Interp
(
self
),
list
,
&
argc
,
&
argv
)
==
TCL_ERROR
)
{
{
/* Not a list.
/* Not a list.
* Could be a quoted string containing funnies, e.g. {"}.
Could be a quoted string containing funnies, e.g. {"}.
* Return the string itself.
Return the string itself. */
*/
PyErr_Clear
();
PyErr_Clear
();
return
PyString_FromString
(
list
);
return
PyString_FromString
(
list
);
}
}
if
(
argc
==
0
)
if
(
argc
==
0
)
v
=
PyString_FromString
(
""
);
v
=
PyString_FromString
(
""
);
else
if
(
argc
==
1
)
else
if
(
argc
==
1
)
v
=
PyString_FromString
(
argv
[
0
]);
v
=
PyString_FromString
(
argv
[
0
]);
else
if
((
v
=
PyTuple_New
(
argc
))
!=
NULL
)
else
if
((
v
=
PyTuple_New
(
argc
))
!=
NULL
)
{
{
int
i
;
int
i
;
PyObject
*
w
;
PyObject
*
w
;
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
if
((
w
=
Split
(
self
,
argv
[
i
]))
==
NULL
)
{
if
((
w
=
Split
(
self
,
argv
[
i
]))
==
NULL
)
Py_DECREF
(
v
);
{
v
=
NULL
;
Py_DECREF
(
v
);
break
;
v
=
NULL
;
}
break
;
PyTuple_SetItem
(
v
,
i
,
w
);
}
}
PyTuple_SetItem
(
v
,
i
,
w
);
}
}
ckfree
(
FREECAST
argv
);
}
return
v
;
ckfree
(
FREECAST
argv
);
return
v
;
}
}
/**** Tkapp Object ****/
/**** Tkapp Object ****/
#ifndef WITH_APPINIT
#ifndef WITH_APPINIT
int
int
Tcl_AppInit
(
interp
)
Tcl_AppInit
(
interp
)
Tcl_Interp
*
interp
;
Tcl_Interp
*
interp
;
{
{
Tk_Window
main
;
Tk_Window
main
;
main
=
Tk_MainWindow
(
interp
);
main
=
Tk_MainWindow
(
interp
);
if
(
Tcl_Init
(
interp
)
==
TCL_ERROR
)
{
if
(
Tcl_Init
(
interp
)
==
TCL_ERROR
)
{
fprintf
(
stderr
,
"Tcl_Init error: %s
\n
"
,
interp
->
result
);
fprintf
(
stderr
,
"Tcl_Init error: %s
\n
"
,
interp
->
result
);
return
TCL_ERROR
;
return
TCL_ERROR
;
}
}
if
(
Tk_Init
(
interp
)
==
TCL_ERROR
)
{
if
(
Tk_Init
(
interp
)
==
TCL_ERROR
)
{
fprintf
(
stderr
,
"Tk_Init error: %s
\n
"
,
interp
->
result
);
fprintf
(
stderr
,
"Tk_Init error: %s
\n
"
,
interp
->
result
);
return
TCL_ERROR
;
return
TCL_ERROR
;
}
}
return
TCL_OK
;
return
TCL_OK
;
}
}
#endif
/* !WITH_APPINIT */
#endif
/* !WITH_APPINIT */
/* Initialize the Tk application; see the `main' function in
/* Initialize the Tk application; see the `main' function in
`tkMain.c'. */
* `tkMain.c'.
*/
static
TkappObject
*
static
TkappObject
*
Tkapp_New
(
screenName
,
baseName
,
className
,
interactive
)
Tkapp_New
(
screenName
,
baseName
,
className
,
interactive
)
char
*
screenName
;
char
*
screenName
;
char
*
baseName
;
char
*
baseName
;
char
*
className
;
char
*
className
;
int
interactive
;
int
interactive
;
{
{
TkappObject
*
v
;
TkappObject
*
v
;
char
*
argv0
;
char
*
argv0
;
v
=
PyObject_NEW
(
TkappObject
,
&
Tkapp_Type
);
v
=
PyObject_NEW
(
TkappObject
,
&
Tkapp_Type
);
if
(
v
==
NULL
)
if
(
v
==
NULL
)
return
NULL
;
return
NULL
;
v
->
interp
=
Tcl_CreateInterp
();
v
->
interp
=
Tcl_CreateInterp
();
#ifdef NEED_TKCREATEMAINWINDOW
#ifdef NEED_TKCREATEMAINWINDOW
v
->
tkwin
=
Tk_CreateMainWindow
(
v
->
interp
,
screenName
,
v
->
tkwin
=
Tk_CreateMainWindow
(
v
->
interp
,
screenName
,
baseName
,
className
);
baseName
,
className
);
if
(
v
->
tkwin
==
NULL
)
if
(
v
->
tkwin
==
NULL
)
return
(
TkappObject
*
)
Tkinter_Error
((
PyObject
*
)
v
);
return
(
TkappObject
*
)
Tkinter_Error
((
PyObject
*
)
v
);
Tk_GeometryRequest
(
v
->
tkwin
,
200
,
200
);
Tk_GeometryRequest
(
v
->
tkwin
,
200
,
200
);
#endif
#endif
if
(
screenName
!=
NULL
)
if
(
screenName
!=
NULL
)
Tcl_SetVar2
(
v
->
interp
,
"env"
,
"DISPLAY"
,
screenName
,
TCL_GLOBAL_ONLY
);
Tcl_SetVar2
(
v
->
interp
,
"env"
,
"DISPLAY"
,
screenName
,
TCL_GLOBAL_ONLY
);
if
(
interactive
)
if
(
interactive
)
Tcl_SetVar
(
v
->
interp
,
"tcl_interactive"
,
"1"
,
TCL_GLOBAL_ONLY
);
Tcl_SetVar
(
v
->
interp
,
"tcl_interactive"
,
"1"
,
TCL_GLOBAL_ONLY
);
else
else
Tcl_SetVar
(
v
->
interp
,
"tcl_interactive"
,
"0"
,
TCL_GLOBAL_ONLY
);
Tcl_SetVar
(
v
->
interp
,
"tcl_interactive"
,
"0"
,
TCL_GLOBAL_ONLY
);
/* This is used to get the application class for Tk 4.1 and up */
argv0
=
(
char
*
)
ckalloc
(
strlen
(
className
)
+
1
);
if
(
!
argv0
)
{
PyErr_NoMemory
();
Py_DECREF
(
v
);
return
NULL
;
}
/* This is used to get the application class for Tk 4.1 and up */
strcpy
(
argv0
,
className
);
argv0
=
(
char
*
)
ckalloc
(
strlen
(
className
)
+
1
);
if
(
isupper
(
argv0
[
0
]))
if
(
argv0
!=
NULL
)
{
argv0
[
0
]
=
tolower
(
argv0
[
0
]);
strcpy
(
argv0
,
className
);
Tcl_SetVar
(
v
->
interp
,
"argv0"
,
argv0
,
TCL_GLOBAL_ONLY
);
if
(
isupper
(
argv0
[
0
]))
ckfree
(
argv0
);
argv0
[
0
]
=
tolower
(
argv0
[
0
]);
Tcl_SetVar
(
v
->
interp
,
"argv0"
,
argv0
,
TCL_GLOBAL_ONLY
);
ckfree
(
argv0
);
}
if
(
Tcl_AppInit
(
v
->
interp
)
!=
TCL_OK
)
if
(
Tcl_AppInit
(
v
->
interp
)
!=
TCL_OK
)
return
(
TkappObject
*
)
Tkinter_Error
(
v
);
return
(
TkappObject
*
)
Tkinter_Error
(
v
);
return
v
;
return
v
;
}
}
/** Tcl Eval **/
/** Tcl Eval **/
static
PyObject
*
static
PyObject
*
Tkapp_Call
(
self
,
args
)
Tkapp_Call
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
cmd
;
char
*
cmd
=
Merge
(
args
);
PyObject
*
res
=
NULL
;
if
(
!
cmd
)
PyErr_SetString
(
Tkinter_TclError
,
"merge failed"
);
else
if
(
Tcl_Eval
(
Tkapp_Interp
(
self
),
cmd
)
==
TCL_ERROR
)
res
=
Tkinter_Error
(
self
);
else
res
=
PyString_FromString
(
Tkapp_Result
(
self
));
cmd
=
Merge
(
args
);
if
(
cmd
)
if
(
Tcl_Eval
(
Tkapp_Interp
(
self
),
cmd
)
==
TCL_ERROR
)
ckfree
(
cmd
);
{
ckfree
(
cmd
);
return
Tkinter_Error
(
self
);
}
ckfree
(
cmd
);
return
res
;
return
PyString_FromString
(
Tkapp_Result
(
self
));
}
}
static
PyObject
*
static
PyObject
*
Tkapp_GlobalCall
(
self
,
args
)
Tkapp_GlobalCall
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
cmd
;
char
*
cmd
=
Merge
(
args
);
PyObject
*
res
=
NULL
;
cmd
=
Merge
(
args
);
if
(
Tcl_GlobalEval
(
Tkapp_Interp
(
self
),
cmd
)
==
TCL_ERROR
)
{
if
(
!
cmd
)
ckfree
(
cmd
);
PyErr_SetString
(
Tkinter_TclError
,
"merge failed"
);
return
Tkinter_Error
(
self
);
}
else
if
(
Tcl_GlobalEval
(
Tkapp_Interp
(
self
),
cmd
)
==
TCL_ERROR
)
res
=
Tkinter_Error
(
self
);
ckfree
(
cmd
);
else
return
PyString_FromString
(
Tkapp_Result
(
self
));
res
=
PyString_FromString
(
Tkapp_Result
(
self
));
if
(
cmd
)
ckfree
(
cmd
);
return
res
;
}
}
static
PyObject
*
static
PyObject
*
Tkapp_Eval
(
self
,
args
)
Tkapp_Eval
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
script
;
char
*
script
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
return
NULL
;
return
NULL
;
if
(
Tcl_Eval
(
Tkapp_Interp
(
self
),
script
)
==
TCL_ERROR
)
if
(
Tcl_Eval
(
Tkapp_Interp
(
self
),
script
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
PyString_FromString
(
Tkapp_Result
(
self
));
return
PyString_FromString
(
Tkapp_Result
(
self
));
}
}
static
PyObject
*
static
PyObject
*
Tkapp_GlobalEval
(
self
,
args
)
Tkapp_GlobalEval
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
script
;
char
*
script
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
return
NULL
;
return
NULL
;
if
(
Tcl_GlobalEval
(
Tkapp_Interp
(
self
),
script
)
==
TCL_ERROR
)
if
(
Tcl_GlobalEval
(
Tkapp_Interp
(
self
),
script
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
PyString_FromString
(
Tkapp_Result
(
self
));
return
PyString_FromString
(
Tkapp_Result
(
self
));
}
}
static
PyObject
*
static
PyObject
*
Tkapp_EvalFile
(
self
,
args
)
Tkapp_EvalFile
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
fileName
;
char
*
fileName
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
fileName
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
fileName
))
return
NULL
;
return
NULL
;
if
(
Tcl_EvalFile
(
Tkapp_Interp
(
self
),
fileName
)
==
TCL_ERROR
)
if
(
Tcl_EvalFile
(
Tkapp_Interp
(
self
),
fileName
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
PyString_FromString
(
Tkapp_Result
(
self
));
return
PyString_FromString
(
Tkapp_Result
(
self
));
}
}
static
PyObject
*
static
PyObject
*
Tkapp_Record
(
self
,
args
)
Tkapp_Record
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
script
;
char
*
script
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
return
NULL
;
return
NULL
;
if
(
Tcl_RecordAndEval
(
Tkapp_Interp
(
self
),
if
(
TCL_ERROR
==
Tcl_RecordAndEval
(
Tkapp_Interp
(
self
),
script
,
TCL_NO_EVAL
)
==
TCL_ERROR
)
script
,
TCL_NO_EVAL
)
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
PyString_FromString
(
Tkapp_Result
(
self
));
return
PyString_FromString
(
Tkapp_Result
(
self
));
}
}
static
PyObject
*
static
PyObject
*
Tkapp_AddErrorInfo
(
self
,
args
)
Tkapp_AddErrorInfo
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
msg
;
char
*
msg
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
msg
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
msg
))
return
NULL
;
return
NULL
;
Tcl_AddErrorInfo
(
Tkapp_Interp
(
self
),
msg
);
Tcl_AddErrorInfo
(
Tkapp_Interp
(
self
),
msg
);
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
/** Tcl Variable **/
/** Tcl Variable **/
static
PyObject
*
static
PyObject
*
SetVar
(
self
,
args
,
flags
)
SetVar
(
self
,
args
,
flags
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
int
flags
;
int
flags
;
{
{
char
*
name1
,
*
name2
,
*
ok
;
char
*
name1
,
*
name2
,
*
ok
;
PyObject
*
newValue
;
PyObject
*
newValue
;
PyObject
*
tmp
;
PyObject
*
tmp
=
PyList_New
(
0
);
tmp
=
PyList_New
(
0
);
if
(
!
tmp
)
return
NULL
;
if
(
PyArg_Parse
(
args
,
"(sO)"
,
&
name1
,
&
newValue
))
ok
=
Tcl_SetVar
(
Tkapp_Interp
(
self
),
name1
,
if
(
PyArg_Parse
(
args
,
"(sO)"
,
&
name1
,
&
newValue
))
AsString
(
newValue
,
tmp
),
flags
);
/* XXX Merge? */
/* XXX Merge? */
else
if
(
PyArg_Parse
(
args
,
"(ssO)"
,
&
name1
,
&
name2
,
&
newValue
))
ok
=
Tcl_SetVar
(
Tkapp_Interp
(
self
),
name1
,
ok
=
Tcl_SetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
AsString
(
newValue
,
tmp
),
flags
);
AsString
(
newValue
,
tmp
),
flags
);
else
else
if
(
PyArg_Parse
(
args
,
"(ssO)"
,
&
name1
,
&
name2
,
&
newValue
))
{
ok
=
Tcl_SetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
Py_DECREF
(
tmp
);
AsString
(
newValue
,
tmp
),
flags
);
return
NULL
;
else
{
}
Py_DECREF
(
tmp
);
Py_DECREF
(
tmp
);
return
NULL
;
}
Py_DECREF
(
tmp
);
if
(
!
ok
)
if
(
!
ok
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
static
PyObject
*
static
PyObject
*
Tkapp_SetVar
(
self
,
args
)
Tkapp_SetVar
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
return
SetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
return
SetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_GlobalSetVar
(
self
,
args
)
Tkapp_GlobalSetVar
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
return
SetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
|
TCL_GLOBAL_ONLY
);
return
SetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
|
TCL_GLOBAL_ONLY
);
}
}
static
PyObject
*
static
PyObject
*
GetVar
(
self
,
args
,
flags
)
GetVar
(
self
,
args
,
flags
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
int
flags
;
int
flags
;
{
{
char
*
name1
,
*
name2
,
*
s
;
char
*
name1
,
*
name2
,
*
s
;
if
(
PyArg_Parse
(
args
,
"s"
,
&
name1
))
if
(
PyArg_Parse
(
args
,
"s"
,
&
name1
))
s
=
Tcl_GetVar
(
Tkapp_Interp
(
self
),
name1
,
flags
);
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
)
else
if
(
PyArg_Parse
(
args
,
"(ss)"
,
&
name1
,
&
name2
))
return
Tkinter_Error
(
self
);
s
=
Tcl_GetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
flags
);
else
return
NULL
;
return
PyString_FromString
(
s
);
if
(
s
==
NULL
)
return
Tkinter_Error
(
self
);
return
PyString_FromString
(
s
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_GetVar
(
self
,
args
)
Tkapp_GetVar
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
return
GetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
return
GetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_GlobalGetVar
(
self
,
args
)
Tkapp_GlobalGetVar
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
return
GetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
|
TCL_GLOBAL_ONLY
);
return
GetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
|
TCL_GLOBAL_ONLY
);
}
}
static
PyObject
*
static
PyObject
*
UnsetVar
(
self
,
args
,
flags
)
UnsetVar
(
self
,
args
,
flags
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
int
flags
;
int
flags
;
{
{
char
*
name1
,
*
name2
;
char
*
name1
,
*
name2
;
int
code
;
int
code
;
if
(
PyArg_Parse
(
args
,
"s"
,
&
name1
))
if
(
PyArg_Parse
(
args
,
"s"
,
&
name1
))
code
=
Tcl_UnsetVar
(
Tkapp_Interp
(
self
),
name1
,
flags
);
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
)
else
if
(
PyArg_Parse
(
args
,
"(ss)"
,
&
name1
,
&
name2
))
return
Tkinter_Error
(
self
);
code
=
Tcl_UnsetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
flags
);
else
return
NULL
;
if
(
code
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
static
PyObject
*
static
PyObject
*
Tkapp_UnsetVar
(
self
,
args
)
Tkapp_UnsetVar
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
return
UnsetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
return
UnsetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_GlobalUnsetVar
(
self
,
args
)
Tkapp_GlobalUnsetVar
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
return
UnsetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
|
TCL_GLOBAL_ONLY
);
return
UnsetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
|
TCL_GLOBAL_ONLY
);
}
}
/** Tcl to Python **/
/** Tcl to Python **/
static
PyObject
*
static
PyObject
*
Tkapp_GetInt
(
self
,
args
)
Tkapp_GetInt
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
s
;
char
*
s
;
int
v
;
int
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
return
NULL
;
if
(
Tcl_GetInt
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
if
(
Tcl_GetInt
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"i"
,
v
);
return
Py_BuildValue
(
"i"
,
v
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_GetDouble
(
self
,
args
)
Tkapp_GetDouble
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
s
;
char
*
s
;
double
v
;
double
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
return
NULL
;
if
(
Tcl_GetDouble
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
if
(
Tcl_GetDouble
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"d"
,
v
);
return
Py_BuildValue
(
"d"
,
v
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_GetBoolean
(
self
,
args
)
Tkapp_GetBoolean
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
s
;
char
*
s
;
int
v
;
int
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
return
NULL
;
if
(
Tcl_GetBoolean
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
if
(
Tcl_GetBoolean
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"i"
,
v
);
return
Py_BuildValue
(
"i"
,
v
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_ExprString
(
self
,
args
)
Tkapp_ExprString
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
s
;
char
*
s
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
return
NULL
;
if
(
Tcl_ExprString
(
Tkapp_Interp
(
self
),
s
)
==
TCL_ERROR
)
if
(
Tcl_ExprString
(
Tkapp_Interp
(
self
),
s
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"s"
,
Tkapp_Result
(
self
));
return
Py_BuildValue
(
"s"
,
Tkapp_Result
(
self
));
}
}
static
PyObject
*
static
PyObject
*
Tkapp_ExprLong
(
self
,
args
)
Tkapp_ExprLong
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
s
;
char
*
s
;
long
v
;
long
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
return
NULL
;
if
(
Tcl_ExprLong
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
if
(
Tcl_ExprLong
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"l"
,
v
);
return
Py_BuildValue
(
"l"
,
v
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_ExprDouble
(
self
,
args
)
Tkapp_ExprDouble
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
s
;
char
*
s
;
double
v
;
double
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
return
NULL
;
if
(
Tcl_ExprDouble
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
if
(
Tcl_ExprDouble
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"d"
,
v
);
return
Py_BuildValue
(
"d"
,
v
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_ExprBoolean
(
self
,
args
)
Tkapp_ExprBoolean
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
s
;
char
*
s
;
int
v
;
int
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
return
NULL
;
if
(
Tcl_ExprBoolean
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
if
(
Tcl_ExprBoolean
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"i"
,
v
);
return
Py_BuildValue
(
"i"
,
v
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_SplitList
(
self
,
args
)
Tkapp_SplitList
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
list
;
char
*
list
;
int
argc
;
int
argc
;
char
**
argv
;
char
**
argv
;
PyObject
*
v
;
PyObject
*
v
;
int
i
;
int
i
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
list
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
list
))
return
NULL
;
return
NULL
;
if
(
Tcl_SplitList
(
Tkapp_Interp
(
self
),
list
,
&
argc
,
&
argv
)
==
TCL_ERROR
)
if
(
Tcl_SplitList
(
Tkapp_Interp
(
self
),
list
,
&
argc
,
&
argv
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
v
=
PyTuple_New
(
argc
);
if
(
!
(
v
=
PyTuple_New
(
argc
)))
for
(
i
=
0
;
i
<
argc
;
i
++
)
return
NULL
;
PyTuple_SetItem
(
v
,
i
,
PyString_FromString
(
argv
[
i
]));
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
PyObject
*
s
=
PyString_FromString
(
argv
[
i
]);
if
(
!
s
||
PyTuple_SetItem
(
v
,
i
,
s
))
{
Py_DECREF
(
v
);
v
=
NULL
;
goto
finally
;
}
}
ckfree
(
FREECAST
argv
);
finally:
return
v
;
ckfree
(
FREECAST
argv
);
return
v
;
}
}
static
PyObject
*
static
PyObject
*
Tkapp_Split
(
self
,
args
)
Tkapp_Split
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
list
;
char
*
list
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
list
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
list
))
return
NULL
;
return
NULL
;
return
Split
(
self
,
list
);
return
Split
(
self
,
list
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_Merge
(
self
,
args
)
Tkapp_Merge
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
s
;
char
*
s
=
Merge
(
args
);
PyObject
*
v
;
PyObject
*
res
=
NULL
;
if
(
s
)
{
res
=
PyString_FromString
(
s
);
ckfree
(
s
);
}
else
PyErr_SetString
(
Tkinter_TclError
,
"merge failed"
);
s
=
Merge
(
args
);
return
res
;
v
=
PyString_FromString
(
s
);
ckfree
(
s
);
return
v
;
}
}
/** Tcl Command **/
/** Tcl Command **/
/* This is the Tcl command that acts as a wrapper for Python
/* This is the Tcl command that acts as a wrapper for Python
function or method. */
* function or method.
*/
static
int
static
int
PythonCmd
(
clientData
,
interp
,
argc
,
argv
)
PythonCmd
(
clientData
,
interp
,
argc
,
argv
)
ClientData
clientData
;
/* Is (self, func) */
ClientData
clientData
;
/* Is (self, func) */
Tcl_Interp
*
interp
;
Tcl_Interp
*
interp
;
int
argc
;
int
argc
;
char
*
argv
[];
char
*
argv
[];
{
{
PyObject
*
self
,
*
func
,
*
arg
,
*
res
,
*
tmp
;
PyObject
*
self
,
*
func
,
*
arg
,
*
res
,
*
tmp
;
int
i
;
int
i
;
self
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
0
);
/* TBD: no error checking here since we know, via the
func
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
1
);
* Tkapp_CreateCommand() that the client data is a two-tuple
*/
self
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
0
);
func
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
1
);
/* Create argument list (argv1, ..., argvN) */
if
(
!
(
arg
=
PyTuple_New
(
argc
-
1
)))
return
PythonCmd_Error
(
interp
);
for
(
i
=
0
;
i
<
(
argc
-
1
);
i
++
)
{
PyObject
*
s
=
PyString_FromString
(
argv
[
i
+
1
]);
if
(
!
s
||
PyTuple_SetItem
(
arg
,
i
,
s
))
{
Py_DECREF
(
arg
);
PythonCmd_Error
(
interp
);
}
}
res
=
PyEval_CallObject
(
func
,
arg
);
Py_DECREF
(
arg
);
/* Create argument list (argv1, ..., argvN) */
if
(
res
==
NULL
)
arg
=
PyTuple_New
(
argc
-
1
);
return
PythonCmd_Error
(
interp
);
for
(
i
=
0
;
i
<
(
argc
-
1
);
i
++
)
PyTuple_SetItem
(
arg
,
i
,
PyString_FromString
(
argv
[
i
+
1
]));
res
=
PyEval_CallObject
(
func
,
arg
);
Py_DECREF
(
arg
);
if
(
res
==
NULL
)
if
(
!
(
tmp
=
PyList_New
(
0
)))
{
return
PythonCmd_Error
(
interp
);
Py_DECREF
(
res
);
return
PythonCmd_Error
(
interp
);
}
tmp
=
PyList_New
(
0
);
Tcl_SetResult
(
Tkapp_Interp
(
self
),
AsString
(
res
,
tmp
),
TCL_VOLATILE
);
Tcl_SetResult
(
Tkapp_Interp
(
self
),
AsString
(
res
,
tmp
),
TCL_VOLATILE
);
Py_DECREF
(
res
);
Py_DECREF
(
res
);
Py_DECREF
(
tmp
);
Py_DECREF
(
tmp
);
return
TCL_OK
;
return
TCL_OK
;
}
}
static
void
static
void
PythonCmdDelete
(
clientData
)
PythonCmdDelete
(
clientData
)
ClientData
clientData
;
/* Is (self, func) */
ClientData
clientData
;
/* Is (self, func) */
{
{
Py_DECREF
((
PyObject
*
)
clientData
);
Py_DECREF
((
PyObject
*
)
clientData
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_CreateCommand
(
self
,
args
)
Tkapp_CreateCommand
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
cmdName
;
char
*
cmdName
;
PyObject
*
data
;
PyObject
*
data
;
PyObject
*
func
;
PyObject
*
func
;
/* Args is: (cmdName, func) */
/* Args is: (cmdName, func) */
if
(
!
PyTuple_Check
(
args
)
if
(
!
PyTuple_Check
(
args
)
||
!
(
PyTuple_Size
(
args
)
==
2
)
||
!
(
PyTuple_Size
(
args
)
==
2
)
||
!
PyString_Check
(
PyTuple_GetItem
(
args
,
0
))
||
!
PyString_Check
(
PyTuple_GetItem
(
args
,
0
))
||
!
PyCallable_Check
(
PyTuple_GetItem
(
args
,
1
)))
||
!
PyCallable_Check
(
PyTuple_GetItem
(
args
,
1
)))
{
{
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
return
NULL
;
return
NULL
;
}
}
cmdName
=
PyString_AsString
(
PyTuple_GetItem
(
args
,
0
));
cmdName
=
PyString_AsString
(
PyTuple_GetItem
(
args
,
0
));
func
=
PyTuple_GetItem
(
args
,
1
);
func
=
PyTuple_GetItem
(
args
,
1
);
data
=
PyTuple_New
(
2
);
/* ClientData is: (self, func) */
data
=
PyTuple_New
(
2
);
/* ClientData is: (self, func) */
if
(
!
data
)
return
NULL
;
Py_INCREF
(
self
);
Py_INCREF
(
self
);
PyTuple_SetItem
(
data
,
0
,
self
);
PyTuple_SetItem
(
data
,
0
,
self
);
Py_INCREF
(
func
);
Py_INCREF
(
func
);
PyTuple_SetItem
(
data
,
1
,
func
);
PyTuple_SetItem
(
data
,
1
,
func
);
Tcl_CreateCommand
(
Tkapp_Interp
(
self
),
cmdName
,
PythonCmd
,
Tcl_CreateCommand
(
Tkapp_Interp
(
self
),
cmdName
,
PythonCmd
,
(
ClientData
)
data
,
PythonCmdDelete
);
(
ClientData
)
data
,
PythonCmdDelete
);
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
static
PyObject
*
static
PyObject
*
Tkapp_DeleteCommand
(
self
,
args
)
Tkapp_DeleteCommand
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
cmdName
;
char
*
cmdName
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
cmdName
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
cmdName
))
return
NULL
;
return
NULL
;
if
(
Tcl_DeleteCommand
(
Tkapp_Interp
(
self
),
cmdName
)
==
-
1
)
if
(
Tcl_DeleteCommand
(
Tkapp_Interp
(
self
),
cmdName
)
==
-
1
)
{
{
PyErr_SetString
(
Tkinter_TclError
,
"can't delete Tcl command"
);
PyErr_SetString
(
Tkinter_TclError
,
"can't delete Tcl command"
);
return
NULL
;
return
NULL
;
}
}
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
/** File Handler **/
/** File Handler **/
static
void
static
void
FileHandler
(
clientData
,
mask
)
FileHandler
(
clientData
,
mask
)
ClientData
clientData
;
/* Is: (func, file) */
ClientData
clientData
;
/* Is: (func, file) */
int
mask
;
int
mask
;
{
{
PyObject
*
func
,
*
file
,
*
arg
,
*
res
;
PyObject
*
func
,
*
file
,
*
arg
,
*
res
;
func
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
0
);
func
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
0
);
file
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
1
);
file
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
1
);
arg
=
Py_BuildValue
(
"(Oi)"
,
file
,
(
long
)
mask
);
arg
=
Py_BuildValue
(
"(Oi)"
,
file
,
(
long
)
mask
);
res
=
PyEval_CallObject
(
func
,
arg
);
res
=
PyEval_CallObject
(
func
,
arg
);
Py_DECREF
(
arg
);
Py_DECREF
(
arg
);
if
(
res
==
NULL
)
{
if
(
res
==
NULL
)
{
errorInCmd
=
1
;
errorInCmd
=
1
;
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
}
}
Py_XDECREF
(
res
);
Py_XDECREF
(
res
);
}
}
static
int
static
int
GetFileNo
(
file
)
GetFileNo
(
file
)
PyObject
*
file
;
/* Either an int >= 0 or an object with a
/* Either an int >= 0 or an object with a
.fileno() method that returns an int >= 0 */
*.fileno() method that returns an int >= 0
*/
PyObject
*
file
;
{
{
PyObject
*
meth
,
*
args
,
*
res
;
PyObject
*
meth
,
*
args
,
*
res
;
int
id
;
int
id
;
...
@@ -896,21 +973,27 @@ GetFileNo (file)
...
@@ -896,21 +973,27 @@ GetFileNo (file)
PyErr_SetString
(
PyExc_ValueError
,
"invalid file id"
);
PyErr_SetString
(
PyExc_ValueError
,
"invalid file id"
);
return
id
;
return
id
;
}
}
meth
=
PyObject_GetAttrString
(
file
,
"fileno"
);
if
(
meth
==
NULL
)
return
-
1
;
args
=
PyTuple_New
(
0
);
args
=
PyTuple_New
(
0
);
if
(
args
==
NULL
)
if
(
args
==
NULL
)
return
-
1
;
return
-
1
;
meth
=
PyObject_GetAttrString
(
file
,
"fileno"
);
if
(
meth
==
NULL
)
{
Py_DECREF
(
args
);
return
-
1
;
}
res
=
PyEval_CallObject
(
meth
,
args
);
res
=
PyEval_CallObject
(
meth
,
args
);
Py_DECREF
(
args
);
Py_DECREF
(
args
);
Py_DECREF
(
meth
);
Py_DECREF
(
meth
);
if
(
res
==
NULL
)
if
(
res
==
NULL
)
return
-
1
;
return
-
1
;
if
(
PyInt_Check
(
res
))
if
(
PyInt_Check
(
res
))
id
=
PyInt_AsLong
(
res
);
id
=
PyInt_AsLong
(
res
);
else
else
id
=
-
1
;
id
=
-
1
;
if
(
id
<
0
)
if
(
id
<
0
)
PyErr_SetString
(
PyExc_ValueError
,
PyErr_SetString
(
PyExc_ValueError
,
"invalid fileno() return value"
);
"invalid fileno() return value"
);
...
@@ -918,403 +1001,443 @@ GetFileNo (file)
...
@@ -918,403 +1001,443 @@ GetFileNo (file)
return
id
;
return
id
;
}
}
static
PyObject
*
Tkapp_ClientDataDict
=
NULL
;
static
PyObject
*
static
PyObject
*
Tkapp_CreateFileHandler
(
self
,
args
)
Tkapp_CreateFileHandler
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
/* Is (file, mask, func) */
PyObject
*
args
;
/* Is (file, mask, func) */
{
{
PyObject
*
file
,
*
func
,
*
data
;
PyObject
*
file
,
*
func
,
*
data
;
int
mask
,
id
;
PyObject
*
idkey
;
int
mask
,
id
;
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
Tcl_File
tfile
;
Tcl_File
tfile
;
#endif
#endif
if
(
!
PyArg_Parse
(
args
,
"(OiO)"
,
&
file
,
&
mask
,
&
func
))
if
(
!
Tkapp_ClientDataDict
)
{
return
NULL
;
if
(
!
(
Tkapp_ClientDataDict
=
PyDict_New
()))
id
=
GetFileNo
(
file
);
return
NULL
;
if
(
id
<
0
)
}
return
NULL
;
if
(
!
PyCallable_Check
(
func
))
if
(
!
PyArg_Parse
(
args
,
"(OiO)"
,
&
file
,
&
mask
,
&
func
))
{
return
NULL
;
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
id
=
GetFileNo
(
file
);
return
NULL
;
if
(
id
<
0
)
}
return
NULL
;
if
(
!
PyCallable_Check
(
func
))
{
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
return
NULL
;
}
/* ClientData is: (func, file) */
if
(
!
(
idkey
=
PyInt_FromLong
(
id
)))
data
=
Py_BuildValue
(
"(OO)"
,
func
,
file
);
return
NULL
;
/* ClientData is: (func, file) */
data
=
Py_BuildValue
(
"(OO)"
,
func
,
file
);
if
(
!
data
||
PyDict_SetItem
(
Tkapp_ClientDataDict
,
idkey
,
data
))
{
Py_DECREF
(
idkey
);
Py_XDECREF
(
data
);
return
NULL
;
}
Py_DECREF
(
idkey
);
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
#ifdef MS_WINDOWS
#ifdef MS_WINDOWS
/* We assume this is a socket... */
/* We assume this is a socket... */
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_WIN_SOCKET
);
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_WIN_SOCKET
);
#else
#else
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_UNIX_FD
);
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_UNIX_FD
);
#endif
#endif
/* Oughtta
check for null Tcl_File object... */
/* Ought to
check for null Tcl_File object... */
Tcl_CreateFileHandler
(
tfile
,
mask
,
FileHandler
,
(
ClientData
)
data
);
Tcl_CreateFileHandler
(
tfile
,
mask
,
FileHandler
,
(
ClientData
)
data
);
#else
#else
Tk_CreateFileHandler
(
id
,
mask
,
FileHandler
,
(
ClientData
)
data
);
Tk_CreateFileHandler
(
id
,
mask
,
FileHandler
,
(
ClientData
)
data
);
#endif
#endif
/* XXX fileHandlerDict */
/* XXX fileHandlerDict */
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
static
PyObject
*
static
PyObject
*
Tkapp_DeleteFileHandler
(
self
,
args
)
Tkapp_DeleteFileHandler
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
/* Args: file */
PyObject
*
args
;
/* Args: file */
{
{
PyObject
*
file
;
PyObject
*
file
;
int
id
;
PyObject
*
idkey
;
PyObject
*
data
;
int
id
;
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
Tcl_File
tfile
;
Tcl_File
tfile
;
#endif
#endif
if
(
!
PyArg_Parse
(
args
,
"O"
,
&
file
))
if
(
!
PyArg_Parse
(
args
,
"O"
,
&
file
))
return
NULL
;
return
NULL
;
id
=
GetFileNo
(
file
);
id
=
GetFileNo
(
file
);
if
(
id
<
0
)
if
(
id
<
0
)
return
NULL
;
return
NULL
;
if
(
!
(
idkey
=
PyInt_FromLong
(
id
)))
return
NULL
;
/* find and free the object created in the
* Tkapp_CreateFileHandler() call
*/
data
=
PyDict_GetItem
(
Tkapp_ClientDataDict
,
idkey
);
Py_XDECREF
(
data
);
PyDict_DelItem
(
Tkapp_ClientDataDict
,
idkey
);
Py_DECREF
(
idkey
);
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
#ifdef MS_WINDOWS
#ifdef MS_WINDOWS
/* We assume this is a socket... */
/* We assume this is a socket... */
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_WIN_SOCKET
);
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_WIN_SOCKET
);
#else
#else
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_UNIX_FD
);
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_UNIX_FD
);
#endif
#endif
/* Oughtta
check for null Tcl_File object... */
/* Ought to
check for null Tcl_File object... */
Tcl_DeleteFileHandler
(
tfile
);
Tcl_DeleteFileHandler
(
tfile
);
#else
#else
Tk_DeleteFileHandler
(
id
);
Tk_DeleteFileHandler
(
id
);
#endif
#endif
/* XXX fileHandlerDict */
/* XXX fileHandlerDict */
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
/**** Tktt Object (timer token) ****/
/**** Tktt Object (timer token) ****/
staticforward
PyTypeObject
Tktt_Type
;
staticforward
PyTypeObject
Tktt_Type
;
typedef
struct
typedef
struct
{
{
PyObject_HEAD
PyObject_HEAD
Tk_TimerToken
token
;
Tk_TimerToken
token
;
PyObject
*
func
;
PyObject
*
func
;
}
}
TkttObject
;
TkttObject
;
static
PyObject
*
static
PyObject
*
Tktt_DeleteTimerHandler
(
self
,
args
)
Tktt_DeleteTimerHandler
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
TkttObject
*
v
=
(
TkttObject
*
)
self
;
TkttObject
*
v
=
(
TkttObject
*
)
self
;
if
(
!
PyArg_Parse
(
args
,
""
))
if
(
!
PyArg_Parse
(
args
,
""
))
return
NULL
;
return
NULL
;
if
(
v
->
func
!=
NULL
)
if
(
v
->
func
!=
NULL
)
{
{
Tk_DeleteTimerHandler
(
v
->
token
);
Tk_DeleteTimerHandler
(
v
->
token
);
PyMem_DEL
(
v
->
func
);
PyMem_DEL
(
v
->
func
);
v
->
func
=
NULL
;
v
->
func
=
NULL
;
}
}
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
static
PyMethodDef
Tktt_methods
[]
=
static
PyMethodDef
Tktt_methods
[]
=
{
{
{
"deletetimerhandler"
,
Tktt_DeleteTimerHandler
},
{
"deletetimerhandler"
,
Tktt_DeleteTimerHandler
},
{
NULL
,
NULL
}
{
NULL
,
NULL
}
};
};
static
TkttObject
*
static
TkttObject
*
Tktt_New
(
token
,
func
)
Tktt_New
(
token
,
func
)
Tk_TimerToken
token
;
Tk_TimerToken
token
;
PyObject
*
func
;
PyObject
*
func
;
{
{
TkttObject
*
v
;
TkttObject
*
v
;
v
=
PyObject_NEW
(
TkttObject
,
&
Tktt_Type
);
v
=
PyObject_NEW
(
TkttObject
,
&
Tktt_Type
);
if
(
v
==
NULL
)
if
(
v
==
NULL
)
return
NULL
;
return
NULL
;
v
->
token
=
token
;
v
->
token
=
token
;
v
->
func
=
func
;
v
->
func
=
func
;
Py_INCREF
(
v
->
func
);
Py_INCREF
(
v
->
func
);
return
v
;
return
v
;
}
}
static
void
static
void
Tktt_Dealloc
(
self
)
Tktt_Dealloc
(
self
)
PyObject
*
self
;
PyObject
*
self
;
{
{
PyMem_DEL
(
self
);
PyMem_DEL
(
self
);
}
}
static
int
static
int
Tktt_Print
(
self
,
fp
,
flags
)
Tktt_Print
(
self
,
fp
,
flags
)
PyObject
*
self
;
PyObject
*
self
;
FILE
*
fp
;
FILE
*
fp
;
int
flags
;
int
flags
;
{
{
TkttObject
*
v
=
(
TkttObject
*
)
self
;
TkttObject
*
v
=
(
TkttObject
*
)
self
;
fprintf
(
fp
,
"<tktimertoken at 0x%lx%s>"
,
(
long
)
v
,
fprintf
(
fp
,
"<tktimertoken at 0x%lx%s>"
,
(
long
)
v
,
v
->
func
==
NULL
?
", handler deleted"
:
""
);
v
->
func
==
NULL
?
", handler deleted"
:
""
);
return
0
;
return
0
;
}
}
static
PyObject
*
static
PyObject
*
Tktt_GetAttr
(
self
,
name
)
Tktt_GetAttr
(
self
,
name
)
PyObject
*
self
;
PyObject
*
self
;
char
*
name
;
char
*
name
;
{
{
return
Py_FindMethod
(
Tktt_methods
,
self
,
name
);
return
Py_FindMethod
(
Tktt_methods
,
self
,
name
);
}
}
static
PyTypeObject
Tktt_Type
=
static
PyTypeObject
Tktt_Type
=
{
{
PyObject_HEAD_INIT
(
NULL
)
PyObject_HEAD_INIT
(
NULL
)
0
,
/*ob_size */
0
,
/*ob_size */
"tktimertoken"
,
/*tp_name */
"tktimertoken"
,
/*tp_name */
sizeof
(
TkttObject
),
/*tp_basicsize */
sizeof
(
TkttObject
),
/*tp_basicsize */
0
,
/*tp_itemsize */
0
,
/*tp_itemsize */
Tktt_Dealloc
,
/*tp_dealloc */
Tktt_Dealloc
,
/*tp_dealloc */
Tktt_Print
,
/*tp_print */
Tktt_Print
,
/*tp_print */
Tktt_GetAttr
,
/*tp_getattr */
Tktt_GetAttr
,
/*tp_getattr */
0
,
/*tp_setattr */
0
,
/*tp_setattr */
0
,
/*tp_compare */
0
,
/*tp_compare */
0
,
/*tp_repr */
0
,
/*tp_repr */
0
,
/*tp_as_number */
0
,
/*tp_as_number */
0
,
/*tp_as_sequence */
0
,
/*tp_as_sequence */
0
,
/*tp_as_mapping */
0
,
/*tp_as_mapping */
0
,
/*tp_hash */
0
,
/*tp_hash */
};
};
/** Timer Handler **/
/** Timer Handler **/
static
void
static
void
TimerHandler
(
clientData
)
TimerHandler
(
clientData
)
ClientData
clientData
;
ClientData
clientData
;
{
{
PyObject
*
func
=
(
PyObject
*
)
clientData
;
PyObject
*
func
=
(
PyObject
*
)
clientData
;
PyObject
*
arg
,
*
res
;
PyObject
*
res
=
PyEval_CallObject
(
func
,
NULL
)
;
arg
=
PyTuple_New
(
0
);
if
(
res
==
NULL
)
{
res
=
PyEval_CallObject
(
func
,
arg
);
errorInCmd
=
1
;
Py_DECREF
(
arg
);
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
if
(
res
==
NULL
)
}
{
else
errorInCmd
=
1
;
Py_DECREF
(
res
);
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
}
else
Py_DECREF
(
res
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_CreateTimerHandler
(
self
,
args
)
Tkapp_CreateTimerHandler
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
/* Is (milliseconds, func) */
PyObject
*
args
;
/* Is (milliseconds, func) */
{
{
int
milliseconds
;
int
milliseconds
;
PyObject
*
func
;
PyObject
*
func
;
Tk_TimerToken
token
;
Tk_TimerToken
token
;
if
(
!
PyArg_Parse
(
args
,
"(iO)"
,
&
milliseconds
,
&
func
))
return
NULL
;
if
(
!
PyCallable_Check
(
func
))
{
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
return
NULL
;
}
token
=
Tk_CreateTimerHandler
(
milliseconds
,
TimerHandler
,
(
ClientData
)
func
);
if
(
!
PyArg_Parse
(
args
,
"(iO)"
,
&
milliseconds
,
&
func
))
return
(
PyObject
*
)
Tktt_New
(
token
,
func
);
return
NULL
;
if
(
!
PyCallable_Check
(
func
))
{
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
return
NULL
;
}
token
=
Tk_CreateTimerHandler
(
milliseconds
,
TimerHandler
,
(
ClientData
)
func
);
return
(
PyObject
*
)
Tktt_New
(
token
,
func
);
}
}
/** Event Loop **/
/** Event Loop **/
static
PyObject
*
static
PyObject
*
Tkapp_MainLoop
(
self
,
args
)
Tkapp_MainLoop
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
int
threshold
=
0
;
int
threshold
=
0
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
threshold
))
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
threshold
))
return
NULL
;
return
NULL
;
quitMainLoop
=
0
;
quitMainLoop
=
0
;
while
(
Tk_GetNumMainWindows
()
>
threshold
&&
!
quitMainLoop
&&
!
errorInCmd
)
while
(
Tk_GetNumMainWindows
()
>
threshold
&&
{
!
quitMainLoop
&&
/* XXX Ought to check for other signals! */
!
errorInCmd
)
if
(
PyOS_InterruptOccurred
())
{
{
PyErr_SetNone
(
PyExc_KeyboardInterrupt
);
/* XXX Ought to check for other signals! */
return
NULL
;
if
(
PyOS_InterruptOccurred
())
{
PyErr_SetNone
(
PyExc_KeyboardInterrupt
);
return
NULL
;
}
Tk_DoOneEvent
(
0
);
}
}
Tk_DoOneEvent
(
0
);
quitMainLoop
=
0
;
}
quitMainLoop
=
0
;
if
(
errorInCmd
)
if
(
errorInCmd
)
{
{
errorInCmd
=
0
;
errorInCmd
=
0
;
PyErr_Restore
(
excInCmd
,
valInCmd
,
trbInCmd
);
PyErr_Restore
(
excInCmd
,
valInCmd
,
trbInCmd
);
excInCmd
=
valInCmd
=
trbInCmd
=
NULL
;
excInCmd
=
valInCmd
=
trbInCmd
=
NULL
;
return
NULL
;
return
NULL
;
}
}
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
static
PyObject
*
static
PyObject
*
Tkapp_DoOneEvent
(
self
,
args
)
Tkapp_DoOneEvent
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
int
flags
=
TK_ALL_EVENTS
;
int
flags
=
TK_ALL_EVENTS
;
int
rv
;
int
rv
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
flags
))
return
NULL
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
flags
))
rv
=
Tk_DoOneEvent
(
flags
);
return
NULL
;
return
Py_BuildValue
(
"i"
,
rv
);
rv
=
Tk_DoOneEvent
(
flags
);
return
Py_BuildValue
(
"i"
,
rv
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_Quit
(
self
,
args
)
Tkapp_Quit
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
if
(
!
PyArg_Parse
(
args
,
""
))
if
(
!
PyArg_Parse
(
args
,
""
))
return
NULL
;
return
NULL
;
quitMainLoop
=
1
;
Py_INCREF
(
Py_None
);
quitMainLoop
=
1
;
return
Py_None
;
Py_INCREF
(
Py_None
);
return
Py_None
;
}
}
/**** Tkapp Method List ****/
/**** Tkapp Method List ****/
static
PyMethodDef
Tkapp_methods
[]
=
static
PyMethodDef
Tkapp_methods
[]
=
{
{
{
"call"
,
Tkapp_Call
},
{
"call"
,
Tkapp_Call
},
{
"globalcall"
,
Tkapp_GlobalCall
},
{
"globalcall"
,
Tkapp_GlobalCall
},
{
"eval"
,
Tkapp_Eval
},
{
"eval"
,
Tkapp_Eval
},
{
"globaleval"
,
Tkapp_GlobalEval
},
{
"globaleval"
,
Tkapp_GlobalEval
},
{
"evalfile"
,
Tkapp_EvalFile
},
{
"evalfile"
,
Tkapp_EvalFile
},
{
"record"
,
Tkapp_Record
},
{
"record"
,
Tkapp_Record
},
{
"adderrorinfo"
,
Tkapp_AddErrorInfo
},
{
"adderrorinfo"
,
Tkapp_AddErrorInfo
},
{
"setvar"
,
Tkapp_SetVar
},
{
"setvar"
,
Tkapp_SetVar
},
{
"globalsetvar"
,
Tkapp_GlobalSetVar
},
{
"globalsetvar"
,
Tkapp_GlobalSetVar
},
{
"getvar"
,
Tkapp_GetVar
},
{
"getvar"
,
Tkapp_GetVar
},
{
"globalgetvar"
,
Tkapp_GlobalGetVar
},
{
"globalgetvar"
,
Tkapp_GlobalGetVar
},
{
"unsetvar"
,
Tkapp_UnsetVar
},
{
"unsetvar"
,
Tkapp_UnsetVar
},
{
"globalunsetvar"
,
Tkapp_GlobalUnsetVar
},
{
"globalunsetvar"
,
Tkapp_GlobalUnsetVar
},
{
"getint"
,
Tkapp_GetInt
},
{
"getint"
,
Tkapp_GetInt
},
{
"getdouble"
,
Tkapp_GetDouble
},
{
"getdouble"
,
Tkapp_GetDouble
},
{
"getboolean"
,
Tkapp_GetBoolean
},
{
"getboolean"
,
Tkapp_GetBoolean
},
{
"exprstring"
,
Tkapp_ExprString
},
{
"exprstring"
,
Tkapp_ExprString
},
{
"exprlong"
,
Tkapp_ExprLong
},
{
"exprlong"
,
Tkapp_ExprLong
},
{
"exprdouble"
,
Tkapp_ExprDouble
},
{
"exprdouble"
,
Tkapp_ExprDouble
},
{
"exprboolean"
,
Tkapp_ExprBoolean
},
{
"exprboolean"
,
Tkapp_ExprBoolean
},
{
"splitlist"
,
Tkapp_SplitList
},
{
"splitlist"
,
Tkapp_SplitList
},
{
"split"
,
Tkapp_Split
},
{
"split"
,
Tkapp_Split
},
{
"merge"
,
Tkapp_Merge
},
{
"merge"
,
Tkapp_Merge
},
{
"createcommand"
,
Tkapp_CreateCommand
},
{
"createcommand"
,
Tkapp_CreateCommand
},
{
"deletecommand"
,
Tkapp_DeleteCommand
},
{
"deletecommand"
,
Tkapp_DeleteCommand
},
{
"createfilehandler"
,
Tkapp_CreateFileHandler
},
{
"createfilehandler"
,
Tkapp_CreateFileHandler
},
{
"deletefilehandler"
,
Tkapp_DeleteFileHandler
},
{
"deletefilehandler"
,
Tkapp_DeleteFileHandler
},
{
"createtimerhandler"
,
Tkapp_CreateTimerHandler
},
{
"createtimerhandler"
,
Tkapp_CreateTimerHandler
},
{
"mainloop"
,
Tkapp_MainLoop
,
1
},
{
"mainloop"
,
Tkapp_MainLoop
,
1
},
{
"dooneevent"
,
Tkapp_DoOneEvent
,
1
},
{
"dooneevent"
,
Tkapp_DoOneEvent
,
1
},
{
"quit"
,
Tkapp_Quit
},
{
"quit"
,
Tkapp_Quit
},
{
NULL
,
NULL
}
{
NULL
,
NULL
}
};
};
/**** Tkapp Type Methods ****/
/**** Tkapp Type Methods ****/
static
void
static
void
Tkapp_Dealloc
(
self
)
Tkapp_Dealloc
(
self
)
PyObject
*
self
;
PyObject
*
self
;
{
{
#ifdef NEED_TKCREATEMAINWINDOW
#ifdef NEED_TKCREATEMAINWINDOW
Tk_DestroyWindow
(
Tkapp_Tkwin
(
self
));
Tk_DestroyWindow
(
Tkapp_Tkwin
(
self
));
#endif
#endif
Tcl_DeleteInterp
(
Tkapp_Interp
(
self
));
Tcl_DeleteInterp
(
Tkapp_Interp
(
self
));
PyMem_DEL
(
self
);
PyMem_DEL
(
self
);
}
}
static
PyObject
*
static
PyObject
*
Tkapp_GetAttr
(
self
,
name
)
Tkapp_GetAttr
(
self
,
name
)
PyObject
*
self
;
PyObject
*
self
;
char
*
name
;
char
*
name
;
{
{
return
Py_FindMethod
(
Tkapp_methods
,
self
,
name
);
return
Py_FindMethod
(
Tkapp_methods
,
self
,
name
);
}
}
static
PyTypeObject
Tkapp_Type
=
static
PyTypeObject
Tkapp_Type
=
{
{
PyObject_HEAD_INIT
(
NULL
)
PyObject_HEAD_INIT
(
NULL
)
0
,
/*ob_size */
0
,
/*ob_size */
"tkapp"
,
/*tp_name */
"tkapp"
,
/*tp_name */
sizeof
(
TkappObject
),
/*tp_basicsize */
sizeof
(
TkappObject
),
/*tp_basicsize */
0
,
/*tp_itemsize */
0
,
/*tp_itemsize */
Tkapp_Dealloc
,
/*tp_dealloc */
Tkapp_Dealloc
,
/*tp_dealloc */
0
,
/*tp_print */
0
,
/*tp_print */
Tkapp_GetAttr
,
/*tp_getattr */
Tkapp_GetAttr
,
/*tp_getattr */
0
,
/*tp_setattr */
0
,
/*tp_setattr */
0
,
/*tp_compare */
0
,
/*tp_compare */
0
,
/*tp_repr */
0
,
/*tp_repr */
0
,
/*tp_as_number */
0
,
/*tp_as_number */
0
,
/*tp_as_sequence */
0
,
/*tp_as_sequence */
0
,
/*tp_as_mapping */
0
,
/*tp_as_mapping */
0
,
/*tp_hash */
0
,
/*tp_hash */
};
};
/**** Tkinter Module ****/
/**** Tkinter Module ****/
static
PyObject
*
static
PyObject
*
Tkinter_Create
(
self
,
args
)
Tkinter_Create
(
self
,
args
)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
screenName
=
NULL
;
char
*
screenName
=
NULL
;
char
*
baseName
=
NULL
;
char
*
baseName
=
NULL
;
char
*
className
=
NULL
;
char
*
className
=
NULL
;
int
interactive
=
0
;
int
interactive
=
0
;
baseName
=
strrchr
(
Py_GetProgramName
(),
'/'
);
baseName
=
strrchr
(
Py_GetProgramName
(),
'/'
);
if
(
baseName
!=
NULL
)
if
(
baseName
!=
NULL
)
baseName
++
;
baseName
++
;
else
else
baseName
=
Py_GetProgramName
();
baseName
=
Py_GetProgramName
();
className
=
"Tk"
;
className
=
"Tk"
;
if
(
!
PyArg_ParseTuple
(
args
,
"|zssi"
,
if
(
!
PyArg_ParseTuple
(
args
,
"|zssi"
,
&
screenName
,
&
baseName
,
&
className
,
&
interactive
))
&
screenName
,
&
baseName
,
&
className
,
return
NULL
;
&
interactive
))
return
NULL
;
return
(
PyObject
*
)
Tkapp_New
(
screenName
,
baseName
,
className
,
return
(
PyObject
*
)
Tkapp_New
(
screenName
,
baseName
,
className
,
interactive
);
interactive
);
}
}
static
PyMethodDef
moduleMethods
[]
=
static
PyMethodDef
moduleMethods
[]
=
{
{
{
"create"
,
Tkinter_Create
,
1
},
{
"create"
,
Tkinter_Create
,
1
},
{
"createfilehandler"
,
Tkapp_CreateFileHandler
,
0
},
{
"createfilehandler"
,
Tkapp_CreateFileHandler
,
0
},
{
"deletefilehandler"
,
Tkapp_DeleteFileHandler
,
0
},
{
"deletefilehandler"
,
Tkapp_DeleteFileHandler
,
0
},
{
"createtimerhandler"
,
Tkapp_CreateTimerHandler
,
0
},
{
"createtimerhandler"
,
Tkapp_CreateTimerHandler
,
0
},
{
"mainloop"
,
Tkapp_MainLoop
,
1
},
{
"mainloop"
,
Tkapp_MainLoop
,
1
},
{
"dooneevent"
,
Tkapp_DoOneEvent
,
1
},
{
"dooneevent"
,
Tkapp_DoOneEvent
,
1
},
{
"quit"
,
Tkapp_Quit
},
{
"quit"
,
Tkapp_Quit
},
{
NULL
,
NULL
}
{
NULL
,
NULL
}
};
};
#undef WITH_READLINE
/* XXX */
#undef WITH_READLINE
/* XXX */
...
@@ -1322,95 +1445,114 @@ static PyMethodDef moduleMethods[] =
...
@@ -1322,95 +1445,114 @@ static PyMethodDef moduleMethods[] =
static
int
static
int
EventHook
()
EventHook
()
{
{
if
(
errorInCmd
)
/* XXX Reset tty */
/* XXX Reset tty */
{
if
(
errorInCmd
)
{
errorInCmd
=
0
;
errorInCmd
=
0
;
PyErr_Restore
(
excInCmd
,
valInCmd
,
trbInCmd
);
PyErr_Restore
(
excInCmd
,
valInCmd
,
trbInCmd
);
excInCmd
=
valInCmd
=
trbInCmd
=
NULL
;
excInCmd
=
valInCmd
=
trbInCmd
=
NULL
;
PyErr_Print
();
PyErr_Print
();
}
}
if
(
Tk_GetNumMainWindows
()
>
0
)
if
(
Tk_GetNumMainWindows
()
>
0
)
Tk_DoOneEvent
(
TK_DONT_WAIT
);
Tk_DoOneEvent
(
TK_DONT_WAIT
);
return
0
;
return
0
;
}
}
#endif
/* WITH_READLINE */
#endif
/* WITH_READLINE */
static
void
static
void
Tkinter_Cleanup
()
Tkinter_Cleanup
()
{
{
/* This segfault with Tk 4.0 beta and seems unnecessary there as well */
/* This segfault with Tk 4.0 beta and seems unnecessary there as
* well */
#if TK_MAJOR_VERSION < 4
#if TK_MAJOR_VERSION < 4
/* XXX rl_deprep_terminal is static, damned! */
/* XXX rl_deprep_terminal is static, damned! */
while
(
tkMainWindowList
!=
0
)
while
(
tkMainWindowList
!=
0
)
Tk_DestroyWindow
(
tkMainWindowList
->
win
);
Tk_DestroyWindow
(
tkMainWindowList
->
win
);
#endif
#endif
}
}
/* all errors will be checked in one fell swoop in init_tkinter() */
static
void
ins_long
(
d
,
name
,
val
)
PyObject
*
d
;
char
*
name
;
long
val
;
{
PyObject
*
v
=
PyInt_FromLong
(
val
);
if
(
v
)
{
PyDict_SetItemString
(
d
,
name
,
v
);
Py_DECREF
(
v
);
}
}
static
void
ins_string
(
d
,
name
,
val
)
PyObject
*
d
;
char
*
name
;
char
*
val
;
{
PyObject
*
v
=
PyString_FromString
(
val
);
if
(
v
)
{
PyDict_SetItemString
(
d
,
name
,
v
);
Py_DECREF
(
v
);
}
}
void
void
init_tkinter
()
init_tkinter
()
{
{
static
inited
=
0
;
static
inited
=
0
;
#ifdef WITH_READLINE
#ifdef WITH_READLINE
extern
int
(
*
rl_event_hook
)
();
extern
int
(
*
rl_event_hook
)
();
#endif
/* WITH_READLINE */
#endif
/* WITH_READLINE */
PyObject
*
m
,
*
d
,
*
v
;
PyObject
*
m
,
*
d
;
Tkapp_Type
.
ob_type
=
&
PyType_Type
;
Tkapp_Type
.
ob_type
=
&
PyType_Type
;
Tktt_Type
.
ob_type
=
&
PyType_Type
;
Tktt_Type
.
ob_type
=
&
PyType_Type
;
m
=
Py_InitModule
(
"_tkinter"
,
moduleMethods
);
m
=
Py_InitModule
(
"_tkinter"
,
moduleMethods
);
d
=
PyModule_GetDict
(
m
);
d
=
PyModule_GetDict
(
m
);
Tkinter_TclError
=
Py_BuildValue
(
"s"
,
"TclError"
);
Tkinter_TclError
=
Py_BuildValue
(
"s"
,
"TclError"
);
PyDict_SetItemString
(
d
,
"TclError"
,
Tkinter_TclError
);
PyDict_SetItemString
(
d
,
"TclError"
,
Tkinter_TclError
);
v
=
Py_BuildValue
(
"i"
,
TK_READABLE
);
ins_long
(
d
,
"READABLE"
,
TK_READABLE
);
PyDict_SetItemString
(
d
,
"READABLE"
,
v
);
ins_long
(
d
,
"WRITABLE"
,
TK_WRITABLE
);
v
=
Py_BuildValue
(
"i"
,
TK_WRITABLE
);
ins_long
(
d
,
"EXCEPTION"
,
TK_EXCEPTION
);
PyDict_SetItemString
(
d
,
"WRITABLE"
,
v
);
ins_long
(
d
,
"X_EVENTS"
,
TK_X_EVENTS
);
v
=
Py_BuildValue
(
"i"
,
TK_EXCEPTION
);
ins_long
(
d
,
"FILE_EVENTS"
,
TK_FILE_EVENTS
);
PyDict_SetItemString
(
d
,
"EXCEPTION"
,
v
);
ins_long
(
d
,
"TIMER_EVENTS"
,
TK_TIMER_EVENTS
);
v
=
Py_BuildValue
(
"i"
,
TK_X_EVENTS
);
ins_long
(
d
,
"IDLE_EVENTS"
,
TK_IDLE_EVENTS
);
PyDict_SetItemString
(
d
,
"X_EVENTS"
,
v
);
ins_long
(
d
,
"ALL_EVENTS"
,
TK_ALL_EVENTS
);
v
=
Py_BuildValue
(
"i"
,
TK_FILE_EVENTS
);
ins_long
(
d
,
"DONT_WAIT"
,
TK_DONT_WAIT
);
PyDict_SetItemString
(
d
,
"FILE_EVENTS"
,
v
);
ins_string
(
d
,
"TK_VERSION"
,
TK_VERSION
);
v
=
Py_BuildValue
(
"i"
,
TK_TIMER_EVENTS
);
ins_string
(
d
,
"TCL_VERSION"
,
TCL_VERSION
);
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
);
v
=
Py_BuildValue
(
"s"
,
TK_VERSION
);
PyDict_SetItemString
(
d
,
"TK_VERSION"
,
v
);
v
=
Py_BuildValue
(
"s"
,
TCL_VERSION
);
PyDict_SetItemString
(
d
,
"TCL_VERSION"
,
v
);
#ifdef WITH_READLINE
#ifdef WITH_READLINE
rl_event_hook
=
EventHook
;
rl_event_hook
=
EventHook
;
#endif
/* WITH_READLINE */
#endif
/* WITH_READLINE */
if
(
!
inited
)
if
(
!
inited
)
{
{
inited
=
1
;
inited
=
1
;
if
(
Py_AtExit
(
Tkinter_Cleanup
)
!=
0
)
if
(
Py_AtExit
(
Tkinter_Cleanup
)
!=
0
)
fprintf
(
stderr
,
fprintf
(
stderr
,
"Tkinter: warning: cleanup procedure not registered
\n
"
);
"Tkinter: warning: cleanup procedure not registered
\n
"
);
}
}
if
(
PyErr_Occurred
())
if
(
PyErr_Occurred
())
Py_FatalError
(
"can't initialize module _tkinter"
);
Py_FatalError
(
"can't initialize module _tkinter"
);
#ifdef macintosh
#ifdef macintosh
TclMacSetEventProc
(
PyMacConvertEvent
);
TclMacSetEventProc
(
PyMacConvertEvent
);
#if GENERATINGCFM
#if GENERATINGCFM
mac_addlibresources
();
mac_addlibresources
();
#endif
/* GENERATINGCFM */
#endif
/* GENERATINGCFM */
#endif
/* macintosh */
#endif
/* macintosh */
}
}
#ifdef macintosh
#ifdef macintosh
/*
/*
...
@@ -1420,16 +1562,16 @@ init_tkinter ()
...
@@ -1420,16 +1562,16 @@ init_tkinter ()
void
void
panic
(
char
*
format
,
...)
panic
(
char
*
format
,
...)
{
{
va_list
varg
;
va_list
varg
;
va_start
(
varg
,
format
);
va_start
(
varg
,
format
);
vfprintf
(
stderr
,
format
,
varg
);
vfprintf
(
stderr
,
format
,
varg
);
(
void
)
fflush
(
stderr
);
(
void
)
fflush
(
stderr
);
va_end
(
varg
);
va_end
(
varg
);
Py_FatalError
(
"Tcl/Tk panic"
);
Py_FatalError
(
"Tcl/Tk panic"
);
}
}
/*
/*
...
@@ -1438,11 +1580,11 @@ panic(char * format, ...)
...
@@ -1438,11 +1580,11 @@ panic(char * format, ...)
static
int
static
int
PyMacConvertEvent
(
eventPtr
)
PyMacConvertEvent
(
eventPtr
)
EventRecord
*
eventPtr
;
EventRecord
*
eventPtr
;
{
{
if
(
SIOUXHandleOneEvent
(
eventPtr
))
if
(
SIOUXHandleOneEvent
(
eventPtr
))
return
0
;
/* Nothing happened to the Tcl event queue */
return
0
;
/* Nothing happened to the Tcl event queue */
return
TkMacConvertEvent
(
eventPtr
);
return
TkMacConvertEvent
(
eventPtr
);
}
}
#if GENERATINGCFM
#if GENERATINGCFM
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment