emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: window-scroll-functions called too often


From: Ryan Yeske
Subject: Re: window-scroll-functions called too often
Date: Thu, 07 Sep 2006 17:19:11 -0700

   I suggest you copy the method used by comint.
   It works.

Here is patch for a simplified version of the comint method.  It just
scrolls to keep the point at the bottom of the window on user input
and on incoming text.

2006-09-07  Ryan Yeske  <address@hidden>

        * rcirc.el (rcirc-scroll-show-maximum-output): Rename from
        rcirc-show-maximum-output.
        (rcirc-mode): Remove window-scroll-function hook.
        (rcirc-scroll-to-bottom): Remove function.
        (rcirc-print): Recenter so point stays at the bottom of the window
        if point was already there.

*** rcirc.el    05 Sep 2006 12:14:49 -0700      1.26
--- rcirc.el    07 Sep 2006 17:01:51 -0700      
***************
*** 142,148 ****
                 (integer :tag "Number of lines"))
    :group 'rcirc)
  
! (defcustom rcirc-show-maximum-output t
    "*If non-nil, scroll buffer to keep the point at the bottom of
  the window."
    :type 'boolean
--- 142,148 ----
                 (integer :tag "Number of lines"))
    :group 'rcirc)
  
! (defcustom rcirc-scroll-show-maximum-output t
    "*If non-nil, scroll buffer to keep the point at the bottom of
  the window."
    :type 'boolean
***************
*** 762,769 ****
    (add-hook 'change-major-mode-hook 'rcirc-change-major-mode-hook nil t)
    (add-hook 'kill-buffer-hook 'rcirc-kill-buffer-hook nil t)
  
-   (add-hook 'window-scroll-functions 'rcirc-scroll-to-bottom nil t)
- 
    ;; add to buffer list, and update buffer abbrevs
    (when target                                ; skip server buffer
      (let ((buffer (current-buffer)))
--- 762,767 ----
***************
*** 1166,1179 ****
  (defvar rcirc-last-sender nil)
  (make-variable-buffer-local 'rcirc-last-sender)
  
- (defun rcirc-scroll-to-bottom (window display-start)
-   "Scroll window to show maximum output if `rcirc-show-maximum-output' is
- non-nil."
-   (when rcirc-show-maximum-output
-     (with-selected-window window
-       (when (>= (window-point) rcirc-prompt-end-marker)
-       (recenter -1)))))
- 
  (defun rcirc-print (process sender response target text &optional activity)
    "Print TEXT in the buffer associated with TARGET.
  Format based on SENDER and RESPONSE.  If ACTIVITY is non-nil,
--- 1164,1169 ----
***************
*** 1252,1268 ****
  
          ;; set the window point for buffers show in windows
          (walk-windows (lambda (w)
!                         (unless (eq (selected-window) w)
!                           (when (and (eq (current-buffer)
!                                          (window-buffer w))
!                                      (>= (window-point w)
!                                          rcirc-prompt-end-marker))
!                             (set-window-point w (point-max)))))
                        nil t)
  
          ;; restore the point
          (goto-char (if moving rcirc-prompt-end-marker old-point))
  
          ;; flush undo (can we do something smarter here?)
          (buffer-disable-undo)
          (buffer-enable-undo))
--- 1242,1275 ----
  
          ;; set the window point for buffers show in windows
          (walk-windows (lambda (w)
!                         (when (and (not (eq (selected-window) w))
!                                    (eq (current-buffer)
!                                        (window-buffer w))
!                                    (>= (window-point w)
!                                        rcirc-prompt-end-marker))
!                             (set-window-point w (point-max))))
                        nil t)
  
          ;; restore the point
          (goto-char (if moving rcirc-prompt-end-marker old-point))
  
+         ;; keep window on bottom line if it was already there
+         (when rcirc-scroll-show-maximum-output
+           (walk-windows (lambda (w)
+                           (when (eq (window-buffer w) (current-buffer))
+                             (with-current-buffer (window-buffer w)
+                               (when (eq major-mode 'rcirc-mode)
+                                 (with-selected-window w
+                                   (when (<= (- (window-height) 
+                                                (- (line-number-at-pos
+                                                    (window-point))
+                                                   (line-number-at-pos
+                                                    (window-start)))
+                                                1)
+                                             0)
+                                     (recenter -1)))))))
+                                 nil t))
+ 
          ;; flush undo (can we do something smarter here?)
          (buffer-disable-undo)
          (buffer-enable-undo))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]