[Python-checkins] r68898 - in python/branches/py3k: Lib/tkinter/_fix.py Misc/NEWS

martin.v.loewis python-checkins at python.org
Sat Jan 24 17:20:06 CET 2009


Author: martin.v.loewis
Date: Sat Jan 24 17:19:45 2009
New Revision: 68898

Log:
Merged revisions 68893 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r68893 | martin.v.loewis | 2009-01-24 16:47:27 +0100 (Sa, 24 Jan 2009) | 3 lines
  
  Issue #3881: Help Tcl to load even when started through the
  unreadable local symlink to "Program Files" on Vista.
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/tkinter/_fix.py
   python/branches/py3k/Misc/NEWS

Modified: python/branches/py3k/Lib/tkinter/_fix.py
==============================================================================
--- python/branches/py3k/Lib/tkinter/_fix.py	(original)
+++ python/branches/py3k/Lib/tkinter/_fix.py	Sat Jan 24 17:19:45 2009
@@ -10,6 +10,40 @@
 # <TCL_LIBRARY>\..\tcl<TCL_VERSION>, so anything close to
 # the real Tcl library will do.
 
+# Expand symbolic links on Vista
+try:
+    import ctypes
+    ctypes.windll.kernel32.GetFinalPathNameByHandleW
+except (ImportError, AttributeError):
+    def convert_path(s):
+        return s
+else:
+    def convert_path(s):
+        if isinstance(s, bytes):
+            s = s.decode("mbcs")
+        hdir = ctypes.windll.kernel32.\
+            CreateFileW(s, 0x80,    # FILE_READ_ATTRIBUTES
+                        1,          # FILE_SHARE_READ
+                        None, 3,    # OPEN_EXISTING
+                        0x02000000, # FILE_FLAG_BACKUP_SEMANTICS
+                        None)
+        if hdir == -1:
+            # Cannot open directory, give up
+            return s
+        buf = ctypes.create_unicode_buffer("", 32768)
+        res = ctypes.windll.kernel32.\
+            GetFinalPathNameByHandleW(hdir, buf, len(buf),
+                                      0) # VOLUME_NAME_DOS
+        ctypes.windll.kernel32.CloseHandle(hdir)
+        if res == 0:
+            # Conversion failed (e.g. network location)
+            return s
+        s = buf[:res]
+        # Ignore leading \\?\
+        if s.startswith("\\\\?\\"):
+            s = s[4:]
+        return s
+
 prefix = os.path.join(sys.prefix,"tcl")
 if not os.path.exists(prefix):
     # devdir/../tcltk/lib
@@ -17,6 +51,7 @@
     prefix = os.path.abspath(prefix)
 # if this does not exist, no further search is needed
 if os.path.exists(prefix):
+    prefix = convert_path(prefix)
     if "TCL_LIBRARY" not in os.environ:
         for name in os.listdir(prefix):
             if name.startswith("tcl"):

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Sat Jan 24 17:19:45 2009
@@ -139,6 +139,9 @@
 Library
 -------
 
+- Issue #3881: Help Tcl to load even when started through the
+  unreadable local symlink to "Program Files" on Vista.
+
 - Issue #4710: Extract directories properly in the zipfile module;
   allow adding directories to a zipfile.
 


More information about the Python-checkins mailing list