From 307021f40b227d2bf114b536c37cc41e03fc2aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Sun, 27 Nov 2005 16:59:04 +0000 Subject: Patch #1162825: Support non-ASCII characters in IDLE window titles. --- Lib/idlelib/EditorWindow.py | 27 +++++++++++++++++++++++---- Lib/idlelib/IOBinding.py | 13 +++++++++++-- Misc/NEWS | 2 ++ 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 -- cgit v0.12