annotate Modules/_tkinter.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 35da5d848ffd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3703
ff7fa59f62e8 Added CWI copyright.
Guido van Rossum <guido@python.org>
parents: 3554
diff changeset
1 /***********************************************************
ff7fa59f62e8 Added CWI copyright.
Guido van Rossum <guido@python.org>
parents: 3554
diff changeset
2 Copyright (C) 1994 Steen Lumholt.
ff7fa59f62e8 Added CWI copyright.
Guido van Rossum <guido@python.org>
parents: 3554
diff changeset
3
ff7fa59f62e8 Added CWI copyright.
Guido van Rossum <guido@python.org>
parents: 3554
diff changeset
4 All Rights Reserved
ff7fa59f62e8 Added CWI copyright.
Guido van Rossum <guido@python.org>
parents: 3554
diff changeset
5
ff7fa59f62e8 Added CWI copyright.
Guido van Rossum <guido@python.org>
parents: 3554
diff changeset
6 ******************************************************************/
ff7fa59f62e8 Added CWI copyright.
Guido van Rossum <guido@python.org>
parents: 3554
diff changeset
7
ff7fa59f62e8 Added CWI copyright.
Guido van Rossum <guido@python.org>
parents: 3554
diff changeset
8 /* _tkinter.c -- Interface to libtk.a and libtcl.a. */
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9
4005
7495322427c7 Changes for Windows NT -- this time it works, with Tcl4.1p1 (p1!!!) etc.
Guido van Rossum <guido@python.org>
parents: 3973
diff changeset
10 /* TCL/TK VERSION INFO:
7495322427c7 Changes for Windows NT -- this time it works, with Tcl4.1p1 (p1!!!) etc.
Guido van Rossum <guido@python.org>
parents: 3973
diff changeset
11
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
12 Only Tcl/Tk 8.3.1 and later are supported. Older versions are not
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
13 supported. Use Python 2.6 or older if you cannot upgrade your
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
14 Tcl/Tk libraries.
12071
9750af5e71b0 Patch by Neil Schemenauer to remove support for Tcl/Tk versions before
Guido van Rossum <guido@python.org>
parents: 12063
diff changeset
15 */
4005
7495322427c7 Changes for Windows NT -- this time it works, with Tcl4.1p1 (p1!!!) etc.
Guido van Rossum <guido@python.org>
parents: 3973
diff changeset
16
12071
9750af5e71b0 Patch by Neil Schemenauer to remove support for Tcl/Tk versions before
Guido van Rossum <guido@python.org>
parents: 12063
diff changeset
17 /* XXX Further speed-up ideas, involving Tcl 8.0 features:
8200
482e4ba33c08 Still somewhat experimental speedup. This appears to speed up the
Guido van Rossum <guido@python.org>
parents: 8199
diff changeset
18
482e4ba33c08 Still somewhat experimental speedup. This appears to speed up the
Guido van Rossum <guido@python.org>
parents: 8199
diff changeset
19 - Register a new Tcl type, "Python callable", which can be called more
482e4ba33c08 Still somewhat experimental speedup. This appears to speed up the
Guido van Rossum <guido@python.org>
parents: 8199
diff changeset
20 efficiently and passed to Tcl_EvalObj() directly (if this is possible).
482e4ba33c08 Still somewhat experimental speedup. This appears to speed up the
Guido van Rossum <guido@python.org>
parents: 8199
diff changeset
21
4005
7495322427c7 Changes for Windows NT -- this time it works, with Tcl4.1p1 (p1!!!) etc.
Guido van Rossum <guido@python.org>
parents: 3973
diff changeset
22 */
7495322427c7 Changes for Windows NT -- this time it works, with Tcl4.1p1 (p1!!!) etc.
Guido van Rossum <guido@python.org>
parents: 3973
diff changeset
23
5914
5155b2c35e15 Functionality enhancement: allow other threads to use Tk commands
Guido van Rossum <guido@python.org>
parents: 5913
diff changeset
24
3120
4a12a543175d Mac changes
Guido van Rossum <guido@python.org>
parents: 2858
diff changeset
25 #include "Python.h"
3973
3d1e4b76f745 Add optional casts to free() calls. (Jack)
Guido van Rossum <guido@python.org>
parents: 3899
diff changeset
26 #include <ctype.h>
3120
4a12a543175d Mac changes
Guido van Rossum <guido@python.org>
parents: 2858
diff changeset
27
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
28 #ifdef WITH_THREAD
9203
07dae6fdae79 Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents: 9128
diff changeset
29 #include "pythread.h"
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
30 #endif
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
31
8446
59dfa9eb7c07 On Windows, need #include <windows.h>; and it's MS_WINDOWS, not MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 8444
diff changeset
32 #ifdef MS_WINDOWS
59dfa9eb7c07 On Windows, need #include <windows.h>; and it's MS_WINDOWS, not MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 8444
diff changeset
33 #include <windows.h>
59dfa9eb7c07 On Windows, need #include <windows.h>; and it's MS_WINDOWS, not MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 8444
diff changeset
34 #endif
59dfa9eb7c07 On Windows, need #include <windows.h>; and it's MS_WINDOWS, not MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 8444
diff changeset
35
27071
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
36 /* Allow using this code in Python 2.[12] */
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
37 #ifndef PyDoc_STRVAR
27333
f4c694a01425 Avoid usage of PyDoc_STR in 2.2 compatibility code.
Martin v. Löwis <martin@v.loewis.de>
parents: 27104
diff changeset
38 #define PyDoc_STRVAR(name,str) static char name[] = str
27071
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
39 #endif
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
40
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
41 #ifndef PyMODINIT_FUNC
27084
f7226422c1d0 Fix typo.
Martin v. Löwis <martin@v.loewis.de>
parents: 27083
diff changeset
42 #define PyMODINIT_FUNC void
27071
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
43 #endif
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
44
28444
2405371be34c Fake bool API for Python 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 28156
diff changeset
45 #ifndef PyBool_Check
2405371be34c Fake bool API for Python 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 28156
diff changeset
46 #define PyBool_Check(o) 0
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43963
diff changeset
47 #define PyBool_FromLong PyLong_FromLong
28444
2405371be34c Fake bool API for Python 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 28156
diff changeset
48 #endif
2405371be34c Fake bool API for Python 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 28156
diff changeset
49
85296
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
50 #define CHECK_SIZE(size, elemsize) \
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
51 ((size_t)(size) <= Py_MAX((size_t)INT_MAX, UINT_MAX / (size_t)(elemsize)))
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
52
25527
5420969ddd70 Eliminate constness warnings with Tcl 8.4.
Martin v. Löwis <martin@v.loewis.de>
parents: 25525
diff changeset
53 /* Starting with Tcl 8.4, many APIs offer const-correctness. Unfortunately,
5420969ddd70 Eliminate constness warnings with Tcl 8.4.
Martin v. Löwis <martin@v.loewis.de>
parents: 25525
diff changeset
54 making _tkinter correct for this API means to break earlier
5420969ddd70 Eliminate constness warnings with Tcl 8.4.
Martin v. Löwis <martin@v.loewis.de>
parents: 25525
diff changeset
55 versions. USE_COMPAT_CONST allows to make _tkinter work with both 8.4 and
5420969ddd70 Eliminate constness warnings with Tcl 8.4.
Martin v. Löwis <martin@v.loewis.de>
parents: 25525
diff changeset
56 earlier versions. Once Tcl releases before 8.4 don't need to be supported
5420969ddd70 Eliminate constness warnings with Tcl 8.4.
Martin v. Löwis <martin@v.loewis.de>
parents: 25525
diff changeset
57 anymore, this should go. */
5420969ddd70 Eliminate constness warnings with Tcl 8.4.
Martin v. Löwis <martin@v.loewis.de>
parents: 25525
diff changeset
58 #define USE_COMPAT_CONST
5420969ddd70 Eliminate constness warnings with Tcl 8.4.
Martin v. Löwis <martin@v.loewis.de>
parents: 25525
diff changeset
59
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
60 /* If Tcl is compiled for threads, we must also define TCL_THREAD. We define
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
61 it always; if Tcl is not threaded, the thread functions in
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
62 Tcl are empty. */
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
63 #define TCL_THREADS
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
64
21322
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
65 #ifdef TK_FRAMEWORK
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
66 #include <Tcl/tcl.h>
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
67 #include <Tk/tk.h>
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
68 #else
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 #include <tcl.h>
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 #include <tk.h>
21322
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
71 #endif
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72
53044
06b64178a30d Merged revisions 71210 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 52859
diff changeset
73 #include "tkinter.h"
06b64178a30d Merged revisions 71210 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 52859
diff changeset
74
26989
bcbd94c610e8 Patch #660485: Cygwin _tkinter Tcl/Tk 8.3 patch
Jason Tishler <jason@tishler.net>
parents: 26971
diff changeset
75 /* For Tcl 8.2 and 8.3, CONST* is not defined (except on Cygwin). */
26858
b4ca5b9ba933 Silence cast warnings for Tcl 8.3.
Martin v. Löwis <martin@v.loewis.de>
parents: 26814
diff changeset
76 #ifndef CONST84_RETURN
b4ca5b9ba933 Silence cast warnings for Tcl 8.3.
Martin v. Löwis <martin@v.loewis.de>
parents: 26814
diff changeset
77 #define CONST84_RETURN
26989
bcbd94c610e8 Patch #660485: Cygwin _tkinter Tcl/Tk 8.3 patch
Jason Tishler <jason@tishler.net>
parents: 26971
diff changeset
78 #undef CONST
26858
b4ca5b9ba933 Silence cast warnings for Tcl 8.3.
Martin v. Löwis <martin@v.loewis.de>
parents: 26814
diff changeset
79 #define CONST
b4ca5b9ba933 Silence cast warnings for Tcl 8.3.
Martin v. Löwis <martin@v.loewis.de>
parents: 26814
diff changeset
80 #endif
b4ca5b9ba933 Silence cast warnings for Tcl 8.3.
Martin v. Löwis <martin@v.loewis.de>
parents: 26814
diff changeset
81
51496
8721c213b6f4 Merged revisions 69474 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51495
diff changeset
82 #if TK_VERSION_HEX < 0x08030102
8721c213b6f4 Merged revisions 69474 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51495
diff changeset
83 #error "Tk older than 8.3.1 not supported"
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
84 #endif
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
85
30979
86fdf8fe7f17 Getting rid of all the code inside #ifdef macintosh too.
Jack Jansen <jack.jansen@cwi.nl>
parents: 30638
diff changeset
86 #if !(defined(MS_WINDOWS) || defined(__CYGWIN__))
6026
b5804154af4d Merge Mac and Windows mods (which mostly affect the same problem -- no
Guido van Rossum <guido@python.org>
parents: 5973
diff changeset
87 #define HAVE_CREATEFILEHANDLER
b5804154af4d Merge Mac and Windows mods (which mostly affect the same problem -- no
Guido van Rossum <guido@python.org>
parents: 5973
diff changeset
88 #endif
b5804154af4d Merge Mac and Windows mods (which mostly affect the same problem -- no
Guido van Rossum <guido@python.org>
parents: 5973
diff changeset
89
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
90 #ifdef HAVE_CREATEFILEHANDLER
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
91
36233
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
92 /* This bit is to ensure that TCL_UNIX_FD is defined and doesn't interfere
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
93 with the proper calculation of FHANDLETYPE == TCL_UNIX_FD below. */
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
94 #ifndef TCL_UNIX_FD
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
95 # ifdef TCL_WIN_SOCKET
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
96 # define TCL_UNIX_FD (! TCL_WIN_SOCKET)
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
97 # else
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
98 # define TCL_UNIX_FD 1
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
99 # endif
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
100 #endif
b9dd481b3972 Fix icc warnings: try to set TCL_UNIX_FD for #if TCL_WIN_SOCKET == TCL_UNIX_FD. res is not used, add a XXX comment
Neal Norwitz <nnorwitz@gmail.com>
parents: 36092
diff changeset
101
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
102 /* Tcl_CreateFileHandler() changed several times; these macros deal with the
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
103 messiness. In Tcl 8.0 and later, it is not available on Windows (and on
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
104 Unix, only because Jack added it back); when available on Windows, it only
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
105 applies to sockets. */
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
106
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
107 #ifdef MS_WINDOWS
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
108 #define FHANDLETYPE TCL_WIN_SOCKET
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
109 #else
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
110 #define FHANDLETYPE TCL_UNIX_FD
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
111 #endif
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
112
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
113 /* If Tcl can wait for a Unix file descriptor, define the EventHook() routine
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
114 which uses this to handle Tcl events while the user is typing commands. */
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
115
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
116 #if FHANDLETYPE == TCL_UNIX_FD
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
117 #define WAIT_FOR_STDIN
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
118 #endif
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
119
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
120 #endif /* HAVE_CREATEFILEHANDLER */
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
121
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
122 #ifdef MS_WINDOWS
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
123 #include <conio.h>
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
124 #define WAIT_FOR_STDIN
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
125 #endif
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
126
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
127 #ifdef WITH_THREAD
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
128
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
129 /* The threading situation is complicated. Tcl is not thread-safe, except
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
130 when configured with --enable-threads.
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
131
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
132 So we need to use a lock around all uses of Tcl. Previously, the
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
133 Python interpreter lock was used for this. However, this causes
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
134 problems when other Python threads need to run while Tcl is blocked
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
135 waiting for events.
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
136
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
137 To solve this problem, a separate lock for Tcl is introduced.
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
138 Holding it is incompatible with holding Python's interpreter lock.
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
139 The following four macros manipulate both locks together.
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
140
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
141 ENTER_TCL and LEAVE_TCL are brackets, just like
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
142 Py_BEGIN_ALLOW_THREADS and Py_END_ALLOW_THREADS. They should be
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
143 used whenever a call into Tcl is made that could call an event
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
144 handler, or otherwise affect the state of a Tcl interpreter. These
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
145 assume that the surrounding code has the Python interpreter lock;
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
146 inside the brackets, the Python interpreter lock has been released
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
147 and the lock for Tcl has been acquired.
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
148
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
149 Sometimes, it is necessary to have both the Python lock and the Tcl
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
150 lock. (For example, when transferring data from the Tcl
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
151 interpreter result to a Python string object.) This can be done by
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
152 using different macros to close the ENTER_TCL block: ENTER_OVERLAP
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
153 reacquires the Python lock (and restores the thread state) but
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
154 doesn't release the Tcl lock; LEAVE_OVERLAP_TCL releases the Tcl
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
155 lock.
8504
de11a88ac498 # Note: a previous checkin message was lost because I can now use CVS
Guido van Rossum <guido@python.org>
parents: 8500
diff changeset
156
9319
8918e4f54eca Patch by Jonathan Giddy (with some cleanup by me) to always use the
Guido van Rossum <guido@python.org>
parents: 9308
diff changeset
157 By contrast, ENTER_PYTHON and LEAVE_PYTHON are used in Tcl event
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
158 handlers when the handler needs to use Python. Such event handlers
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
159 are entered while the lock for Tcl is held; the event handler
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
160 presumably needs to use Python. ENTER_PYTHON releases the lock for
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
161 Tcl and acquires the Python interpreter lock, restoring the
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
162 appropriate thread state, and LEAVE_PYTHON releases the Python
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
163 interpreter lock and re-acquires the lock for Tcl. It is okay for
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
164 ENTER_TCL/LEAVE_TCL pairs to be contained inside the code between
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
165 ENTER_PYTHON and LEAVE_PYTHON.
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
166
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
167 These locks expand to several statements and brackets; they should
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
168 not be used in branches of if statements and the like.
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
169
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
170 If Tcl is threaded, this approach won't work anymore. The Tcl
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
171 interpreter is only valid in the thread that created it, and all Tk
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
172 activity must happen in this thread, also. That means that the
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
173 mainloop must be invoked in the thread that created the
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
174 interpreter. Invoking commands from other threads is possible;
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
175 _tkinter will queue an event for the interpreter thread, which will
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
176 then execute the command and pass back the result. If the main
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
177 thread is not in the mainloop, and invoking commands causes an
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
178 exception; if the main loop is running but not processing events,
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
179 the command invocation will block.
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
180
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
181 In addition, for a threaded Tcl, a single global tcl_tstate won't
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
182 be sufficient anymore, since multiple Tcl interpreters may
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
183 simultaneously dispatch in different threads. So we use the Tcl TLS
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
184 API.
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
185
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
186 */
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
187
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
188 static PyThread_type_lock tcl_lock = 0;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
189
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
190 #ifdef TCL_THREADS
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
191 static Tcl_ThreadDataKey state_key;
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
192 typedef PyThreadState *ThreadSpecificData;
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
193 #define tcl_tstate \
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
194 (*(PyThreadState**)Tcl_GetThreadData(&state_key, sizeof(PyThreadState*)))
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
195 #else
9319
8918e4f54eca Patch by Jonathan Giddy (with some cleanup by me) to always use the
Guido van Rossum <guido@python.org>
parents: 9308
diff changeset
196 static PyThreadState *tcl_tstate = NULL;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
197 #endif
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
198
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
199 #define ENTER_TCL \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
200 { PyThreadState *tstate = PyThreadState_Get(); Py_BEGIN_ALLOW_THREADS \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
201 if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1); tcl_tstate = tstate;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
202
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
203 #define LEAVE_TCL \
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
204 tcl_tstate = NULL; \
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
205 if(tcl_lock)PyThread_release_lock(tcl_lock); Py_END_ALLOW_THREADS}
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
206
8500
92cf7f427723 # (My first checkin from Windows NT using remote CVS!)
Guido van Rossum <guido@python.org>
parents: 8499
diff changeset
207 #define ENTER_OVERLAP \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
208 Py_END_ALLOW_THREADS
8500
92cf7f427723 # (My first checkin from Windows NT using remote CVS!)
Guido van Rossum <guido@python.org>
parents: 8499
diff changeset
209
92cf7f427723 # (My first checkin from Windows NT using remote CVS!)
Guido van Rossum <guido@python.org>
parents: 8499
diff changeset
210 #define LEAVE_OVERLAP_TCL \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
211 tcl_tstate = NULL; if(tcl_lock)PyThread_release_lock(tcl_lock); }
8500
92cf7f427723 # (My first checkin from Windows NT using remote CVS!)
Guido van Rossum <guido@python.org>
parents: 8499
diff changeset
212
9319
8918e4f54eca Patch by Jonathan Giddy (with some cleanup by me) to always use the
Guido van Rossum <guido@python.org>
parents: 9308
diff changeset
213 #define ENTER_PYTHON \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
214 { PyThreadState *tstate = tcl_tstate; tcl_tstate = NULL; \
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
215 if(tcl_lock) \
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
216 PyThread_release_lock(tcl_lock); PyEval_RestoreThread((tstate)); }
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
217
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
218 #define LEAVE_PYTHON \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
219 { PyThreadState *tstate = PyEval_SaveThread(); \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
220 if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1); tcl_tstate = tstate; }
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
221
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
222 #define CHECK_TCL_APPARTMENT \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
223 if (((TkappObject *)self)->threaded && \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
224 ((TkappObject *)self)->thread_id != Tcl_GetCurrentThread()) { \
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
225 PyErr_SetString(PyExc_RuntimeError, \
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
226 "Calling Tcl from different appartment"); \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
227 return 0; \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
228 }
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
229
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
230 #else
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
231
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
232 #define ENTER_TCL
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
233 #define LEAVE_TCL
8500
92cf7f427723 # (My first checkin from Windows NT using remote CVS!)
Guido van Rossum <guido@python.org>
parents: 8499
diff changeset
234 #define ENTER_OVERLAP
92cf7f427723 # (My first checkin from Windows NT using remote CVS!)
Guido van Rossum <guido@python.org>
parents: 8499
diff changeset
235 #define LEAVE_OVERLAP_TCL
9319
8918e4f54eca Patch by Jonathan Giddy (with some cleanup by me) to always use the
Guido van Rossum <guido@python.org>
parents: 9308
diff changeset
236 #define ENTER_PYTHON
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
237 #define LEAVE_PYTHON
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
238 #define CHECK_TCL_APPARTMENT
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
239
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
240 #endif
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
241
3973
3d1e4b76f745 Add optional casts to free() calls. (Jack)
Guido van Rossum <guido@python.org>
parents: 3899
diff changeset
242 #ifndef FREECAST
4005
7495322427c7 Changes for Windows NT -- this time it works, with Tcl4.1p1 (p1!!!) etc.
Guido van Rossum <guido@python.org>
parents: 3973
diff changeset
243 #define FREECAST (char *)
3973
3d1e4b76f745 Add optional casts to free() calls. (Jack)
Guido van Rossum <guido@python.org>
parents: 3899
diff changeset
244 #endif
3d1e4b76f745 Add optional casts to free() calls. (Jack)
Guido van Rossum <guido@python.org>
parents: 3899
diff changeset
245
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 /**** Tkapp Object Declaration ****/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
248 static PyObject *Tkapp_Type;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
250 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
251 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
252 Tcl_Interp *interp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
253 int wantobjects;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
254 int threaded; /* True if tcl_platform[threaded] */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
255 Tcl_ThreadId thread_id;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
256 int dispatching;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
257 /* We cannot include tclInt.h, as this is internal.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
258 So we cache interesting types here. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
259 Tcl_ObjType *BooleanType;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
260 Tcl_ObjType *ByteArrayType;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
261 Tcl_ObjType *DoubleType;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
262 Tcl_ObjType *IntType;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
263 Tcl_ObjType *ListType;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
264 Tcl_ObjType *ProcBodyType;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
265 Tcl_ObjType *StringType;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
266 } TkappObject;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 #define Tkapp_Interp(v) (((TkappObject *) (v))->interp)
15177
52d2d36b8bf7 Fix for Bug #116453.
Guido van Rossum <guido@python.org>
parents: 15053
diff changeset
269 #define Tkapp_Result(v) Tcl_GetStringResult(Tkapp_Interp(v))
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270
5914
5155b2c35e15 Functionality enhancement: allow other threads to use Tk commands
Guido van Rossum <guido@python.org>
parents: 5913
diff changeset
271 #define DEBUG_REFCNT(v) (printf("DEBUG: id=%p, refcnt=%i\n", \
44351
86a2679dca46 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents: 44158
diff changeset
272 (void *) v, Py_REFCNT(v)))
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
274
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
275
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 /**** Error Handling ****/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 static PyObject *Tkinter_TclError;
1713
bb566d28caa0 * tkintermodule.c
Guido van Rossum <guido@python.org>
parents: 1690
diff changeset
279 static int quitMainLoop = 0;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 static int errorInCmd = 0;
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 static PyObject *excInCmd;
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 static PyObject *valInCmd;
2055
cf31eab6ab5a Another bulky set of minor changes.
Guido van Rossum <guido@python.org>
parents: 2009
diff changeset
283 static PyObject *trbInCmd;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
285 #ifdef TKINTER_PROTECT_LOADTK
52859
78f310b961c0 Initialize the tk_init_failed static variable to 0.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 52431
diff changeset
286 static int tk_load_failed = 0;
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
287 #endif
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
288
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
289
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
291 Tkinter_Error(PyObject *v)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
293 PyErr_SetString(Tkinter_TclError, Tkapp_Result(v));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
294 return NULL;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
297
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
298
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
299 /**** Utils ****/
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
300
29038
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
301 static int Tkinter_busywaitinterval = 20;
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
302
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
303 #ifdef WITH_THREAD
8446
59dfa9eb7c07 On Windows, need #include <windows.h>; and it's MS_WINDOWS, not MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 8444
diff changeset
304 #ifndef MS_WINDOWS
8987
3e127bca84e7 Need mytime.h for Sleep().
Guido van Rossum <guido@python.org>
parents: 8828
diff changeset
305
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
306 /* Millisecond sleep() for Unix platforms. */
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
307
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
308 static void
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
309 Sleep(int milli)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
311 /* XXX Too bad if you don't have select(). */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
312 struct timeval t;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
313 t.tv_sec = milli/1000;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
314 t.tv_usec = (milli%1000) * 1000;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
315 select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 }
8446
59dfa9eb7c07 On Windows, need #include <windows.h>; and it's MS_WINDOWS, not MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 8444
diff changeset
317 #endif /* MS_WINDOWS */
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
318
26814
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
319 /* Wait up to 1s for the mainloop to come up. */
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
320
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
321 static int
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
322 WaitForMainloop(TkappObject* self)
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
323 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
324 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
325 for (i = 0; i < 10; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
326 if (self->dispatching)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
327 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
328 Py_BEGIN_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
329 Sleep(100);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
330 Py_END_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
331 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
332 if (self->dispatching)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
333 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
334 PyErr_SetString(PyExc_RuntimeError, "main thread is not in main loop");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
335 return 0;
26814
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
336 }
28445
3fc5764273d9 Wrap thread stuff in WITH_THREAD. Fixes #704641.
Martin v. Löwis <martin@v.loewis.de>
parents: 28444
diff changeset
337 #endif /* WITH_THREAD */
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
338
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
339
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
340
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 #define ARGSZ 64
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
343
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
344
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
345 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
346 Split(char *list)
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
347 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
348 int argc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
349 char **argv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
350 PyObject *v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
351
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
352 if (list == NULL) {
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
353 Py_RETURN_NONE;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
354 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
355
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
356 if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
357 /* Not a list.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
358 * Could be a quoted string containing funnies, e.g. {"}.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
359 * Return the string itself.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
360 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
361 return PyUnicode_FromString(list);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
362 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
363
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
364 if (argc == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
365 v = PyUnicode_FromString("");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
366 else if (argc == 1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
367 v = PyUnicode_FromString(argv[0]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
368 else if ((v = PyTuple_New(argc)) != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
369 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
370 PyObject *w;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
371
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
372 for (i = 0; i < argc; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
373 if ((w = Split(argv[i])) == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
374 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
375 v = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
376 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
377 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
378 PyTuple_SetItem(v, i, w);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
379 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
380 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
381 Tcl_Free(FREECAST argv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
382 return v;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
384
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
385 /* In some cases, Tcl will still return strings that are supposed to
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
386 be lists. SplitObj walks through a nested tuple, finding string
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
387 objects that need to be split. */
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
388
47680
b5e02775fffc Merged revisions 64226 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47580
diff changeset
389 static PyObject *
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
390 SplitObj(PyObject *arg)
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
391 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
392 if (PyTuple_Check(arg)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
393 int i, size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
394 PyObject *elem, *newelem, *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
395
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
396 size = PyTuple_Size(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
397 result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
398 /* Recursively invoke SplitObj for all tuple items.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
399 If this does not return a new object, no action is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
400 needed. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
401 for(i = 0; i < size; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
402 elem = PyTuple_GetItem(arg, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
403 newelem = SplitObj(elem);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
404 if (!newelem) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
405 Py_XDECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
406 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
407 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
408 if (!result) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
409 int k;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
410 if (newelem == elem) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
411 Py_DECREF(newelem);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
412 continue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
413 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
414 result = PyTuple_New(size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
415 if (!result)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
416 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
417 for(k = 0; k < i; k++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
418 elem = PyTuple_GetItem(arg, k);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
419 Py_INCREF(elem);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
420 PyTuple_SetItem(result, k, elem);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
421 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
422 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
423 PyTuple_SetItem(result, i, newelem);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
424 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
425 if (result)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
426 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
427 /* Fall through, returning arg. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
428 }
84552
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
429 else if (PyUnicode_Check(arg)) {
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
430 int argc;
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
431 char **argv;
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
432 char *list = PyUnicode_AsUTF8(arg);
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
433
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
434 if (list == NULL ||
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
435 Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) {
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
436 Py_INCREF(arg);
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
437 return arg;
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
438 }
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
439 Tcl_Free(FREECAST argv);
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
440 if (argc > 1)
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
441 return Split(list);
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
442 /* Fall through, returning arg. */
9486c07929a1 Issue #18101: Tcl.split() now process strings nested in a tuple as it
Serhiy Storchaka <storchaka@gmail.com>
parents: 82253
diff changeset
443 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
444 else if (PyBytes_Check(arg)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
445 int argc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
446 char **argv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
447 char *list = PyBytes_AsString(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
448
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
449 if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
450 Py_INCREF(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
451 return arg;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
452 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
453 Tcl_Free(FREECAST argv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
454 if (argc > 1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
455 return Split(PyBytes_AsString(arg));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
456 /* Fall through, returning arg. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
457 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
458 Py_INCREF(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
459 return arg;
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
460 }
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
461
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
462
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 /**** Tkapp Object ****/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
464
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 #ifndef WITH_APPINIT
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 int
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
467 Tcl_AppInit(Tcl_Interp *interp)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
468 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
469 const char * _tkinter_skip_tk_init;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
470
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
471 if (Tcl_Init(interp) == TCL_ERROR) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
472 PySys_WriteStderr("Tcl_Init error: %s\n", Tcl_GetStringResult(interp));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
473 return TCL_ERROR;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
474 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
475
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
476 _tkinter_skip_tk_init = Tcl_GetVar(interp,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
477 "_tkinter_skip_tk_init", TCL_GLOBAL_ONLY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
478 if (_tkinter_skip_tk_init != NULL &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
479 strcmp(_tkinter_skip_tk_init, "1") == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
480 return TCL_OK;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
481 }
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
482
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
483 #ifdef TKINTER_PROTECT_LOADTK
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
484 if (tk_load_failed) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
485 PySys_WriteStderr("Tk_Init error: %s\n", TKINTER_LOADTK_ERRMSG);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
486 return TCL_ERROR;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
487 }
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
488 #endif
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
489
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
490 if (Tk_Init(interp) == TCL_ERROR) {
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
491 #ifdef TKINTER_PROTECT_LOADTK
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
492 tk_load_failed = 1;
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
493 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
494 PySys_WriteStderr("Tk_Init error: %s\n", Tcl_GetStringResult(interp));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
495 return TCL_ERROR;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
496 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
497
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
498 return TCL_OK;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
499 }
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
500 #endif /* !WITH_APPINIT */
3413
2fe7d489654e Changes to make it work with Tcl/Tk beta 1.
Guido van Rossum <guido@python.org>
parents: 3386
diff changeset
501
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
502
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
503
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
504
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 /* Initialize the Tk application; see the `main' function in
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
506 * `tkMain.c'.
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
507 */
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
508
13690
c09c0171474f ANSIfy some more forward declarations.
Thomas Wouters <thomas@python.org>
parents: 13651
diff changeset
509 static void EnableEventHook(void); /* Forward */
c09c0171474f ANSIfy some more forward declarations.
Thomas Wouters <thomas@python.org>
parents: 13651
diff changeset
510 static void DisableEventHook(void); /* Forward */
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
511
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
512 static TkappObject *
46316
4352d41affb0 Remove baseName argument from Tkapp_New, as it apparently
Martin v. Löwis <martin@v.loewis.de>
parents: 44460
diff changeset
513 Tkapp_New(char *screenName, char *className,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
514 int interactive, int wantobjects, int wantTk, int sync, char *use)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
515 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
516 TkappObject *v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
517 char *argv0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
518
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
519 v = PyObject_New(TkappObject, (PyTypeObject *) Tkapp_Type);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
520 if (v == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
521 return NULL;
85111
4d0c938870bc Fix refcounting issue with extension types in tkinter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84553
diff changeset
522 Py_INCREF(Tkapp_Type);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
523
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
524 v->interp = Tcl_CreateInterp();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
525 v->wantobjects = wantobjects;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
526 v->threaded = Tcl_GetVar2Ex(v->interp, "tcl_platform", "threaded",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
527 TCL_GLOBAL_ONLY) != NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
528 v->thread_id = Tcl_GetCurrentThread();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
529 v->dispatching = 0;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
530
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
531 #ifndef TCL_THREADS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
532 if (v->threaded) {
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
533 PyErr_SetString(PyExc_RuntimeError,
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
534 "Tcl is threaded but _tkinter is not");
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
535 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
536 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
537 }
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
538 #endif
28445
3fc5764273d9 Wrap thread stuff in WITH_THREAD. Fixes #704641.
Martin v. Löwis <martin@v.loewis.de>
parents: 28444
diff changeset
539 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
540 if (v->threaded && tcl_lock) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
541 /* If Tcl is threaded, we don't need the lock. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
542 PyThread_free_lock(tcl_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
543 tcl_lock = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
544 }
28445
3fc5764273d9 Wrap thread stuff in WITH_THREAD. Fixes #704641.
Martin v. Löwis <martin@v.loewis.de>
parents: 28444
diff changeset
545 #endif
3413
2fe7d489654e Changes to make it work with Tcl/Tk beta 1.
Guido van Rossum <guido@python.org>
parents: 3386
diff changeset
546
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
547 v->BooleanType = Tcl_GetObjType("boolean");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
548 v->ByteArrayType = Tcl_GetObjType("bytearray");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
549 v->DoubleType = Tcl_GetObjType("double");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
550 v->IntType = Tcl_GetObjType("int");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
551 v->ListType = Tcl_GetObjType("list");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
552 v->ProcBodyType = Tcl_GetObjType("procbody");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
553 v->StringType = Tcl_GetObjType("string");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
554
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
555 /* Delete the 'exit' command, which can screw things up */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
556 Tcl_DeleteCommand(v->interp, "exit");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
557
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
558 if (screenName != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
559 Tcl_SetVar2(v->interp, "env", "DISPLAY",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
560 screenName, TCL_GLOBAL_ONLY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
561
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
562 if (interactive)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
563 Tcl_SetVar(v->interp, "tcl_interactive", "1", TCL_GLOBAL_ONLY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
564 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
565 Tcl_SetVar(v->interp, "tcl_interactive", "0", TCL_GLOBAL_ONLY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
566
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
567 /* This is used to get the application class for Tk 4.1 and up */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
568 argv0 = (char*)ckalloc(strlen(className) + 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
569 if (!argv0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
570 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
571 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
572 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
573 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
574
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
575 strcpy(argv0, className);
72655
fe48e2b3dbee Remove all other uses of the C tolower()/toupper() which could break with a Turkish locale.
Antoine Pitrou <solipsis@pitrou.net>
parents: 70040
diff changeset
576 if (Py_ISUPPER(Py_CHARMASK(argv0[0])))
fe48e2b3dbee Remove all other uses of the C tolower()/toupper() which could break with a Turkish locale.
Antoine Pitrou <solipsis@pitrou.net>
parents: 70040
diff changeset
577 argv0[0] = Py_TOLOWER(Py_CHARMASK(argv0[0]));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
578 Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
579 ckfree(argv0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
580
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
581 if (! wantTk) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
582 Tcl_SetVar(v->interp,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
583 "_tkinter_skip_tk_init", "1", TCL_GLOBAL_ONLY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
584 }
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
585 #ifdef TKINTER_PROTECT_LOADTK
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
586 else if (tk_load_failed) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
587 Tcl_SetVar(v->interp,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
588 "_tkinter_tk_failed", "1", TCL_GLOBAL_ONLY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
589 }
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
590 #endif
31547
470f95ad6750 Implementation of patch 869468
David Ascher <david.ascher@gmail.com>
parents: 30979
diff changeset
591
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
592 /* some initial arguments need to be in argv */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
593 if (sync || use) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
594 char *args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
595 int len = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
596
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
597 if (sync)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
598 len += sizeof "-sync";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
599 if (use)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
600 len += strlen(use) + sizeof "-use ";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
601
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
602 args = (char*)ckalloc(len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
603 if (!args) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
604 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
605 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
606 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
607 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
608
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
609 args[0] = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
610 if (sync)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
611 strcat(args, "-sync");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
612 if (use) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
613 if (sync)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
614 strcat(args, " ");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
615 strcat(args, "-use ");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
616 strcat(args, use);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
617 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
618
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
619 Tcl_SetVar(v->interp, "argv", args, TCL_GLOBAL_ONLY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
620 ckfree(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
621 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
622
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
623 if (Tcl_AppInit(v->interp) != TCL_OK) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
624 PyObject *result = Tkinter_Error((PyObject *)v);
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
625 #ifdef TKINTER_PROTECT_LOADTK
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
626 if (wantTk) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
627 const char *_tkinter_tk_failed;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
628 _tkinter_tk_failed = Tcl_GetVar(v->interp,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
629 "_tkinter_tk_failed", TCL_GLOBAL_ONLY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
630
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
631 if ( _tkinter_tk_failed != NULL &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
632 strcmp(_tkinter_tk_failed, "1") == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
633 tk_load_failed = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
634 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
635 }
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
636 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
637 Py_DECREF((PyObject *)v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
638 return (TkappObject *)result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
639 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
640
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
641 EnableEventHook();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
642
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
643 return v;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
644 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
645
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
646
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
647 #ifdef WITH_THREAD
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
648 static void
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
649 Tkapp_ThreadSend(TkappObject *self, Tcl_Event *ev,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
650 Tcl_Condition *cond, Tcl_Mutex *mutex)
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
651 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
652 Py_BEGIN_ALLOW_THREADS;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
653 Tcl_MutexLock(mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
654 Tcl_ThreadQueueEvent(self->thread_id, ev, TCL_QUEUE_TAIL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
655 Tcl_ThreadAlert(self->thread_id);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
656 Tcl_ConditionWait(cond, mutex, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
657 Tcl_MutexUnlock(mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
658 Py_END_ALLOW_THREADS
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
659 }
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
660 #endif
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
661
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
662
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
663 /** Tcl Eval **/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
664
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
665 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
666 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
667 Tcl_Obj *value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
668 PyObject *string; /* This cannot cause cycles. */
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
669 } PyTclObject;
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
670
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
671 static PyObject *PyTclObject_Type;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
672 #define PyTclObject_Check(v) ((v)->ob_type == (PyTypeObject *) PyTclObject_Type)
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
673
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
674 static PyObject *
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
675 newPyTclObject(Tcl_Obj *arg)
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
676 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
677 PyTclObject *self;
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
678 self = PyObject_New(PyTclObject, (PyTypeObject *) PyTclObject_Type);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
679 if (self == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
680 return NULL;
85111
4d0c938870bc Fix refcounting issue with extension types in tkinter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84553
diff changeset
681 Py_INCREF(PyTclObject_Type);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
682 Tcl_IncrRefCount(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
683 self->value = arg;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
684 self->string = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
685 return (PyObject*)self;
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
686 }
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
687
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
688 static void
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
689 PyTclObject_dealloc(PyTclObject *self)
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
690 {
85111
4d0c938870bc Fix refcounting issue with extension types in tkinter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84553
diff changeset
691 PyObject *tp = (PyObject *) Py_TYPE(self);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
692 Tcl_DecrRefCount(self->value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
693 Py_XDECREF(self->string);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
694 PyObject_Del(self);
85111
4d0c938870bc Fix refcounting issue with extension types in tkinter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84553
diff changeset
695 Py_DECREF(tp);
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
696 }
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
697
28915
fa0063928518 Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Martin v. Löwis <martin@v.loewis.de>
parents: 28643
diff changeset
698 static char*
fa0063928518 Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Martin v. Löwis <martin@v.loewis.de>
parents: 28643
diff changeset
699 PyTclObject_TclString(PyObject *self)
fa0063928518 Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Martin v. Löwis <martin@v.loewis.de>
parents: 28643
diff changeset
700 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
701 return Tcl_GetString(((PyTclObject*)self)->value);
28915
fa0063928518 Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Martin v. Löwis <martin@v.loewis.de>
parents: 28643
diff changeset
702 }
fa0063928518 Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Martin v. Löwis <martin@v.loewis.de>
parents: 28643
diff changeset
703
27069
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
704 /* Like _str, but create Unicode if necessary. */
43950
2a3ca90008ff Return PyString, not PyBytes, for a bytes array.
Guido van Rossum <guido@python.org>
parents: 42887
diff changeset
705 PyDoc_STRVAR(PyTclObject_string__doc__,
43963
14c4bb3c65a7 Removed some leftovers from the str8 days
Christian Heimes <christian@cheimes.de>
parents: 43950
diff changeset
706 "the string representation of this object, either as str or bytes");
27071
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
707
27069
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
708 static PyObject *
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
709 PyTclObject_string(PyTclObject *self, void *ignored)
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
710 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
711 char *s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
712 int len;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
713 if (!self->string) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
714 s = Tcl_GetStringFromObj(self->value, &len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
715 self->string = PyUnicode_FromStringAndSize(s, len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
716 if (!self->string)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
717 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
718 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
719 Py_INCREF(self->string);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
720 return self->string;
27069
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
721 }
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
722
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
723 static PyObject *
42232
e715e2081637 Rename PyTclObject_unicode to PyTclObject_str and use this
Walter Dörwald <walter@livinglogic.de>
parents: 42193
diff changeset
724 PyTclObject_str(PyTclObject *self, void *ignored)
27069
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
725 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
726 char *s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
727 int len;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
728 if (self->string && PyUnicode_Check(self->string)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
729 Py_INCREF(self->string);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
730 return self->string;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
731 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
732 /* XXX Could chache result if it is non-ASCII. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
733 s = Tcl_GetStringFromObj(self->value, &len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
734 return PyUnicode_DecodeUTF8(s, len, "strict");
27069
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
735 }
ef531482bb37 Convert Tcl path objects to strings. Fixes #661357.
Martin v. Löwis <martin@v.loewis.de>
parents: 26989
diff changeset
736
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
737 static PyObject *
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
738 PyTclObject_repr(PyTclObject *self)
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
739 {
85791
ece634a69ba8 Issue #19034: repr() for tkinter.Tcl_Obj now exposes string reperesentation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 85763
diff changeset
740 PyObject *repr, *str = PyTclObject_str(self, NULL);
ece634a69ba8 Issue #19034: repr() for tkinter.Tcl_Obj now exposes string reperesentation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 85763
diff changeset
741 if (str == NULL)
ece634a69ba8 Issue #19034: repr() for tkinter.Tcl_Obj now exposes string reperesentation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 85763
diff changeset
742 return NULL;
ece634a69ba8 Issue #19034: repr() for tkinter.Tcl_Obj now exposes string reperesentation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 85763
diff changeset
743 repr = PyUnicode_FromFormat("<%s object: %R>",
ece634a69ba8 Issue #19034: repr() for tkinter.Tcl_Obj now exposes string reperesentation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 85763
diff changeset
744 self->value->typePtr->name, str);
ece634a69ba8 Issue #19034: repr() for tkinter.Tcl_Obj now exposes string reperesentation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 85763
diff changeset
745 Py_DECREF(str);
ece634a69ba8 Issue #19034: repr() for tkinter.Tcl_Obj now exposes string reperesentation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 85763
diff changeset
746 return repr;
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
747 }
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
748
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51194
diff changeset
749 #define TEST_COND(cond) ((cond) ? Py_True : Py_False)
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51194
diff changeset
750
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51194
diff changeset
751 static PyObject *
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51194
diff changeset
752 PyTclObject_richcompare(PyObject *self, PyObject *other, int op)
28950
3a9f5f0c512e Implement tcl object __cmp__.
Martin v. Löwis <martin@v.loewis.de>
parents: 28915
diff changeset
753 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
754 int result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
755 PyObject *v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
756
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
757 /* neither argument should be NULL, unless something's gone wrong */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
758 if (self == NULL || other == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
759 PyErr_BadInternalCall();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
760 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
761 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
762
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
763 /* both arguments should be instances of PyTclObject */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
764 if (!PyTclObject_Check(self) || !PyTclObject_Check(other)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
765 v = Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
766 goto finished;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
767 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
768
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
769 if (self == other)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
770 /* fast path when self and other are identical */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
771 result = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
772 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
773 result = strcmp(Tcl_GetString(((PyTclObject *)self)->value),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
774 Tcl_GetString(((PyTclObject *)other)->value));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
775 /* Convert return value to a Boolean */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
776 switch (op) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
777 case Py_EQ:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
778 v = TEST_COND(result == 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
779 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
780 case Py_NE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
781 v = TEST_COND(result != 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
782 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
783 case Py_LE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
784 v = TEST_COND(result <= 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
785 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
786 case Py_GE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
787 v = TEST_COND(result >= 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
788 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
789 case Py_LT:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
790 v = TEST_COND(result < 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
791 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
792 case Py_GT:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
793 v = TEST_COND(result > 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
794 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
795 default:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
796 PyErr_BadArgument();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
797 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
798 }
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51194
diff changeset
799 finished:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
800 Py_INCREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
801 return v;
28950
3a9f5f0c512e Implement tcl object __cmp__.
Martin v. Löwis <martin@v.loewis.de>
parents: 28915
diff changeset
802 }
3a9f5f0c512e Implement tcl object __cmp__.
Martin v. Löwis <martin@v.loewis.de>
parents: 28915
diff changeset
803
27071
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
804 PyDoc_STRVAR(get_typename__doc__, "name of the Tcl type");
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
805
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
806 static PyObject*
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
807 get_typename(PyTclObject* obj, void* ignored)
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
808 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
809 return PyUnicode_FromString(obj->value->typePtr->name);
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
810 }
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
811
27071
c30f97287602 Wrap doc strings in PyDoc_STRVAR. Fix .string docstring. Provide default
Martin v. Löwis <martin@v.loewis.de>
parents: 27069
diff changeset
812
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
813 static PyGetSetDef PyTclObject_getsetlist[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
814 {"typename", (getter)get_typename, NULL, get_typename__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
815 {"string", (getter)PyTclObject_string, NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
816 PyTclObject_string__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
817 {0},
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
818 };
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
819
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
820 static PyType_Slot PyTclObject_Type_slots[] = {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
821 {Py_tp_dealloc, (destructor)PyTclObject_dealloc},
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
822 {Py_tp_repr, (reprfunc)PyTclObject_repr},
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
823 {Py_tp_str, (reprfunc)PyTclObject_str},
80062
4eb6e07e8171 Issue #15721: apply PEP 384 Refactoring to tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79767
diff changeset
824 {Py_tp_getattro, PyObject_GenericGetAttr},
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
825 {Py_tp_richcompare, PyTclObject_richcompare},
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
826 {Py_tp_getset, PyTclObject_getsetlist},
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
827 {0, 0}
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
828 };
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
829
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
830 static PyType_Spec PyTclObject_Type_spec = {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
831 "_tkinter.Tcl_Obj",
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
832 sizeof(PyTclObject),
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
833 0,
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
834 Py_TPFLAGS_DEFAULT,
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
835 PyTclObject_Type_slots,
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
836 };
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
837
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
838
12141
4a3fd2c1372f Don't use the object call interface in Tk 8.0 -- the EvalObj* API
Guido van Rossum <guido@python.org>
parents: 12087
diff changeset
839 static Tcl_Obj*
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
840 AsObj(PyObject *value)
12141
4a3fd2c1372f Don't use the object call interface in Tk 8.0 -- the EvalObj* API
Guido van Rossum <guido@python.org>
parents: 12087
diff changeset
841 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
842 Tcl_Obj *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
843 long longVal;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
844 int overflow;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
845
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
846 if (PyBytes_Check(value))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
847 return Tcl_NewStringObj(PyBytes_AS_STRING(value),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
848 PyBytes_GET_SIZE(value));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
849 else if (PyBool_Check(value))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
850 return Tcl_NewBooleanObj(PyObject_IsTrue(value));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
851 else if (PyLong_CheckExact(value) &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
852 ((longVal = PyLong_AsLongAndOverflow(value, &overflow)),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
853 !overflow)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
854 /* If there is an overflow in the long conversion,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
855 fall through to default object handling. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
856 return Tcl_NewLongObj(longVal);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
857 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
858 else if (PyFloat_Check(value))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
859 return Tcl_NewDoubleObj(PyFloat_AS_DOUBLE(value));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
860 else if (PyTuple_Check(value)) {
85296
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
861 Tcl_Obj **argv;
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
862 Py_ssize_t size, i;
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
863
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
864 size = PyTuple_Size(value);
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
865 if (!CHECK_SIZE(size, sizeof(Tcl_Obj *))) {
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
866 PyErr_SetString(PyExc_OverflowError, "tuple is too long");
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
867 return NULL;
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
868 }
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
869 argv = (Tcl_Obj **) ckalloc(((size_t)size) * sizeof(Tcl_Obj *));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
870 if(!argv)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
871 return 0;
85296
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
872 for (i = 0; i < size; i++)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
873 argv[i] = AsObj(PyTuple_GetItem(value,i));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
874 result = Tcl_NewListObj(PyTuple_Size(value), argv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
875 ckfree(FREECAST argv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
876 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
877 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
878 else if (PyUnicode_Check(value)) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
879 void *inbuf;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
880 Py_ssize_t size;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
881 int kind;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
882 Tcl_UniChar *outbuf = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
883 Py_ssize_t i;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
884 size_t allocsize;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
885
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
886 if (PyUnicode_READY(value) == -1)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
887 return NULL;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
888
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
889 inbuf = PyUnicode_DATA(value);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
890 size = PyUnicode_GET_LENGTH(value);
85296
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
891 if (!CHECK_SIZE(size, sizeof(Tcl_UniChar))) {
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
892 PyErr_SetString(PyExc_OverflowError, "string is too long");
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
893 return NULL;
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
894 }
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
895 kind = PyUnicode_KIND(value);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
896 allocsize = ((size_t)size) * sizeof(Tcl_UniChar);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
897 outbuf = (Tcl_UniChar*)ckalloc(allocsize);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
898 /* Else overflow occurred, and we take the next exit */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
899 if (!outbuf) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
900 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
901 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
902 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
903 for (i = 0; i < size; i++) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
904 Py_UCS4 ch = PyUnicode_READ(kind, inbuf, i);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
905 /* We cannot test for sizeof(Tcl_UniChar) directly,
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
906 so we test for UTF-8 size instead. */
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
907 #if TCL_UTF_MAX == 3
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
908 if (ch >= 0x10000) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
909 /* Tcl doesn't do UTF-16, yet. */
82252
9904f245c3f0 Issue #13153: Tkinter functions now raise TclError instead of ValueError when
Serhiy Storchaka <storchaka@gmail.com>
parents: 78180
diff changeset
910 PyErr_Format(Tkinter_TclError,
73340
9a07b73abdb1 Issue #12342: Improve _tkinter error message on unencodable character
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72655
diff changeset
911 "character U+%x is above the range "
9a07b73abdb1 Issue #12342: Improve _tkinter error message on unencodable character
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72655
diff changeset
912 "(U+0000-U+FFFF) allowed by Tcl",
73346
5f49b496d161 Issue #12342: Fix compilation on Mac OS X
Victor Stinner <vstinner@wyplay.com>
parents: 73341
diff changeset
913 ch);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
914 ckfree(FREECAST outbuf);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
915 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
916 }
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
917 #endif
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
918 outbuf[i] = ch;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
919 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
920 result = Tcl_NewUnicodeObj(outbuf, size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
921 ckfree(FREECAST outbuf);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
922 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
923 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
924 else if(PyTclObject_Check(value)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
925 Tcl_Obj *v = ((PyTclObject*)value)->value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
926 Tcl_IncrRefCount(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
927 return v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
928 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
929 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
930 PyObject *v = PyObject_Str(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
931 if (!v)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
932 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
933 result = AsObj(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
934 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
935 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
936 }
12141
4a3fd2c1372f Don't use the object call interface in Tk 8.0 -- the EvalObj* API
Guido van Rossum <guido@python.org>
parents: 12087
diff changeset
937 }
4a3fd2c1372f Don't use the object call interface in Tk 8.0 -- the EvalObj* API
Guido van Rossum <guido@python.org>
parents: 12087
diff changeset
938
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
939 static PyObject*
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
940 FromObj(PyObject* tkapp, Tcl_Obj *value)
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
941 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
942 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
943 TkappObject *app = (TkappObject*)tkapp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
944
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
945 if (value->typePtr == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
946 return PyUnicode_FromStringAndSize(value->bytes,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
947 value->length);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
948 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
949
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
950 if (value->typePtr == app->BooleanType) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
951 result = value->internalRep.longValue ? Py_True : Py_False;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
952 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
953 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
954 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
955
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
956 if (value->typePtr == app->ByteArrayType) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
957 int size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
958 char *data = (char*)Tcl_GetByteArrayFromObj(value, &size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
959 return PyBytes_FromStringAndSize(data, size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
960 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
961
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
962 if (value->typePtr == app->DoubleType) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
963 return PyFloat_FromDouble(value->internalRep.doubleValue);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
964 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
965
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
966 if (value->typePtr == app->IntType) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
967 return PyLong_FromLong(value->internalRep.longValue);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
968 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
969
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
970 if (value->typePtr == app->ListType) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
971 int size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
972 int i, status;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
973 PyObject *elem;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
974 Tcl_Obj *tcl_elem;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
975
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
976 status = Tcl_ListObjLength(Tkapp_Interp(tkapp), value, &size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
977 if (status == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
978 return Tkinter_Error(tkapp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
979 result = PyTuple_New(size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
980 if (!result)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
981 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
982 for (i = 0; i < size; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
983 status = Tcl_ListObjIndex(Tkapp_Interp(tkapp),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
984 value, i, &tcl_elem);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
985 if (status == TCL_ERROR) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
986 Py_DECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
987 return Tkinter_Error(tkapp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
988 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
989 elem = FromObj(tkapp, tcl_elem);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
990 if (!elem) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
991 Py_DECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
992 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
993 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
994 PyTuple_SetItem(result, i, elem);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
995 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
996 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
997 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
998
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
999 if (value->typePtr == app->ProcBodyType) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1000 /* fall through: return tcl object. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1001 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1002
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1003 if (value->typePtr == app->StringType) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
1004 #if TCL_UTF_MAX==3
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
1005 return PyUnicode_FromKindAndData(
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
1006 PyUnicode_2BYTE_KIND, Tcl_GetUnicode(value),
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
1007 Tcl_GetCharLength(value));
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
1008 #else
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
1009 return PyUnicode_FromKindAndData(
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
1010 PyUnicode_4BYTE_KIND, Tcl_GetUnicode(value),
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70043
diff changeset
1011 Tcl_GetCharLength(value));
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
1012 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1013 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1014
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1015 return newPyTclObject(value);
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
1016 }
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
1017
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1018 #ifdef WITH_THREAD
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1019 /* This mutex synchronizes inter-thread command calls. */
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1020 TCL_DECLARE_MUTEX(call_mutex)
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1021
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1022 typedef struct Tkapp_CallEvent {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1023 Tcl_Event ev; /* Must be first */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1024 TkappObject *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1025 PyObject *args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1026 int flags;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1027 PyObject **res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1028 PyObject **exc_type, **exc_value, **exc_tb;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1029 Tcl_Condition *done;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1030 } Tkapp_CallEvent;
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1031 #endif
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1032
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1033 void
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1034 Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1035 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1036 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1037 for (i = 0; i < objc; i++)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1038 Tcl_DecrRefCount(objv[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1039 if (objv != objStore)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1040 ckfree(FREECAST objv);
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1041 }
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1042
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1043 /* Convert Python objects to Tcl objects. This must happen in the
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1044 interpreter thread, which may or may not be the calling thread. */
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1045
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1046 static Tcl_Obj**
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1047 Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc)
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1048 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1049 Tcl_Obj **objv = objStore;
85296
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
1050 Py_ssize_t objc = 0, i;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1051 if (args == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1052 /* do nothing */;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1053
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1054 else if (!PyTuple_Check(args)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1055 objv[0] = AsObj(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1056 if (objv[0] == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1057 goto finally;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1058 objc = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1059 Tcl_IncrRefCount(objv[0]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1060 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1061 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1062 objc = PyTuple_Size(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1063
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1064 if (objc > ARGSZ) {
85296
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
1065 if (!CHECK_SIZE(objc, sizeof(Tcl_Obj *))) {
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
1066 PyErr_SetString(PyExc_OverflowError, "tuple is too long");
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
1067 return NULL;
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
1068 }
6bc533d06cf1 Issue #17119: Fixed integer overflows when processing large strings and tuples
Serhiy Storchaka <storchaka@gmail.com>
parents: 84552
diff changeset
1069 objv = (Tcl_Obj **)ckalloc(((size_t)objc) * sizeof(Tcl_Obj *));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1070 if (objv == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1071 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1072 objc = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1073 goto finally;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1074 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1075 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1076
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1077 for (i = 0; i < objc; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1078 PyObject *v = PyTuple_GetItem(args, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1079 if (v == Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1080 objc = i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1081 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1082 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1083 objv[i] = AsObj(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1084 if (!objv[i]) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1085 /* Reset objc, so it attempts to clear
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1086 objects only up to i. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1087 objc = i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1088 goto finally;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1089 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1090 Tcl_IncrRefCount(objv[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1091 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1092 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1093 *pobjc = objc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1094 return objv;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1095 finally:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1096 Tkapp_CallDeallocArgs(objv, objStore, objc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1097 return NULL;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1098 }
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1099
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1100 /* Convert the results of a command call into a Python objects. */
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1101
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1102 static PyObject*
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1103 Tkapp_CallResult(TkappObject *self)
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1104 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1105 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1106 if(self->wantobjects) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1107 Tcl_Obj *value = Tcl_GetObjResult(self->interp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1108 /* Not sure whether the IncrRef is necessary, but something
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1109 may overwrite the interpreter result while we are
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1110 converting it. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1111 Tcl_IncrRefCount(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1112 res = FromObj((PyObject*)self, value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1113 Tcl_DecrRefCount(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1114 } else {
85762
08c45e18e7b2 Issue #3015: Fixed tkinter with wantobject=False. Any Tcl command call
Serhiy Storchaka <storchaka@gmail.com>
parents: 85531
diff changeset
1115 res = PyUnicode_FromString(Tcl_GetStringResult(self->interp));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1116 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1117 return res;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1118 }
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1119
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1120 #ifdef WITH_THREAD
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1121
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1122 /* Tkapp_CallProc is the event procedure that is executed in the context of
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1123 the Tcl interpreter thread. Initially, it holds the Tcl lock, and doesn't
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1124 hold the Python lock. */
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1125
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1126 static int
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1127 Tkapp_CallProc(Tkapp_CallEvent *e, int flags)
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1128 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1129 Tcl_Obj *objStore[ARGSZ];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1130 Tcl_Obj **objv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1131 int objc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1132 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1133 ENTER_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1134 objv = Tkapp_CallArgs(e->args, objStore, &objc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1135 if (!objv) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1136 PyErr_Fetch(e->exc_type, e->exc_value, e->exc_tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1137 *(e->res) = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1138 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1139 LEAVE_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1140 if (!objv)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1141 goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1142 i = Tcl_EvalObjv(e->self->interp, objc, objv, e->flags);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1143 ENTER_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1144 if (i == TCL_ERROR) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1145 *(e->res) = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1146 *(e->exc_type) = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1147 *(e->exc_tb) = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1148 *(e->exc_value) = PyObject_CallFunction(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1149 Tkinter_TclError, "s",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1150 Tcl_GetStringResult(e->self->interp));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1151 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1152 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1153 *(e->res) = Tkapp_CallResult(e->self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1154 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1155 LEAVE_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1156
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1157 Tkapp_CallDeallocArgs(objv, objStore, objc);
51411
58b7dc9c9557 Merged revisions 69376-69377 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51278
diff changeset
1158 done:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1159 /* Wake up calling thread. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1160 Tcl_MutexLock(&call_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1161 Tcl_ConditionNotify(e->done);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1162 Tcl_MutexUnlock(&call_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1163 return 1;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1164 }
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1165
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1166 #endif
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1167
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1168 /* This is the main entry point for calling a Tcl command.
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1169 It supports three cases, with regard to threading:
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1170 1. Tcl is not threaded: Must have the Tcl lock, then can invoke command in
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1171 the context of the calling thread.
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1172 2. Tcl is threaded, caller of the command is in the interpreter thread:
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1173 Execute the command in the calling thread. Since the Tcl lock will
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1174 not be used, we can merge that with case 1.
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1175 3. Tcl is threaded, caller is in a different thread: Must queue an event to
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1176 the interpreter thread. Allocation of Tcl objects needs to occur in the
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1177 interpreter thread, so we ship the PyObject* args to the target thread,
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1178 and perform processing there. */
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1179
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1180 static PyObject *
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1181 Tkapp_Call(PyObject *selfptr, PyObject *args)
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1182 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1183 Tcl_Obj *objStore[ARGSZ];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1184 Tcl_Obj **objv = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1185 int objc, i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1186 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1187 TkappObject *self = (TkappObject*)selfptr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1188 int flags = TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1189
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1190 /* If args is a single tuple, replace with contents of tuple */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1191 if (1 == PyTuple_Size(args)){
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1192 PyObject* item = PyTuple_GetItem(args, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1193 if (PyTuple_Check(item))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1194 args = item;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1195 }
28445
3fc5764273d9 Wrap thread stuff in WITH_THREAD. Fixes #704641.
Martin v. Löwis <martin@v.loewis.de>
parents: 28444
diff changeset
1196 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1197 if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1198 /* We cannot call the command directly. Instead, we must
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1199 marshal the parameters to the interpreter thread. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1200 Tkapp_CallEvent *ev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1201 Tcl_Condition cond = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1202 PyObject *exc_type, *exc_value, *exc_tb;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1203 if (!WaitForMainloop(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1204 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1205 ev = (Tkapp_CallEvent*)ckalloc(sizeof(Tkapp_CallEvent));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1206 ev->ev.proc = (Tcl_EventProc*)Tkapp_CallProc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1207 ev->self = self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1208 ev->args = args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1209 ev->res = &res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1210 ev->exc_type = &exc_type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1211 ev->exc_value = &exc_value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1212 ev->exc_tb = &exc_tb;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1213 ev->done = &cond;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1214
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1215 Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond, &call_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1216
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1217 if (res == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1218 if (exc_type)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1219 PyErr_Restore(exc_type, exc_value, exc_tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1220 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1221 PyErr_SetObject(Tkinter_TclError, exc_value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1222 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1223 Tcl_ConditionFinalize(&cond);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1224 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1225 else
28445
3fc5764273d9 Wrap thread stuff in WITH_THREAD. Fixes #704641.
Martin v. Löwis <martin@v.loewis.de>
parents: 28444
diff changeset
1226 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1227 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1228
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1229 objv = Tkapp_CallArgs(args, objStore, &objc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1230 if (!objv)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1231 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1232
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1233 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1234
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1235 i = Tcl_EvalObjv(self->interp, objc, objv, flags);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1236
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1237 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1238
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1239 if (i == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1240 Tkinter_Error(selfptr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1241 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1242 res = Tkapp_CallResult(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1243
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1244 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1245
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1246 Tkapp_CallDeallocArgs(objv, objStore, objc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1247 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1248 return res;
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1249 }
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1250
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1251
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1252 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1253 Tkapp_Eval(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1254 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1255 char *script;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1256 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1257 int err;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1258
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1259 if (!PyArg_ParseTuple(args, "s:eval", &script))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1260 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1261
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1262 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1263
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1264 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1265 err = Tcl_Eval(Tkapp_Interp(self), script);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1266 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1267 if (err == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1268 res = Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1269 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1270 res = PyUnicode_FromString(Tkapp_Result(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1271 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1272 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1273 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1274
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1275 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1276 Tkapp_EvalFile(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1277 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1278 char *fileName;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1279 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1280 int err;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1281
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1282 if (!PyArg_ParseTuple(args, "s:evalfile", &fileName))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1283 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1284
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1285 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1286
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1287 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1288 err = Tcl_EvalFile(Tkapp_Interp(self), fileName);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1289 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1290 if (err == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1291 res = Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1292
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1293 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1294 res = PyUnicode_FromString(Tkapp_Result(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1295 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1296 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1297 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1298
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1299 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1300 Tkapp_Record(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1301 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1302 char *script;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1303 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1304 int err;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1305
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1306 if (!PyArg_ParseTuple(args, "s", &script))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1307 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1308
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1309 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1310
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1311 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1312 err = Tcl_RecordAndEval(Tkapp_Interp(self), script, TCL_NO_EVAL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1313 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1314 if (err == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1315 res = Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1316 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1317 res = PyUnicode_FromString(Tkapp_Result(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1318 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1319 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1320 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1321
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1322 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1323 Tkapp_AddErrorInfo(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1324 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1325 char *msg;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1326
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1327 if (!PyArg_ParseTuple(args, "s:adderrorinfo", &msg))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1328 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1329 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1330
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1331 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1332 Tcl_AddErrorInfo(Tkapp_Interp(self), msg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1333 LEAVE_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1334
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
1335 Py_RETURN_NONE;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1336 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1337
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1338
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1339
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1340 /** Tcl Variable **/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1341
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1342 typedef PyObject* (*EventFunc)(PyObject*, PyObject *args, int flags);
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1343
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1344 #ifdef WITH_THREAD
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1345 TCL_DECLARE_MUTEX(var_mutex)
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1346
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1347 typedef struct VarEvent {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1348 Tcl_Event ev; /* must be first */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1349 PyObject *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1350 PyObject *args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1351 int flags;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1352 EventFunc func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1353 PyObject **res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1354 PyObject **exc_type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1355 PyObject **exc_val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1356 Tcl_Condition *cond;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1357 } VarEvent;
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1358 #endif
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1359
28915
fa0063928518 Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Martin v. Löwis <martin@v.loewis.de>
parents: 28643
diff changeset
1360 static int
fa0063928518 Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Martin v. Löwis <martin@v.loewis.de>
parents: 28643
diff changeset
1361 varname_converter(PyObject *in, void *_out)
fa0063928518 Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Martin v. Löwis <martin@v.loewis.de>
parents: 28643
diff changeset
1362 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1363 char **out = (char**)_out;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1364 if (PyBytes_Check(in)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1365 *out = PyBytes_AsString(in);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1366 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1367 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1368 if (PyUnicode_Check(in)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1369 *out = _PyUnicode_AsString(in);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1370 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1371 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1372 if (PyTclObject_Check(in)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1373 *out = PyTclObject_TclString(in);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1374 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1375 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1376 /* XXX: Should give diagnostics. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1377 return 0;
43950
2a3ca90008ff Return PyString, not PyBytes, for a bytes array.
Guido van Rossum <guido@python.org>
parents: 42887
diff changeset
1378 }
28915
fa0063928518 Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Martin v. Löwis <martin@v.loewis.de>
parents: 28643
diff changeset
1379
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1380 #ifdef WITH_THREAD
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1381
47680
b5e02775fffc Merged revisions 64226 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47580
diff changeset
1382 static void
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1383 var_perform(VarEvent *ev)
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1384 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1385 *(ev->res) = ev->func(ev->self, ev->args, ev->flags);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1386 if (!*(ev->res)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1387 PyObject *exc, *val, *tb;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1388 PyErr_Fetch(&exc, &val, &tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1389 PyErr_NormalizeException(&exc, &val, &tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1390 *(ev->exc_type) = exc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1391 *(ev->exc_val) = val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1392 Py_DECREF(tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1393 }
43950
2a3ca90008ff Return PyString, not PyBytes, for a bytes array.
Guido van Rossum <guido@python.org>
parents: 42887
diff changeset
1394
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1395 }
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1396
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1397 static int
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1398 var_proc(VarEvent* ev, int flags)
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1399 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1400 ENTER_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1401 var_perform(ev);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1402 Tcl_MutexLock(&var_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1403 Tcl_ConditionNotify(ev->cond);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1404 Tcl_MutexUnlock(&var_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1405 LEAVE_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1406 return 1;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1407 }
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1408
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1409 #endif
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1410
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1411 static PyObject*
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1412 var_invoke(EventFunc func, PyObject *selfptr, PyObject *args, int flags)
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1413 {
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1414 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1415 TkappObject *self = (TkappObject*)selfptr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1416 if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1417 TkappObject *self = (TkappObject*)selfptr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1418 VarEvent *ev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1419 PyObject *res, *exc_type, *exc_val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1420 Tcl_Condition cond = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1421
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1422 /* The current thread is not the interpreter thread. Marshal
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1423 the call to the interpreter thread, then wait for
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1424 completion. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1425 if (!WaitForMainloop(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1426 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1427
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1428 ev = (VarEvent*)ckalloc(sizeof(VarEvent));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1429
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1430 ev->self = selfptr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1431 ev->args = args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1432 ev->flags = flags;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1433 ev->func = func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1434 ev->res = &res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1435 ev->exc_type = &exc_type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1436 ev->exc_val = &exc_val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1437 ev->cond = &cond;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1438 ev->ev.proc = (Tcl_EventProc*)var_proc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1439 Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond, &var_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1440 Tcl_ConditionFinalize(&cond);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1441 if (!res) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1442 PyErr_SetObject(exc_type, exc_val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1443 Py_DECREF(exc_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1444 Py_DECREF(exc_val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1445 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1446 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1447 return res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1448 }
28622
6c0004690941 Use object interface for global vars. Fixes #721171.
Martin v. Löwis <martin@v.loewis.de>
parents: 28445
diff changeset
1449 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1450 /* Tcl is not threaded, or this is the interpreter thread. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1451 return func(selfptr, args, flags);
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1452 }
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1453
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1454 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1455 SetVar(PyObject *self, PyObject *args, int flags)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1456 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1457 char *name1, *name2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1458 PyObject *newValue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1459 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1460 Tcl_Obj *newval, *ok;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1461
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1462 if (PyArg_ParseTuple(args, "O&O:setvar",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1463 varname_converter, &name1, &newValue)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1464 /* XXX Acquire tcl lock??? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1465 newval = AsObj(newValue);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1466 if (newval == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1467 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1468 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1469 ok = Tcl_SetVar2Ex(Tkapp_Interp(self), name1, NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1470 newval, flags);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1471 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1472 if (!ok)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1473 Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1474 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1475 res = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1476 Py_INCREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1477 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1478 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1479 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1480 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1481 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1482 if (PyArg_ParseTuple(args, "ssO:setvar",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1483 &name1, &name2, &newValue)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1484 /* XXX must hold tcl lock already??? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1485 newval = AsObj(newValue);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1486 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1487 ok = Tcl_SetVar2Ex(Tkapp_Interp(self), name1, name2, newval, flags);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1488 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1489 if (!ok)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1490 Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1491 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1492 res = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1493 Py_INCREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1494 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1495 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1496 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1497 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1498 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1499 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1500 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1501 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1502 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1503
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1504 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1505 Tkapp_SetVar(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1506 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1507 return var_invoke(SetVar, self, args, TCL_LEAVE_ERR_MSG);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1508 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1509
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1510 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1511 Tkapp_GlobalSetVar(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1512 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1513 return var_invoke(SetVar, self, args, TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1514 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1515
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1516
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1517
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1518 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1519 GetVar(PyObject *self, PyObject *args, int flags)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1520 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1521 char *name1, *name2=NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1522 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1523 Tcl_Obj *tres;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1524
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1525 if (!PyArg_ParseTuple(args, "O&|s:getvar",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1526 varname_converter, &name1, &name2))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1527 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1528
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1529 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1530 tres = Tcl_GetVar2Ex(Tkapp_Interp(self), name1, name2, flags);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1531 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1532 if (tres == NULL) {
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
1533 PyErr_SetString(Tkinter_TclError,
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
1534 Tcl_GetStringResult(Tkapp_Interp(self)));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1535 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1536 if (((TkappObject*)self)->wantobjects) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1537 res = FromObj(self, tres);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1538 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1539 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1540 res = PyUnicode_FromString(Tcl_GetString(tres));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1541 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1542 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1543 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1544 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1545 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1546
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1547 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1548 Tkapp_GetVar(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1549 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1550 return var_invoke(GetVar, self, args, TCL_LEAVE_ERR_MSG);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1551 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1552
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1553 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1554 Tkapp_GlobalGetVar(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1555 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1556 return var_invoke(GetVar, self, args, TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1557 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1558
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1559
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1560
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1561 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1562 UnsetVar(PyObject *self, PyObject *args, int flags)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1563 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1564 char *name1, *name2=NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1565 int code;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1566 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1567
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1568 if (!PyArg_ParseTuple(args, "s|s:unsetvar", &name1, &name2))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1569 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1570
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1571 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1572 code = Tcl_UnsetVar2(Tkapp_Interp(self), name1, name2, flags);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1573 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1574 if (code == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1575 res = Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1576 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1577 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1578 res = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1579 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1580 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1581 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1582 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1583
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1584 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1585 Tkapp_UnsetVar(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1586 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1587 return var_invoke(UnsetVar, self, args, TCL_LEAVE_ERR_MSG);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1588 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1589
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1590 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1591 Tkapp_GlobalUnsetVar(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1592 {
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
1593 return var_invoke(UnsetVar, self, args,
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
1594 TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1595 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1596
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1597
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1598
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1599 /** Tcl to Python **/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1600
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1601 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1602 Tkapp_GetInt(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1603 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1604 char *s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1605 int v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1606
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1607 if (PyTuple_Size(args) == 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1608 PyObject* o = PyTuple_GetItem(args, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1609 if (PyLong_Check(o)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1610 Py_INCREF(o);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1611 return o;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1612 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1613 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1614 if (!PyArg_ParseTuple(args, "s:getint", &s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1615 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1616 if (Tcl_GetInt(Tkapp_Interp(self), s, &v) == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1617 return Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1618 return Py_BuildValue("i", v);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1619 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1620
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1621 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1622 Tkapp_GetDouble(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1623 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1624 char *s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1625 double v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1626
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1627 if (PyTuple_Size(args) == 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1628 PyObject *o = PyTuple_GetItem(args, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1629 if (PyFloat_Check(o)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1630 Py_INCREF(o);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1631 return o;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1632 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1633 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1634 if (!PyArg_ParseTuple(args, "s:getdouble", &s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1635 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1636 if (Tcl_GetDouble(Tkapp_Interp(self), s, &v) == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1637 return Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1638 return Py_BuildValue("d", v);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1639 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1640
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1641 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1642 Tkapp_GetBoolean(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1643 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1644 char *s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1645 int v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1646
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1647 if (PyTuple_Size(args) == 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1648 PyObject *o = PyTuple_GetItem(args, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1649 if (PyLong_Check(o)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1650 Py_INCREF(o);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1651 return o;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1652 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1653 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1654 if (!PyArg_ParseTuple(args, "s:getboolean", &s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1655 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1656 if (Tcl_GetBoolean(Tkapp_Interp(self), s, &v) == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1657 return Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1658 return PyBool_FromLong(v);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1659 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1660
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1661 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1662 Tkapp_ExprString(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1663 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1664 char *s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1665 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1666 int retval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1667
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1668 if (!PyArg_ParseTuple(args, "s:exprstring", &s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1669 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1670
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1671 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1672
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1673 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1674 retval = Tcl_ExprString(Tkapp_Interp(self), s);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1675 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1676 if (retval == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1677 res = Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1678 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1679 res = Py_BuildValue("s", Tkapp_Result(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1680 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1681 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1682 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1683
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1684 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1685 Tkapp_ExprLong(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1686 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1687 char *s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1688 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1689 int retval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1690 long v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1691
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1692 if (!PyArg_ParseTuple(args, "s:exprlong", &s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1693 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1694
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1695 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1696
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1697 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1698 retval = Tcl_ExprLong(Tkapp_Interp(self), s, &v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1699 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1700 if (retval == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1701 res = Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1702 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1703 res = Py_BuildValue("l", v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1704 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1705 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1706 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1707
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1708 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1709 Tkapp_ExprDouble(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1710 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1711 char *s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1712 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1713 double v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1714 int retval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1715
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1716 if (!PyArg_ParseTuple(args, "s:exprdouble", &s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1717 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1718 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1719 PyFPE_START_PROTECT("Tkapp_ExprDouble", return 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1720 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1721 retval = Tcl_ExprDouble(Tkapp_Interp(self), s, &v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1722 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1723 PyFPE_END_PROTECT(retval)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1724 if (retval == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1725 res = Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1726 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1727 res = Py_BuildValue("d", v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1728 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1729 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1730 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1731
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1732 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1733 Tkapp_ExprBoolean(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1734 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1735 char *s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1736 PyObject *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1737 int retval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1738 int v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1739
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1740 if (!PyArg_ParseTuple(args, "s:exprboolean", &s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1741 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1742 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1743 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1744 retval = Tcl_ExprBoolean(Tkapp_Interp(self), s, &v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1745 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1746 if (retval == TCL_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1747 res = Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1748 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1749 res = Py_BuildValue("i", v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1750 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1751 return res;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1752 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1753
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1754
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1755
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1756 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1757 Tkapp_SplitList(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1758 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1759 char *list;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1760 int argc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1761 char **argv;
85323
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1762 PyObject *arg, *v;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1763 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1764
85323
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1765 if (!PyArg_ParseTuple(args, "O:splitlist", &arg))
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1766 return NULL;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1767 if (PyTclObject_Check(arg)) {
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1768 int objc;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1769 Tcl_Obj **objv;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1770 if (Tcl_ListObjGetElements(Tkapp_Interp(self),
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1771 ((PyTclObject*)arg)->value,
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1772 &objc, &objv) == TCL_ERROR) {
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1773 return Tkinter_Error(self);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1774 }
85323
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1775 if (!(v = PyTuple_New(objc)))
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1776 return NULL;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1777 for (i = 0; i < objc; i++) {
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1778 PyObject *s = FromObj(self, objv[i]);
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1779 if (!s || PyTuple_SetItem(v, i, s)) {
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1780 Py_DECREF(v);
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1781 return NULL;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1782 }
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1783 }
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1784 return v;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1785 }
85323
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1786 if (PyTuple_Check(arg)) {
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1787 Py_INCREF(arg);
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1788 return arg;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1789 }
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1790
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1791 if (!PyArg_ParseTuple(args, "et:splitlist", "utf-8", &list))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1792 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1793
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1794 if (Tcl_SplitList(Tkapp_Interp(self), list,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1795 &argc, &argv) == TCL_ERROR) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1796 PyMem_Free(list);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1797 return Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1798 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1799
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1800 if (!(v = PyTuple_New(argc)))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1801 goto finally;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1802
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1803 for (i = 0; i < argc; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1804 PyObject *s = PyUnicode_FromString(argv[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1805 if (!s || PyTuple_SetItem(v, i, s)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1806 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1807 v = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1808 goto finally;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1809 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1810 }
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1811
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1812 finally:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1813 ckfree(FREECAST argv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1814 PyMem_Free(list);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1815 return v;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1816 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1817
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1818 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1819 Tkapp_Split(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1820 {
85323
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1821 PyObject *arg, *v;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1822 char *list;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1823
85323
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1824 if (!PyArg_ParseTuple(args, "O:split", &arg))
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1825 return NULL;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1826 if (PyTclObject_Check(arg)) {
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1827 Tcl_Obj *value = ((PyTclObject*)arg)->value;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1828 int objc;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1829 Tcl_Obj **objv;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1830 int i;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1831 if (Tcl_ListObjGetElements(Tkapp_Interp(self), value,
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1832 &objc, &objv) == TCL_ERROR) {
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1833 return FromObj(self, value);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1834 }
85323
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1835 if (objc == 0)
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1836 return PyUnicode_FromString("");
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1837 if (objc == 1)
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1838 return FromObj(self, objv[0]);
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1839 if (!(v = PyTuple_New(objc)))
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1840 return NULL;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1841 for (i = 0; i < objc; i++) {
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1842 PyObject *s = FromObj(self, objv[i]);
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1843 if (!s || PyTuple_SetItem(v, i, s)) {
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1844 Py_DECREF(v);
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1845 return NULL;
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1846 }
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1847 }
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1848 return v;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1849 }
85323
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1850 if (PyTuple_Check(arg))
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1851 return SplitObj(arg);
6b841e1ee3b8 Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
Serhiy Storchaka <storchaka@gmail.com>
parents: 85296
diff changeset
1852
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1853 if (!PyArg_ParseTuple(args, "et:split", "utf-8", &list))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1854 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1855 v = Split(list);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1856 PyMem_Free(list);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1857 return v;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1858 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1859
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1860
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1861
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1862 /** Tcl Command **/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1863
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
1864 /* Client data struct */
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
1865 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1866 PyObject *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1867 PyObject *func;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
1868 } PythonCmd_ClientData;
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
1869
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
1870 static int
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1871 PythonCmd_Error(Tcl_Interp *interp)
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
1872 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1873 errorInCmd = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1874 PyErr_Fetch(&excInCmd, &valInCmd, &trbInCmd);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1875 LEAVE_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1876 return TCL_ERROR;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
1877 }
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
1878
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1879 /* This is the Tcl command that acts as a wrapper for Python
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1880 * function or method.
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1881 */
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1882 static int
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1883 PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1884 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1885 PythonCmd_ClientData *data = (PythonCmd_ClientData *)clientData;
68102
e2f96bd29252 Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents: 61597
diff changeset
1886 PyObject *func, *arg, *res;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1887 int i, rv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1888 Tcl_Obj *obj_res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1889
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1890 ENTER_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1891
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1892 /* TBD: no error checking here since we know, via the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1893 * Tkapp_CreateCommand() that the client data is a two-tuple
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1894 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1895 func = data->func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1896
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1897 /* Create argument list (argv1, ..., argvN) */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1898 if (!(arg = PyTuple_New(argc - 1)))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1899 return PythonCmd_Error(interp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1900
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1901 for (i = 0; i < (argc - 1); i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1902 PyObject *s = PyUnicode_FromString(argv[i + 1]);
70039
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1903 if (!s) {
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1904 /* Is Tk leaking 0xC080 in %A - a "modified" utf-8 null? */
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1905 if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError) &&
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1906 !strcmp(argv[i + 1], "\xC0\x80")) {
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1907 PyErr_Clear();
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1908 /* Convert to "strict" utf-8 null */
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1909 s = PyUnicode_FromString("\0");
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1910 } else {
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1911 Py_DECREF(arg);
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1912 return PythonCmd_Error(interp);
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1913 }
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1914 }
82cfbe2ddfbb Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
Kurt B. Kaiser <kbk@shore.net>
parents: 61466
diff changeset
1915 if (PyTuple_SetItem(arg, i, s)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1916 Py_DECREF(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1917 return PythonCmd_Error(interp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1918 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1919 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1920 res = PyEval_CallObject(func, arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1921 Py_DECREF(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1922
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1923 if (res == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1924 return PythonCmd_Error(interp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1925
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1926 obj_res = AsObj(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1927 if (obj_res == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1928 Py_DECREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1929 return PythonCmd_Error(interp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1930 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1931 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1932 Tcl_SetObjResult(interp, obj_res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1933 rv = TCL_OK;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1934 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1935
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1936 Py_DECREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1937
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1938 LEAVE_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1939
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1940 return rv;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1941 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1942
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1943 static void
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
1944 PythonCmdDelete(ClientData clientData)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1945 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1946 PythonCmd_ClientData *data = (PythonCmd_ClientData *)clientData;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1947
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1948 ENTER_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1949 Py_XDECREF(data->self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1950 Py_XDECREF(data->func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1951 PyMem_DEL(data);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1952 LEAVE_PYTHON
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1953 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1954
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
1955
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1956
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1957
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1958 #ifdef WITH_THREAD
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1959 TCL_DECLARE_MUTEX(command_mutex)
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1960
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1961 typedef struct CommandEvent{
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1962 Tcl_Event ev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1963 Tcl_Interp* interp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1964 char *name;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1965 int create;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1966 int *status;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1967 ClientData *data;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1968 Tcl_Condition *done;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1969 } CommandEvent;
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1970
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1971 static int
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1972 Tkapp_CommandProc(CommandEvent *ev, int flags)
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1973 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1974 if (ev->create)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1975 *ev->status = Tcl_CreateCommand(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1976 ev->interp, ev->name, PythonCmd,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1977 ev->data, PythonCmdDelete) == NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1978 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1979 *ev->status = Tcl_DeleteCommand(ev->interp, ev->name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1980 Tcl_MutexLock(&command_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1981 Tcl_ConditionNotify(ev->done);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1982 Tcl_MutexUnlock(&command_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1983 return 1;
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1984 }
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
1985 #endif
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
1986
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1987 static PyObject *
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1988 Tkapp_CreateCommand(PyObject *selfptr, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1989 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1990 TkappObject *self = (TkappObject*)selfptr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1991 PythonCmd_ClientData *data;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1992 char *cmdName;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1993 PyObject *func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1994 int err;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1995
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1996 if (!PyArg_ParseTuple(args, "sO:createcommand", &cmdName, &func))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1997 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1998 if (!PyCallable_Check(func)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
1999 PyErr_SetString(PyExc_TypeError, "command not callable");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2000 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2001 }
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2002
28445
3fc5764273d9 Wrap thread stuff in WITH_THREAD. Fixes #704641.
Martin v. Löwis <martin@v.loewis.de>
parents: 28444
diff changeset
2003 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2004 if (self->threaded && self->thread_id != Tcl_GetCurrentThread() &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2005 !WaitForMainloop(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2006 return NULL;
28445
3fc5764273d9 Wrap thread stuff in WITH_THREAD. Fixes #704641.
Martin v. Löwis <martin@v.loewis.de>
parents: 28444
diff changeset
2007 #endif
26613
28bc2d3af91d Support threads-enabled Tcl installations.
Martin v. Löwis <martin@v.loewis.de>
parents: 26572
diff changeset
2008
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2009 data = PyMem_NEW(PythonCmd_ClientData, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2010 if (!data)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2011 return PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2012 Py_INCREF(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2013 Py_INCREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2014 data->self = selfptr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2015 data->func = func;
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
2016 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2017 if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2018 Tcl_Condition cond = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2019 CommandEvent *ev = (CommandEvent*)ckalloc(sizeof(CommandEvent));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2020 ev->ev.proc = (Tcl_EventProc*)Tkapp_CommandProc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2021 ev->interp = self->interp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2022 ev->create = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2023 ev->name = cmdName;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2024 ev->data = (ClientData)data;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2025 ev->status = &err;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2026 ev->done = &cond;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2027 Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond, &command_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2028 Tcl_ConditionFinalize(&cond);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2029 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2030 else
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
2031 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2032 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2033 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2034 err = Tcl_CreateCommand(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2035 Tkapp_Interp(self), cmdName, PythonCmd,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2036 (ClientData)data, PythonCmdDelete) == NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2037 LEAVE_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2038 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2039 if (err) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2040 PyErr_SetString(Tkinter_TclError, "can't create Tcl command");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2041 PyMem_DEL(data);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2042 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2043 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2044
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2045 Py_RETURN_NONE;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2046 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2047
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
2048
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2049
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2050 static PyObject *
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
2051 Tkapp_DeleteCommand(PyObject *selfptr, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2052 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2053 TkappObject *self = (TkappObject*)selfptr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2054 char *cmdName;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2055 int err;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2056
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2057 if (!PyArg_ParseTuple(args, "s:deletecommand", &cmdName))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2058 return NULL;
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
2059
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
2060 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2061 if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2062 Tcl_Condition cond = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2063 CommandEvent *ev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2064 ev = (CommandEvent*)ckalloc(sizeof(CommandEvent));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2065 ev->ev.proc = (Tcl_EventProc*)Tkapp_CommandProc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2066 ev->interp = self->interp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2067 ev->create = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2068 ev->name = cmdName;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2069 ev->status = &err;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2070 ev->done = &cond;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2071 Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2072 &command_mutex);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2073 Tcl_ConditionFinalize(&cond);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2074 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2075 else
52431
11c335a96f60 Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52057
diff changeset
2076 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2077 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2078 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2079 err = Tcl_DeleteCommand(self->interp, cmdName);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2080 LEAVE_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2081 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2082 if (err == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2083 PyErr_SetString(Tkinter_TclError, "can't delete Tcl command");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2084 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2085 }
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2086 Py_RETURN_NONE;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2087 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2088
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
2089
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2090
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2091 #ifdef HAVE_CREATEFILEHANDLER
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2092 /** File Handler **/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2093
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2094 typedef struct _fhcdata {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2095 PyObject *func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2096 PyObject *file;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2097 int id;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2098 struct _fhcdata *next;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2099 } FileHandler_ClientData;
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2100
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2101 static FileHandler_ClientData *HeadFHCD;
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2102
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2103 static FileHandler_ClientData *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2104 NewFHCD(PyObject *func, PyObject *file, int id)
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2105 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2106 FileHandler_ClientData *p;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2107 p = PyMem_NEW(FileHandler_ClientData, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2108 if (p != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2109 Py_XINCREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2110 Py_XINCREF(file);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2111 p->func = func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2112 p->file = file;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2113 p->id = id;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2114 p->next = HeadFHCD;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2115 HeadFHCD = p;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2116 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2117 return p;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2118 }
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2119
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2120 static void
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2121 DeleteFHCD(int id)
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2122 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2123 FileHandler_ClientData *p, **pp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2124
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2125 pp = &HeadFHCD;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2126 while ((p = *pp) != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2127 if (p->id == id) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2128 *pp = p->next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2129 Py_XDECREF(p->func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2130 Py_XDECREF(p->file);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2131 PyMem_DEL(p);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2132 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2133 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2134 pp = &p->next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2135 }
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2136 }
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2137
2123
fd5ab7e828fc cosmetic changes so these modules will work with the strict new naming scheme
Guido van Rossum <guido@python.org>
parents: 2121
diff changeset
2138 static void
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2139 FileHandler(ClientData clientData, int mask)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2140 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2141 FileHandler_ClientData *data = (FileHandler_ClientData *)clientData;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2142 PyObject *func, *file, *arg, *res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2143
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2144 ENTER_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2145 func = data->func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2146 file = data->file;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2147
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2148 arg = Py_BuildValue("(Oi)", file, (long) mask);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2149 res = PyEval_CallObject(func, arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2150 Py_DECREF(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2151
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2152 if (res == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2153 errorInCmd = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2154 PyErr_Fetch(&excInCmd, &valInCmd, &trbInCmd);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2155 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2156 Py_XDECREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2157 LEAVE_PYTHON
1771
51c2e5a9f39c * tkintermodule.c (*FileHandler): generalize to arbitrary file ids
Guido van Rossum <guido@python.org>
parents: 1756
diff changeset
2158 }
51c2e5a9f39c * tkintermodule.c (*FileHandler): generalize to arbitrary file ids
Guido van Rossum <guido@python.org>
parents: 1756
diff changeset
2159
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2160 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2161 Tkapp_CreateFileHandler(PyObject *self, PyObject *args)
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2162 /* args is (file, mask, func) */
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2163 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2164 FileHandler_ClientData *data;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2165 PyObject *file, *func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2166 int mask, tfile;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2167
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2168 if (!PyArg_ParseTuple(args, "OiO:createfilehandler",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2169 &file, &mask, &func))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2170 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2171
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2172 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2173
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2174 tfile = PyObject_AsFileDescriptor(file);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2175 if (tfile < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2176 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2177 if (!PyCallable_Check(func)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2178 PyErr_SetString(PyExc_TypeError, "bad argument list");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2179 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2180 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2181
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2182 data = NewFHCD(func, file, tfile);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2183 if (data == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2184 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2185
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2186 /* Ought to check for null Tcl_File object... */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2187 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2188 Tcl_CreateFileHandler(tfile, mask, FileHandler, (ClientData) data);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2189 LEAVE_TCL
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2190 Py_RETURN_NONE;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2191 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2192
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2193 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2194 Tkapp_DeleteFileHandler(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2195 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2196 PyObject *file;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2197 int tfile;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2198
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2199 if (!PyArg_ParseTuple(args, "O:deletefilehandler", &file))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2200 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2201
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2202 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2203
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2204 tfile = PyObject_AsFileDescriptor(file);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2205 if (tfile < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2206 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2207
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2208 DeleteFHCD(tfile);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2209
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2210 /* Ought to check for null Tcl_File object... */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2211 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2212 Tcl_DeleteFileHandler(tfile);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2213 LEAVE_TCL
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2214 Py_RETURN_NONE;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2215 }
6026
b5804154af4d Merge Mac and Windows mods (which mostly affect the same problem -- no
Guido van Rossum <guido@python.org>
parents: 5973
diff changeset
2216 #endif /* HAVE_CREATEFILEHANDLER */
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2217
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2218
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2219 /**** Tktt Object (timer token) ****/
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2220
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2221 static PyObject *Tktt_Type;
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2222
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2223 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2224 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2225 Tcl_TimerToken token;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2226 PyObject *func;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2227 } TkttObject;
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2228
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2229 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2230 Tktt_DeleteTimerHandler(PyObject *self, PyObject *args)
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2231 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2232 TkttObject *v = (TkttObject *)self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2233 PyObject *func = v->func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2234
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2235 if (!PyArg_ParseTuple(args, ":deletetimerhandler"))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2236 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2237 if (v->token != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2238 Tcl_DeleteTimerHandler(v->token);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2239 v->token = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2240 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2241 if (func != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2242 v->func = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2243 Py_DECREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2244 Py_DECREF(v); /* See Tktt_New() */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2245 }
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2246 Py_RETURN_NONE;
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2247 }
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2248
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2249 static PyMethodDef Tktt_methods[] =
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2250 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2251 {"deletetimerhandler", Tktt_DeleteTimerHandler, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2252 {NULL, NULL}
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2253 };
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2254
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2255 static TkttObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2256 Tktt_New(PyObject *func)
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2257 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2258 TkttObject *v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2259
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2260 v = PyObject_New(TkttObject, (PyTypeObject *) Tktt_Type);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2261 if (v == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2262 return NULL;
85111
4d0c938870bc Fix refcounting issue with extension types in tkinter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84553
diff changeset
2263 Py_INCREF(Tktt_Type);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2264
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2265 Py_INCREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2266 v->token = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2267 v->func = func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2268
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2269 /* Extra reference, deleted when called or when handler is deleted */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2270 Py_INCREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2271 return v;
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2272 }
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2273
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2274 static void
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2275 Tktt_Dealloc(PyObject *self)
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2276 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2277 TkttObject *v = (TkttObject *)self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2278 PyObject *func = v->func;
85111
4d0c938870bc Fix refcounting issue with extension types in tkinter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84553
diff changeset
2279 PyObject *tp = (PyObject *) Py_TYPE(self);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2280
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2281 Py_XDECREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2282
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2283 PyObject_Del(self);
85111
4d0c938870bc Fix refcounting issue with extension types in tkinter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84553
diff changeset
2284 Py_DECREF(tp);
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2285 }
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2286
8312
d67be13da3cc Trivial little change: timer tokens shouldn't have a Print() function,
Guido van Rossum <guido@python.org>
parents: 8200
diff changeset
2287 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2288 Tktt_Repr(PyObject *self)
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2289 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2290 TkttObject *v = (TkttObject *)self;
68809
4c2135930882 Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68102
diff changeset
2291 return PyUnicode_FromFormat("<tktimertoken at %p%s>",
4c2135930882 Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68102
diff changeset
2292 v,
4c2135930882 Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68102
diff changeset
2293 v->func == NULL ? ", handler deleted" : "");
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2294 }
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2295
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2296 static PyType_Slot Tktt_Type_slots[] = {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2297 {Py_tp_dealloc, Tktt_Dealloc},
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2298 {Py_tp_repr, Tktt_Repr},
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2299 {Py_tp_methods, Tktt_methods},
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2300 {0, 0}
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2301 };
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2302
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2303 static PyType_Spec Tktt_Type_spec = {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2304 "tktimertoken",
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2305 sizeof(TkttObject),
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2306 0,
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2307 Py_TPFLAGS_DEFAULT,
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2308 Tktt_Type_slots,
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2309 };
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
2310
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2311
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2312 /** Timer Handler **/
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2313
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2314 static void
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2315 TimerHandler(ClientData clientData)
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2316 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2317 TkttObject *v = (TkttObject *)clientData;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2318 PyObject *func = v->func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2319 PyObject *res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2320
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2321 if (func == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2322 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2323
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2324 v->func = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2325
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2326 ENTER_PYTHON
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2327
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2328 res = PyEval_CallObject(func, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2329 Py_DECREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2330 Py_DECREF(v); /* See Tktt_New() */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2331
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2332 if (res == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2333 errorInCmd = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2334 PyErr_Fetch(&excInCmd, &valInCmd, &trbInCmd);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2335 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2336 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2337 Py_DECREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2338
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2339 LEAVE_PYTHON
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2340 }
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2341
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2342 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2343 Tkapp_CreateTimerHandler(PyObject *self, PyObject *args)
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2344 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2345 int milliseconds;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2346 PyObject *func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2347 TkttObject *v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2348
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2349 if (!PyArg_ParseTuple(args, "iO:createtimerhandler",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2350 &milliseconds, &func))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2351 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2352 if (!PyCallable_Check(func)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2353 PyErr_SetString(PyExc_TypeError, "bad argument list");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2354 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2355 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2356
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2357 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2358
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2359 v = Tktt_New(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2360 if (v) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2361 v->token = Tcl_CreateTimerHandler(milliseconds, TimerHandler,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2362 (ClientData)v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2363 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2364
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2365 return (PyObject *) v;
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2366 }
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2367
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2368
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2369 /** Event Loop **/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2370
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2371 static PyObject *
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
2372 Tkapp_MainLoop(PyObject *selfptr, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2373 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2374 int threshold = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2375 TkappObject *self = (TkappObject*)selfptr;
9319
8918e4f54eca Patch by Jonathan Giddy (with some cleanup by me) to always use the
Guido van Rossum <guido@python.org>
parents: 9308
diff changeset
2376 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2377 PyThreadState *tstate = PyThreadState_Get();
9319
8918e4f54eca Patch by Jonathan Giddy (with some cleanup by me) to always use the
Guido van Rossum <guido@python.org>
parents: 9308
diff changeset
2378 #endif
2009
392db1881190 added timer and file callbacks and global mainloop and quit fns
Guido van Rossum <guido@python.org>
parents: 1888
diff changeset
2379
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2380 if (!PyArg_ParseTuple(args, "|i:mainloop", &threshold))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2381 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2382
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2383 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2384 self->dispatching = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2385
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2386 quitMainLoop = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2387 while (Tk_GetNumMainWindows() > threshold &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2388 !quitMainLoop &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2389 !errorInCmd)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2390 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2391 int result;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2392
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2393 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2394 if (self->threaded) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2395 /* Allow other Python threads to run. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2396 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2397 result = Tcl_DoOneEvent(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2398 LEAVE_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2399 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2400 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2401 Py_BEGIN_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2402 if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2403 tcl_tstate = tstate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2404 result = Tcl_DoOneEvent(TCL_DONT_WAIT);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2405 tcl_tstate = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2406 if(tcl_lock)PyThread_release_lock(tcl_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2407 if (result == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2408 Sleep(Tkinter_busywaitinterval);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2409 Py_END_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2410 }
6106
36b3b337c566 Alas, the thread support for Tk didn't work. Withdraw it, until I
Guido van Rossum <guido@python.org>
parents: 6093
diff changeset
2411 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2412 result = Tcl_DoOneEvent(0);
6106
36b3b337c566 Alas, the thread support for Tk didn't work. Withdraw it, until I
Guido van Rossum <guido@python.org>
parents: 6093
diff changeset
2413 #endif
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2414
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2415 if (PyErr_CheckSignals() != 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2416 self->dispatching = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2417 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2418 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2419 if (result < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2420 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2421 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2422 self->dispatching = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2423 quitMainLoop = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2424
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2425 if (errorInCmd) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2426 errorInCmd = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2427 PyErr_Restore(excInCmd, valInCmd, trbInCmd);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2428 excInCmd = valInCmd = trbInCmd = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2429 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2430 }
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2431 Py_RETURN_NONE;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2432 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2433
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2434 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2435 Tkapp_DoOneEvent(PyObject *self, PyObject *args)
2121
86d9e91405c8 added interface to Tk_DoOneEvent (R Lindsay Todd)
Guido van Rossum <guido@python.org>
parents: 2055
diff changeset
2436 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2437 int flags = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2438 int rv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2439
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2440 if (!PyArg_ParseTuple(args, "|i:dooneevent", &flags))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2441 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2442
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2443 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2444 rv = Tcl_DoOneEvent(flags);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2445 LEAVE_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2446 return Py_BuildValue("i", rv);
2121
86d9e91405c8 added interface to Tk_DoOneEvent (R Lindsay Todd)
Guido van Rossum <guido@python.org>
parents: 2055
diff changeset
2447 }
86d9e91405c8 added interface to Tk_DoOneEvent (R Lindsay Todd)
Guido van Rossum <guido@python.org>
parents: 2055
diff changeset
2448
86d9e91405c8 added interface to Tk_DoOneEvent (R Lindsay Todd)
Guido van Rossum <guido@python.org>
parents: 2055
diff changeset
2449 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2450 Tkapp_Quit(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2451 {
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2452
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2453 if (!PyArg_ParseTuple(args, ":quit"))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2454 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2455
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2456 quitMainLoop = 1;
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2457 Py_RETURN_NONE;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2458 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2459
8199
c31c59f192af Add a new method of interpreter objects, interpaddr(). This returns
Guido van Rossum <guido@python.org>
parents: 8185
diff changeset
2460 static PyObject *
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2461 Tkapp_InterpAddr(PyObject *self, PyObject *args)
8199
c31c59f192af Add a new method of interpreter objects, interpaddr(). This returns
Guido van Rossum <guido@python.org>
parents: 8185
diff changeset
2462 {
c31c59f192af Add a new method of interpreter objects, interpaddr(). This returns
Guido van Rossum <guido@python.org>
parents: 8185
diff changeset
2463
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2464 if (!PyArg_ParseTuple(args, ":interpaddr"))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2465 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2466
85531
f01e06d26b41 Issue #18909: Fix _tkinter.tkapp.interpaddr() on Windows 64-bit, don't cast
Victor Stinner <victor.stinner@gmail.com>
parents: 85323
diff changeset
2467 return PyLong_FromVoidPtr(Tkapp_Interp(self));
8199
c31c59f192af Add a new method of interpreter objects, interpaddr(). This returns
Guido van Rossum <guido@python.org>
parents: 8185
diff changeset
2468 }
c31c59f192af Add a new method of interpreter objects, interpaddr(). This returns
Guido van Rossum <guido@python.org>
parents: 8185
diff changeset
2469
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2470 static PyObject *
31547
470f95ad6750 Implementation of patch 869468
David Ascher <david.ascher@gmail.com>
parents: 30979
diff changeset
2471 Tkapp_TkInit(PyObject *self, PyObject *args)
470f95ad6750 Implementation of patch 869468
David Ascher <david.ascher@gmail.com>
parents: 30979
diff changeset
2472 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2473 Tcl_Interp *interp = Tkapp_Interp(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2474 const char * _tk_exists = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2475 int err;
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
2476
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
2477 #ifdef TKINTER_PROTECT_LOADTK
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2478 /* Up to Tk 8.4.13, Tk_Init deadlocks on the second call when the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2479 * first call failed.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2480 * To avoid the deadlock, we just refuse the second call through
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2481 * a static variable.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2482 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2483 if (tk_load_failed) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2484 PyErr_SetString(Tkinter_TclError, TKINTER_LOADTK_ERRMSG);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2485 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2486 }
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
2487 #endif
43950
2a3ca90008ff Return PyString, not PyBytes, for a bytes array.
Guido van Rossum <guido@python.org>
parents: 42887
diff changeset
2488
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2489 /* We want to guard against calling Tk_Init() multiple times */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2490 CHECK_TCL_APPARTMENT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2491 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2492 err = Tcl_Eval(Tkapp_Interp(self), "info exists tk_version");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2493 ENTER_OVERLAP
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2494 if (err == TCL_ERROR) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2495 /* This sets an exception, but we cannot return right
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2496 away because we need to exit the overlap first. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2497 Tkinter_Error(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2498 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2499 _tk_exists = Tkapp_Result(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2500 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2501 LEAVE_OVERLAP_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2502 if (err == TCL_ERROR) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2503 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2504 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2505 if (_tk_exists == NULL || strcmp(_tk_exists, "1") != 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2506 if (Tk_Init(interp) == TCL_ERROR) {
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
2507 PyErr_SetString(Tkinter_TclError,
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
2508 Tcl_GetStringResult(Tkapp_Interp(self)));
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
2509 #ifdef TKINTER_PROTECT_LOADTK
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2510 tk_load_failed = 1;
51495
4e7ba67cfa05 Merged revisions 69473 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51411
diff changeset
2511 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2512 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2513 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2514 }
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2515 Py_RETURN_NONE;
31547
470f95ad6750 Implementation of patch 869468
David Ascher <david.ascher@gmail.com>
parents: 30979
diff changeset
2516 }
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
2517
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
2518 static PyObject *
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
2519 Tkapp_WantObjects(PyObject *self, PyObject *args)
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
2520 {
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
2521
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2522 int wantobjects = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2523 if (!PyArg_ParseTuple(args, "|i:wantobjects", &wantobjects))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2524 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2525 if (wantobjects == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2526 return PyBool_FromLong(((TkappObject*)self)->wantobjects);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2527 ((TkappObject*)self)->wantobjects = wantobjects;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2528
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2529 Py_RETURN_NONE;
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
2530 }
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
2531
26814
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
2532 static PyObject *
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
2533 Tkapp_WillDispatch(PyObject *self, PyObject *args)
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
2534 {
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
2535
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2536 ((TkappObject*)self)->dispatching = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2537
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2538 Py_RETURN_NONE;
26814
7c8af1979e78 Gracefully delay runtime error up to 1s. Add .willdispatch().
Martin v. Löwis <martin@v.loewis.de>
parents: 26620
diff changeset
2539 }
26416
bd09e3a2d536 Patch #518625: Return objects in Tkinter.
Martin v. Löwis <martin@v.loewis.de>
parents: 25530
diff changeset
2540
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2541
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2542 /**** Tkapp Method List ****/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2543
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2544 static PyMethodDef Tkapp_methods[] =
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2545 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2546 {"willdispatch", Tkapp_WillDispatch, METH_NOARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2547 {"wantobjects", Tkapp_WantObjects, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2548 {"call", Tkapp_Call, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2549 {"eval", Tkapp_Eval, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2550 {"evalfile", Tkapp_EvalFile, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2551 {"record", Tkapp_Record, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2552 {"adderrorinfo", Tkapp_AddErrorInfo, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2553 {"setvar", Tkapp_SetVar, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2554 {"globalsetvar", Tkapp_GlobalSetVar, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2555 {"getvar", Tkapp_GetVar, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2556 {"globalgetvar", Tkapp_GlobalGetVar, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2557 {"unsetvar", Tkapp_UnsetVar, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2558 {"globalunsetvar", Tkapp_GlobalUnsetVar, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2559 {"getint", Tkapp_GetInt, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2560 {"getdouble", Tkapp_GetDouble, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2561 {"getboolean", Tkapp_GetBoolean, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2562 {"exprstring", Tkapp_ExprString, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2563 {"exprlong", Tkapp_ExprLong, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2564 {"exprdouble", Tkapp_ExprDouble, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2565 {"exprboolean", Tkapp_ExprBoolean, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2566 {"splitlist", Tkapp_SplitList, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2567 {"split", Tkapp_Split, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2568 {"createcommand", Tkapp_CreateCommand, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2569 {"deletecommand", Tkapp_DeleteCommand, METH_VARARGS},
6026
b5804154af4d Merge Mac and Windows mods (which mostly affect the same problem -- no
Guido van Rossum <guido@python.org>
parents: 5973
diff changeset
2570 #ifdef HAVE_CREATEFILEHANDLER
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2571 {"createfilehandler", Tkapp_CreateFileHandler, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2572 {"deletefilehandler", Tkapp_DeleteFileHandler, METH_VARARGS},
5954
d3835a6a18c9 Rather unsatisfactory temporary hack to get it to run
Guido van Rossum <guido@python.org>
parents: 5947
diff changeset
2573 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2574 {"createtimerhandler", Tkapp_CreateTimerHandler, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2575 {"mainloop", Tkapp_MainLoop, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2576 {"dooneevent", Tkapp_DoOneEvent, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2577 {"quit", Tkapp_Quit, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2578 {"interpaddr", Tkapp_InterpAddr, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2579 {"loadtk", Tkapp_TkInit, METH_NOARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2580 {NULL, NULL}
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2581 };
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2582
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
2583
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2584
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2585 /**** Tkapp Type Methods ****/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2586
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2587 static void
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2588 Tkapp_Dealloc(PyObject *self)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2589 {
85111
4d0c938870bc Fix refcounting issue with extension types in tkinter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84553
diff changeset
2590 PyObject *tp = (PyObject *) Py_TYPE(self);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2591 /*CHECK_TCL_APPARTMENT;*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2592 ENTER_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2593 Tcl_DeleteInterp(Tkapp_Interp(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2594 LEAVE_TCL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2595 PyObject_Del(self);
85111
4d0c938870bc Fix refcounting issue with extension types in tkinter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 84553
diff changeset
2596 Py_DECREF(tp);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2597 DisableEventHook();
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2598 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2599
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2600 static PyType_Slot Tkapp_Type_slots[] = {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2601 {Py_tp_dealloc, Tkapp_Dealloc},
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2602 {Py_tp_methods, Tkapp_methods},
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2603 {0, 0}
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2604 };
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2605
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2606
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2607 static PyType_Spec Tkapp_Type_spec = {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2608 "tkapp",
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2609 sizeof(TkappObject),
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2610 0,
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2611 Py_TPFLAGS_DEFAULT,
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2612 Tkapp_Type_slots,
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2613 };
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2614
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
2615
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2616
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2617 /**** Tkinter Module ****/
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2618
12953
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2619 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2620 PyObject* tuple;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2621 int size; /* current size */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2622 int maxsize; /* allocated size */
12953
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2623 } FlattenContext;
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2624
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2625 static int
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2626 _bump(FlattenContext* context, int size)
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2627 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2628 /* expand tuple to hold (at least) size new items.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2629 return true if successful, false if an exception was raised */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2630
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2631 int maxsize = context->maxsize * 2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2632
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2633 if (maxsize < context->size + size)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2634 maxsize = context->size + size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2635
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2636 context->maxsize = maxsize;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2637
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2638 return _PyTuple_Resize(&context->tuple, maxsize) >= 0;
12953
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2639 }
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2640
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2641 static int
12958
3c6641c810db Patch from Michael Hudson to fix flatten recursive data structures:
Andrew M. Kuchling <amk@amk.ca>
parents: 12953
diff changeset
2642 _flatten1(FlattenContext* context, PyObject* item, int depth)
12953
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2643 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2644 /* add tuple or list to argument tuple (recursively) */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2645
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2646 int i, size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2647
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2648 if (depth > 1000) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2649 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2650 "nesting too deep in _flatten");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2651 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2652 } else if (PyList_Check(item)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2653 size = PyList_GET_SIZE(item);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2654 /* preallocate (assume no nesting) */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2655 if (context->size + size > context->maxsize &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2656 !_bump(context, size))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2657 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2658 /* copy items to output tuple */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2659 for (i = 0; i < size; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2660 PyObject *o = PyList_GET_ITEM(item, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2661 if (PyList_Check(o) || PyTuple_Check(o)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2662 if (!_flatten1(context, o, depth + 1))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2663 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2664 } else if (o != Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2665 if (context->size + 1 > context->maxsize &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2666 !_bump(context, 1))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2667 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2668 Py_INCREF(o);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2669 PyTuple_SET_ITEM(context->tuple,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2670 context->size++, o);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2671 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2672 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2673 } else if (PyTuple_Check(item)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2674 /* same, for tuples */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2675 size = PyTuple_GET_SIZE(item);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2676 if (context->size + size > context->maxsize &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2677 !_bump(context, size))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2678 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2679 for (i = 0; i < size; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2680 PyObject *o = PyTuple_GET_ITEM(item, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2681 if (PyList_Check(o) || PyTuple_Check(o)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2682 if (!_flatten1(context, o, depth + 1))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2683 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2684 } else if (o != Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2685 if (context->size + 1 > context->maxsize &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2686 !_bump(context, 1))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2687 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2688 Py_INCREF(o);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2689 PyTuple_SET_ITEM(context->tuple,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2690 context->size++, o);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2691 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2692 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2693 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2694 PyErr_SetString(PyExc_TypeError, "argument must be sequence");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2695 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2696 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2697 return 1;
12953
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2698 }
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2699
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2700 static PyObject *
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2701 Tkinter_Flatten(PyObject* self, PyObject* args)
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2702 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2703 FlattenContext context;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2704 PyObject* item;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2705
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2706 if (!PyArg_ParseTuple(args, "O:_flatten", &item))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2707 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2708
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2709 context.maxsize = PySequence_Size(item);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2710 if (context.maxsize < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2711 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2712 if (context.maxsize == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2713 return PyTuple_New(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2714
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2715 context.tuple = PyTuple_New(context.maxsize);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2716 if (!context.tuple)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2717 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2718
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2719 context.size = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2720
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2721 if (!_flatten1(&context, item,0))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2722 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2723
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2724 if (_PyTuple_Resize(&context.tuple, context.size))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2725 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2726
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2727 return context.tuple;
12953
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2728 }
a3e12881cc3c Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12583
diff changeset
2729
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2730 static PyObject *
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13593
diff changeset
2731 Tkinter_Create(PyObject *self, PyObject *args)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2732 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2733 char *screenName = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2734 char *baseName = NULL; /* XXX this is not used anymore;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2735 try getting rid of it. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2736 char *className = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2737 int interactive = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2738 int wantobjects = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2739 int wantTk = 1; /* If false, then Tk_Init() doesn't get called */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2740 int sync = 0; /* pass -sync to wish */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2741 char *use = NULL; /* pass -use to wish */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2742
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2743 className = "Tk";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2744
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2745 if (!PyArg_ParseTuple(args, "|zssiiiiz:create",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2746 &screenName, &baseName, &className,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2747 &interactive, &wantobjects, &wantTk,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2748 &sync, &use))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2749 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2750
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2751 return (PyObject *) Tkapp_New(screenName, className,
79767
4c0d38670f41 Reformat _tkinter code to follow PEP7
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79721
diff changeset
2752 interactive, wantobjects, wantTk,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2753 sync, use);
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2754 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2755
29038
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2756 static PyObject *
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2757 Tkinter_setbusywaitinterval(PyObject *self, PyObject *args)
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2758 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2759 int new_val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2760 if (!PyArg_ParseTuple(args, "i:setbusywaitinterval", &new_val))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2761 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2762 if (new_val < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2763 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2764 "busywaitinterval must be >= 0");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2765 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2766 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2767 Tkinter_busywaitinterval = new_val;
79562
c4e39d4584f2 Utilize Py_RETURN_NONE in _tkinter module.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79484
diff changeset
2768 Py_RETURN_NONE;
29038
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2769 }
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2770
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2771 static char setbusywaitinterval_doc[] =
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2772 "setbusywaitinterval(n) -> None\n\
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2773 \n\
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2774 Set the busy-wait interval in milliseconds between successive\n\
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2775 calls to Tcl_DoOneEvent in a threaded Python interpreter.\n\
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2776 It should be set to a divisor of the maximum time between\n\
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2777 frames in an animation.";
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2778
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2779 static PyObject *
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2780 Tkinter_getbusywaitinterval(PyObject *self, PyObject *args)
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2781 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2782 return PyLong_FromLong(Tkinter_busywaitinterval);
29038
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2783 }
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2784
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2785 static char getbusywaitinterval_doc[] =
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2786 "getbusywaitinterval() -> int\n\
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2787 \n\
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2788 Return the current busy-wait interval between successive\n\
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2789 calls to Tcl_DoOneEvent in a threaded Python interpreter.";
d3c1a03a5130 Patch #734118: Add {get|set}busywaitinterval.
Martin v. Löwis <martin@v.loewis.de>
parents: 28950
diff changeset
2790
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2791 static PyMethodDef moduleMethods[] =
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2792 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2793 {"_flatten", Tkinter_Flatten, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2794 {"create", Tkinter_Create, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2795 {"setbusywaitinterval",Tkinter_setbusywaitinterval, METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2796 setbusywaitinterval_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2797 {"getbusywaitinterval",(PyCFunction)Tkinter_getbusywaitinterval,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2798 METH_NOARGS, getbusywaitinterval_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2799 {NULL, NULL}
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2800 };
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2801
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2802 #ifdef WAIT_FOR_STDIN
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2803
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2804 static int stdin_ready = 0;
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2805
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2806 #ifndef MS_WINDOWS
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2807 static void
13421
346df1920873 Removed Py_PROTO, ANSI-fied sources.
Fred Drake <fdrake@acm.org>
parents: 13255
diff changeset
2808 MyFileProc(void *clientData, int mask)
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2809 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2810 stdin_ready = 1;
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2811 }
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2812 #endif
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2813
28445
3fc5764273d9 Wrap thread stuff in WITH_THREAD. Fixes #704641.
Martin v. Löwis <martin@v.loewis.de>
parents: 28444
diff changeset
2814 #ifdef WITH_THREAD
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2815 static PyThreadState *event_tstate = NULL;
28445
3fc5764273d9 Wrap thread stuff in WITH_THREAD. Fixes #704641.
Martin v. Löwis <martin@v.loewis.de>
parents: 28444
diff changeset
2816 #endif
6438
9e46ecf03c3e Fix EventHook (the trick to make widgets appear when using GNU
Guido van Rossum <guido@python.org>
parents: 6343
diff changeset
2817
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2818 static int
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13593
diff changeset
2819 EventHook(void)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2820 {
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2821 #ifndef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2822 int tfile;
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2823 #endif
9488
b0ca2ca586b1 RajGopal Srinivasan noted that the latest code doesn't work when
Guido van Rossum <guido@python.org>
parents: 9327
diff changeset
2824 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2825 PyEval_RestoreThread(event_tstate);
9488
b0ca2ca586b1 RajGopal Srinivasan noted that the latest code doesn't work when
Guido van Rossum <guido@python.org>
parents: 9327
diff changeset
2826 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2827 stdin_ready = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2828 errorInCmd = 0;
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2829 #ifndef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2830 tfile = fileno(stdin);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2831 Tcl_CreateFileHandler(tfile, TCL_READABLE, MyFileProc, NULL);
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2832 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2833 while (!errorInCmd && !stdin_ready) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2834 int result;
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2835 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2836 if (_kbhit()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2837 stdin_ready = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2838 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2839 }
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2840 #endif
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2841 #if defined(WITH_THREAD) || defined(MS_WINDOWS)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2842 Py_BEGIN_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2843 if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2844 tcl_tstate = event_tstate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2845
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2846 result = Tcl_DoOneEvent(TCL_DONT_WAIT);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2847
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2848 tcl_tstate = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2849 if(tcl_lock)PyThread_release_lock(tcl_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2850 if (result == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2851 Sleep(Tkinter_busywaitinterval);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2852 Py_END_ALLOW_THREADS
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2853 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2854 result = Tcl_DoOneEvent(0);
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2855 #endif
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2856
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2857 if (result < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2858 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2859 }
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2860 #ifndef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2861 Tcl_DeleteFileHandler(tfile);
8499
0447ef8483c8 Fixed the EventHook() code so that it also works on Windows, sort of.
Guido van Rossum <guido@python.org>
parents: 8446
diff changeset
2862 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2863 if (errorInCmd) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2864 errorInCmd = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2865 PyErr_Restore(excInCmd, valInCmd, trbInCmd);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2866 excInCmd = valInCmd = trbInCmd = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2867 PyErr_Print();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2868 }
9488
b0ca2ca586b1 RajGopal Srinivasan noted that the latest code doesn't work when
Guido van Rossum <guido@python.org>
parents: 9327
diff changeset
2869 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2870 PyEval_SaveThread();
9488
b0ca2ca586b1 RajGopal Srinivasan noted that the latest code doesn't work when
Guido van Rossum <guido@python.org>
parents: 9327
diff changeset
2871 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2872 return 0;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2873 }
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2874
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2875 #endif
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2876
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2877 static void
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13593
diff changeset
2878 EnableEventHook(void)
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2879 {
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2880 #ifdef WAIT_FOR_STDIN
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2881 if (PyOS_InputHook == NULL) {
9488
b0ca2ca586b1 RajGopal Srinivasan noted that the latest code doesn't work when
Guido van Rossum <guido@python.org>
parents: 9327
diff changeset
2882 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2883 event_tstate = PyThreadState_Get();
9488
b0ca2ca586b1 RajGopal Srinivasan noted that the latest code doesn't work when
Guido van Rossum <guido@python.org>
parents: 9327
diff changeset
2884 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2885 PyOS_InputHook = EventHook;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2886 }
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2887 #endif
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2888 }
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2889
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2890 static void
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13593
diff changeset
2891 DisableEventHook(void)
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2892 {
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2893 #ifdef WAIT_FOR_STDIN
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2894 if (Tk_GetNumMainWindows() == 0 && PyOS_InputHook == EventHook) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2895 PyOS_InputHook = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2896 }
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2897 #endif
8417
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2898 }
f398419d50f9 Use a different implementation of EventHook(). The new version
Guido van Rossum <guido@python.org>
parents: 8315
diff changeset
2899
4968
3d32da37d627 reformatted
Barry Warsaw <barry@python.org>
parents: 4754
diff changeset
2900
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
2901 static struct PyModuleDef _tkintermodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2902 PyModuleDef_HEAD_INIT,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2903 "_tkinter",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2904 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2905 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2906 moduleMethods,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2907 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2908 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2909 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2910 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
2911 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
2912
24363
979ff5d0ae07 Replace DL_IMPORT with PyMODINIT_FUNC and remove "/export:init..." link
Mark Hammond <mhammond@skippinet.com.au>
parents: 24280
diff changeset
2913 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
2914 PyInit__tkinter(void)
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2915 {
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2916 PyObject *m, *uexe, *cexe, *o;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2917
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2918 #ifdef WITH_THREAD
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2919 tcl_lock = PyThread_allocate_lock();
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2920 if (tcl_lock == NULL)
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2921 return NULL;
8444
6f70ca7c84e6 Changes to make it possible to write multi-threaded programs using
Guido van Rossum <guido@python.org>
parents: 8417
diff changeset
2922 #endif
4091
dc946cab7b9b Hacks to support being a Windows DLL
Guido van Rossum <guido@python.org>
parents: 4079
diff changeset
2923
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2924 m = PyModule_Create(&_tkintermodule);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2925 if (m == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2926 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2927
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2928 o = PyErr_NewException("_tkinter.TclError", NULL, NULL);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2929 if (o == NULL) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2930 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2931 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2932 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2933 Py_INCREF(o);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2934 if (PyModule_AddObject(m, "TclError", o)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2935 Py_DECREF(o);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2936 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2937 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2938 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2939 Tkinter_TclError = o;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2940
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2941 if (PyModule_AddIntConstant(m, "READABLE", TCL_READABLE)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2942 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2943 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2944 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2945 if (PyModule_AddIntConstant(m, "WRITABLE", TCL_WRITABLE)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2946 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2947 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2948 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2949 if (PyModule_AddIntConstant(m, "EXCEPTION", TCL_EXCEPTION)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2950 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2951 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2952 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2953 if (PyModule_AddIntConstant(m, "WINDOW_EVENTS", TCL_WINDOW_EVENTS)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2954 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2955 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2956 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2957 if (PyModule_AddIntConstant(m, "FILE_EVENTS", TCL_FILE_EVENTS)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2958 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2959 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2960 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2961 if (PyModule_AddIntConstant(m, "TIMER_EVENTS", TCL_TIMER_EVENTS)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2962 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2963 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2964 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2965 if (PyModule_AddIntConstant(m, "IDLE_EVENTS", TCL_IDLE_EVENTS)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2966 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2967 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2968 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2969 if (PyModule_AddIntConstant(m, "ALL_EVENTS", TCL_ALL_EVENTS)) {
78180
b584c58c2286 Closes #15396: memory leak in tkinter
Jesus Cea <jcea@jcea.es>
parents: 73340
diff changeset
2970 Py_DECREF(m);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
2971 return NULL;
78180
b584c58c2286 Closes #15396: memory leak in tkinter
Jesus Cea <jcea@jcea.es>
parents: 73340
diff changeset
2972 }
79721
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2973 if (PyModule_AddIntConstant(m, "DONT_WAIT", TCL_DONT_WAIT)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2974 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2975 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2976 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2977 if (PyModule_AddStringConstant(m, "TK_VERSION", TK_VERSION)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2978 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2979 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2980 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2981 if (PyModule_AddStringConstant(m, "TCL_VERSION", TCL_VERSION)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2982 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2983 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2984 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2985
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2986 o = PyType_FromSpec(&Tkapp_Type_spec);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2987 if (o == NULL) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2988 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2989 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2990 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2991 if (PyModule_AddObject(m, "TkappType", o)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2992 Py_DECREF(o);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2993 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2994 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2995 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2996 Tkapp_Type = o;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2997
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2998 o = PyType_FromSpec(&Tktt_Type_spec);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
2999 if (o == NULL) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3000 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3001 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3002 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3003 if (PyModule_AddObject(m, "TkttType", o)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3004 Py_DECREF(o);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3005 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3006 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3007 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3008 Tktt_Type = o;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3009
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3010 o = PyType_FromSpec(&PyTclObject_Type_spec);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3011 if (o == NULL) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3012 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3013 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3014 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3015 if (PyModule_AddObject(m, "Tcl_Obj", o)) {
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3016 Py_DECREF(o);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3017 Py_DECREF(m);
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3018 return NULL;
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3019 }
bf9d118779f5 Issue #15721: make _tkinter module pep384 compatible.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79565
diff changeset
3020 PyTclObject_Type = o;
21322
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
3021
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
3022 #ifdef TK_AQUA
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3023 /* Tk_MacOSXSetupTkNotifier must be called before Tcl's subsystems
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3024 * start waking up. Note that Tcl_FindExecutable will do this, this
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3025 * code must be above it! The original warning from
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3026 * tkMacOSXAppInit.c is copied below.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3027 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3028 * NB - You have to swap in the Tk Notifier BEFORE you start up the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3029 * Tcl interpreter for now. It probably should work to do this
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3030 * in the other order, but for now it doesn't seem to.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3031 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3032 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3033 Tk_MacOSXSetupTkNotifier();
21322
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
3034 #endif
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
3035
1852caba7014 Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
Jack Jansen <jack.jansen@cwi.nl>
parents: 21073
diff changeset
3036
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3037 /* This helps the dynamic loader; in Unicode aware Tcl versions
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3038 it also helps Tcl find its encodings. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3039 uexe = PyUnicode_FromWideChar(Py_GetProgramName(), -1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3040 if (uexe) {
61597
b5ba7ea4246b Issue #8715: Create PyUnicode_EncodeFSDefault() function: Encode a Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
3041 cexe = PyUnicode_EncodeFSDefault(uexe);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3042 if (cexe)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3043 Tcl_FindExecutable(PyBytes_AsString(cexe));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3044 Py_XDECREF(cexe);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3045 Py_DECREF(uexe);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3046 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3047
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3048 if (PyErr_Occurred()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3049 Py_DECREF(m);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3050 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3051 }
7212
b9bbfa169920 Register Tcl_Finalize as a Python exit handler.
Guido van Rossum <guido@python.org>
parents: 6478
diff changeset
3052
8670
07e47370fcb8 Temporarily get rid of the registration of Tcl_Finalize() as a
Guido van Rossum <guido@python.org>
parents: 8639
diff changeset
3053 #if 0
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3054 /* This was not a good idea; through <Destroy> bindings,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3055 Tcl_Finalize() may invoke Python code but at that point the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3056 interpreter and thread state have already been destroyed! */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3057 Py_AtExit(Tcl_Finalize);
8096
8c1f161c6c8c Add #ifdefs so Tcl_Finalize isn't referenced when it's not defined.
Guido van Rossum <guido@python.org>
parents: 7982
diff changeset
3058 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53044
diff changeset
3059 return m;
1664
a09efb135de5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3060 }