Mercurial > cpython-lru_cache-weakref
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 |
| 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 |
