]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-34864: warn if "Prefer tabs when opening documents" set to "Always" (#10464)
authorTal Einat <taleinat+github@gmail.com>
Fri, 7 Dec 2018 06:32:21 +0000 (08:32 +0200)
committerTerry Jan Reedy <tjreedy@udel.edu>
Fri, 7 Dec 2018 06:32:21 +0000 (01:32 -0500)
* bpo-34864: warn if "Prefer tabs when opening documents" set to "Always"

* add NEWS entry

* address code review comments

* address second code review comments

* Add entry for idlelib/NEWS.txt.

Lib/idlelib/NEWS.txt
Lib/idlelib/macosx.py
Lib/idlelib/outwin.py
Lib/idlelib/pyshell.py
Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst [new file with mode: 0644]

index 9a16ece3bbe3f7cf685155a11ff1601a85f7daab..6e11cab586008f17404d3c9878aeb7a80fb774c3 100644 (file)
@@ -3,6 +3,12 @@ Released on 2019-10-20?
 ======================================
 
 
+bpo-34864: When starting IDLE on MacOS, warn if the system setting
+"Prefer tabs when opening documents" is "Always".  As previous
+documented for this issue, running IDLE with this setting causes
+problems.  If the setting is changed while IDLE is running,
+there will be no warning until IDLE is restarted.
+
 bpo-35213: Where appropriate, use 'macOS' in idlelib.
 
 bpo-34864: Document two IDLE on MacOS issues.  The System Preferences
index 8f8484a37015d4857252156a253689fc5fc9f0a5..9be4ed2ec411d557e9ca8bcda5e647b0bcee4ea9 100644 (file)
@@ -1,6 +1,8 @@
 """
 A number of functions that enhance IDLE on macOS.
 """
+from os.path import expanduser
+import plistlib
 from sys import platform  # Used in _init_tk_type, changed by test.
 
 import tkinter
@@ -79,14 +81,47 @@ def tkVersionWarning(root):
         patchlevel = root.tk.call('info', 'patchlevel')
         if patchlevel not in ('8.5.7', '8.5.9'):
             return False
-        return (r"WARNING: The version of Tcl/Tk ({0}) in use may"
-                r" be unstable.\n"
-                r"Visit http://www.python.org/download/mac/tcltk/"
-                r" for current information.".format(patchlevel))
+        return ("WARNING: The version of Tcl/Tk ({0}) in use may"
+                " be unstable.\n"
+                "Visit http://www.python.org/download/mac/tcltk/"
+                " for current information.".format(patchlevel))
     else:
         return False
 
 
+def readSystemPreferences():
+    """
+    Fetch the macOS system preferences.
+    """
+    if platform != 'darwin':
+        return None
+
+    plist_path = expanduser('~/Library/Preferences/.GlobalPreferences.plist')
+    try:
+        with open(plist_path, 'rb') as plist_file:
+            return plistlib.load(plist_file)
+    except OSError:
+        return None
+
+
+def preferTabsPreferenceWarning():
+    """
+    Warn if "Prefer tabs when opening documents" is set to "Always".
+    """
+    if platform != 'darwin':
+        return None
+
+    prefs = readSystemPreferences()
+    if prefs and prefs.get('AppleWindowTabbingMode') == 'always':
+        return (
+            'WARNING: The system preference "Prefer tabs when opening'
+            ' documents" is set to "Always". This will cause various problems'
+            ' with IDLE. For the best experience, change this setting when'
+            ' running IDLE (via System Preferences -> Dock).'
+        )
+    return None
+
+
 ## Fix the menu and related functions.
 
 def addOpenEventSupport(root, flist):
index 4af9f1afaed5181eae2dd80c7f4b1b0f2335f0b9..e962142498dfd87308867298f6b25aaf069b8dae 100644 (file)
@@ -109,7 +109,7 @@ class OutputWindow(EditorWindow):
         Return:
             Length of text inserted.
         """
-        if isinstance(s, (bytes, bytes)):
+        if isinstance(s, bytes):
             s = s.decode(iomenu.encoding, "replace")
         self.text.insert(mark, s, tags)
         self.text.see(mark)
index 47eef4399ce6b3654f6954126f1fe339fecb0af0..81a97ef6d6bcc511dc0a2d4b41d107a920d4cfc8 100755 (executable)
@@ -38,6 +38,7 @@ from platform import python_version
 import re
 import socket
 import subprocess
+from textwrap import TextWrapper
 import threading
 import time
 import tokenize
@@ -1273,6 +1274,14 @@ class PyShell(OutputWindow):
         self.set_line_and_column()
         self.io.reset_undo()
 
+    def show_warning(self, msg):
+        width = self.interp.tkconsole.width
+        wrapper = TextWrapper(width=width, tabsize=8, expand_tabs=True)
+        wrapped_msg = '\n'.join(wrapper.wrap(msg))
+        if not wrapped_msg.endswith('\n'):
+            wrapped_msg += '\n'
+        self.per.bottom.insert("iomark linestart", wrapped_msg, "stderr")
+
     def resetoutput(self):
         source = self.text.get("iomark", "end-1c")
         if self.history:
@@ -1541,12 +1550,20 @@ def main():
             shell.interp.execfile(script)
     elif shell:
         # If there is a shell window and no cmd or script in progress,
-        # check for problematic OS X Tk versions and print a warning
-        # message in the IDLE shell window; this is less intrusive
-        # than always opening a separate window.
+        # check for problematic issues and print warning message(s) in
+        # the IDLE shell window; this is less intrusive than always
+        # opening a separate window.
+
+        # Warn if using a problematic OS X Tk version.
         tkversionwarning = macosx.tkVersionWarning(root)
         if tkversionwarning:
-            shell.interp.runcommand("print('%s')" % tkversionwarning)
+            shell.show_warning(tkversionwarning)
+
+        # Warn if the "Prefer tabs when opening documents" system
+        # preference is set to "Always".
+        prefer_tabs_preference_warning = macosx.preferTabsPreferenceWarning()
+        if prefer_tabs_preference_warning:
+            shell.show_warning(prefer_tabs_preference_warning)
 
     while flist.inversedict:  # keep IDLE running while files are open.
         root.mainloop()
diff --git a/Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst b/Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst
new file mode 100644 (file)
index 0000000..8d2b61d
--- /dev/null
@@ -0,0 +1,2 @@
+On macOS, warn if the system preference "Prefer tabs when opening documents"
+is set to "Always".
\ No newline at end of file