X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/61655fd96ce959e47ad8d047387e5585843fc789..799d2f3d87185a51835d0594a89485932d0f4c23:/lisp/image-mode.el diff --git a/lisp/image-mode.el b/lisp/image-mode.el index ac090f020b..b75946475d 100644 --- a/lisp/image-mode.el +++ b/lisp/image-mode.el @@ -1,6 +1,6 @@ ;;; image-mode.el --- support for visiting image files -*- lexical-binding: t -*- ;; -;; Copyright (C) 2005-2013 Free Software Foundation, Inc. +;; Copyright (C) 2005-2014 Free Software Foundation, Inc. ;; ;; Author: Richard Stallman ;; Keywords: multimedia @@ -69,13 +69,17 @@ otherwise it defaults to t, used for times when the buffer is not displayed." image-mode-winprops-alist)))) (let ((winprops (assq window image-mode-winprops-alist))) ;; For new windows, set defaults from the latest. - (unless winprops + (if winprops + ;; Move window to front. + (setq image-mode-winprops-alist + (cons winprops (delq winprops image-mode-winprops-alist))) (setq winprops (cons window (copy-alist (cdar image-mode-winprops-alist)))) + ;; Add winprops before running the hook, to avoid inf-loops if the hook + ;; triggers window-configuration-change-hook. + (setq image-mode-winprops-alist + (cons winprops 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) @@ -86,6 +90,8 @@ otherwise it defaults to t, used for times when the buffer is not displayed." (defun image-mode-window-put (prop val &optional winprops) (unless (consp winprops) (setq winprops (image-mode-winprops winprops))) + (unless (eq t (car winprops)) + (image-mode-window-put prop val t)) (setcdr winprops (cons (cons prop val) (delq (assq prop (cdr winprops)) (cdr winprops))))) @@ -100,13 +106,16 @@ otherwise it defaults to t, used for times when the buffer is not displayed." (defun image-mode-reapply-winprops () ;; When set-window-buffer, set hscroll and vscroll to what they were ;; last time the image was displayed in this window. - (when (and (image-get-display-property) - (listp image-mode-winprops-alist)) + (when (listp image-mode-winprops-alist) + ;; Beware: this call to image-mode-winprops can't be optimized away, + ;; because it not only gets the winprops data but sets it up if needed + ;; (e.g. it's used by doc-view to display the image in a new window). (let* ((winprops (image-mode-winprops nil t)) (hscroll (image-mode-window-get 'hscroll winprops)) (vscroll (image-mode-window-get 'vscroll winprops))) - (if hscroll (set-window-hscroll (selected-window) hscroll)) - (if vscroll (set-window-vscroll (selected-window) vscroll))))) + (when (image-get-display-property) ;Only do it if we display an image! + (if hscroll (set-window-hscroll (selected-window) hscroll)) + (if vscroll (set-window-vscroll (selected-window) vscroll)))))) (defun image-mode-setup-winprops () ;; Record current scroll settings. @@ -325,9 +334,8 @@ call." ;;; Image Mode setup -(defvar image-type nil +(defvar-local image-type nil "The image type for the current Image mode buffer.") -(make-variable-buffer-local 'image-type) (defvar-local image-multi-frame nil "Non-nil if image for the current Image mode buffer has multiple frames.") @@ -348,6 +356,10 @@ call." (define-key map "b" 'image-previous-frame) (define-key map "n" 'image-next-file) (define-key map "p" 'image-previous-file) + (define-key map "a+" 'image-increase-speed) + (define-key map "a-" 'image-decrease-speed) + (define-key map "a0" 'image-reset-speed) + (define-key map "ar" 'image-reverse-speed) (define-key map [remap forward-char] 'image-forward-hscroll) (define-key map [remap backward-char] 'image-backward-hscroll) (define-key map [remap right-char] 'image-forward-hscroll) @@ -397,7 +409,6 @@ call." :help "Toggle image animation"] ["Loop Animation" (lambda () (interactive) -;;; (make-variable-buffer-local 'image-animate-loop) (setq image-animate-loop (not image-animate-loop)) ;; FIXME this is a hacky way to make it affect a currently ;; animating image. @@ -407,7 +418,23 @@ call." (image-toggle-animation))) :style toggle :selected image-animate-loop :active image-multi-frame - :help "Animate images once, or forever?"] + :help "Animate images once, or forever?"] + ["Reverse Animation" image-reverse-speed + :style toggle :selected (let ((image (image-get-display-property))) + (and image (< + (image-animate-get-speed image) + 0))) + :active image-multi-frame + :help "Reverse direction of this image's animation?"] + ["Speed Up Animation" image-increase-speed + :active image-multi-frame + :help "Speed up this image's animation"] + ["Slow Down Animation" image-decrease-speed + :active image-multi-frame + :help "Slow down this image's animation"] + ["Reset Animation Speed" image-reset-speed + :active image-multi-frame + :help "Reset the speed of this image's animation"] ["Next Frame" image-next-frame :active image-multi-frame :help "Show the next frame of this image"] ["Previous Frame" image-previous-frame :active image-multi-frame @@ -432,7 +459,10 @@ call." (defun image-mode () "Major mode for image files. You can use \\\\[image-toggle-display] -to toggle between display as an image and display as text." +to toggle between display as an image and display as text. + +Key bindings: +\\{image-mode-map}" (interactive) (condition-case err (progn @@ -457,8 +487,8 @@ to toggle between display as an image and display as text." (use-local-map image-mode-map) ;; Use our own bookmarking function for images. - (set (make-local-variable 'bookmark-make-record-function) - 'image-bookmark-make-record) + (setq-local bookmark-make-record-function + #'image-bookmark-make-record) ;; Keep track of [vh]scroll when switching buffers (image-mode-setup-winprops) @@ -557,7 +587,7 @@ on these modes." elt)) magic-fallback-mode-alist)))) (normal-mode) - (set (make-local-variable 'image-mode-previous-major-mode) major-mode))) + (setq-local image-mode-previous-major-mode major-mode))) ;; Restore `image-type' after `kill-all-local-variables' in `normal-mode'. (setq image-type previous-image-type) ;; Enable image minor mode with `C-c C-c'. @@ -637,9 +667,9 @@ was inserted." ;; is written with, e.g., C-x C-w. (if (coding-system-equal (coding-system-base buffer-file-coding-system) 'no-conversion) - (set (make-local-variable 'find-file-literally) t)) - ;; Allow navigation of large images - (set (make-local-variable 'auto-hscroll-mode) nil) + (setq-local find-file-literally t)) + ;; Allow navigation of large images. + (setq-local auto-hscroll-mode nil) (setq image-type type) (if (eq major-mode 'image-mode) (setq mode-name (format "Image[%s]" type))) @@ -698,6 +728,48 @@ Otherwise it plays once, then stops." (image-animate image index (if image-animate-loop t))))))))) +(defun image--set-speed (speed &optional multiply) + "Set speed of an animated image to SPEED. +If MULTIPLY is non-nil, treat SPEED as a multiplication factor. +If SPEED is `reset', reset the magnitude of the speed to 1." + (let ((image (image-get-display-property))) + (cond + ((null image) + (error "No image is present")) + ((null image-multi-frame) + (message "No image animation.")) + (t + (if (eq speed 'reset) + (setq speed (if (< (image-animate-get-speed image) 0) + -1 1) + multiply nil)) + (image-animate-set-speed image speed multiply) + ;; FIXME Hack to refresh an active image. + (when (image-animate-timer image) + (image-toggle-animation) + (image-toggle-animation)) + (message "Image speed is now %s" (image-animate-get-speed image)))))) + +(defun image-increase-speed () + "Increase the speed of current animated image by a factor of 2." + (interactive) + (image--set-speed 2 t)) + +(defun image-decrease-speed () + "Decrease the speed of current animated image by a factor of 2." + (interactive) + (image--set-speed 0.5 t)) + +(defun image-reverse-speed () + "Reverse the animation of the current image." + (interactive) + (image--set-speed -1 t)) + +(defun image-reset-speed () + "Reset the animation speed of the current image." + (interactive) + (image--set-speed 'reset)) + (defun image-goto-frame (n &optional relative) "Show frame N of a multi-frame image. Optional argument OFFSET non-nil means interpret N as relative to the