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
fa701a88
Commit
fa701a88
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
e4d7821e
Changes
1
Show 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 @
fa701a88
...
@@ -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,121 +128,123 @@ static PyObject *excInCmd;
...
@@ -126,121 +128,123 @@ 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
;
if
(
!
(
tmp
=
PyList_New
(
0
)))
return
NULL
;
tmp
=
PyList_New
(
0
);
argv
=
argvStore
;
argv
=
argvStore
;
fv
=
fvStore
;
fv
=
fvStore
;
if
(
args
==
NULL
)
if
(
args
==
NULL
)
{
argc
=
0
;
argc
=
0
;
}
else
if
(
!
PyTuple_Check
(
args
))
else
if
(
!
PyTuple_Check
(
args
))
{
{
argc
=
1
;
argc
=
1
;
fv
[
0
]
=
0
;
fv
[
0
]
=
0
;
argv
[
0
]
=
AsString
(
args
,
tmp
);
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
;
}
}
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
);
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
for
(
i
=
0
;
i
<
argc
;
i
++
)
PyObject
*
v
=
PyTuple_GetItem
(
args
,
i
);
{
if
(
PyTuple_Check
(
v
))
{
v
=
PyTuple_GetItem
(
args
,
i
);
if
(
PyTuple_Check
(
v
))
{
fv
[
i
]
=
1
;
fv
[
i
]
=
1
;
argv
[
i
]
=
Merge
(
v
);
if
(
!
(
argv
[
i
]
=
Merge
(
v
)))
goto
finally
;
}
}
else
if
(
v
==
Py_None
)
else
if
(
v
==
Py_None
)
{
{
argc
=
i
;
argc
=
i
;
break
;
break
;
}
}
else
else
{
{
fv
[
i
]
=
0
;
fv
[
i
]
=
0
;
argv
[
i
]
=
AsString
(
v
,
tmp
);
argv
[
i
]
=
AsString
(
v
,
tmp
);
}
}
}
}
}
}
res
=
Tcl_Merge
(
argc
,
argv
);
res
=
Tcl_Merge
(
argc
,
argv
);
finally:
Py_DECREF
(
tmp
);
for
(
i
=
0
;
i
<
argc
;
i
++
)
for
(
i
=
0
;
i
<
argc
;
i
++
)
if
(
fv
[
i
])
ckfree
(
argv
[
i
]);
if
(
fv
[
i
])
{
ckfree
(
argv
[
i
]);
}
if
(
argv
!=
argvStore
)
if
(
argv
!=
argvStore
)
ckfree
(
FREECAST
argv
);
ckfree
(
FREECAST
argv
);
if
(
fv
!=
fvStore
)
if
(
fv
!=
fvStore
)
ckfree
(
FREECAST
fv
);
ckfree
(
FREECAST
fv
);
Py_DECREF
(
tmp
);
return
res
;
return
res
;
}
}
static
PyObject
*
static
PyObject
*
Split
(
self
,
list
)
Split
(
self
,
list
)
PyObject
*
self
;
PyObject
*
self
;
char
*
list
;
char
*
list
;
{
{
...
@@ -248,45 +252,44 @@ Split (self, list)
...
@@ -248,45 +252,44 @@ Split (self, list)
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
);
Py_DECREF
(
v
);
v
=
NULL
;
v
=
NULL
;
break
;
break
;
}
}
PyTuple_SetItem
(
v
,
i
,
w
);
PyTuple_SetItem
(
v
,
i
,
w
);
}
}
}
}
ckfree
(
FREECAST
argv
);
ckfree
(
FREECAST
argv
);
return
v
;
return
v
;
}
}
/**** Tkapp Object ****/
/**** Tkapp Object ****/
#ifndef WITH_APPINIT
#ifndef WITH_APPINIT
...
@@ -297,23 +300,26 @@ Tcl_AppInit (interp)
...
@@ -297,23 +300,26 @@ Tcl_AppInit (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
;
...
@@ -322,85 +328,103 @@ Tkapp_New (screenName, baseName, className, interactive)
...
@@ -322,85 +328,103 @@ Tkapp_New (screenName, baseName, className, 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 */
/* This is used to get the application class for Tk 4.1 and up */
argv0
=
(
char
*
)
ckalloc
(
strlen
(
className
)
+
1
);
argv0
=
(
char
*
)
ckalloc
(
strlen
(
className
)
+
1
);
if
(
argv0
!=
NULL
)
{
if
(
!
argv0
)
{
strcpy
(
argv0
,
className
);
PyErr_NoMemory
();
if
(
isupper
(
argv0
[
0
]))
Py_DECREF
(
v
);
argv0
[
0
]
=
tolower
(
argv0
[
0
]);
return
NULL
;
Tcl_SetVar
(
v
->
interp
,
"argv0"
,
argv0
,
TCL_GLOBAL_ONLY
);
ckfree
(
argv0
);
}
}
if
(
Tcl_AppInit
(
v
->
interp
)
!=
TCL_OK
)
strcpy
(
argv0
,
className
);
return
(
TkappObject
*
)
Tkinter_Error
(
v
);
if
(
isupper
(
argv0
[
0
]))
argv0
[
0
]
=
tolower
(
argv0
[
0
]);
Tcl_SetVar
(
v
->
interp
,
"argv0"
,
argv0
,
TCL_GLOBAL_ONLY
);
ckfree
(
argv0
);
if
(
Tcl_AppInit
(
v
->
interp
)
!=
TCL_OK
)
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
;
cmd
=
Merge
(
args
);
if
(
!
cmd
)
if
(
Tcl_Eval
(
Tkapp_Interp
(
self
),
cmd
)
==
TCL_ERROR
)
PyErr_SetString
(
Tkinter_TclError
,
"merge failed"
);
{
ckfree
(
cmd
);
return
Tkinter_Error
(
self
);
}
ckfree
(
cmd
);
else
if
(
Tcl_Eval
(
Tkapp_Interp
(
self
),
cmd
)
==
TCL_ERROR
)
return
PyString_FromString
(
Tkapp_Result
(
self
));
res
=
Tkinter_Error
(
self
);
else
res
=
PyString_FromString
(
Tkapp_Result
(
self
));
if
(
cmd
)
ckfree
(
cmd
);
return
res
;
}
}
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
)
{
ckfree
(
cmd
);
return
Tkinter_Error
(
self
);
}
ckfree
(
cmd
);
if
(
!
cmd
)
return
PyString_FromString
(
Tkapp_Result
(
self
));
PyErr_SetString
(
Tkinter_TclError
,
"merge failed"
);
else
if
(
Tcl_GlobalEval
(
Tkapp_Interp
(
self
),
cmd
)
==
TCL_ERROR
)
res
=
Tkinter_Error
(
self
);
else
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
;
{
{
...
@@ -409,26 +433,26 @@ Tkapp_Eval (self, args)
...
@@ -409,26 +433,26 @@ Tkapp_Eval (self, args)
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
*
...
@@ -438,34 +462,34 @@ Tkapp_EvalFile (self, args)
...
@@ -438,34 +462,34 @@ Tkapp_EvalFile (self, 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
;
{
{
...
@@ -473,43 +497,47 @@ Tkapp_AddErrorInfo (self, args)
...
@@ -473,43 +497,47 @@ Tkapp_AddErrorInfo (self, args)
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
))
if
(
PyArg_Parse
(
args
,
"(sO)"
,
&
name1
,
&
newValue
))
ok
=
Tcl_SetVar
(
Tkapp_Interp
(
self
),
name1
,
/* XXX Merge? */
AsString
(
newValue
,
tmp
),
flags
);
/* XXX Merge? */
ok
=
Tcl_SetVar
(
Tkapp_Interp
(
self
),
name1
,
else
if
(
PyArg_Parse
(
args
,
"(ssO)"
,
&
name1
,
&
name2
,
&
newValue
))
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
,
AsString
(
newValue
,
tmp
),
flags
);
else
{
Py_DECREF
(
tmp
);
Py_DECREF
(
tmp
);
return
NULL
;
return
NULL
;
}
}
Py_DECREF
(
tmp
);
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
;
}
}
...
@@ -518,7 +546,7 @@ Tkapp_SetVar (self, args)
...
@@ -518,7 +546,7 @@ 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
*
...
@@ -526,9 +554,11 @@ Tkapp_GlobalSetVar (self, args)
...
@@ -526,9 +554,11 @@ 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
;
...
@@ -537,15 +567,16 @@ GetVar (self, args, flags)
...
@@ -537,15 +567,16 @@ GetVar (self, args, 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
if
(
PyArg_Parse
(
args
,
"(ss)"
,
&
name1
,
&
name2
))
s
=
Tcl_GetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
flags
);
else
else
return
NULL
;
return
NULL
;
if
(
s
==
NULL
)
if
(
s
==
NULL
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
PyString_FromString
(
s
);
return
PyString_FromString
(
s
);
}
}
...
@@ -555,7 +586,7 @@ Tkapp_GetVar (self, args)
...
@@ -555,7 +586,7 @@ 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
*
...
@@ -563,9 +594,11 @@ Tkapp_GlobalGetVar (self, args)
...
@@ -563,9 +594,11 @@ 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
;
...
@@ -575,17 +608,18 @@ UnsetVar (self, args, flags)
...
@@ -575,17 +608,18 @@ UnsetVar (self, args, 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
if
(
PyArg_Parse
(
args
,
"(ss)"
,
&
name1
,
&
name2
))
code
=
Tcl_UnsetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
flags
);
else
else
return
NULL
;
return
NULL
;
if
(
code
==
TCL_ERROR
)
if
(
code
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
...
@@ -594,7 +628,7 @@ Tkapp_UnsetVar (self, args)
...
@@ -594,7 +628,7 @@ 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
*
...
@@ -602,9 +636,11 @@ Tkapp_GlobalUnsetVar (self, args)
...
@@ -602,9 +636,11 @@ 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
*
...
@@ -615,11 +651,11 @@ Tkapp_GetInt (self, args)
...
@@ -615,11 +651,11 @@ Tkapp_GetInt (self, 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
*
...
@@ -630,11 +666,11 @@ Tkapp_GetDouble (self, args)
...
@@ -630,11 +666,11 @@ Tkapp_GetDouble (self, 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
*
...
@@ -645,11 +681,11 @@ Tkapp_GetBoolean (self, args)
...
@@ -645,11 +681,11 @@ Tkapp_GetBoolean (self, 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
*
...
@@ -659,11 +695,11 @@ Tkapp_ExprString (self, args)
...
@@ -659,11 +695,11 @@ Tkapp_ExprString (self, 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
*
...
@@ -674,11 +710,11 @@ Tkapp_ExprLong (self, args)
...
@@ -674,11 +710,11 @@ Tkapp_ExprLong (self, 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
*
...
@@ -689,11 +725,11 @@ Tkapp_ExprDouble (self, args)
...
@@ -689,11 +725,11 @@ Tkapp_ExprDouble (self, 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
*
...
@@ -704,13 +740,15 @@ Tkapp_ExprBoolean (self, args)
...
@@ -704,13 +740,15 @@ Tkapp_ExprBoolean (self, 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
;
...
@@ -722,17 +760,26 @@ Tkapp_SplitList (self, args)
...
@@ -722,17 +760,26 @@ Tkapp_SplitList (self, args)
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
]));
ckfree
(
FREECAST
argv
);
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
;
}
}
finally:
ckfree
(
FREECAST
argv
);
return
v
;
return
v
;
}
}
...
@@ -743,9 +790,9 @@ Tkapp_Split (self, args)
...
@@ -743,9 +790,9 @@ Tkapp_Split (self, 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
*
...
@@ -753,19 +800,26 @@ Tkapp_Merge (self, args)
...
@@ -753,19 +800,26 @@ Tkapp_Merge (self, args)
PyObject
*
self
;
PyObject
*
self
;
PyObject
*
args
;
PyObject
*
args
;
{
{
char
*
s
;
char
*
s
=
Merge
(
args
)
;
PyObject
*
v
;
PyObject
*
res
=
NULL
;
s
=
Merge
(
args
);
if
(
s
)
{
v
=
PyString_FromString
(
s
);
res
=
PyString_FromString
(
s
);
ckfree
(
s
);
ckfree
(
s
);
return
v
;
}
else
PyErr_SetString
(
Tkinter_TclError
,
"merge failed"
);
return
res
;
}
}
/** 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) */
...
@@ -776,24 +830,37 @@ PythonCmd (clientData, interp, argc, argv)
...
@@ -776,24 +830,37 @@ PythonCmd (clientData, interp, argc, 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) */
/* Create argument list (argv1, ..., argvN) */
arg
=
PyTuple_New
(
argc
-
1
);
if
(
!
(
arg
=
PyTuple_New
(
argc
-
1
)))
for
(
i
=
0
;
i
<
(
argc
-
1
);
i
++
)
return
PythonCmd_Error
(
interp
);
PyTuple_SetItem
(
arg
,
i
,
PyString_FromString
(
argv
[
i
+
1
]));
for
(
i
=
0
;
i
<
(
argc
-
1
);
i
++
)
{
res
=
PyEval_CallObject
(
func
,
arg
);
PyObject
*
s
=
PyString_FromString
(
argv
[
i
+
1
]);
Py_DECREF
(
arg
);
if
(
!
s
||
PyTuple_SetItem
(
arg
,
i
,
s
))
{
Py_DECREF
(
arg
);
PythonCmd_Error
(
interp
);
}
}
res
=
PyEval_CallObject
(
func
,
arg
);
Py_DECREF
(
arg
);
if
(
res
==
NULL
)
if
(
res
==
NULL
)
return
PythonCmd_Error
(
interp
);
return
PythonCmd_Error
(
interp
);
tmp
=
PyList_New
(
0
);
if
(
!
(
tmp
=
PyList_New
(
0
)))
{
Tcl_SetResult
(
Tkapp_Interp
(
self
),
AsString
(
res
,
tmp
),
TCL_VOLATILE
);
Py_DECREF
(
res
);
Py_DECREF
(
res
);
return
PythonCmd_Error
(
interp
);
Py_DECREF
(
tmp
);
}
Tcl_SetResult
(
Tkapp_Interp
(
self
),
AsString
(
res
,
tmp
),
TCL_VOLATILE
);
Py_DECREF
(
res
);
Py_DECREF
(
tmp
);
return
TCL_OK
;
return
TCL_OK
;
}
}
...
@@ -802,9 +869,11 @@ static void
...
@@ -802,9 +869,11 @@ 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
;
...
@@ -815,33 +884,37 @@ Tkapp_CreateCommand (self, args)
...
@@ -815,33 +884,37 @@ Tkapp_CreateCommand (self, args)
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
;
...
@@ -849,17 +922,19 @@ Tkapp_DeleteCommand (self, args)
...
@@ -849,17 +922,19 @@ Tkapp_DeleteCommand (self, 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
...
@@ -869,24 +944,26 @@ FileHandler (clientData, mask)
...
@@ -869,24 +944,26 @@ FileHandler (clientData, 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,30 +1001,47 @@ GetFileNo (file)
...
@@ -918,30 +1001,47 @@ 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
;
PyObject
*
idkey
;
int
mask
,
id
;
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
)
{
if
(
!
(
Tkapp_ClientDataDict
=
PyDict_New
()))
return
NULL
;
return
NULL
;
id
=
GetFileNo
(
file
);
}
if
(
!
PyArg_Parse
(
args
,
"(OiO)"
,
&
file
,
&
mask
,
&
func
))
return
NULL
;
id
=
GetFileNo
(
file
);
if
(
id
<
0
)
if
(
id
<
0
)
return
NULL
;
return
NULL
;
if
(
!
PyCallable_Check
(
func
))
if
(
!
PyCallable_Check
(
func
))
{
{
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
return
NULL
;
return
NULL
;
}
}
if
(
!
(
idkey
=
PyInt_FromLong
(
id
)))
return
NULL
;
/* ClientData is: (func, file) */
/* ClientData is: (func, file) */
data
=
Py_BuildValue
(
"(OO)"
,
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
...
@@ -950,34 +1050,47 @@ Tkapp_CreateFileHandler (self, args)
...
@@ -950,34 +1050,47 @@ Tkapp_CreateFileHandler (self, args)
#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
;
PyObject
*
idkey
;
PyObject
*
data
;
int
id
;
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... */
...
@@ -985,26 +1098,27 @@ Tkapp_DeleteFileHandler (self, args)
...
@@ -985,26 +1098,27 @@ Tkapp_DeleteFileHandler (self, args)
#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
*
...
@@ -1012,17 +1126,16 @@ Tktt_DeleteTimerHandler (self, args)
...
@@ -1012,17 +1126,16 @@ 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
;
}
}
...
@@ -1039,13 +1152,13 @@ Tktt_New (token, func)
...
@@ -1039,13 +1152,13 @@ Tktt_New (token, 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
;
}
}
...
@@ -1062,7 +1175,7 @@ Tktt_Print (self, fp, flags)
...
@@ -1062,7 +1175,7 @@ Tktt_Print (self, fp, flags)
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"
:
""
);
...
@@ -1074,7 +1187,7 @@ Tktt_GetAttr (self, name)
...
@@ -1074,7 +1187,7 @@ 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
=
...
@@ -1096,25 +1209,23 @@ static PyTypeObject Tktt_Type =
...
@@ -1096,25 +1209,23 @@ static PyTypeObject Tktt_Type =
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
);
Py_DECREF
(
arg
);
if
(
res
==
NULL
)
{
errorInCmd
=
1
;
errorInCmd
=
1
;
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
}
}
else
else
Py_DECREF
(
res
);
Py_DECREF
(
res
);
}
}
static
PyObject
*
static
PyObject
*
...
@@ -1126,17 +1237,20 @@ Tkapp_CreateTimerHandler (self, args)
...
@@ -1126,17 +1237,20 @@ Tkapp_CreateTimerHandler (self, args)
PyObject
*
func
;
PyObject
*
func
;
Tk_TimerToken
token
;
Tk_TimerToken
token
;
if
(
!
PyArg_Parse
(
args
,
"(iO)"
,
&
milliseconds
,
&
func
))
if
(
!
PyArg_Parse
(
args
,
"(iO)"
,
&
milliseconds
,
&
func
))
return
NULL
;
return
NULL
;
if
(
!
PyCallable_Check
(
func
))
if
(
!
PyCallable_Check
(
func
))
{
{
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
return
NULL
;
return
NULL
;
}
}
token
=
Tk_CreateTimerHandler
(
milliseconds
,
TimerHandler
,
(
ClientData
)
func
);
token
=
Tk_CreateTimerHandler
(
milliseconds
,
TimerHandler
,
return
(
PyObject
*
)
Tktt_New
(
token
,
func
);
(
ClientData
)
func
);
return
(
PyObject
*
)
Tktt_New
(
token
,
func
);
}
}
/** Event Loop **/
/** Event Loop **/
static
PyObject
*
static
PyObject
*
...
@@ -1146,30 +1260,30 @@ Tkapp_MainLoop (self, args)
...
@@ -1146,30 +1260,30 @@ Tkapp_MainLoop (self, 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
&&
!
errorInCmd
)
{
{
/* XXX Ought to check for other signals! */
/* XXX Ought to check for other signals! */
if
(
PyOS_InterruptOccurred
())
if
(
PyOS_InterruptOccurred
())
{
{
PyErr_SetNone
(
PyExc_KeyboardInterrupt
);
PyErr_SetNone
(
PyExc_KeyboardInterrupt
);
return
NULL
;
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
;
}
}
...
@@ -1181,10 +1295,11 @@ Tkapp_DoOneEvent (self, args)
...
@@ -1181,10 +1295,11 @@ Tkapp_DoOneEvent (self, args)
int
flags
=
TK_ALL_EVENTS
;
int
flags
=
TK_ALL_EVENTS
;
int
rv
;
int
rv
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
flags
))
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
flags
))
return
NULL
;
return
NULL
;
rv
=
Tk_DoOneEvent
(
flags
);
rv
=
Tk_DoOneEvent
(
flags
);
return
Py_BuildValue
(
"i"
,
rv
);
return
Py_BuildValue
(
"i"
,
rv
);
}
}
static
PyObject
*
static
PyObject
*
...
@@ -1193,13 +1308,16 @@ Tkapp_Quit (self, args)
...
@@ -1193,13 +1308,16 @@ Tkapp_Quit (self, args)
PyObject
*
args
;
PyObject
*
args
;
{
{
if
(
!
PyArg_Parse
(
args
,
""
))
if
(
!
PyArg_Parse
(
args
,
""
))
return
NULL
;
return
NULL
;
quitMainLoop
=
1
;
quitMainLoop
=
1
;
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
return
Py_None
;
}
}
/**** Tkapp Method List ****/
/**** Tkapp Method List ****/
static
PyMethodDef
Tkapp_methods
[]
=
static
PyMethodDef
Tkapp_methods
[]
=
...
@@ -1238,6 +1356,8 @@ static PyMethodDef Tkapp_methods[] =
...
@@ -1238,6 +1356,8 @@ static PyMethodDef Tkapp_methods[] =
{
NULL
,
NULL
}
{
NULL
,
NULL
}
};
};
/**** Tkapp Type Methods ****/
/**** Tkapp Type Methods ****/
static
void
static
void
...
@@ -1278,6 +1398,8 @@ static PyTypeObject Tkapp_Type =
...
@@ -1278,6 +1398,8 @@ static PyTypeObject Tkapp_Type =
0
,
/*tp_hash */
0
,
/*tp_hash */
};
};
/**** Tkinter Module ****/
/**** Tkinter Module ****/
static
PyObject
*
static
PyObject
*
...
@@ -1290,18 +1412,19 @@ Tkinter_Create (self, args)
...
@@ -1290,18 +1412,19 @@ Tkinter_Create (self, args)
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
,
&
interactive
))
return
NULL
;
return
NULL
;
return
(
PyObject
*
)
Tkapp_New
(
screenName
,
baseName
,
className
,
return
(
PyObject
*
)
Tkapp_New
(
screenName
,
baseName
,
className
,
interactive
);
interactive
);
}
}
...
@@ -1322,15 +1445,15 @@ static PyMethodDef moduleMethods[] =
...
@@ -1322,15 +1445,15 @@ 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 */
...
@@ -1338,14 +1461,44 @@ EventHook ()
...
@@ -1338,14 +1461,44 @@ EventHook ()
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
()
{
{
...
@@ -1354,53 +1507,41 @@ init_tkinter ()
...
@@ -1354,53 +1507,41 @@ init_tkinter ()
#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
);
...
@@ -1411,6 +1552,7 @@ init_tkinter ()
...
@@ -1411,6 +1552,7 @@ init_tkinter ()
}
}
#ifdef macintosh
#ifdef macintosh
/*
/*
...
...
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