From ac79c930b5950fdca38d7addf73ad2b607591e03 Mon Sep 17 00:00:00 2001 From: Tal Einat Date: Fri, 7 Jun 2019 08:54:40 +0300 Subject: [PATCH 1/2] [2.7] bpo-37177: make IDLE's search dialogs transient (GH-13869) This avoids the search dialogs being hidden behind the editor window.. (cherry picked from commit 554450fb4e95066e825bdb4a2d544a490daeebdc) Co-authored-by: Tal Einat --- Lib/idlelib/SearchDialogBase.py | 2 ++ Lib/idlelib/idle_test/test_searchdialogbase.py | 9 +++++---- .../next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py index 651e7f4a3fcd90..9eb8b223ffda77 100644 --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -52,6 +52,7 @@ def open(self, text, searchphrase=None): else: self.top.deiconify() self.top.tkraise() + self.top.transient(text.winfo_toplevel()) if searchphrase: self.ent.delete(0,"end") self.ent.insert("end",searchphrase) @@ -64,6 +65,7 @@ def close(self, event=None): "Put dialog away for later use." if self.top: self.top.grab_release() + self.top.transient('') self.top.withdraw() def create_widgets(self): diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py index 32abfe6f792dc1..5e269c9e2cbe55 100644 --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -6,7 +6,7 @@ ''' import unittest from test.test_support import requires -from Tkinter import Tk, Toplevel, Frame ## BooleanVar, StringVar +from Tkinter import Text, Tk, Toplevel, Frame ## BooleanVar, StringVar from idlelib import SearchEngine as se from idlelib import SearchDialogBase as sdb from idlelib.idle_test.mock_idle import Func @@ -45,9 +45,10 @@ def test_open_and_close(self): # open calls create_widgets, which needs default_command self.dialog.default_command = None - # Since text parameter of .open is not used in base class, - # pass dummy 'text' instead of tk.Text(). - self.dialog.open('text') + toplevel = Toplevel(self.root) + self.addCleanup(toplevel.destroy) + text = Text(toplevel) + self.dialog.open(text) self.assertEqual(self.dialog.top.state(), 'normal') self.dialog.close() self.assertEqual(self.dialog.top.state(), 'withdrawn') diff --git a/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst new file mode 100644 index 00000000000000..74e48eef89a621 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst @@ -0,0 +1,2 @@ +Properly 'attach' search dialogs to their main window so that they behave +like other dialogs and do not get hidden behind their main window. From 681fa6c03d70413e242089129f028b446d026e6d Mon Sep 17 00:00:00 2001 From: Tal Einat Date: Fri, 7 Jun 2019 09:19:23 +0300 Subject: [PATCH 2/2] fix minor backport mistake --- Lib/idlelib/idle_test/test_searchdialogbase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py index 5e269c9e2cbe55..7ca6bbf6934709 100644 --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -53,7 +53,7 @@ def test_open_and_close(self): self.dialog.close() self.assertEqual(self.dialog.top.state(), 'withdrawn') - self.dialog.open('text', searchphrase="hello") + self.dialog.open(text, searchphrase="hello") self.assertEqual(self.dialog.ent.get(), 'hello') self.dialog.close()