unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Alan Mackenzie <acm@muc.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 32874@debbugs.gnu.org
Subject: bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active
Date: Sun, 30 Sep 2018 14:45:29 +0000	[thread overview]
Message-ID: <20180930144529.GE6305@ACM> (raw)
In-Reply-To: <83lg7k5q2o.fsf@gnu.org>

Hello, yet again, Eli.

On Sat, Sep 29, 2018 at 17:35:43 +0300, Eli Zaretskii wrote:
> > Date: Sat, 29 Sep 2018 14:09:57 +0000
> > From: Alan Mackenzie <acm@muc.de>

[ .... ]

> > The best available hooks which might serve seem to be
> > pre-redisplay-function or pre-redisplay-functions.  Unfortunately,
> > these are called too late, after redisplay has already determined
> > which windows to operate on.

> That's not true: pre-redisplay-function is called _before_ the display
> engine determines what window(s) might need to be redrawn.

Indeed, pre-redisplay-function appears to work well.  The following
patch, which moves follow-mode's embedding in Emacs from
post-command-hook to pre-redisplay-function appears to solve the
original bug (Unwanted scrolling after `f' in edebug) completely.

Any objection from anybody to me committing this change to master?


diff --git a/lisp/follow.el b/lisp/follow.el
index 7aa7b51473..54ece9cd4f 100644
--- a/lisp/follow.el
+++ b/lisp/follow.el
@@ -187,8 +187,8 @@
 ;; Implementation:
 ;;
 ;; The main method by which Follow mode aligns windows is via the
-;; function `follow-post-command-hook', which is run after each
-;; command.  This "fixes up" the alignment of other windows which are
+;; function `follow-pre-redisplay-function', which is run before each
+;; redisplay.  This "fixes up" the alignment of other windows which are
 ;; showing the same Follow mode buffer, on the same frame as the
 ;; selected window.  It does not try to deal with buffers other than
 ;; the buffer of the selected frame, or windows on other frames.
@@ -418,7 +418,8 @@ follow-mode
   (if follow-mode
       (progn
 	(add-hook 'compilation-filter-hook 'follow-align-compilation-windows t t)
-	(add-hook 'post-command-hook 'follow-post-command-hook t)
+        ;; (add-hook 'post-command-hook 'follow-post-command-hook t)
+        (add-function :before pre-redisplay-function 'follow-pre-redisplay-function)
 	(add-hook 'window-size-change-functions 'follow-window-size-change t)
         (add-hook 'after-change-functions 'follow-after-change nil t)
         (add-hook 'isearch-update-post-hook 'follow-post-command-hook nil t)
@@ -445,7 +446,7 @@ follow-mode
 	(setq following (buffer-local-value 'follow-mode (car buffers))
 	      buffers (cdr buffers)))
       (unless following
-	(remove-hook 'post-command-hook 'follow-post-command-hook)
+	;; (remove-hook 'post-command-hook 'follow-post-command-hook)
 	(remove-hook 'window-size-change-functions 'follow-window-size-change)))
 
     (kill-local-variable 'move-to-window-group-line-function)
@@ -1260,10 +1261,27 @@ follow-avoid-tail-recenter
 	    (not (eq win top))))  ;; Loop while this is true.
       (set-buffer orig-buffer))))
 
-;;; Post Command Hook
+;;; Pre Display Function
+
+;; This function is added to `pre-display-function' and is thus called
+;; before each redisplay operation.  It supersedes (2018-09) the
+;; former use of the post command hook, and now does the right thing
+;; when a program calls `redisplay' or `sit-for'.
+
+(defun follow-pre-redisplay-function (wins)
+  (if (or (eq wins t)
+          (null wins)
+          (and (listp wins)
+               (memq (selected-window) wins)))
+      (follow-post-command-hook)))
 
-;; The magic little box. This function is called after every command.
+;;; Post Command Hook
 
+;; The magic little box. This function was formerly called after every
+;; command.  It is now called before each redisplay operation (see
+;; `follow-pre-redisplay-function' above), and at the end of several
+;; search/replace commands.  It retains its historical name.
+;;
 ;; This is not as complicated as it seems. It is simply a list of common
 ;; display situations and the actions to take, plus commands for redrawing
 ;; the screen if it should be unaligned.
@@ -1284,6 +1302,12 @@ follow-post-command-hook
 	  (setq follow-windows-start-end-cache nil))
         (follow-adjust-window win)))))
 
+;; NOTE: to debug follow-mode with edebug, it is helpful to add
+;; `follow-post-command-hook' to `post-command-hook' temporarily.  Do
+;; this locally to the target buffer with, say,:
+;; M-: (add-hook 'post-command-hook 'follow-post-command-hook t t)
+;; .
+
 (defun follow-adjust-window (win)
   ;; Adjust the window WIN and its followers.
   (cl-assert (eq (window-buffer win) (current-buffer)))


-- 
Alan Mackenzie (Nuremberg, Germany).





  parent reply	other threads:[~2018-09-30 14:45 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-29 14:09 bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active Alan Mackenzie
2018-09-29 14:35 ` Eli Zaretskii
2018-09-29 15:37   ` Alan Mackenzie
2018-09-29 16:09     ` Eli Zaretskii
2018-09-29 20:41       ` Alan Mackenzie
2018-09-30  7:35         ` Eli Zaretskii
2018-09-30 15:36           ` Alan Mackenzie
2018-09-30 17:17             ` Eli Zaretskii
2018-10-01 12:59               ` Alan Mackenzie
2018-10-01 13:52                 ` Eli Zaretskii
2018-09-30 14:45   ` Alan Mackenzie [this message]
2018-10-03 10:54     ` Alan Mackenzie

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=20180930144529.GE6305@ACM \
    --to=acm@muc.de \
    --cc=32874@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).