unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Philipp Stephani <p.stephani2@gmail.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 24372@debbugs.gnu.org
Subject: bug#24372: 25.1.50; After losing focus, cursor is hidden when moving point
Date: Sun, 11 Sep 2016 09:15:49 +0000	[thread overview]
Message-ID: <CAArVCkTtkH5AJ20huvd1NNvLfb1MnH_hT5wOp0+BSLMaZmb19Q@mail.gmail.com> (raw)
In-Reply-To: <83mvjg8bk2.fsf@gnu.org>


[-- Attachment #1.1: Type: text/plain, Size: 1368 bytes --]

Eli Zaretskii <eliz@gnu.org> schrieb am Sa., 10. Sep. 2016 um 09:21 Uhr:

> > From: Philipp Stephani <p.stephani2@gmail.com>
> > Date: Fri, 09 Sep 2016 17:18:12 +0000
> > Cc: 24372@debbugs.gnu.org
> >
> >  A simpler recipe that doesn't need explicit focus events is
> >
> >  emacs -Q -eval '(progn (setq blink-cursor-delay 0.0)
> (blink-cursor-suspend) (blink-cursor-check))'
> >
> >  and then start moving point.
> >
> > OK, I guess one issue is that setting blink-cursor-delay doesn't restart
> blink-cursor-idle-timer. (Similarly,
> > changing blink-cursor-interval doesn't restart blink-cursor-timer.)
> While obviously we can't fix that when using
> > setq, I'd suggest adding custom setters to the variables nevertheless.
>

I've attached a patch for this. It shouldn't be controversial because it
only reduces the possibility for surprises, but doesn't change any behavior.


> >
> > The direct cause of the issue seems to be that, when blink-cursor-delay
> is idle, after every command
> > blink-cursor-start is called immediately, which hides the cursor.
>
> Thanks.  Does the patch below fix the issue, without introducing any
> adverse side effects?
>
>
It does introduce the adverse side effect that now the first blink takes
one second (the sum of cursor-blink-delay and cursor-blink-interval). I've
attached another patch with the change I have in mind.

[-- Attachment #1.2: Type: text/html, Size: 2448 bytes --]

[-- Attachment #2: 0001-Avoid-hiding-the-blinking-cursor-too-fast.patch --]
[-- Type: application/octet-stream, Size: 2392 bytes --]

From 095920029806b1c599c9618818105e22e25321f5 Mon Sep 17 00:00:00 2001
From: Philipp Stephani <phst@google.com>
Date: Sun, 11 Sep 2016 11:07:18 +0200
Subject: [PATCH] Avoid hiding the blinking cursor too fast

If `blink-cursor-delay' is smaller than `blink-cursor-delay', the cursor
is hidden to quickly after a command; see Bug#24372.  This change uses
`blink-cursor-interval' as lower bound for `blink-cursor-delay'.

* lisp/frame.el (blink-cursor-check, blink-cursor-mode): Use
`blink-cursor-interval' as lower bound to `blink-cursor-delay'.
(blink-cursor-delay): Document changed behavior of
`blink-cursor-delay'.
---
 lisp/frame.el | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/lisp/frame.el b/lisp/frame.el
index cfd40bf..ebc5cc1 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -2027,7 +2027,11 @@ cursor
   :group 'frames)
 
 (defcustom blink-cursor-delay 0.5
-  "Seconds of idle time after which cursor starts to blink."
+  "Seconds of idle time after which cursor starts to blink.
+This is the interval between the end of an user action and the
+time when the cursor first becomes invisible due to blinking.  If
+this is shorter than `blink-cursor-interval', the value of
+`blink-cursor-interval' is used instead."
   :type 'number
   :group 'cursor)
 
@@ -2114,9 +2118,8 @@ blink-cursor-check
 	     (not blink-cursor-idle-timer))
     (remove-hook 'post-command-hook 'blink-cursor-check)
     (setq blink-cursor-idle-timer
-          (run-with-idle-timer blink-cursor-delay
-                               blink-cursor-delay
-                               'blink-cursor-start))))
+          (let ((delay (max blink-cursor-delay blink-cursor-interval)))
+            (run-with-idle-timer delay delay #'blink-cursor-start)))))
 
 (define-obsolete-variable-alias 'blink-cursor 'blink-cursor-mode "22.1")
 
@@ -2148,9 +2151,8 @@ blink-cursor-mode
     (add-hook 'focus-in-hook #'blink-cursor-check)
     (add-hook 'focus-out-hook #'blink-cursor-suspend)
     (setq blink-cursor-idle-timer
-          (run-with-idle-timer blink-cursor-delay
-                               blink-cursor-delay
-                               #'blink-cursor-start))))
+          (let ((delay (max blink-cursor-delay blink-cursor-interval)))
+            (run-with-idle-timer delay delay #'blink-cursor-start)))))
 
 \f
 ;; Frame maximization/fullscreen
-- 
2.9.0


[-- Attachment #3: 0001-Restart-blink-cursor-timers-on-interval-changes.patch --]
[-- Type: application/octet-stream, Size: 3899 bytes --]

From 06445b3e6fee4ab1c680ab4d9aedb75eddf85352 Mon Sep 17 00:00:00 2001
From: Philipp Stephani <phst@google.com>
Date: Sat, 10 Sep 2016 10:16:32 +0200
Subject: [PATCH] Restart blink cursor timers on interval changes

This prevents surprising behavior when timer interval customizations are
only applied whenever the timers happen to be restarted (see Bug#24372).

* lisp/frame.el (blink-cursor--start-idle-timer)
(blink-cursor--start-timer): New functions.
(blink-cursor-start, blink-cursor-check, blink-cursor-mode): Use
the new helper functions.
(blink-cursor-delay, blink-cursor-interval): Restart timers when
the value is changed.
---
 lisp/frame.el | 38 +++++++++++++++++++++++++-------------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/lisp/frame.el b/lisp/frame.el
index cfd40bf..b32ba7a 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -2029,12 +2029,18 @@ cursor
 (defcustom blink-cursor-delay 0.5
   "Seconds of idle time after which cursor starts to blink."
   :type 'number
-  :group 'cursor)
+  :group 'cursor
+  :set (lambda (symbol value)
+         (set-default symbol value)
+         (when blink-cursor-idle-timer (blink-cursor--start-idle-timer))))
 
 (defcustom blink-cursor-interval 0.5
   "Length of cursor blink interval in seconds."
   :type 'number
-  :group 'cursor)
+  :group 'cursor
+  :set (lambda (symbol value)
+         (set-default symbol value)
+         (when blink-cursor-timer (blink-cursor--start-timer))))
 
 (defcustom blink-cursor-blinks 10
   "How many times to blink before using a solid cursor on NS, X, and MS-Windows.
@@ -2055,6 +2061,20 @@ blink-cursor-timer
 This timer calls `blink-cursor-timer-function' every
 `blink-cursor-interval' seconds.")
 
+(defun blink-cursor--start-idle-timer ()
+  "Start the `blink-cursor-idle-timer'."
+  (when blink-cursor-idle-timer (cancel-timer blink-cursor-idle-timer))
+  (setq blink-cursor-idle-timer
+        (run-with-idle-timer blink-cursor-delay blink-cursor-delay
+                             #'blink-cursor-start)))
+
+(defun blink-cursor--start-timer ()
+  "Start the `blink-cursor-timer'."
+  (when blink-cursor-timer (cancel-timer blink-cursor-timer))
+  (setq blink-cursor-timer
+        (run-with-timer blink-cursor-interval blink-cursor-interval
+                        #'blink-cursor-timer-function)))
+
 (defun blink-cursor-start ()
   "Timer function called from the timer `blink-cursor-idle-timer'.
 This starts the timer `blink-cursor-timer', which makes the cursor blink
@@ -2064,9 +2084,7 @@ blink-cursor-start
     ;; Set up the timer first, so that if this signals an error,
     ;; blink-cursor-end is not added to pre-command-hook.
     (setq blink-cursor-blinks-done 1)
-    (setq blink-cursor-timer
-	  (run-with-timer blink-cursor-interval blink-cursor-interval
-			  'blink-cursor-timer-function))
+    (blink-cursor--start-timer)
     (add-hook 'pre-command-hook 'blink-cursor-end)
     (internal-show-cursor nil nil)))
 
@@ -2113,10 +2131,7 @@ blink-cursor-check
   (when (and blink-cursor-mode
 	     (not blink-cursor-idle-timer))
     (remove-hook 'post-command-hook 'blink-cursor-check)
-    (setq blink-cursor-idle-timer
-          (run-with-idle-timer blink-cursor-delay
-                               blink-cursor-delay
-                               'blink-cursor-start))))
+    (blink-cursor--start-idle-timer)))
 
 (define-obsolete-variable-alias 'blink-cursor 'blink-cursor-mode "22.1")
 
@@ -2147,10 +2162,7 @@ blink-cursor-mode
   (when blink-cursor-mode
     (add-hook 'focus-in-hook #'blink-cursor-check)
     (add-hook 'focus-out-hook #'blink-cursor-suspend)
-    (setq blink-cursor-idle-timer
-          (run-with-idle-timer blink-cursor-delay
-                               blink-cursor-delay
-                               #'blink-cursor-start))))
+    (blink-cursor--start-idle-timer)))
 
 \f
 ;; Frame maximization/fullscreen
-- 
2.9.0


  reply	other threads:[~2016-09-11  9:15 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-05 19:16 bug#24372: 25.1.50; After losing focus, cursor is hidden when moving point Philipp Stephani
2016-09-05 21:29 ` Clément Pit--Claudel
2016-09-06 16:03 ` Eli Zaretskii
2016-09-09 15:59   ` Philipp Stephani
2016-09-09 16:07     ` Eli Zaretskii
2016-09-09 16:20       ` Philipp Stephani
2016-09-09 16:29         ` Philipp Stephani
2016-09-09 17:18           ` Philipp Stephani
2016-09-09 18:59             ` Philipp Stephani
2016-09-10  7:21             ` Eli Zaretskii
2016-09-11  9:15               ` Philipp Stephani [this message]
2016-09-11 16:23                 ` Eli Zaretskii
2016-09-11 17:37                   ` Philipp Stephani
2016-09-11 19:18                     ` Eli Zaretskii
2016-09-23 14:28                       ` Eli Zaretskii
2016-09-25 19:09                       ` Philipp Stephani
2016-10-01  8:25                         ` Eli Zaretskii
2016-10-01 16:11                           ` Philipp Stephani
2016-10-01 17:29                             ` Eli Zaretskii
2016-10-01 18:10                               ` Philipp Stephani
2016-10-02  7:12                                 ` Eli Zaretskii
2016-10-01 18:16                             ` Philipp Stephani
2016-10-02  7:14                               ` Eli Zaretskii
2016-10-02 17:56                                 ` Philipp Stephani

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAArVCkTtkH5AJ20huvd1NNvLfb1MnH_hT5wOp0+BSLMaZmb19Q@mail.gmail.com \
    --to=p.stephani2@gmail.com \
    --cc=24372@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).