summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/idlelib/EditorWindow.py27
-rw-r--r--Lib/idlelib/IOBinding.py13
-rw-r--r--Misc/NEWS2
3 files changed, 36 insertions, 6 deletions
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index 1c04d76..59440f0 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -42,7 +42,7 @@ class EditorWindow(object):
from Percolator import Percolator
from ColorDelegator import ColorDelegator
from UndoDelegator import UndoDelegator
- from IOBinding import IOBinding
+ from IOBinding import IOBinding, filesystemencoding, encoding
import Bindings
from Tkinter import Toplevel
from MultiStatusBar import MultiStatusBar
@@ -256,6 +256,21 @@ class EditorWindow(object):
self.askinteger = tkSimpleDialog.askinteger
self.showerror = tkMessageBox.showerror
+ def _filename_to_unicode(self, filename):
+ """convert filename to unicode in order to display it in Tk"""
+ if isinstance(filename, unicode) or not filename:
+ return filename
+ else:
+ try:
+ return filename.decode(self.filesystemencoding)
+ except UnicodeDecodeError:
+ # XXX
+ try:
+ return filename.decode(self.encoding)
+ except UnicodeDecodeError:
+ # byte-to-byte conversion
+ return filename.decode('iso8859-1')
+
def new_callback(self, event):
dirname, basename = self.io.defaultfilename()
self.flist.new(dirname)
@@ -675,8 +690,10 @@ class EditorWindow(object):
menu.delete(1, END) # clear, and rebuild:
for i, file in zip(count(), rf_list):
file_name = file[0:-1] # zap \n
+ # make unicode string to display non-ASCII chars correctly
+ ufile_name = self._filename_to_unicode(file_name)
callback = instance.__recent_file_callback(file_name)
- menu.add_command(label=ulchars[i] + " " + file_name,
+ menu.add_command(label=ulchars[i] + " " + ufile_name,
command=callback,
underline=0)
@@ -716,10 +733,12 @@ class EditorWindow(object):
filename = self.io.filename
if filename:
filename = os.path.basename(filename)
- return filename
+ # return unicode string to display non-ASCII chars correctly
+ return self._filename_to_unicode(filename)
def long_title(self):
- return self.io.filename or ""
+ # return unicode string to display non-ASCII chars correctly
+ return self._filename_to_unicode(self.io.filename or "")
def center_insert_event(self, event):
self.center()
diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py
index 4d67292..ce1fd2a 100644
--- a/Lib/idlelib/IOBinding.py
+++ b/Lib/idlelib/IOBinding.py
@@ -32,6 +32,9 @@ try:
except (ImportError, locale.Error):
pass
+# Encoding for file names
+filesystemencoding = sys.getfilesystemencoding()
+
encoding = "ascii"
if sys.platform == 'win32':
# On Windows, we could use "mbcs". However, to give the user
@@ -517,7 +520,10 @@ class IOBinding:
if not self.opendialog:
self.opendialog = tkFileDialog.Open(master=self.text,
filetypes=self.filetypes)
- return self.opendialog.show(initialdir=dir, initialfile=base)
+ filename = self.opendialog.show(initialdir=dir, initialfile=base)
+ if isinstance(filename, unicode):
+ filename = filename.encode(filesystemencoding)
+ return filename
def defaultfilename(self, mode="open"):
if self.filename:
@@ -536,7 +542,10 @@ class IOBinding:
if not self.savedialog:
self.savedialog = tkFileDialog.SaveAs(master=self.text,
filetypes=self.filetypes)
- return self.savedialog.show(initialdir=dir, initialfile=base)
+ filename = self.savedialog.show(initialdir=dir, initialfile=base)
+ if isinstance(filename, unicode):
+ filename = filename.encode(filesystemencoding)
+ return filename
def updaterecentfileslist(self,filename):
"Update recent file list on all editor windows"
diff --git a/Misc/NEWS b/Misc/NEWS
index c087a11..cb598d5 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -287,6 +287,8 @@ Extension Modules
Library
-------
+- Patch #1162825: Support non-ASCII characters in IDLE window titles.
+
- Bug #1365984: urllib now opens "data:" URLs again.
- Patch #1314396: prevent deadlock for threading.Thread.join() when an exception