From 545a3fdbf98b8c45f382e0324b01da1f67d92a6a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 4 Apr 2021 20:52:20 +0300 Subject: [PATCH 1/3] bpo-43655: Tkinter and IDLE dialog windows are now recognized as dialogs by window managers on macOS and X Window --- Lib/idlelib/config_key.py | 2 ++ Lib/idlelib/configdialog.py | 2 ++ Lib/idlelib/query.py | 10 +++------- Lib/idlelib/searchbase.py | 2 ++ Lib/tkinter/filedialog.py | 1 + Lib/tkinter/simpledialog.py | 12 ++++++++++++ .../IDLE/2021-04-04-20-52-07.bpo-43655.HSyaKH.rst | 2 ++ .../Library/2021-04-04-20-51-19.bpo-43655.LwGy8R.rst | 2 ++ 8 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2021-04-04-20-52-07.bpo-43655.HSyaKH.rst create mode 100644 Misc/NEWS.d/next/Library/2021-04-04-20-51-19.bpo-43655.LwGy8R.rst diff --git a/Lib/idlelib/config_key.py b/Lib/idlelib/config_key.py index 7510aa9f3d8786..9ca3a156f4b97f 100644 --- a/Lib/idlelib/config_key.py +++ b/Lib/idlelib/config_key.py @@ -4,6 +4,7 @@ from tkinter import Toplevel, Listbox, StringVar, TclError from tkinter.ttk import Frame, Button, Checkbutton, Entry, Label, Scrollbar from tkinter import messagebox +from tkinter.simpledialog import _setup_dialog import string import sys @@ -63,6 +64,7 @@ def __init__(self, parent, title, action, current_key_sequences, self.resizable(height=False, width=False) self.title(title) self.transient(parent) + _setup_dialog(self) self.grab_set() self.protocol("WM_DELETE_WINDOW", self.cancel) self.parent = parent diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index c52a04b503adb4..a7eef99d41dd78 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -21,6 +21,7 @@ from tkinter import colorchooser import tkinter.font as tkfont from tkinter import messagebox +from tkinter.simpledialog import _setup_dialog from idlelib.config import idleConf, ConfigChanges from idlelib.config_key import GetKeysDialog @@ -77,6 +78,7 @@ def __init__(self, parent, title='', *, _htest=False, _utest=False): self.create_widgets() self.resizable(height=FALSE, width=FALSE) self.transient(parent) + _setup_dialog(self) self.protocol("WM_DELETE_WINDOW", self.cancel) self.fontpage.fontlist.focus_set() # XXX Decide whether to keep or delete these key bindings. diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index 015fc7ade459db..fefa5aac1b7f58 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -28,6 +28,7 @@ from tkinter.ttk import Frame, Button, Entry, Label, Checkbutton from tkinter import filedialog from tkinter.font import Font +from tkinter.simpledialog import _setup_dialog class Query(Toplevel): """Base class for getting verified answer from a user. @@ -60,13 +61,8 @@ def __init__(self, parent, title, message, *, text0='', used_names={}, if not _utest: # Otherwise fail when directly run unittest. self.grab_set() - windowingsystem = self.tk.call('tk', 'windowingsystem') - if windowingsystem == 'aqua': - try: - self.tk.call('::tk::unsupported::MacWindowStyle', 'style', - self._w, 'moveableModal', '') - except: - pass + _setup_dialog(self) + if self._windowingsystem == 'aqua': self.bind("", self.cancel) self.bind('', self.cancel) self.protocol("WM_DELETE_WINDOW", self.cancel) diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index fbef87aa2d3d04..64ed50c7364be3 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -2,6 +2,7 @@ from tkinter import Toplevel from tkinter.ttk import Frame, Entry, Label, Button, Checkbutton, Radiobutton +from tkinter.simpledialog import _setup_dialog class SearchDialogBase: @@ -83,6 +84,7 @@ def create_widgets(self): top.protocol("WM_DELETE_WINDOW", self.close) top.wm_title(self.title) top.wm_iconname(self.icon) + _setup_dialog(top) self.top = top self.frame = Frame(top, padding="5px") self.frame.grid(sticky="nwes") diff --git a/Lib/tkinter/filedialog.py b/Lib/tkinter/filedialog.py index 3ed93eb8c163a4..9ac68343017e71 100644 --- a/Lib/tkinter/filedialog.py +++ b/Lib/tkinter/filedialog.py @@ -62,6 +62,7 @@ def __init__(self, master, title=None): self.top = Toplevel(master) self.top.title(title) self.top.iconname(title) + _setup_dialog(self.top) self.botframe = Frame(self.top) self.botframe.pack(side=BOTTOM, fill=X) diff --git a/Lib/tkinter/simpledialog.py b/Lib/tkinter/simpledialog.py index a66fbd6cb9885b..538bbfc318d704 100644 --- a/Lib/tkinter/simpledialog.py +++ b/Lib/tkinter/simpledialog.py @@ -40,6 +40,9 @@ def __init__(self, master, if title: self.root.title(title) self.root.iconname(title) + + _setup_dialog(self.root) + self.message = Message(self.root, text=text, aspect=400) self.message.pack(expand=1, fill=BOTH) self.frame = Frame(self.root) @@ -115,6 +118,8 @@ def __init__(self, parent, title = None): if title: self.title(title) + _setup_dialog(self) + self.parent = parent self.result = None @@ -252,6 +257,13 @@ def _place_window(w, parent=None): w.wm_deiconify() # Become visible at the desired location +def _setup_dialog(w): + if w._windowingsystem == "aqua": + w.tk.call("::tk::unsupported::MacWindowStyle", "style", + w, "moveableModal", "") + elif w._windowingsystem == "x11": + w.wm_attributes("-type", "dialog") + # -------------------------------------------------------------------- # convenience dialogues diff --git a/Misc/NEWS.d/next/IDLE/2021-04-04-20-52-07.bpo-43655.HSyaKH.rst b/Misc/NEWS.d/next/IDLE/2021-04-04-20-52-07.bpo-43655.HSyaKH.rst new file mode 100644 index 00000000000000..105ec9281f0051 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2021-04-04-20-52-07.bpo-43655.HSyaKH.rst @@ -0,0 +1,2 @@ +IDLE dialog windows are now recognized as dialogs by window managers on +macOS and X Window. diff --git a/Misc/NEWS.d/next/Library/2021-04-04-20-51-19.bpo-43655.LwGy8R.rst b/Misc/NEWS.d/next/Library/2021-04-04-20-51-19.bpo-43655.LwGy8R.rst new file mode 100644 index 00000000000000..7916d2248b231d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-04-04-20-51-19.bpo-43655.LwGy8R.rst @@ -0,0 +1,2 @@ +:mod:`tkinter` dialog windows are now recognized as dialogs by window +managers on macOS and X Window. From 2d73fec750b88dd068635a7332d12e89394e96a0 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 5 Apr 2021 10:04:45 +0300 Subject: [PATCH 2/3] Revert changes in Lib/idlelib/configdialog.py --- Lib/idlelib/configdialog.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index a7eef99d41dd78..c52a04b503adb4 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -21,7 +21,6 @@ from tkinter import colorchooser import tkinter.font as tkfont from tkinter import messagebox -from tkinter.simpledialog import _setup_dialog from idlelib.config import idleConf, ConfigChanges from idlelib.config_key import GetKeysDialog @@ -78,7 +77,6 @@ def __init__(self, parent, title='', *, _htest=False, _utest=False): self.create_widgets() self.resizable(height=FALSE, width=FALSE) self.transient(parent) - _setup_dialog(self) self.protocol("WM_DELETE_WINDOW", self.cancel) self.fontpage.fontlist.focus_set() # XXX Decide whether to keep or delete these key bindings. From be3e5c9a79c29d7f0f45a892f84964b3933a0d16 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 5 Apr 2021 17:04:41 +0300 Subject: [PATCH 3/3] Fix FileDialog. --- Lib/tkinter/filedialog.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/tkinter/filedialog.py b/Lib/tkinter/filedialog.py index 9ac68343017e71..600d0bd49fe2cf 100644 --- a/Lib/tkinter/filedialog.py +++ b/Lib/tkinter/filedialog.py @@ -24,6 +24,7 @@ ) from tkinter.dialog import Dialog from tkinter import commondialog +from tkinter.simpledialog import _setup_dialog dialogstates = {}