mirror of
https://github.com/python/cpython.git
synced 2026-07-24 10:52:24 -04:00
f663e54dc4
gh-152728: IDLE - move 3 toplevel fix_xyz functions to idlelb.util (GH-152729)
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.
(cherry picked from commit 53ca52ddb0)
Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
71 lines
2.5 KiB
Python
71 lines
2.5 KiB
Python
"""
|
|
Idlelib objects with no external idlelib dependencies
|
|
which are needed in more than one idlelib module.
|
|
|
|
They are included here because
|
|
a) they don't particularly belong elsewhere; or
|
|
b) because inclusion here simplifies the idlelib dependency graph.
|
|
|
|
TODO:
|
|
* Python versions (editor and help_about),
|
|
* tk version and patchlevel (pyshell, help_about, maxos?, editor?),
|
|
* std streams (pyshell, run),
|
|
* warning stuff (pyshell, run).
|
|
"""
|
|
import sys
|
|
|
|
# .pyw is for Windows; .pyi is for typing stub files.
|
|
# The extension order is needed for iomenu open/save dialogs.
|
|
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
|
|
if sys.platform == 'win32': # pragma: no cover
|
|
def fix_win_hidpi(): # Called in pyshell and turtledemo.
|
|
try:
|
|
import ctypes
|
|
PROCESS_SYSTEM_DPI_AWARE = 1 # Int required.
|
|
ctypes.OleDLL('shcore').SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE)
|
|
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
|
|
main('idlelib.idle_test.test_util', verbosity=2)
|