]> granicus.if.org Git - python/commitdiff
Issue #14777: In an X11 windowing environment, tkinter may return
authorNed Deily <nad@acm.org>
Wed, 16 May 2012 01:05:57 +0000 (18:05 -0700)
committerNed Deily <nad@acm.org>
Wed, 16 May 2012 01:05:57 +0000 (18:05 -0700)
undecoded UTF-8 bytes as a string when accessing the Tk clipboard.
Modify clipboad_get() to first request type UTF8_STRING when no
specific type is requested in an X11 windowing environment, falling
back to the current default type STRING if that fails.
Original patch by Thomas Kluyver.

Lib/lib-tk/Tkinter.py
Misc/NEWS

index 586129a5ca30c2cc13e1a69d7725614ade1cffbd..795cc453fff76b80224e87c507816187c1fe0fd9 100644 (file)
@@ -534,12 +534,19 @@ class Misc:
 
         The type keyword specifies the form in which the data is
         to be returned and should be an atom name such as STRING
-        or FILE_NAME.  Type defaults to STRING.
+        or FILE_NAME.  Type defaults to STRING, except on X11, where the default
+        is to try UTF8_STRING and fall back to STRING.
 
         This command is equivalent to:
 
         selection_get(CLIPBOARD)
         """
+        if 'type' not in kw and self._windowingsystem == 'x11':
+            try:
+                kw['type'] = 'UTF8_STRING'
+                return self.tk.call(('clipboard', 'get') + self._options(kw))
+            except TclError:
+                del kw['type']
         return self.tk.call(('clipboard', 'get') + self._options(kw))
 
     def clipboard_clear(self, **kw):
@@ -621,8 +628,16 @@ class Misc:
         A keyword parameter selection specifies the name of
         the selection and defaults to PRIMARY.  A keyword
         parameter displayof specifies a widget on the display
-        to use."""
+        to use. A keyword parameter type specifies the form of data to be
+        fetched, defaulting to STRING except on X11, where UTF8_STRING is tried
+        before STRING."""
         if 'displayof' not in kw: kw['displayof'] = self._w
+        if 'type' not in kw and self._windowingsystem == 'x11':
+            try:
+                kw['type'] = 'UTF8_STRING'
+                return self.tk.call(('selection', 'get') + self._options(kw))
+            except TclError:
+                del kw['type']
         return self.tk.call(('selection', 'get') + self._options(kw))
     def selection_handle(self, command, **kw):
         """Specify a function COMMAND to call if the X
@@ -1037,6 +1052,15 @@ class Misc:
         if displayof is None:
             return ('-displayof', self._w)
         return ()
+    @property
+    def _windowingsystem(self):
+        """Internal function."""
+        try:
+            return self._root()._windowingsystem_cached
+        except AttributeError:
+            ws = self._root()._windowingsystem_cached = \
+                        self.tk.call('tk', 'windowingsystem')
+            return ws
     def _options(self, cnf, kw = None):
         """Internal function."""
         if kw:
index 1da4cee1b660b7483a1bb1fc7390cb9dc8f12d88..a1572cda77605a6850ef33d0413bfe00aaf72471 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -60,6 +60,12 @@ Core and Builtins
 Library
 -------
 
+- Issue #14777: tkinter may return undecoded UTF-8 bytes as a string when
+  accessing the Tk clipboard.  Modify clipboad_get() to first request type
+  UTF8_STRING when no specific type is requested in an X11 windowing
+  environment, falling back to the current default type STRING if that fails.
+  Original patch by Thomas Kluyver.
+
 - Issue #12541: Be lenient with quotes around Realm field with HTTP Basic
   Authentation in urllib2.