annotate Modules/_tkinter.c @ 87488:124e51c19e4f

Issue #19734: Also run pip version check in isolated mode
author Nick Coghlan <ncoghlan@gmail.com>
date Sun, 24 Nov 2013 16:49:20 +1000
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 }