Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Lib/idlelib/NEWS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
43 changes: 39 additions & 4 deletions Lib/idlelib/macosx.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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):
Expand Down
2 changes: 1 addition & 1 deletion Lib/idlelib/outwin.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def write(self, s, tags=(), mark="insert"):
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)
Expand Down
25 changes: 21 additions & 4 deletions Lib/idlelib/pyshell.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import re
import socket
import subprocess
from textwrap import TextWrapper
import threading
import time
import tokenize
Expand Down Expand Up @@ -1273,6 +1274,14 @@ def showprompt(self):
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:
Expand Down Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
On macOS, warn if the system preference "Prefer tabs when opening documents"
is set to "Always".