=========================
+gh-152728: Move functions run.fix_scaling, editor.fixwordbreaks (as fix_word_breaks)
+and pyshell.fix_x11_paste to module util. Patch by Terry J. Reedy.
+
gh-85320: IDLE now reads and writes its configuration files and the
breakpoints file using UTF-8 instead of the locale encoding.
Files with non-ASCII characters and non-UTF-8 encoding may need
return s
-def fixwordbreaks(root):
- # On Windows, tcl/tk breaks 'words' only on spaces, as in Command Prompt.
- # We want Motif style everywhere. See #21474, msg218992 and followup.
- tk = root.tk
- tk.call('tcl_wordBreakAfter', 'a b', 0) # make sure word.tcl is loaded
- tk.call('set', 'tcl_wordchars', r'\w')
- tk.call('set', 'tcl_nonwordchars', r'\W')
-
-
-def _editor_window(parent): # htest #
- # error if close master window first - timer event, after script
- root = parent
- fixwordbreaks(root)
+def _editor_window(root): # htest #
+ # Error if close master window first - timer event, after script
+ from util import fix_word_breaks
+ fix_word_breaks(root)
if sys.argv[1:]:
filename = sys.argv[1]
else:
def _test(): # TODO check and convert to htest
+ # Maybe redundant with test_filelist.FileListTest.test_new_empty.
from tkinter import Tk
- from idlelib.editor import fixwordbreaks
- from idlelib.run import fix_scaling
+ from idlelib.util import fix_scaling, fix_word_breaks
root = Tk()
fix_scaling(root)
- fixwordbreaks(root)
+ fix_word_breaks(root)
root.withdraw()
flist = FileList(root)
flist.new()
import tkinter as tk
from tkinter import ttk
import unittest
-from idlelib import pyshell
+from idlelib.util import fix_x11_paste
class PasteTest(unittest.TestCase):
'''Test pasting into widgets that allow pasting.
def setUpClass(cls):
cls.root = root = tk.Tk()
cls.root.withdraw()
- pyshell.fix_x11_paste(root)
+ fix_x11_paste(root)
cls.text = tk.Text(root)
cls.entry = tk.Entry(root)
cls.tentry = ttk.Entry(root)
from idlelib.idle_test.tkinter_testing_utils import run_in_tk_mainloop
from idlelib.delegator import Delegator
-from idlelib.editor import fixwordbreaks
from idlelib.percolator import Percolator
import idlelib.pyshell
-from idlelib.pyshell import fix_x11_paste, PyShell, PyShellFileList
-from idlelib.run import fix_scaling
+from idlelib.pyshell import PyShell, PyShellFileList
+from idlelib.util import fix_scaling, fix_word_breaks, fix_x11_paste
import idlelib.sidebar
from idlelib.sidebar import get_end_linenumber, get_lineno
root.withdraw()
fix_scaling(root)
- fixwordbreaks(root)
+ fix_word_breaks(root)
fix_x11_paste(root)
cls.flist = flist = PyShellFileList(root)
from idlelib.delegator import Delegator
from idlelib import debugger
from idlelib import debugger_r
-from idlelib.editor import EditorWindow, fixwordbreaks
+from idlelib.editor import EditorWindow
from idlelib.filelist import FileList
from idlelib.outwin import OutputWindow
from idlelib import replace
from idlelib import rpc
from idlelib.run import idle_formatwarning, StdInputFile, StdOutputFile
from idlelib.undo import UndoDelegator
+from idlelib.util import fix_word_breaks
# Default for testing; defaults to True in main() for running.
use_subprocess = False
if ms[2][0] != "shell":
ms.insert(2, ("shell", "She_ll"))
self.interp = ModifiedInterpreter(self)
- if flist is None:
+ if flist is None: # TODO possible? root and flist in main.
root = Tk()
- fixwordbreaks(root)
+ fix_word_breaks(root)
root.withdraw()
flist = PyShellFileList(root)
self.shell_sidebar.update_sidebar()
-def fix_x11_paste(root):
- "Make paste replace selection on x11. See issue #5124."
- if root._windowingsystem == 'x11':
- for cls in 'Text', 'Entry', 'Spinbox':
- root.bind_class(
- cls,
- '<<Paste>>',
- 'catch {%W delete sel.first sel.last}\n' +
- root.bind_class(cls, '<<Paste>>'))
-
-
usage_msg = """\
USAGE: idle [-deins] [-t title] [file]*
from platform import system
from idlelib import testing # bool value
from idlelib import macosx
+ from idlelib.util import fix_scaling, fix_x11_paste
global flist, root, use_subprocess
NoDefaultRoot()
root = Tk(className="Idle")
root.withdraw()
- from idlelib.run import fix_scaling
fix_scaling(root)
# set application icon
root.wm_iconphoto(True, *icons)
# start editor and/or shell windows:
- fixwordbreaks(root)
+ fix_word_breaks(root)
fix_x11_paste(root)
flist = PyShellFileList(root)
macosx.setupApp(root, flist)
from idlelib import iomenu # encoding
from idlelib import rpc # multiple objects
from idlelib import stackviewer # StackTreeItem
+from idlelib import util # fix_scaling
import __main__
import tkinter # Use tcl and, if startup fails, messagebox.
import tkinter
from tkinter.messagebox import showerror
root = tkinter.Tk()
- fix_scaling(root)
+ util.fix_scaling(root)
root.withdraw()
showerror(
"Subprocess Connection Error",
sys.exit(0)
-def fix_scaling(root):
- """Scale fonts on HiDPI displays."""
- import tkinter.font
- scaling = float(root.tk.call('tk', 'scaling'))
- if scaling > 1.4:
- for name in tkinter.font.names(root):
- font = tkinter.font.Font(root=root, name=name, exists=True)
- size = int(font['size'])
- if size < 0:
- font['size'] = round(-0.75*size)
def fixdoc(fun, text):
py_extensions = ('.py', '.pyw', '.pyi')
+# fix_x functions seem only needed once per process.
+
+def fix_scaling(root): # Called in filelist _test, pyshell, and run.
+ """Scale fonts on HiDPI displays, once per process."""
+ import tkinter.font
+ scaling = float(root.tk.call('tk', 'scaling'))
+ if scaling > 1.4:
+ for name in tkinter.font.names(root):
+ font = tkinter.font.Font(root=root, name=name, exists=True)
+ size = int(font['size'])
+ if size < 0:
+ font['size'] = round(-0.75*size)
+
+
# Fix for HiDPI screens on Windows. CALL BEFORE ANY TK OPERATIONS!
# URL for arguments for the ...Awareness call below.
# https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx
except (ImportError, AttributeError, OSError):
pass
+def fix_word_breaks(root): # Called in editor htest, filelist _test, pyshell.
+ # On Windows, tcl/tk breaks 'words' only on spaces, as in Command Prompt.
+ # We want Motif style everywhere. See #21474, msg218992 and followup.
+ tk = root.tk
+ tk.call('tcl_wordBreakAfter', 'a b', 0) # make sure word.tcl is loaded
+ tk.call('set', 'tcl_wordchars', r'\w')
+ tk.call('set', 'tcl_nonwordchars', r'\W')
+
+
+def fix_x11_paste(root):
+ "Make paste replace selection on x11. See issue #5124."
+ if root._windowingsystem == 'x11':
+ for cls in 'Text', 'Entry', 'Spinbox':
+ root.bind_class(
+ cls,
+ '<<Paste>>',
+ 'catch {%W delete sel.first sel.last}\n' +
+ root.bind_class(cls, '<<Paste>>'))
+
if __name__ == '__main__':
from unittest import main
--- /dev/null
+Move functions run.fix_scaling, editor.fixwordbreaks (as fix_word_breaks)
+and pyshell.fix_x11_paste to idlelib.util.