[2.7] bpo-34120: fix IDLE freezing after closing dialogs (GH-8603)

Added missing .grab_release() calls to all places where we call .grab_set().

(cherry picked from commit 10ea9409ceb5da83cb380b610750551e26561044)
diff --git a/Lib/idlelib/aboutDialog.py b/Lib/idlelib/aboutDialog.py
index c9adc08..87d6c3c 100644
--- a/Lib/idlelib/aboutDialog.py
+++ b/Lib/idlelib/aboutDialog.py
@@ -141,6 +141,7 @@
         textView.view_file(self, title, fn, encoding)
 
     def Ok(self, event=None):
+        self.grab_release()
         self.destroy()
 
 if __name__ == '__main__':
diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py
index d53f5ff..3c29af1 100644
--- a/Lib/idlelib/configDialog.py
+++ b/Lib/idlelib/configDialog.py
@@ -1197,10 +1197,12 @@
             instance.reset_help_menu_entries()
 
     def Cancel(self):
+        self.grab_release()
         self.destroy()
 
     def Ok(self):
         self.Apply()
+        self.grab_release()
         self.destroy()
 
     def Apply(self):
diff --git a/Lib/idlelib/configHelpSourceEdit.py b/Lib/idlelib/configHelpSourceEdit.py
index 5816449..62b010a 100644
--- a/Lib/idlelib/configHelpSourceEdit.py
+++ b/Lib/idlelib/configHelpSourceEdit.py
@@ -155,10 +155,12 @@
                     # Mac Safari insists on using the URI form for local files
                     self.result = list(self.result)
                     self.result[1] = "file://" + path
+            self.grab_release()
             self.destroy()
 
     def Cancel(self, event=None):
         self.result = None
+        self.grab_release()
         self.destroy()
 
 if __name__ == '__main__':
diff --git a/Lib/idlelib/configSectionNameDialog.py b/Lib/idlelib/configSectionNameDialog.py
index c09dca8..f28dc1a 100644
--- a/Lib/idlelib/configSectionNameDialog.py
+++ b/Lib/idlelib/configSectionNameDialog.py
@@ -80,10 +80,13 @@
         name = self.name_ok()
         if name:
             self.result = name
+            self.grab_release()
             self.destroy()
     def Cancel(self, event=None):
         self.result = ''
+        self.grab_release()
         self.destroy()
+
 if __name__ == '__main__':
     import unittest
     unittest.main('idlelib.idle_test.test_config_name', verbosity=2, exit=False)
diff --git a/Lib/idlelib/idle_test/test_config_name.py b/Lib/idlelib/idle_test/test_config_name.py
index 4403f87..2a4df6a 100644
--- a/Lib/idlelib/idle_test/test_config_name.py
+++ b/Lib/idlelib/idle_test/test_config_name.py
@@ -15,6 +15,8 @@
     name = Var()
     result = None
     destroyed = False
+    def grab_release(self):
+        pass
     def destroy(self):
         self.destroyed = True
 
diff --git a/Lib/idlelib/keybindingDialog.py b/Lib/idlelib/keybindingDialog.py
index 4d32ca9..755f1af 100644
--- a/Lib/idlelib/keybindingDialog.py
+++ b/Lib/idlelib/keybindingDialog.py
@@ -217,10 +217,12 @@
     def OK(self, event=None):
         if self.advanced or self.KeysOK():  # doesn't check advanced string yet
             self.result=self.keyString.get()
+            self.grab_release()
             self.destroy()
 
     def Cancel(self, event=None):
         self.result=''
+        self.grab_release()
         self.destroy()
 
     def KeysOK(self):
diff --git a/Lib/idlelib/textView.py b/Lib/idlelib/textView.py
index b8c4ac1..ec837f8 100644
--- a/Lib/idlelib/textView.py
+++ b/Lib/idlelib/textView.py
@@ -39,7 +39,8 @@
         self.textView.insert(0.0, text)
         self.textView.config(state=DISABLED)
 
-        if modal:
+        self.is_modal = modal
+        if self.is_modal:
             self.transient(parent)
             self.grab_set()
             self.wait_window()
@@ -62,6 +63,8 @@
         frameText.pack(side=TOP,expand=TRUE,fill=BOTH)
 
     def Ok(self, event=None):
+        if self.is_modal:
+            self.grab_release()
         self.destroy()