annotate Lib/lib-tk/FixTk.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents b36cb4602e21
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22038
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
1 import sys, os
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
2
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
3 # Delay import _tkinter until we have set TCL_LIBRARY,
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
4 # so that Tcl_FindExecutable has a chance to locate its
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
5 # encoding directory.
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
6
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
7 # Unfortunately, we cannot know the TCL_LIBRARY directory
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
8 # if we don't know the tcl version, which we cannot find out
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
9 # without import Tcl. Fortunately, Tcl will itself look in
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
10 # <TCL_LIBRARY>\..\tcl<TCL_VERSION>, so anything close to
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
11 # the real Tcl library will do.
20387
f908b063f28b Suggestion from SF patch #470433 to avoid clobbering TCL_LIBRARY et
Guido van Rossum <guido@python.org>
parents: 15324
diff changeset
12
51008
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
13 # Expand symbolic links on Vista
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
14 try:
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
15 import ctypes
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
16 ctypes.windll.kernel32.GetFinalPathNameByHandleW
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
17 except (ImportError, AttributeError):
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
18 def convert_path(s):
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
19 return s
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
20 else:
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
21 def convert_path(s):
59947
102623d6843f Merged revisions 78722 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 51008
diff changeset
22 assert isinstance(s, str) # sys.prefix contains only bytes
102623d6843f Merged revisions 78722 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 51008
diff changeset
23 udir = s.decode("mbcs")
51008
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
24 hdir = ctypes.windll.kernel32.\
59947
102623d6843f Merged revisions 78722 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 51008
diff changeset
25 CreateFileW(udir, 0x80, # FILE_READ_ATTRIBUTES
51008
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
26 1, # FILE_SHARE_READ
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
27 None, 3, # OPEN_EXISTING
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
28 0x02000000, # FILE_FLAG_BACKUP_SEMANTICS
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
29 None)
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
30 if hdir == -1:
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
31 # Cannot open directory, give up
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
32 return s
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
33 buf = ctypes.create_unicode_buffer(u"", 32768)
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
34 res = ctypes.windll.kernel32.\
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
35 GetFinalPathNameByHandleW(hdir, buf, len(buf),
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
36 0) # VOLUME_NAME_DOS
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
37 ctypes.windll.kernel32.CloseHandle(hdir)
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
38 if res == 0:
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
39 # Conversion failed (e.g. network location)
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
40 return s
59947
102623d6843f Merged revisions 78722 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 51008
diff changeset
41 s = buf[:res].encode("mbcs")
51008
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
42 # Ignore leading \\?\
59947
102623d6843f Merged revisions 78722 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 51008
diff changeset
43 if s.startswith("\\\\?\\"):
51008
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
44 s = s[4:]
62079
bbaf6062f241 Merged revisions 81701 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 59947
diff changeset
45 if s.startswith("UNC"):
bbaf6062f241 Merged revisions 81701 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 59947
diff changeset
46 s = "\\" + s[3:]
51008
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
47 return s
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
48
22038
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
49 prefix = os.path.join(sys.prefix,"tcl")
44332
11b6f5b68ad1 Make it a bit easier to test Tcl/Tk and idle from a build dir.
Christian Heimes <christian@cheimes.de>
parents: 26135
diff changeset
50 if not os.path.exists(prefix):
11b6f5b68ad1 Make it a bit easier to test Tcl/Tk and idle from a build dir.
Christian Heimes <christian@cheimes.de>
parents: 26135
diff changeset
51 # devdir/../tcltk/lib
11b6f5b68ad1 Make it a bit easier to test Tcl/Tk and idle from a build dir.
Christian Heimes <christian@cheimes.de>
parents: 26135
diff changeset
52 prefix = os.path.join(sys.prefix, os.path.pardir, "tcltk", "lib")
11b6f5b68ad1 Make it a bit easier to test Tcl/Tk and idle from a build dir.
Christian Heimes <christian@cheimes.de>
parents: 26135
diff changeset
53 prefix = os.path.abspath(prefix)
22038
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
54 # if this does not exist, no further search is needed
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
55 if os.path.exists(prefix):
51008
5132a13f169a Merged revisions 68893 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47182
diff changeset
56 prefix = convert_path(prefix)
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 51008
diff changeset
57 if "TCL_LIBRARY" not in os.environ:
22038
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
58 for name in os.listdir(prefix):
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
59 if name.startswith("tcl"):
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
60 tcldir = os.path.join(prefix,name)
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
61 if os.path.isdir(tcldir):
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
62 os.environ["TCL_LIBRARY"] = tcldir
26135
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
63 # Compute TK_LIBRARY, knowing that it has the same version
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
64 # as Tcl
22038
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
65 import _tkinter
e6d44cf29dbf backport loewis' checkin of
Michael W. Hudson <mwh@python.net>
parents: 20387
diff changeset
66 ver = str(_tkinter.TCL_VERSION)
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 51008
diff changeset
67 if "TK_LIBRARY" not in os.environ:
26135
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
68 v = os.path.join(prefix, 'tk'+ver)
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
69 if os.path.exists(os.path.join(v, "tclIndex")):
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
70 os.environ['TK_LIBRARY'] = v
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
71 # We don't know the Tix version, so we must search the entire
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
72 # directory
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 51008
diff changeset
73 if "TIX_LIBRARY" not in os.environ:
26135
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
74 for name in os.listdir(prefix):
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
75 if name.startswith("tix"):
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
76 tixdir = os.path.join(prefix,name)
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
77 if os.path.isdir(tixdir):
f4278af8eefa Search for tix subdirectories. Fixes #564729. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 22038
diff changeset
78 os.environ["TIX_LIBRARY"] = tixdir