GNU bug report logs -
#22404
25.1.50; Forcing `window-scroll-functions` to run.
Previous Next
Full log
Message #44 received at 22404 <at> debbugs.gnu.org (full text, mbox):
> What do you need from window-scroll-functions? Only the correct
> values of window-start and window-end? Or something else?
Correct, I just need the 100% accurate `window-start` and `window-end`. :) :)
> The other thing I still don't understand is how forcing
> window-scroll-functions to run could fix your problem or _avoiding_
> extra calculations. Where and under what conditions would you call
> the function that forces Emacs to run window-scroll-functions?
I either need to use BOTH the `post-command-hook` and `window-scroll-functions` hook; OR, just the WSF if it is forced to always run. WSF is needed (for sure) whenever `window-start` and `window-end` have changed -- so PCH must do the work the rest of the time. I had previously been using a poor test to GUESS (from the PCH) whether WSF will run.
> Doesn't that waste processing in those cases where normally
> window-scroll-functions didn't need to be run (because window-start
> and window-end don't change)? IOW, aren't you running those costly
> calculations from window-scroll-functions?
If point moves left or right, the vertical ruler that tracks the cursor position moves with the cursor -- so recalculation is needed. The vertical ruler is on a 0.3 idle timer, and the horizontal ruler (with line numbers and pilcrows) is on all the time. For the horizontal ruler, I have a test that compares the previous window-start/end to the new window-start/end -- if it is just cursor movement (instead of self-insert-command), then I use the previously recorded list of calculations. Just moving the cursor left/right/up/down within the same window bounds is much faster than typing or deleting a character.
;; HORIZONTAL RULER (snippet)
(setq posn-list
(if
(and
hr-prev-start
(= hr-prev-start start)
hr-prev-end
(= hr-prev-end end)
+-posn-list
(or
(eq +-this-command 'lawlist-left-char)
(eq +-this-command 'lawlist-right-char)
(eq +-this-command 'lawlist-previous-line)
(eq +-this-command 'lawlist-next-line)
(eq +-this-command 'lawlist-forward-entity)
(eq +-this-command 'lawlist-backward-entity)
(eq +-this-command 'lawlist-forward-paragraph)
(eq +-this-command 'lawlist-backward-paragraph)
(eq +-this-command 'lawlist-end-of-visual-line)
(eq +-this-command 'lawlist-beginning-of-visual-line)))
+-posn-list
(posn start end vcol)))
The vertical ruler (on an idle timer) will use the previously recorded list of calculations under a few limited circumstances.
;; VERTICAL RULER (snippet)
(setq posn-list
(if
(or
(not +-posn-list)
(and
(not force)
(memq last-command '(
special-yank
special-copy-selected-region
copy-selected-region
delete-word-or-whitespace
delete-forward-char
lawlist-backward-delete-char-untabify
lawlist-beginning-of-buffer
lawlist-end-of-buffer
beginning-of-buffer
end-of-buffer
scroll-up
scroll-down
lawlist-super-scroll-up
lawlist-super-scroll-down
lawlist-scroll-up
lawlist-scroll-down
lawlist-left-char
lawlist-right-char
left-char
right-char
lawlist-previous-line
lawlist-next-line
previous-line
next-line
lawlist-forward-entity
lawlist-backward-entity
lawlist-forward-paragraph
lawlist-backward-paragraph
forward-paragraph
backward-paragraph
lawlist-end-of-visual-line
lawlist-beginning-of-visual-line
end-of-visual-line
beginning-of-visual-line))))
(posn start end vcol)
+-posn-list))
> Finally, wouldn't running from pre-command-hook solve the problem?
> The values of window-start and window-end are known by then, and you
> can record the old values to compare them against new, to know when
> they change. No?
Basically any change to the text requires some type of recalculation -- e.g., line got shorter/longer, block of test was deleted/pasted.
Keith
This bug report was last modified 9 years and 97 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.