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));
staticforward
PyTypeObject
Tkapp_Type
;
typedef
struct
{
{
PyObject_HEAD
Tcl_Interp
*
interp
;
#ifdef NEED_TKCREATEMAINWINDOW
Tk_Window
tkwin
;
#endif
}
}
TkappObject
;
#define Tkapp_Check(v) ((v)->ob_type == &Tkapp_Type)
...
...
@@ -115,8 +115,10 @@ TkappObject;
#define Tkapp_Result(v) (((TkappObject *) (v))->interp->result)
#define DEBUG_REFCNT(v) (printf ("DEBUG: id=%p, refcnt=%i\n", \
(void *) v, ((PyObject *) v)->ob_refcnt))
(void *) v, ((PyObject *) v)->ob_refcnt))
/**** Error Handling ****/
static
PyObject
*
Tkinter_TclError
;
...
...
@@ -126,121 +128,123 @@ static PyObject *excInCmd;
static
PyObject
*
valInCmd
;
static
PyObject
*
trbInCmd
;
static
PyObject
*
Tkinter_Error
(
v
)
Tkinter_Error
(
v
)
PyObject
*
v
;
{
PyErr_SetString
(
Tkinter_TclError
,
Tkapp_Result
(
v
));
PyErr_SetString
(
Tkinter_TclError
,
Tkapp_Result
(
v
));
return
NULL
;
}
int
PythonCmd_Error
(
interp
)
PythonCmd_Error
(
interp
)
Tcl_Interp
*
interp
;
{
errorInCmd
=
1
;
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
return
TCL_ERROR
;
}
/**** Utils ****/
/**** Utils ****/
static
char
*
AsString
(
value
,
tmp
)
AsString
(
value
,
tmp
)
PyObject
*
value
;
PyObject
*
tmp
;
{
if
(
PyString_Check
(
value
))
return
PyString_AsString
(
value
);
else
{
PyObject
*
v
;
v
=
PyObject_Str
(
value
);
PyList_Append
(
tmp
,
v
);
Py_DECREF
(
v
);
return
PyString_AsString
(
v
);
else
{
PyObject
*
v
=
PyObject_Str
(
value
);
PyList_Append
(
tmp
,
v
);
Py_DECREF
(
v
);
return
PyString_AsString
(
v
);
}
}
#define ARGSZ 64
static
char
*
Merge
(
args
)
Merge
(
args
)
PyObject
*
args
;
{
PyObject
*
tmp
;
PyObject
*
tmp
=
NULL
;
char
*
argvStore
[
ARGSZ
];
char
**
argv
;
char
**
argv
=
NULL
;
int
fvStore
[
ARGSZ
];
int
*
fv
;
int
argc
;
char
*
res
;
int
i
;
int
*
fv
=
NULL
;
int
argc
=
0
,
i
;
char
*
res
=
NULL
;
if
(
!
(
tmp
=
PyList_New
(
0
)))
return
NULL
;
tmp
=
PyList_New
(
0
);
argv
=
argvStore
;
fv
=
fvStore
;
if
(
args
==
NULL
)
{
argc
=
0
;
}
else
if
(
!
PyTuple_Check
(
args
))
{
else
if
(
!
PyTuple_Check
(
args
))
{
argc
=
1
;
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
++
)
{
v
=
PyTuple_GetItem
(
args
,
i
);
if
(
PyTuple_Check
(
v
))
{
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
PyObject
*
v
=
PyTuple_GetItem
(
args
,
i
);
if
(
PyTuple_Check
(
v
))
{
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
;
break
;
}
else
{
else
{
fv
[
i
]
=
0
;
argv
[
i
]
=
AsString
(
v
,
tmp
);
argv
[
i
]
=
AsString
(
v
,
tmp
);
}
}
}
res
=
Tcl_Merge
(
argc
,
argv
);
res
=
Tcl_Merge
(
argc
,
argv
);
Py_DECREF
(
tmp
);
finally:
for
(
i
=
0
;
i
<
argc
;
i
++
)
if
(
fv
[
i
])
ckfree
(
argv
[
i
]);
if
(
fv
[
i
])
{
ckfree
(
argv
[
i
]);
}
if
(
argv
!=
argvStore
)
ckfree
(
FREECAST
argv
);
ckfree
(
FREECAST
argv
);
if
(
fv
!=
fvStore
)
ckfree
(
FREECAST
fv
);
ckfree
(
FREECAST
fv
);
Py_DECREF
(
tmp
);
return
res
;
}
static
PyObject
*
Split
(
self
,
list
)
Split
(
self
,
list
)
PyObject
*
self
;
char
*
list
;
{
...
...
@@ -248,45 +252,44 @@ Split (self, list)
char
**
argv
;
PyObject
*
v
;
if
(
list
==
NULL
)
{
Py_INCREF
(
Py_None
);
if
(
list
==
NULL
)
{
Py_INCREF
(
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.
Could be a quoted string containing funnies, e.g. {"}.
Return the string itself. */
* Could be a quoted string containing funnies, e.g. {"}.
* Return the string itself.
*/
PyErr_Clear
();
return
PyString_FromString
(
list
);
}
if
(
argc
==
0
)
v
=
PyString_FromString
(
""
);
v
=
PyString_FromString
(
""
);
else
if
(
argc
==
1
)
v
=
PyString_FromString
(
argv
[
0
]);
else
if
((
v
=
PyTuple_New
(
argc
))
!=
NULL
)
{
v
=
PyString_FromString
(
argv
[
0
]);
else
if
((
v
=
PyTuple_New
(
argc
))
!=
NULL
)
{
int
i
;
PyObject
*
w
;
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
;
break
;
}
PyTuple_SetItem
(
v
,
i
,
w
);
PyTuple_SetItem
(
v
,
i
,
w
);
}
}
ckfree
(
FREECAST
argv
);
return
v
;
}
/**** Tkapp Object ****/
#ifndef WITH_APPINIT
...
...
@@ -297,23 +300,26 @@ Tcl_AppInit (interp)
Tk_Window
main
;
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
);
return
TCL_ERROR
;
}
if
(
Tk_Init
(
interp
)
==
TCL_ERROR
)
{
if
(
Tk_Init
(
interp
)
==
TCL_ERROR
)
{
fprintf
(
stderr
,
"Tk_Init error: %s
\n
"
,
interp
->
result
);
return
TCL_ERROR
;
}
return
TCL_OK
;
}
#endif
/* !WITH_APPINIT */
/* Initialize the Tk application; see the `main' function in
`tkMain.c'. */
* `tkMain.c'.
*/
static
TkappObject
*
Tkapp_New
(
screenName
,
baseName
,
className
,
interactive
)
Tkapp_New
(
screenName
,
baseName
,
className
,
interactive
)
char
*
screenName
;
char
*
baseName
;
char
*
className
;
...
...
@@ -322,85 +328,103 @@ Tkapp_New (screenName, baseName, className, interactive)
TkappObject
*
v
;
char
*
argv0
;
v
=
PyObject_NEW
(
TkappObject
,
&
Tkapp_Type
);
v
=
PyObject_NEW
(
TkappObject
,
&
Tkapp_Type
);
if
(
v
==
NULL
)
return
NULL
;
v
->
interp
=
Tcl_CreateInterp
();
v
->
interp
=
Tcl_CreateInterp
();
#ifdef NEED_TKCREATEMAINWINDOW
v
->
tkwin
=
Tk_CreateMainWindow
(
v
->
interp
,
screenName
,
v
->
tkwin
=
Tk_CreateMainWindow
(
v
->
interp
,
screenName
,
baseName
,
className
);
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
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
)
Tcl_SetVar
(
v
->
interp
,
"tcl_interactive"
,
"1"
,
TCL_GLOBAL_ONLY
);
Tcl_SetVar
(
v
->
interp
,
"tcl_interactive"
,
"1"
,
TCL_GLOBAL_ONLY
);
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
!=
NULL
)
{
strcpy
(
argv0
,
className
);
if
(
isupper
(
argv0
[
0
]))
argv0
[
0
]
=
tolower
(
argv0
[
0
]);
Tcl_SetVar
(
v
->
interp
,
"argv0"
,
argv0
,
TCL_GLOBAL_ONLY
);
ckfree
(
argv0
);
argv0
=
(
char
*
)
ckalloc
(
strlen
(
className
)
+
1
);
if
(
!
argv0
)
{
PyErr_NoMemory
();
Py_DECREF
(
v
);
return
NULL
;
}
if
(
Tcl_AppInit
(
v
->
interp
)
!=
TCL_OK
)
return
(
TkappObject
*
)
Tkinter_Error
(
v
);
strcpy
(
argv0
,
className
);
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
;
}
/** Tcl Eval **/
static
PyObject
*
Tkapp_Call
(
self
,
args
)
Tkapp_Call
(
self
,
args
)
PyObject
*
self
;
PyObject
*
args
;
{
char
*
cmd
;
char
*
cmd
=
Merge
(
args
);
PyObject
*
res
=
NULL
;
cmd
=
Merge
(
args
);
if
(
Tcl_Eval
(
Tkapp_Interp
(
self
),
cmd
)
==
TCL_ERROR
)
{
ckfree
(
cmd
);
return
Tkinter_Error
(
self
);
}
if
(
!
cmd
)
PyErr_SetString
(
Tkinter_TclError
,
"merge failed"
);
ckfree
(
cmd
);
return
PyString_FromString
(
Tkapp_Result
(
self
));
else
if
(
Tcl_Eval
(
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
*
Tkapp_GlobalCall
(
self
,
args
)
Tkapp_GlobalCall
(
self
,
args
)
PyObject
*
self
;
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
);
return
PyString_FromString
(
Tkapp_Result
(
self
));
if
(
!
cmd
)
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
*
Tkapp_Eval
(
self
,
args
)
Tkapp_Eval
(
self
,
args
)
PyObject
*
self
;
PyObject
*
args
;
{
...
...
@@ -409,26 +433,26 @@ Tkapp_Eval (self, args)
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
return
NULL
;
if
(
Tcl_Eval
(
Tkapp_Interp
(
self
),
script
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
if
(
Tcl_Eval
(
Tkapp_Interp
(
self
),
script
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
PyString_FromString
(
Tkapp_Result
(
self
));
return
PyString_FromString
(
Tkapp_Result
(
self
));
}
static
PyObject
*
Tkapp_GlobalEval
(
self
,
args
)
Tkapp_GlobalEval
(
self
,
args
)
PyObject
*
self
;
PyObject
*
args
;
{
char
*
script
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
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
PyString_FromString
(
Tkapp_Result
(
self
));
return
PyString_FromString
(
Tkapp_Result
(
self
));
}
static
PyObject
*
...
...
@@ -438,34 +462,34 @@ Tkapp_EvalFile (self, args)
{
char
*
fileName
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
fileName
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
fileName
))
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
PyString_FromString
(
Tkapp_Result
(
self
));
return
PyString_FromString
(
Tkapp_Result
(
self
));
}
static
PyObject
*
Tkapp_Record
(
self
,
args
)
Tkapp_Record
(
self
,
args
)
PyObject
*
self
;
PyObject
*
args
;
{
char
*
script
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
script
))
return
NULL
;
if
(
Tcl_RecordAndEval
(
Tkapp_Interp
(
self
),
script
,
TCL_NO_EVAL
)
==
TCL_ERROR
)
if
(
TCL_ERROR
==
Tcl_RecordAndEval
(
Tkapp_Interp
(
self
),
script
,
TCL_NO_EVAL
)
)
return
Tkinter_Error
(
self
);
return
PyString_FromString
(
Tkapp_Result
(
self
));
return
PyString_FromString
(
Tkapp_Result
(
self
));
}
static
PyObject
*
Tkapp_AddErrorInfo
(
self
,
args
)
Tkapp_AddErrorInfo
(
self
,
args
)
PyObject
*
self
;
PyObject
*
args
;
{
...
...
@@ -473,43 +497,47 @@ Tkapp_AddErrorInfo (self, args)
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
msg
))
return
NULL
;
Tcl_AddErrorInfo
(
Tkapp_Interp
(
self
),
msg
);
Tcl_AddErrorInfo
(
Tkapp_Interp
(
self
),
msg
);
Py_INCREF
(
Py_None
);
return
Py_None
;
}
/** Tcl Variable **/
static
PyObject
*
SetVar
(
self
,
args
,
flags
)
SetVar
(
self
,
args
,
flags
)
PyObject
*
self
;
PyObject
*
args
;
int
flags
;
{
char
*
name1
,
*
name2
,
*
ok
;
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
,
AsString
(
newValue
,
tmp
),
flags
);
/* XXX Merge? */
else
if
(
PyArg_Parse
(
args
,
"(ssO)"
,
&
name1
,
&
name2
,
&
newValue
))
ok
=
Tcl_SetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
if
(
PyArg_Parse
(
args
,
"(sO)"
,
&
name1
,
&
newValue
))
/* XXX Merge? */
ok
=
Tcl_SetVar
(
Tkapp_Interp
(
self
),
name1
,
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
);
return
NULL
;
}
Py_DECREF
(
tmp
);
if
(
!
ok
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
}
...
...
@@ -518,7 +546,7 @@ Tkapp_SetVar (self, args)
PyObject
*
self
;
PyObject
*
args
;
{
return
SetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
return
SetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
}
static
PyObject
*
...
...
@@ -526,9 +554,11 @@ Tkapp_GlobalSetVar (self, args)
PyObject
*
self
;
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
*
GetVar
(
self
,
args
,
flags
)
PyObject
*
self
;
...
...
@@ -537,15 +567,16 @@ GetVar (self, args, flags)
{
char
*
name1
,
*
name2
,
*
s
;
if
(
PyArg_Parse
(
args
,
"s"
,
&
name1
))
s
=
Tcl_GetVar
(
Tkapp_Interp
(
self
),
name1
,
flags
);
else
if
(
PyArg_Parse
(
args
,
"(ss)"
,
&
name1
,
&
name2
))
s
=
Tcl_GetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
flags
);
if
(
PyArg_Parse
(
args
,
"s"
,
&
name1
))
s
=
Tcl_GetVar
(
Tkapp_Interp
(
self
),
name1
,
flags
);
else
if
(
PyArg_Parse
(
args
,
"(ss)"
,
&
name1
,
&
name2
))
s
=
Tcl_GetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
flags
);
else
return
NULL
;
if
(
s
==
NULL
)
return
Tkinter_Error
(
self
);
return
Tkinter_Error
(
self
);
return
PyString_FromString
(
s
);
}
...
...
@@ -555,7 +586,7 @@ Tkapp_GetVar (self, args)
PyObject
*
self
;
PyObject
*
args
;
{
return
GetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
return
GetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
}
static
PyObject
*
...
...
@@ -563,9 +594,11 @@ Tkapp_GlobalGetVar (self, args)
PyObject
*
self
;
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
*
UnsetVar
(
self
,
args
,
flags
)
PyObject
*
self
;
...
...
@@ -575,17 +608,18 @@ UnsetVar (self, args, flags)
char
*
name1
,
*
name2
;
int
code
;
if
(
PyArg_Parse
(
args
,
"s"
,
&
name1
))
code
=
Tcl_UnsetVar
(
Tkapp_Interp
(
self
),
name1
,
flags
);
else
if
(
PyArg_Parse
(
args
,
"(ss)"
,
&
name1
,
&
name2
))
code
=
Tcl_UnsetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
flags
);
if
(
PyArg_Parse
(
args
,
"s"
,
&
name1
))
code
=
Tcl_UnsetVar
(
Tkapp_Interp
(
self
),
name1
,
flags
);
else
if
(
PyArg_Parse
(
args
,
"(ss)"
,
&
name1
,
&
name2
))
code
=
Tcl_UnsetVar2
(
Tkapp_Interp
(
self
),
name1
,
name2
,
flags
);
else
return
NULL
;
if
(
code
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
}
...
...
@@ -594,7 +628,7 @@ Tkapp_UnsetVar (self, args)
PyObject
*
self
;
PyObject
*
args
;
{
return
UnsetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
return
UnsetVar
(
self
,
args
,
TCL_LEAVE_ERR_MSG
);
}
static
PyObject
*
...
...
@@ -602,9 +636,11 @@ Tkapp_GlobalUnsetVar (self, args)
PyObject
*
self
;
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 **/
static
PyObject
*
...
...
@@ -615,11 +651,11 @@ Tkapp_GetInt (self, args)
char
*
s
;
int
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
if
(
Tcl_GetInt
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"i"
,
v
);
if
(
Tcl_GetInt
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"i"
,
v
);
}
static
PyObject
*
...
...
@@ -630,11 +666,11 @@ Tkapp_GetDouble (self, args)
char
*
s
;
double
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
if
(
Tcl_GetDouble
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"d"
,
v
);
if
(
Tcl_GetDouble
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"d"
,
v
);
}
static
PyObject
*
...
...
@@ -645,11 +681,11 @@ Tkapp_GetBoolean (self, args)
char
*
s
;
int
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
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
Py_BuildValue
(
"i"
,
v
);
return
Py_BuildValue
(
"i"
,
v
);
}
static
PyObject
*
...
...
@@ -659,11 +695,11 @@ Tkapp_ExprString (self, args)
{
char
*
s
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
if
(
Tcl_ExprString
(
Tkapp_Interp
(
self
),
s
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"s"
,
Tkapp_Result
(
self
));
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"s"
,
Tkapp_Result
(
self
));
}
static
PyObject
*
...
...
@@ -674,11 +710,11 @@ Tkapp_ExprLong (self, args)
char
*
s
;
long
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
if
(
Tcl_ExprLong
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"l"
,
v
);
if
(
Tcl_ExprLong
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"l"
,
v
);
}
static
PyObject
*
...
...
@@ -689,11 +725,11 @@ Tkapp_ExprDouble (self, args)
char
*
s
;
double
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
if
(
Tcl_ExprDouble
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"d"
,
v
);
if
(
Tcl_ExprDouble
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"d"
,
v
);
}
static
PyObject
*
...
...
@@ -704,13 +740,15 @@ Tkapp_ExprBoolean (self, args)
char
*
s
;
int
v
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
s
))
return
NULL
;
if
(
Tcl_ExprBoolean
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"i"
,
v
);
if
(
Tcl_ExprBoolean
(
Tkapp_Interp
(
self
),
s
,
&
v
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
return
Py_BuildValue
(
"i"
,
v
);
}
static
PyObject
*
Tkapp_SplitList
(
self
,
args
)
PyObject
*
self
;
...
...
@@ -722,17 +760,26 @@ Tkapp_SplitList (self, args)
PyObject
*
v
;
int
i
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
list
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
list
))
return
NULL
;
if
(
Tcl_SplitList
(
Tkapp_Interp
(
self
),
list
,
&
argc
,
&
argv
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
if
(
Tcl_SplitList
(
Tkapp_Interp
(
self
),
list
,
&
argc
,
&
argv
)
==
TCL_ERROR
)
return
Tkinter_Error
(
self
);
v
=
PyTuple_New
(
argc
);
for
(
i
=
0
;
i
<
argc
;
i
++
)
PyTuple_SetItem
(
v
,
i
,
PyString_FromString
(
argv
[
i
]));
if
(
!
(
v
=
PyTuple_New
(
argc
)))
return
NULL
;
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
;
}
...
...
@@ -743,9 +790,9 @@ Tkapp_Split (self, args)
{
char
*
list
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
list
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
list
))
return
NULL
;
return
Split
(
self
,
list
);
return
Split
(
self
,
list
);
}
static
PyObject
*
...
...
@@ -753,19 +800,26 @@ Tkapp_Merge (self, args)
PyObject
*
self
;
PyObject
*
args
;
{
char
*
s
;
PyObject
*
v
;
char
*
s
=
Merge
(
args
)
;
PyObject
*
res
=
NULL
;
s
=
Merge
(
args
);
v
=
PyString_FromString
(
s
);
ckfree
(
s
);
return
v
;
if
(
s
)
{
res
=
PyString_FromString
(
s
);
ckfree
(
s
);
}
else
PyErr_SetString
(
Tkinter_TclError
,
"merge failed"
);
return
res
;
}
/** Tcl Command **/
/* This is the Tcl command that acts as a wrapper for Python
function or method. */
* function or method.
*/
static
int
PythonCmd
(
clientData
,
interp
,
argc
,
argv
)
ClientData
clientData
;
/* Is (self, func) */
...
...
@@ -776,24 +830,37 @@ PythonCmd (clientData, interp, argc, argv)
PyObject
*
self
,
*
func
,
*
arg
,
*
res
,
*
tmp
;
int
i
;
self
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
0
);
func
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
1
);
/* TBD: no error checking here since we know, via the
* 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) */
arg
=
PyTuple_New
(
argc
-
1
);
for
(
i
=
0
;
i
<
(
argc
-
1
);
i
++
)
PyTuple_SetItem
(
arg
,
i
,
PyString_FromString
(
argv
[
i
+
1
]));
res
=
PyEval_CallObject
(
func
,
arg
);
Py_DECREF
(
arg
);
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
);
if
(
res
==
NULL
)
return
PythonCmd_Error
(
interp
);
return
PythonCmd_Error
(
interp
);
tmp
=
PyList_New
(
0
);
Tcl_SetResult
(
Tkapp_Interp
(
self
),
AsString
(
res
,
tmp
),
TCL_VOLATILE
);
Py_DECREF
(
res
);
Py_DECREF
(
tmp
);
if
(
!
(
tmp
=
PyList_New
(
0
)))
{
Py_DECREF
(
res
);
return
PythonCmd_Error
(
interp
);
}
Tcl_SetResult
(
Tkapp_Interp
(
self
),
AsString
(
res
,
tmp
),
TCL_VOLATILE
);
Py_DECREF
(
res
);
Py_DECREF
(
tmp
);
return
TCL_OK
;
}
...
...
@@ -802,9 +869,11 @@ static void
PythonCmdDelete
(
clientData
)
ClientData
clientData
;
/* Is (self, func) */
{
Py_DECREF
((
PyObject
*
)
clientData
);
Py_DECREF
((
PyObject
*
)
clientData
);
}
static
PyObject
*
Tkapp_CreateCommand
(
self
,
args
)
PyObject
*
self
;
...
...
@@ -815,33 +884,37 @@ Tkapp_CreateCommand (self, args)
PyObject
*
func
;
/* Args is: (cmdName, func) */
if
(
!
PyTuple_Check
(
args
)
||
!
(
PyTuple_Size
(
args
)
==
2
)
||
!
PyString_Check
(
PyTuple_GetItem
(
args
,
0
))
||
!
PyCallable_Check
(
PyTuple_GetItem
(
args
,
1
)))
if
(
!
PyTuple_Check
(
args
)
||
!
(
PyTuple_Size
(
args
)
==
2
)
||
!
PyString_Check
(
PyTuple_GetItem
(
args
,
0
))
||
!
PyCallable_Check
(
PyTuple_GetItem
(
args
,
1
)))
{
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
return
NULL
;
}
cmdName
=
PyString_AsString
(
PyTuple_GetItem
(
args
,
0
));
func
=
PyTuple_GetItem
(
args
,
1
);
cmdName
=
PyString_AsString
(
PyTuple_GetItem
(
args
,
0
));
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
);
PyTuple_SetItem
(
data
,
0
,
self
);
Py_INCREF
(
self
);
PyTuple_SetItem
(
data
,
0
,
self
);
Py_INCREF
(
func
);
PyTuple_SetItem
(
data
,
1
,
func
);
Py_INCREF
(
func
);
PyTuple_SetItem
(
data
,
1
,
func
);
Tcl_CreateCommand
(
Tkapp_Interp
(
self
),
cmdName
,
PythonCmd
,
Tcl_CreateCommand
(
Tkapp_Interp
(
self
),
cmdName
,
PythonCmd
,
(
ClientData
)
data
,
PythonCmdDelete
);
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
}
static
PyObject
*
Tkapp_DeleteCommand
(
self
,
args
)
PyObject
*
self
;
...
...
@@ -849,17 +922,19 @@ Tkapp_DeleteCommand (self, args)
{
char
*
cmdName
;
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
cmdName
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
cmdName
))
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
;
}
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
}
/** File Handler **/
static
void
...
...
@@ -869,24 +944,26 @@ FileHandler (clientData, mask)
{
PyObject
*
func
,
*
file
,
*
arg
,
*
res
;
func
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
0
);
file
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
1
);
func
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
0
);
file
=
PyTuple_GetItem
((
PyObject
*
)
clientData
,
1
);
arg
=
Py_BuildValue
(
"(Oi)"
,
file
,
(
long
)
mask
);
res
=
PyEval_CallObject
(
func
,
arg
);
arg
=
Py_BuildValue
(
"(Oi)"
,
file
,
(
long
)
mask
);
res
=
PyEval_CallObject
(
func
,
arg
);
Py_DECREF
(
arg
);
if
(
res
==
NULL
)
{
if
(
res
==
NULL
)
{
errorInCmd
=
1
;
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
}
Py_XDECREF
(
res
);
Py_XDECREF
(
res
);
}
static
int
GetFileNo
(
file
)
PyObject
*
file
;
/* Either an int >= 0 or an object with a
.fileno() method that returns an int >= 0 */
/* Either an int >= 0 or an object with a
*.fileno() method that returns an int >= 0
*/
PyObject
*
file
;
{
PyObject
*
meth
,
*
args
,
*
res
;
int
id
;
...
...
@@ -896,21 +973,27 @@ GetFileNo (file)
PyErr_SetString
(
PyExc_ValueError
,
"invalid file id"
);
return
id
;
}
meth
=
PyObject_GetAttrString
(
file
,
"fileno"
);
if
(
meth
==
NULL
)
return
-
1
;
args
=
PyTuple_New
(
0
);
if
(
args
==
NULL
)
return
-
1
;
meth
=
PyObject_GetAttrString
(
file
,
"fileno"
);
if
(
meth
==
NULL
)
{
Py_DECREF
(
args
);
return
-
1
;
}
res
=
PyEval_CallObject
(
meth
,
args
);
Py_DECREF
(
args
);
Py_DECREF
(
meth
);
if
(
res
==
NULL
)
return
-
1
;
if
(
PyInt_Check
(
res
))
id
=
PyInt_AsLong
(
res
);
else
id
=
-
1
;
if
(
id
<
0
)
PyErr_SetString
(
PyExc_ValueError
,
"invalid fileno() return value"
);
...
...
@@ -918,30 +1001,47 @@ GetFileNo (file)
return
id
;
}
static
PyObject
*
Tkapp_ClientDataDict
=
NULL
;
static
PyObject
*
Tkapp_CreateFileHandler
(
self
,
args
)
PyObject
*
self
;
PyObject
*
args
;
/* Is (file, mask, func) */
{
PyObject
*
file
,
*
func
,
*
data
;
PyObject
*
idkey
;
int
mask
,
id
;
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
Tcl_File
tfile
;
#endif
if
(
!
PyArg_Parse
(
args
,
"(OiO)"
,
&
file
,
&
mask
,
&
func
))
if
(
!
Tkapp_ClientDataDict
)
{
if
(
!
(
Tkapp_ClientDataDict
=
PyDict_New
()))
return
NULL
;
id
=
GetFileNo
(
file
);
}
if
(
!
PyArg_Parse
(
args
,
"(OiO)"
,
&
file
,
&
mask
,
&
func
))
return
NULL
;
id
=
GetFileNo
(
file
);
if
(
id
<
0
)
return
NULL
;
if
(
!
PyCallable_Check
(
func
))
{
if
(
!
PyCallable_Check
(
func
))
{
PyErr_SetString
(
PyExc_TypeError
,
"bad argument list"
);
return
NULL
;
}
if
(
!
(
idkey
=
PyInt_FromLong
(
id
)))
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
#ifdef MS_WINDOWS
...
...
@@ -950,34 +1050,47 @@ Tkapp_CreateFileHandler (self, args)
#else
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_UNIX_FD
);
#endif
/* Oughtta
check for null Tcl_File object... */
Tcl_CreateFileHandler
(
tfile
,
mask
,
FileHandler
,
(
ClientData
)
data
);
/* Ought to
check for null Tcl_File object... */
Tcl_CreateFileHandler
(
tfile
,
mask
,
FileHandler
,
(
ClientData
)
data
);
#else
Tk_CreateFileHandler
(
id
,
mask
,
FileHandler
,
(
ClientData
)
data
);
Tk_CreateFileHandler
(
id
,
mask
,
FileHandler
,
(
ClientData
)
data
);
#endif
/* XXX fileHandlerDict */
Py_INCREF
(
Py_None
);
return
Py_None
;
}
static
PyObject
*
Tkapp_DeleteFileHandler
(
self
,
args
)
PyObject
*
self
;
PyObject
*
args
;
/* Args: file */
{
PyObject
*
file
;
PyObject
*
idkey
;
PyObject
*
data
;
int
id
;
#if (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION) >= 4001
Tcl_File
tfile
;
#endif
if
(
!
PyArg_Parse
(
args
,
"O"
,
&
file
))
if
(
!
PyArg_Parse
(
args
,
"O"
,
&
file
))
return
NULL
;
id
=
GetFileNo
(
file
);
id
=
GetFileNo
(
file
);
if
(
id
<
0
)
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
#ifdef MS_WINDOWS
/* We assume this is a socket... */
...
...
@@ -985,26 +1098,27 @@ Tkapp_DeleteFileHandler (self, args)
#else
tfile
=
Tcl_GetFile
((
ClientData
)
id
,
TCL_UNIX_FD
);
#endif
/* Oughtta
check for null Tcl_File object... */
/* Ought to
check for null Tcl_File object... */
Tcl_DeleteFileHandler
(
tfile
);
#else
Tk_DeleteFileHandler
(
id
);
Tk_DeleteFileHandler
(
id
);
#endif
/* XXX fileHandlerDict */
Py_INCREF
(
Py_None
);
return
Py_None
;
}
/**** Tktt Object (timer token) ****/
staticforward
PyTypeObject
Tktt_Type
;
typedef
struct
{
{
PyObject_HEAD
Tk_TimerToken
token
;
PyObject
*
func
;
}
}
TkttObject
;
static
PyObject
*
...
...
@@ -1012,17 +1126,16 @@ Tktt_DeleteTimerHandler (self, args)
PyObject
*
self
;
PyObject
*
args
;
{
TkttObject
*
v
=
(
TkttObject
*
)
self
;
TkttObject
*
v
=
(
TkttObject
*
)
self
;
if
(
!
PyArg_Parse
(
args
,
""
))
if
(
!
PyArg_Parse
(
args
,
""
))
return
NULL
;
if
(
v
->
func
!=
NULL
)
{
Tk_DeleteTimerHandler
(
v
->
token
);
PyMem_DEL
(
v
->
func
);
if
(
v
->
func
!=
NULL
)
{
Tk_DeleteTimerHandler
(
v
->
token
);
PyMem_DEL
(
v
->
func
);
v
->
func
=
NULL
;
}
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
}
...
...
@@ -1039,13 +1152,13 @@ Tktt_New (token, func)
{
TkttObject
*
v
;
v
=
PyObject_NEW
(
TkttObject
,
&
Tktt_Type
);
v
=
PyObject_NEW
(
TkttObject
,
&
Tktt_Type
);
if
(
v
==
NULL
)
return
NULL
;
v
->
token
=
token
;
v
->
func
=
func
;
Py_INCREF
(
v
->
func
);
Py_INCREF
(
v
->
func
);
return
v
;
}
...
...
@@ -1062,7 +1175,7 @@ Tktt_Print (self, fp, flags)
FILE
*
fp
;
int
flags
;
{
TkttObject
*
v
=
(
TkttObject
*
)
self
;
TkttObject
*
v
=
(
TkttObject
*
)
self
;
fprintf
(
fp
,
"<tktimertoken at 0x%lx%s>"
,
(
long
)
v
,
v
->
func
==
NULL
?
", handler deleted"
:
""
);
...
...
@@ -1074,7 +1187,7 @@ Tktt_GetAttr (self, name)
PyObject
*
self
;
char
*
name
;
{
return
Py_FindMethod
(
Tktt_methods
,
self
,
name
);
return
Py_FindMethod
(
Tktt_methods
,
self
,
name
);
}
static
PyTypeObject
Tktt_Type
=
...
...
@@ -1096,25 +1209,23 @@ static PyTypeObject Tktt_Type =
0
,
/*tp_hash */
};
/** Timer Handler **/
static
void
TimerHandler
(
clientData
)
ClientData
clientData
;
{
PyObject
*
func
=
(
PyObject
*
)
clientData
;
PyObject
*
arg
,
*
res
;
PyObject
*
func
=
(
PyObject
*
)
clientData
;
PyObject
*
res
=
PyEval_CallObject
(
func
,
NULL
)
;
arg
=
PyTuple_New
(
0
);
res
=
PyEval_CallObject
(
func
,
arg
);
Py_DECREF
(
arg
);
if
(
res
==
NULL
)
{
if
(
res
==
NULL
)
{
errorInCmd
=
1
;
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
PyErr_Fetch
(
&
excInCmd
,
&
valInCmd
,
&
trbInCmd
);
}
else
Py_DECREF
(
res
);
Py_DECREF
(
res
);
}
static
PyObject
*
...
...
@@ -1126,17 +1237,20 @@ Tkapp_CreateTimerHandler (self, args)
PyObject
*
func
;
Tk_TimerToken
token
;
if
(
!
PyArg_Parse
(
args
,
"(iO)"
,
&
milliseconds
,
&
func
))
if
(
!
PyArg_Parse
(
args
,
"(iO)"
,
&
milliseconds
,
&
func
))
return
NULL
;
if
(
!
PyCallable_Check
(
func
))
{
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
);
token
=
Tk_CreateTimerHandler
(
milliseconds
,
TimerHandler
,
(
ClientData
)
func
);
return
(
PyObject
*
)
Tktt_New
(
token
,
func
);
}
/** Event Loop **/
static
PyObject
*
...
...
@@ -1146,30 +1260,30 @@ Tkapp_MainLoop (self, args)
{
int
threshold
=
0
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
threshold
))
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
threshold
))
return
NULL
;
quitMainLoop
=
0
;
while
(
Tk_GetNumMainWindows
()
>
threshold
&&
!
quitMainLoop
&&
!
errorInCmd
)
while
(
Tk_GetNumMainWindows
()
>
threshold
&&
!
quitMainLoop
&&
!
errorInCmd
)
{
/* XXX Ought to check for other signals! */
if
(
PyOS_InterruptOccurred
())
{
PyErr_SetNone
(
PyExc_KeyboardInterrupt
);
if
(
PyOS_InterruptOccurred
())
{
PyErr_SetNone
(
PyExc_KeyboardInterrupt
);
return
NULL
;
}
Tk_DoOneEvent
(
0
);
Tk_DoOneEvent
(
0
);
}
quitMainLoop
=
0
;
if
(
errorInCmd
)
{
if
(
errorInCmd
)
{
errorInCmd
=
0
;
PyErr_Restore
(
excInCmd
,
valInCmd
,
trbInCmd
);
PyErr_Restore
(
excInCmd
,
valInCmd
,
trbInCmd
);
excInCmd
=
valInCmd
=
trbInCmd
=
NULL
;
return
NULL
;
}
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
}
...
...
@@ -1181,10 +1295,11 @@ Tkapp_DoOneEvent (self, args)
int
flags
=
TK_ALL_EVENTS
;
int
rv
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
flags
))
if
(
!
PyArg_ParseTuple
(
args
,
"|i"
,
&
flags
))
return
NULL
;
rv
=
Tk_DoOneEvent
(
flags
);
return
Py_BuildValue
(
"i"
,
rv
);
return
Py_BuildValue
(
"i"
,
rv
);
}
static
PyObject
*
...
...
@@ -1193,13 +1308,16 @@ Tkapp_Quit (self, args)
PyObject
*
args
;
{
if
(
!
PyArg_Parse
(
args
,
""
))
if
(
!
PyArg_Parse
(
args
,
""
))
return
NULL
;
quitMainLoop
=
1
;
Py_INCREF
(
Py_None
);
Py_INCREF
(
Py_None
);
return
Py_None
;
}
/**** Tkapp Method List ****/
static
PyMethodDef
Tkapp_methods
[]
=
...
...
@@ -1238,6 +1356,8 @@ static PyMethodDef Tkapp_methods[] =
{
NULL
,
NULL
}
};
/**** Tkapp Type Methods ****/
static
void
...
...
@@ -1278,6 +1398,8 @@ static PyTypeObject Tkapp_Type =
0
,
/*tp_hash */
};
/**** Tkinter Module ****/
static
PyObject
*
...
...
@@ -1290,18 +1412,19 @@ Tkinter_Create (self, args)
char
*
className
=
NULL
;
int
interactive
=
0
;
baseName
=
strrchr
(
Py_GetProgramName
(),
'/'
);
baseName
=
strrchr
(
Py_GetProgramName
(),
'/'
);
if
(
baseName
!=
NULL
)
baseName
++
;
else
baseName
=
Py_GetProgramName
();
baseName
=
Py_GetProgramName
();
className
=
"Tk"
;
if
(
!
PyArg_ParseTuple
(
args
,
"|zssi"
,
&
screenName
,
&
baseName
,
&
className
,
&
interactive
))
if
(
!
PyArg_ParseTuple
(
args
,
"|zssi"
,
&
screenName
,
&
baseName
,
&
className
,
&
interactive
))
return
NULL
;
return
(
PyObject
*
)
Tkapp_New
(
screenName
,
baseName
,
className
,
return
(
PyObject
*
)
Tkapp_New
(
screenName
,
baseName
,
className
,
interactive
);
}
...
...
@@ -1322,15 +1445,15 @@ static PyMethodDef moduleMethods[] =
static
int
EventHook
()
{
if
(
errorInCmd
)
/* XXX Reset tty */
{
/* XXX Reset tty */
if
(
errorInCmd
)
{
errorInCmd
=
0
;
PyErr_Restore
(
excInCmd
,
valInCmd
,
trbInCmd
);
PyErr_Restore
(
excInCmd
,
valInCmd
,
trbInCmd
);
excInCmd
=
valInCmd
=
trbInCmd
=
NULL
;
PyErr_Print
();
PyErr_Print
();
}
if
(
Tk_GetNumMainWindows
()
>
0
)
Tk_DoOneEvent
(
TK_DONT_WAIT
);
Tk_DoOneEvent
(
TK_DONT_WAIT
);
return
0
;
}
#endif
/* WITH_READLINE */
...
...
@@ -1338,14 +1461,44 @@ EventHook ()
static
void
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
/* XXX rl_deprep_terminal is static, damned! */
while
(
tkMainWindowList
!=
0
)
Tk_DestroyWindow
(
tkMainWindowList
->
win
);
Tk_DestroyWindow
(
tkMainWindowList
->
win
);
#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
init_tkinter
()
{
...
...
@@ -1354,53 +1507,41 @@ init_tkinter ()
#ifdef WITH_READLINE
extern
int
(
*
rl_event_hook
)
();
#endif
/* WITH_READLINE */
PyObject
*
m
,
*
d
,
*
v
;
PyObject
*
m
,
*
d
;
Tkapp_Type
.
ob_type
=
&
PyType_Type
;
Tktt_Type
.
ob_type
=
&
PyType_Type
;
m
=
Py_InitModule
(
"_tkinter"
,
moduleMethods
);
d
=
PyModule_GetDict
(
m
);
Tkinter_TclError
=
Py_BuildValue
(
"s"
,
"TclError"
);
PyDict_SetItemString
(
d
,
"TclError"
,
Tkinter_TclError
);
v
=
Py_BuildValue
(
"i"
,
TK_READABLE
);
PyDict_SetItemString
(
d
,
"READABLE"
,
v
);
v
=
Py_BuildValue
(
"i"
,
TK_WRITABLE
);
PyDict_SetItemString
(
d
,
"WRITABLE"
,
v
);
v
=
Py_BuildValue
(
"i"
,
TK_EXCEPTION
);
PyDict_SetItemString
(
d
,
"EXCEPTION"
,
v
);
v
=
Py_BuildValue
(
"i"
,
TK_X_EVENTS
);
PyDict_SetItemString
(
d
,
"X_EVENTS"
,
v
);
v
=
Py_BuildValue
(
"i"
,
TK_FILE_EVENTS
);
PyDict_SetItemString
(
d
,
"FILE_EVENTS"
,
v
);
v
=
Py_BuildValue
(
"i"
,
TK_TIMER_EVENTS
);
PyDict_SetItemString
(
d
,
"TIMER_EVENTS"
,
v
);
v
=
Py_BuildValue
(
"i"
,
TK_IDLE_EVENTS
);
PyDict_SetItemString
(
d
,
"IDLE_EVENTS"
,
v
);
v
=
Py_BuildValue
(
"i"
,
TK_ALL_EVENTS
);
PyDict_SetItemString
(
d
,
"ALL_EVENTS"
,
v
);
v
=
Py_BuildValue
(
"i"
,
TK_DONT_WAIT
);
PyDict_SetItemString
(
d
,
"DONT_WAIT"
,
v
);
v
=
Py_BuildValue
(
"s"
,
TK_VERSION
);
PyDict_SetItemString
(
d
,
"TK_VERSION"
,
v
);
v
=
Py_BuildValue
(
"s"
,
TCL_VERSION
);
PyDict_SetItemString
(
d
,
"TCL_VERSION"
,
v
);
m
=
Py_InitModule
(
"_tkinter"
,
moduleMethods
);
d
=
PyModule_GetDict
(
m
);
Tkinter_TclError
=
Py_BuildValue
(
"s"
,
"TclError"
);
PyDict_SetItemString
(
d
,
"TclError"
,
Tkinter_TclError
);
ins_long
(
d
,
"READABLE"
,
TK_READABLE
);
ins_long
(
d
,
"WRITABLE"
,
TK_WRITABLE
);
ins_long
(
d
,
"EXCEPTION"
,
TK_EXCEPTION
);
ins_long
(
d
,
"X_EVENTS"
,
TK_X_EVENTS
);
ins_long
(
d
,
"FILE_EVENTS"
,
TK_FILE_EVENTS
);
ins_long
(
d
,
"TIMER_EVENTS"
,
TK_TIMER_EVENTS
);
ins_long
(
d
,
"IDLE_EVENTS"
,
TK_IDLE_EVENTS
);
ins_long
(
d
,
"ALL_EVENTS"
,
TK_ALL_EVENTS
);
ins_long
(
d
,
"DONT_WAIT"
,
TK_DONT_WAIT
);
ins_string
(
d
,
"TK_VERSION"
,
TK_VERSION
);
ins_string
(
d
,
"TCL_VERSION"
,
TCL_VERSION
);
#ifdef WITH_READLINE
rl_event_hook
=
EventHook
;
#endif
/* WITH_READLINE */
if
(
!
inited
)
{
if
(
!
inited
)
{
inited
=
1
;
if
(
Py_AtExit
(
Tkinter_Cleanup
)
!=
0
)
if
(
Py_AtExit
(
Tkinter_Cleanup
)
!=
0
)
fprintf
(
stderr
,
"Tkinter: warning: cleanup procedure not registered
\n
"
);
}
if
(
PyErr_Occurred
())
if
(
PyErr_Occurred
())
Py_FatalError
(
"can't initialize module _tkinter"
);
#ifdef macintosh
TclMacSetEventProc
(
PyMacConvertEvent
);
...
...
@@ -1411,6 +1552,7 @@ init_tkinter ()
}
#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