]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-152728: IDLE - move 3 toplevel fix_xyz functions to idlelb.util (#152729)
authorTerry Jan Reedy <tjreedy@udel.edu>
Wed, 1 Jul 2026 04:58:39 +0000 (00:58 -0400)
committerGitHub <noreply@github.com>
Wed, 1 Jul 2026 04:58:39 +0000 (04:58 +0000)
IDLE - move 3 toplevel fix_xyz functions to idlelb.util

Move idlelib functions run.fix_scaling, editor.fixwordbreaks
(as fix_word_breaks).  All are used in at least 3 modules.

Lib/idlelib/News3.txt
Lib/idlelib/editor.py
Lib/idlelib/filelist.py
Lib/idlelib/idle_test/test_editmenu.py
Lib/idlelib/idle_test/test_sidebar.py
Lib/idlelib/pyshell.py
Lib/idlelib/run.py
Lib/idlelib/util.py
Misc/NEWS.d/next/IDLE/2026-07-01-00-15-58.gh-issue-152728.yxIhMN.rst [new file with mode: 0644]

index 97becb858fea333508ea2cc943508d0e4b607ea9..dc18b6e07eb364b364dd24823edf3fbd03a13a1b 100644 (file)
@@ -4,6 +4,9 @@ Released on 2026-10-01
 =========================
 
 
+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
index 239bf5af4705674cb57a2fa06fdee99c85628021..a040d791bdeb528444ff2b357d4993eacabee3a7 100644 (file)
@@ -1704,19 +1704,10 @@ def get_accelerator(keydefs, eventname):
     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:
index e27e5d32a0ff633e3c0973d3758135f80ee7972b..384908f911f515342d9631b3a7cbb680eb63bb43 100644 (file)
@@ -112,12 +112,12 @@ class FileList:
 
 
 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()
index 17478473a3d1b2711fd8e1ffa7f6076c540c4386..0d1eb9054918da75687bab27aef01aa1c9580c38 100644 (file)
@@ -7,7 +7,7 @@ requires('gui')
 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.
@@ -18,7 +18,7 @@ class PasteTest(unittest.TestCase):
     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)
index 4157a4b4dcdd2aaf1a0e1936b115421aa339b5ed..dc3431d8d8ef8870ce3647dfd32fe1ca49875767 100644 (file)
@@ -11,11 +11,10 @@ import tkinter as tk
 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
 
@@ -403,7 +402,7 @@ class ShellSidebarTest(unittest.TestCase):
         root.withdraw()
 
         fix_scaling(root)
-        fixwordbreaks(root)
+        fix_word_breaks(root)
         fix_x11_paste(root)
 
         cls.flist = flist = PyShellFileList(root)
index b1662491935e4a0f5b0edae9eeda7282b7a6d0fa..439f98170292b07f261de1af069ca9bc1cab8639 100755 (executable)
@@ -36,13 +36,14 @@ from idlelib.config import idleConf
 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
@@ -881,9 +882,9 @@ class PyShell(OutputWindow):
         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)
 
@@ -1452,17 +1453,6 @@ class PyShell(OutputWindow):
         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]*
@@ -1522,6 +1512,7 @@ def main():
     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
 
@@ -1607,7 +1598,6 @@ def main():
         NoDefaultRoot()
     root = Tk(className="Idle")
     root.withdraw()
-    from idlelib.run import fix_scaling
     fix_scaling(root)
 
     # set application icon
@@ -1629,7 +1619,7 @@ def main():
         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)
index e1c40fee8f480535678d0e3f028e6d3afef7f581..f5564ccf90f7f4675a6af29a9d6a0bc1edf15fc5 100644 (file)
@@ -25,6 +25,7 @@ from idlelib import debugobj_r  # remote_object_tree_item
 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.
@@ -216,7 +217,7 @@ def show_socket_error(err, address):
     import tkinter
     from tkinter.messagebox import showerror
     root = tkinter.Tk()
-    fix_scaling(root)
+    util.fix_scaling(root)
     root.withdraw()
     showerror(
             "Subprocess Connection Error",
@@ -389,16 +390,6 @@ def exit():
     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):
index e05604ab4853f6dbf342ccf874ba6ee9dd85d11b..bf88c905e1d177d7ca82d0f68a62c603e96e5a43 100644 (file)
@@ -19,6 +19,20 @@ import sys
 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
@@ -31,6 +45,25 @@ if sys.platform == 'win32':  # pragma: no cover
         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
diff --git a/Misc/NEWS.d/next/IDLE/2026-07-01-00-15-58.gh-issue-152728.yxIhMN.rst b/Misc/NEWS.d/next/IDLE/2026-07-01-00-15-58.gh-issue-152728.yxIhMN.rst
new file mode 100644 (file)
index 0000000..d73512a
--- /dev/null
@@ -0,0 +1,2 @@
+Move functions run.fix_scaling, editor.fixwordbreaks (as fix_word_breaks)
+and pyshell.fix_x11_paste to idlelib.util.