]> git.eshelyaron.com Git - emacs.git/commitdiff
Extend [hv]scroll support to per-window properties.
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 21 Feb 2008 03:27:15 +0000 (03:27 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 21 Feb 2008 03:27:15 +0000 (03:27 +0000)
(image-mode-current-vscroll, image-mode-current-hscroll): Remove.
(image-mode-winprops-alist): New var to replace them.
(image-mode-new-window-functions): New hook.
(image-mode-winprops, image-mode-window-get, image-mode-window-put): New funs.
(image-set-window-vscroll, image-set-window-hscroll): Use them.
Remove the `window' argument, update callers.
(image-mode-reapply-winprops): Rename image-reset-current-vhscroll.
Use the new functions.
(image-mode-reapply-winprops): New fun.
(image-mode): Use it.

lisp/ChangeLog
lisp/image-mode.el

index 57760a0b66e06af789c9003056a74aac6a0828bb..72d97f777ac529b2abdadc7671495fbbb53301e9 100644 (file)
@@ -1,3 +1,18 @@
+2008-02-21  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * image-mode.el: Extend [hv]scroll support to per-window properties.
+       (image-mode-current-vscroll, image-mode-current-hscroll): Remove.
+       (image-mode-winprops-alist): New var to replace them.
+       (image-mode-new-window-functions): New hook.
+       (image-mode-winprops, image-mode-window-get, image-mode-window-put):
+       New funs.
+       (image-set-window-vscroll, image-set-window-hscroll): Use them.
+       Remove the `window' argument, update callers.
+       (image-mode-reapply-winprops): Rename image-reset-current-vhscroll.
+       Use the new functions.
+       (image-mode-reapply-winprops): New fun.
+       (image-mode): Use it.
+
 2008-02-20  Jay Belanger  <jay.p.belanger@gmail.com>
 
        * calc/calc-math.el (math-sin-raw): Add optional argument
 2008-02-20  Kenichi Handa  <handa@ni.aist.go.jp>
 
        * ps-mule.el (ps-mule-encode-region): Return a single string.
-       (ps-mule-plot-string): Adjusted for the above change.
+       (ps-mule-plot-string): Adjust for the above change.
        (ps-mule-encode-header-string): Likewise.
 
        * international/latin1-disp.el (latin1-display): Don't use
        ucs-mule-8859-to-mule-unicode.  Fix the way of resetting
        standard-display-table.
-       (latin1-display-identities): Adjusted for the change of what is
+       (latin1-display-identities): Adjust for the change of what is
        returned by (get-language-info charset 'charset).
 
        * international/mule-util.el (char-displayable-p): Fix for Latin-1
index 56dff23e9ba9bdd11dc3843bda1aabda6143ffcf..e518cc0e3b584f2a672f2504e5ef50111f2db754 100644 (file)
@@ -35,6 +35,7 @@
 ;;; Code:
 
 (require 'image)
+(eval-when-compile (require 'cl))
 
 ;;;###autoload (push '("\\.jpe?g\\'"    . image-mode) auto-mode-alist)
 ;;;###autoload (push '("\\.png\\'"      . image-mode) auto-mode-alist)
 ;;;###autoload (push '("\\.svgz?\\'"    . xml-mode)   auto-mode-alist)
 ;;;###autoload (push '("\\.svgz?\\'"    . image-mode-maybe) auto-mode-alist)
 
-;;; Image scrolling functions
-
-(defvar image-mode-current-vscroll nil
-  "An alist with elements (WINDOW . VSCROLL).")
-(make-variable-buffer-local 'image-mode-current-vscroll)
-
-(defvar image-mode-current-hscroll nil
-  "An alist with elements (WINDOW . HSCROLL).")
-(make-variable-buffer-local 'image-mode-current-hscroll)
-
-(defun image-set-window-vscroll (window vscroll &optional pixels-p)
-  (setq image-mode-current-vscroll
-       (cons (cons window vscroll)
-              (delq (assq window image-mode-current-vscroll)
-                    image-mode-current-vscroll)))
-  (set-window-vscroll window vscroll pixels-p))
-
-(defun image-set-window-hscroll (window ncol)
-  (setq image-mode-current-hscroll
-       (cons (cons window ncol)
-              (delq (assq window image-mode-current-hscroll)
-                    image-mode-current-hscroll)))
-  (set-window-hscroll window ncol))
-
-(defun image-reset-current-vhscroll ()
+;;; Image mode window-info management.
+
+(defvar image-mode-winprops-alist t)
+(make-variable-buffer-local 'image-mode-winprops-alist)
+
+(defvar image-mode-new-window-functions nil
+  "Special hook run when image data is requested in a new window.
+It is called with one argument, the initial WINPROPS.")
+
+(defun image-mode-winprops (&optional window)
+  "Return winprops of WINDOW.
+A winprops object has the shape (WINDOW . ALIST)."
+  (unless window (setq window (selected-window)))
+  (let ((winprops (assq window image-mode-winprops-alist)))
+    ;; For new windows, set defaults from the latest.
+    (unless winprops
+      (setq winprops (cons window
+                           (copy-alist (cdar image-mode-winprops-alist))))
+      (run-hook-with-args 'image-mode-new-window-functions winprops))
+    ;; Move window to front.
+    (setq image-mode-winprops-alist
+          (cons winprops (delq winprops image-mode-winprops-alist)))
+    winprops))
+
+(defun image-mode-window-get (prop &optional winprops)
+  (unless (consp winprops) (setq winprops (image-mode-winprops winprops)))
+  (cdr (assq prop (cdr winprops))))
+
+(defsetf image-mode-window-get (prop &optional winprops) (val)
+  `(image-mode-window-put ,prop ,val ,winprops))
+
+(defun image-mode-window-put (prop val &optional winprops)
+  (unless (consp winprops) (setq winprops (image-mode-winprops winprops)))
+  (setcdr winprops (cons (cons prop val)
+                         (delq (assq prop (cdr winprops)) (cdr winprops)))))
+
+(defun image-set-window-vscroll (vscroll)
+  (setf (image-mode-window-get 'vscroll) vscroll)
+  (set-window-vscroll (selected-window) vscroll))
+
+(defun image-set-window-hscroll (ncol)
+  (setf (image-mode-window-put 'hscroll) ncol)
+  (set-window-hscroll (selected-window) ncol))
+
+(defun image-mode-reapply-winprops ()
   (walk-windows
    (lambda (win)
      (with-current-buffer (window-buffer win)
        ;; When set-window-buffer, set hscroll and vscroll to what they were
-       ;; last time the image was displayed in this window.  If it's the first
-       ;; time it's displayed in this window, use the most recent setting.
-       (when image-mode-current-hscroll
-         (set-window-hscroll win (cdr (or (assoc win image-mode-current-hscroll)
-                                          (car image-mode-current-hscroll)))))
-       (when image-mode-current-vscroll
-         (set-window-vscroll win (cdr (or (assoc win image-mode-current-vscroll)
-                                          (car image-mode-current-vscroll)))))))
+       ;; last time the image was displayed in this window.
+       (when (listp image-mode-winprops-alist)
+         (let* ((winprops (image-mode-winprops win))
+                (hscroll (image-mode-window-get 'hscroll winprops))
+                (vscroll (image-mode-window-get 'vscroll winprops)))
+           (if hscroll (set-window-hscroll win hscroll))
+           (if vscroll (set-window-vscroll win vscroll))))))
    'nomini
    (selected-frame)))
 
+(defun image-mode-setup-winprops ()
+  ;; Record current scroll settings.
+  (unless (listp image-mode-winprops-alist)
+    (setq image-mode-winprops-alist nil))
+  (add-hook 'window-configuration-change-hook
+           'image-mode-reapply-winprops nil t))
+
+;;; Image scrolling functions
+
 (defun image-get-display-property ()
   (get-char-property (point-min) 'display
                      ;; There might be different images for different displays.
@@ -100,15 +129,13 @@ Stop if the right edge of the image is reached."
   (interactive "p")
   (cond ((= n 0) nil)
        ((< n 0)
-        (image-set-window-hscroll (selected-window)
-                                  (max 0 (+ (window-hscroll) n))))
+        (image-set-window-hscroll (max 0 (+ (window-hscroll) n))))
        (t
         (let* ((image (image-get-display-property))
                (edges (window-inside-edges))
                (win-width (- (nth 2 edges) (nth 0 edges)))
                (img-width (ceiling (car (image-size image)))))
-          (image-set-window-hscroll (selected-window)
-                                    (min (max 0 (- img-width win-width))
+          (image-set-window-hscroll (min (max 0 (- img-width win-width))
                                          (+ n (window-hscroll))))))))
 
 (defun image-backward-hscroll (&optional n)
@@ -123,15 +150,13 @@ Stop if the bottom edge of the image is reached."
   (interactive "p")
   (cond ((= n 0) nil)
        ((< n 0)
-        (image-set-window-vscroll (selected-window)
-                                  (max 0 (+ (window-vscroll) n))))
+        (image-set-window-vscroll (max 0 (+ (window-vscroll) n))))
        (t
         (let* ((image (image-get-display-property))
                (edges (window-inside-edges))
                (win-height (- (nth 3 edges) (nth 1 edges)))
                (img-height (ceiling (cdr (image-size image)))))
-          (image-set-window-vscroll (selected-window)
-                                    (min (max 0 (- img-height win-height))
+          (image-set-window-vscroll (min (max 0 (- img-height win-height))
                                          (+ n (window-vscroll))))))))
 
 (defun image-previous-line (&optional n)
@@ -190,7 +215,7 @@ stopping if the top or bottom edge of the image is reached."
   (and arg
        (/= (setq arg (prefix-numeric-value arg)) 1)
        (image-next-line (- arg 1)))
-  (image-set-window-hscroll (selected-window) 0))
+  (image-set-window-hscroll 0))
 
 (defun image-eol (arg)
   "Scroll horizontally to the right edge of the image in the current window.
@@ -204,14 +229,13 @@ stopping if the top or bottom edge of the image is reached."
         (edges (window-inside-edges))
         (win-width (- (nth 2 edges) (nth 0 edges)))
         (img-width (ceiling (car (image-size image)))))
-    (image-set-window-hscroll (selected-window)
-                             (max 0 (- img-width win-width)))))
+    (image-set-window-hscroll (max 0 (- img-width win-width)))))
 
 (defun image-bob ()
   "Scroll to the top-left corner of the image in the current window."
   (interactive)
-  (image-set-window-hscroll (selected-window) 0)
-  (image-set-window-vscroll (selected-window) 0))
+  (image-set-window-hscroll 0)
+  (image-set-window-vscroll 0))
 
 (defun image-eob ()
   "Scroll to the bottom-right corner of the image in the current window."
@@ -222,8 +246,8 @@ stopping if the top or bottom edge of the image is reached."
         (img-width (ceiling (car (image-size image))))
         (win-height (- (nth 3 edges) (nth 1 edges)))
         (img-height (ceiling (cdr (image-size image)))))
-    (image-set-window-hscroll (selected-window) (max 0 (- img-width win-width)))
-    (image-set-window-vscroll (selected-window) (max 0 (- img-height win-height)))))
+    (image-set-window-hscroll (max 0 (- img-width win-width)))
+    (image-set-window-vscroll (max 0 (- img-height win-height)))))
 
 ;;; Image Mode setup
 
@@ -270,10 +294,7 @@ to toggle between display as an image and display as text."
        'image-bookmark-make-cell)
 
   ;; Keep track of [vh]scroll when switching buffers
-  (image-set-window-hscroll (selected-window) (window-hscroll))
-  (image-set-window-vscroll (selected-window) (window-vscroll))
-  (add-hook 'window-configuration-change-hook
-           'image-reset-current-vhscroll nil t)
+  (image-mode-setup-winprops)
 
   (add-hook 'change-major-mode-hook 'image-toggle-display-text nil t)
   (if (and (display-images-p)