]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-4630: Add cursor no-blink option for IDLE (GH-16960)
authorZackery Spytz <zspytz@gmail.com>
Wed, 13 Nov 2019 07:13:33 +0000 (00:13 -0700)
committerTerry Jan Reedy <tjreedy@udel.edu>
Wed, 13 Nov 2019 07:13:33 +0000 (02:13 -0500)
This immediately toggles shell, editor, and output windows, but does not affect other input widgets.

Lib/idlelib/NEWS.txt
Lib/idlelib/config-main.def
Lib/idlelib/config.py
Lib/idlelib/configdialog.py
Lib/idlelib/editor.py
Lib/idlelib/idle_test/test_configdialog.py
Misc/NEWS.d/next/IDLE/2019-10-28-04-48-03.bpo-4630.upgjiV.rst [new file with mode: 0644]

index 938c9c7d06b05ab47aaf2087c5e84b9abcef5a34..b02a9880505e83adc0f1767a6a38800ad2bdfe86 100644 (file)
@@ -3,7 +3,11 @@ Released on 2020-10-05?
 ======================================
 
 
-bop-26353: Stop adding newline when saving an IDLE shell window.
+bpo-4360: Add an option to toggle IDLE's cursor blink for shell,
+editor, and output windows.  See Settings, General, Window Preferences,
+Cursor Blink.  Patch by Zachary Spytz.
+
+bpo-26353: Stop adding newline when saving an IDLE shell window.
 
 bpo-38598: Do not try to compile IDLE shell or output windows.
 
index b2be6250d021afe9f073fe3fc1f30b3d06026620..28ae94161d5c035c0c2db3864308c42f9928ce1f 100644 (file)
@@ -59,6 +59,7 @@ delete-exitfunc= 1
 [EditorWindow]
 width= 80
 height= 40
+cursor-blink= 1
 font= TkFixedFont
 # For TkFixedFont, the actual size and boldness are obtained from tk
 # and override 10 and 0.  See idlelib.config.IdleConf.GetFont
index 12e6f9fae78b80fdada01e1723e99c9a6c6c13f2..04444a3bf20b30bc250764203ced633cab2462b3 100644 (file)
@@ -158,6 +158,8 @@ class IdleConf:
         self.defaultCfg = {}
         self.userCfg = {}
         self.cfg = {}  # TODO use to select userCfg vs defaultCfg
+        # self.blink_off_time = <first editor text>['insertofftime']
+        # See https:/bugs.python.org/issue4630, msg356516.
 
         if not _utest:
             self.CreateConfigHandlers()
index df216582fe60930c27732c8ab52c32d5ec83511a..aaf319bbe1befd0fa0fa71e1eff134e79561814c 100644 (file)
@@ -236,6 +236,7 @@ class ConfigDialog(Toplevel):
             instance.set_notabs_indentwidth()
             instance.ApplyKeybindings()
             instance.reset_help_menu_entries()
+            instance.update_cursor_blink()
         for klass in reloadables:
             klass.reload()
 
@@ -1820,6 +1821,9 @@ class GenPage(Frame):
                     (*)win_width_int: Entry - win_width
                     win_height_title: Label
                     (*)win_height_int: Entry - win_height
+                frame_cursor_blink: Frame
+                    cursor_blink_title: Label
+                    (*)cursor_blink_bool: Checkbutton - cursor_blink
                 frame_autocomplete: Frame
                     auto_wait_title: Label
                     (*)auto_wait_int: Entry - autocomplete_wait
@@ -1864,6 +1868,8 @@ class GenPage(Frame):
                 StringVar(self), ('main', 'EditorWindow', 'width'))
         self.win_height = tracers.add(
                 StringVar(self), ('main', 'EditorWindow', 'height'))
+        self.cursor_blink = tracers.add(
+                BooleanVar(self), ('main', 'EditorWindow', 'cursor-blink'))
         self.autocomplete_wait = tracers.add(
                 StringVar(self), ('extensions', 'AutoComplete', 'popupwait'))
         self.paren_style = tracers.add(
@@ -1920,6 +1926,11 @@ class GenPage(Frame):
                 validatecommand=self.digits_only, validate='key',
         )
 
+        frame_cursor_blink = Frame(frame_window, borderwidth=0)
+        cursor_blink_title = Label(frame_cursor_blink, text='Cursor Blink')
+        self.cursor_blink_bool = Checkbutton(frame_cursor_blink,
+                variable=self.cursor_blink, width=1)
+
         frame_autocomplete = Frame(frame_window, borderwidth=0,)
         auto_wait_title = Label(frame_autocomplete,
                                text='Completions Popup Wait (milliseconds)')
@@ -2024,6 +2035,10 @@ class GenPage(Frame):
         win_height_title.pack(side=RIGHT, anchor=E, pady=5)
         self.win_width_int.pack(side=RIGHT, anchor=E, padx=10, pady=5)
         win_width_title.pack(side=RIGHT, anchor=E, pady=5)
+        # frame_cursor_blink.
+        frame_cursor_blink.pack(side=TOP, padx=5, pady=0, fill=X)
+        cursor_blink_title.pack(side=LEFT, anchor=W, padx=5, pady=5)
+        self.cursor_blink_bool.pack(side=LEFT, padx=5, pady=5)
         # frame_autocomplete.
         frame_autocomplete.pack(side=TOP, padx=5, pady=0, fill=X)
         auto_wait_title.pack(side=LEFT, anchor=W, padx=5, pady=5)
@@ -2078,6 +2093,8 @@ class GenPage(Frame):
                 'main', 'EditorWindow', 'width', type='int'))
         self.win_height.set(idleConf.GetOption(
                 'main', 'EditorWindow', 'height', type='int'))
+        self.cursor_blink.set(idleConf.GetOption(
+                'main', 'EditorWindow', 'cursor-blink', type='bool'))
         self.autocomplete_wait.set(idleConf.GetOption(
                 'extensions', 'AutoComplete', 'popupwait', type='int'))
         self.paren_style.set(idleConf.GetOption(
index adeed74059f847d15069016bfc38a24e1fa1f230..dff104ff0f18f249637cb74750ec5f39f7a6245a 100644 (file)
@@ -241,6 +241,12 @@ class EditorWindow(object):
         self.indentwidth = self.tabwidth
         self.set_notabs_indentwidth()
 
+        # Store the current value of the insertofftime now so we can restore
+        # it if needed.
+        if not hasattr(idleConf, 'blink_off_time'):
+            idleConf.blink_off_time = self.text['insertofftime']
+        self.update_cursor_blink()
+
         # When searching backwards for a reliable place to begin parsing,
         # first start num_context_lines[0] lines back, then
         # num_context_lines[1] lines back if that didn't work, and so on.
@@ -803,6 +809,16 @@ class EditorWindow(object):
             text.mark_set("insert", pos + "+1c")
         text.see(pos)
 
+    def update_cursor_blink(self):
+        "Update the cursor blink configuration."
+        cursorblink = idleConf.GetOption(
+                'main', 'EditorWindow', 'cursor-blink', type='bool')
+        if not cursorblink:
+            self.text['insertofftime'] = 0
+        else:
+            # Restore the original value
+            self.text['insertofftime'] = idleConf.blink_off_time
+
     def ResetFont(self):
         "Update the text widgets' font if it is changed"
         # Called from configdialog.py
index 37e83439c471edff98f0afebe971c29d34e9db71..1f14ed1f26473004c26c6bf74996c4caf3762a03 100644 (file)
@@ -1135,6 +1135,10 @@ class GenPageTest(unittest.TestCase):
         d.win_width_int.insert(0, '11')
         self.assertEqual(mainpage, {'EditorWindow': {'width': '11'}})
 
+    def test_cursor_blink(self):
+        self.page.cursor_blink_bool.invoke()
+        self.assertEqual(mainpage, {'EditorWindow': {'cursor-blink': 'False'}})
+
     def test_autocomplete_wait(self):
         self.page.auto_wait_int.delete(0, 'end')
         self.page.auto_wait_int.insert(0, '11')
diff --git a/Misc/NEWS.d/next/IDLE/2019-10-28-04-48-03.bpo-4630.upgjiV.rst b/Misc/NEWS.d/next/IDLE/2019-10-28-04-48-03.bpo-4630.upgjiV.rst
new file mode 100644 (file)
index 0000000..759b35b
--- /dev/null
@@ -0,0 +1,3 @@
+Add an option to toggle IDLE's cursor blink for shell, editor, and output
+windows.  See Settings, General, Window Preferences, Cursor Blink.
+Patch by Zachary Spytz.