Make image-dired-display-image-mode inherit from image-mode

* lisp/image-dired.el (image-dired-display-image-mode):
Inherit from 'image-mode'.  (Bug#10758)
(image-dired-display-image): Don't generate a temporary image, which
is no longer needed with the above change.
(image-dired-display-thumbnail-original-image)
(image-dired-dired-display-image)
(image-dired-mouse-display-image): Simplify.

(image-dired-temp-image-file)
(image-dired-cmd-create-temp-image-program)
(image-dired-cmd-create-temp-image-options)
(image-dired-display-window-width-correction)
(image-dired-display-window-height-correction)
(image-dired-display-window-width)
(image-dired-display-window-height)
(image-dired-display-current-image-full)
(image-dired-display-current-image-sized)
(image-dired-window-height-pixels): Make obsolete.
(image-dired-create-display-image-buffer): Make into obsolete
function alias for 'ignore'.
(image-dired-display-image-mode-map): Simplify by removing things
duplicated from `image-mode-map'.  Disable some commands from
`image-mode-map' that doesn't make sense for Image-Dired.
(image-dired-display-image-mode-menu): Remove menu, as it no longer
contains anything useful.
(image-dired-minor-mode):
* doc/emacs/dired.texi (Image-Dired): Update documentation for the
above change.
This commit is contained in:
Stefan Kangas 2021-11-04 02:05:29 +01:00
parent bf953694ad
commit 73a6c8f98f
3 changed files with 141 additions and 175 deletions

View file

@ -1512,10 +1512,9 @@ thumbnails are generated in the background and are loaded as they
become available.
With point in the thumbnail buffer, you can type @key{RET}
(@code{image-dired-display-thumbnail-original-image}) to display a
sized version of it in another window. This sizes the image to fit
the window. Use the arrow keys to move around in the buffer. For
easy browsing, use @key{SPC}
(@code{image-dired-display-thumbnail-original-image}) to display the
image in another window. Use the arrow keys to move around in the
thumbnail buffer. For easy browsing, use @key{SPC}
(@code{image-dired-display-next-thumbnail-original}) to advance and
display the next image. Typing @key{DEL}
(@code{image-dired-display-previous-thumbnail-original}) backs up to

View file

@ -235,6 +235,21 @@ as opposed to via the command-line.
** Image-Dired
+++
*** 'image-dired-display-image-mode' is now based on 'image-mode'.
This avoids converting images in the background, and makes Image-Dired
noticeably faster. New keybindings from 'image-mode' are now
available in the "*image-dired-display-image*" buffer; press '?' or
'h' in that buffer to see the full list. Finally, some commands and
user options that are no longer needed are now obsolete:
'image-dired-cmd-create-temp-image-options',
'image-dired-cmd-create-temp-image-program',
'image-dired-display-current-image-full',
'image-dired-display-current-image-sized',
'image-dired-display-window-height-correction',
'image-dired-display-window-width-correction',
'image-dired-temp-image-file'.
---
*** Reduce dependency on external "exiftool" command.
The 'image-dired-copy-with-exif-file-name' no longer requires an

View file

@ -100,8 +100,6 @@
;; * WARNING: The "database" format used might be changed so keep a
;; backup of `image-dired-db-file' when testing new versions.
;;
;; * `image-dired-display-image-mode' does not support animation.
;;
;; TODO
;; ====
;;
@ -224,11 +222,6 @@ https://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html
"Database file where file names and their associated tags are stored."
:type 'file)
(defcustom image-dired-temp-image-file
(expand-file-name ".image-dired_temp" image-dired-dir)
"Name of temporary image file used by various commands."
:type 'file)
(defcustom image-dired-gallery-dir
(expand-file-name ".image-dired_gallery" image-dired-dir)
"Directory to store generated gallery html pages.
@ -275,27 +268,6 @@ which is replaced by the file name of the thumbnail file."
:version "29.1"
:type '(repeat (string :tag "Argument")))
(defcustom image-dired-cmd-create-temp-image-program
(if (executable-find "gm") "gm" "convert")
"Executable used to create temporary image.
Used together with `image-dired-cmd-create-temp-image-options'."
:type 'file
:version "29.1")
(defcustom image-dired-cmd-create-temp-image-options
(let ((opts '("-size" "%wx%h" "%f[0]"
"-resize" "%wx%h>"
"-strip" "jpeg:%t")))
(if (executable-find "gm") (cons "convert" opts) opts))
"Options of command used to create temporary image for display window.
Used together with `image-dired-cmd-create-temp-image-program',
Available format specifiers are: %w and %h which are replaced by
the calculated max size for width and height in the image display window,
%f which is replaced by the file name of the original image and %t which
is replaced by the file name of the temporary file."
:version "29.1"
:type '(repeat (string :tag "Argument")))
(defcustom image-dired-cmd-pngnq-program
;; Prefer pngquant to pngnq-s9 as it is faster on my machine.
;; The project also seems more active than the alternatives.
@ -498,18 +470,6 @@ and No line-up means that no automatic line-up will be done."
"Number of thumbnails to display per row in thumb buffer."
:type 'integer)
(defcustom image-dired-display-window-width-correction 1
"Number to be used to correct image display window width.
Change if the default (1) does not work (i.e. if the image does not
completely fit)."
:type 'integer)
(defcustom image-dired-display-window-height-correction 0
"Number to be used to correct image display window height.
Change if the default (0) does not work (i.e. if the image does not
completely fit)."
:type 'integer)
(defcustom image-dired-track-movement t
"The current state of the tracking and mirroring.
For more information, see the documentation for
@ -1003,15 +963,6 @@ Otherwise, delete overlays."
(defvar image-dired-display-image-buffer "*image-dired-display-image*"
"Where larger versions of the images are display.")
(defun image-dired-create-display-image-buffer ()
"Create image display buffer and set `image-dired-display-image-mode'."
(let ((buf (get-buffer-create image-dired-display-image-buffer)))
(with-current-buffer buf
(setq buffer-read-only t)
(if (not (eq major-mode 'image-dired-display-image-mode))
(image-dired-display-image-mode)))
buf))
(defvar image-dired-saved-window-configuration nil
"Saved window configuration.")
@ -1035,7 +986,7 @@ The current window configuration is saved and can be restored by
calling `image-dired-restore-window-configuration'."
(interactive "DDirectory: \nP")
(let ((buf (image-dired-create-thumbnail-buffer))
(buf2 (image-dired-create-display-image-buffer)))
(buf2 (get-buffer-create image-dired-display-image-buffer)))
(setq image-dired-saved-window-configuration
(current-window-configuration))
(dired dir)
@ -1713,59 +1664,19 @@ You probably want to use this together with
(defvar image-dired-display-image-mode-map
(let ((map (make-sparse-keymap)))
;; `image-mode-map' has bindings that do not make sense in image-dired
;; (set-keymap-parent map image-mode-map)
(define-key map "f" 'image-dired-display-current-image-full)
(define-key map "s" 'image-dired-display-current-image-sized)
(define-key map "g" nil)
;; Useful bindings from `image-mode-map'
(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)
(define-key map [remap left-char] 'image-backward-hscroll)
(define-key map [remap previous-line] 'image-previous-line)
(define-key map [remap next-line] 'image-next-line)
(define-key map [remap scroll-up] 'image-scroll-up)
(define-key map [remap scroll-down] 'image-scroll-down)
(define-key map [remap scroll-up-command] 'image-scroll-up)
(define-key map [remap scroll-down-command] 'image-scroll-down)
(define-key map [remap scroll-left] 'image-scroll-left)
(define-key map [remap scroll-right] 'image-scroll-right)
(define-key map [remap move-beginning-of-line] 'image-bol)
(define-key map [remap move-end-of-line] 'image-eol)
(define-key map [remap beginning-of-buffer] 'image-bob)
(define-key map [remap end-of-buffer] 'image-eob)
;; Disable keybindings from `image-mode-map' that doesn't make sense here.
(define-key map "o" nil) ; image-save
(define-key map "n" nil) ; image-next-file
(define-key map "p" nil) ; image-previous-file
;; FIXME: Should be replaced with image-dired commands.
(define-key map (kbd "DEL") nil) ; image-next-file
(define-key map (kbd "SPC") nil) ; image-next-file
;; FIXME: Should be replaced with image-dired commands.
(define-key map "m" nil) ; image-mode-mark-file
(define-key map "u" nil) ; image-mode-unmark-file
map)
"Keymap for `image-dired-display-image-mode'.")
(easy-menu-define image-dired-display-image-mode-menu image-dired-display-image-mode-map
"Menu for `image-dired-display-image-mode-map'."
'("Image-Dired"
["Display original, full size" image-dired-display-current-image-full]
["Display original, sized to fit" image-dired-display-current-image-sized]
["Quit" quit-window]))
(defun image-dired-display-current-image-full ()
"Display current image in full size."
(interactive)
(let ((file (image-dired-original-file-name)))
(if file
(progn
(image-dired-display-image file t)
(message "Full size image displayed"))
(error "No original file name at point"))))
(defun image-dired-display-current-image-sized ()
"Display current image in sized to fit window dimensions."
(interactive)
(let ((file (image-dired-original-file-name)))
(if file
(progn
(image-dired-display-image file)
(message "Fitted image displayed"))
(error "No original file name at point"))))
(define-derived-mode image-dired-thumbnail-mode
special-mode "image-dired-thumbnail"
"Browse and manipulate thumbnail images using Dired.
@ -1777,13 +1688,11 @@ Use `image-dired-minor-mode' to get a nice setup."
(setq-local line-spacing (frame-char-width)))
(define-derived-mode image-dired-display-image-mode
special-mode "image-dired-image-display"
image-mode "image-dired-image-display"
"Mode for displaying and manipulating original image.
Resized or in full-size."
(buffer-disable-undo)
(image-mode-setup-winprops)
(setq cursor-type nil)
(add-hook 'file-name-at-point-functions 'image-dired-file-name-at-point nil t))
:interactive nil
(add-hook 'file-name-at-point-functions #'image-dired-file-name-at-point nil t))
(defvar image-dired-minor-mode-map
(let ((map (make-sparse-keymap)))
@ -1843,7 +1752,7 @@ Resized or in full-size."
(define-minor-mode image-dired-minor-mode
"Setup easy-to-use keybindings for the commands to be used in Dired mode.
Note that n, p and <down> and <up> will be hijacked and bound to
`image-dired-dired-x-line'."
`image-dired-dired-next-line' and `image-dired-dired-previous-line'."
:keymap image-dired-minor-mode-map)
(declare-function clear-image-cache "image.c" (&optional filter))
@ -2006,11 +1915,6 @@ Ask user how many thumbnails should be displayed per row."
"Calculate WINDOW width in pixels."
(* (window-width window) (frame-char-width)))
(defun image-dired-window-height-pixels (window)
"Calculate WINDOW height in pixels."
;; Note: The mode-line consumes one line
(* (- (window-height window) 1) (frame-char-height)))
(defun image-dired-display-window ()
"Return window where `image-dired-display-image-buffer' is visible."
(get-window-with-predicate
@ -2036,61 +1940,24 @@ Ask user how many thumbnails should be displayed per row."
(equal (window-buffer window) buf))))
(error "No thumbnail image at point"))))
(defun image-dired-display-window-width (window)
"Return width, in pixels, of WINDOW."
(- (image-dired-window-width-pixels window)
image-dired-display-window-width-correction))
(defun image-dired-display-window-height (window)
"Return height, in pixels, of WINDOW."
(- (image-dired-window-height-pixels window)
image-dired-display-window-height-correction))
(defun image-dired-display-image (file &optional original-size)
(defun image-dired-display-image (file &optional _ignored)
"Display image FILE in image buffer.
Use this when you want to display the image, semi sized, in a new
window. The image is sized to fit the display window (using a
temporary file, don't worry). Because of this, it will not be as
quick as opening it directly, but on most modern systems it
should feel snappy enough.
If optional argument ORIGINAL-SIZE is non-nil, display image in its
original size."
(image-dired--check-executable-exists
'image-dired-cmd-create-temp-image-program)
(let ((new-file (expand-file-name image-dired-temp-image-file))
(window (image-dired-display-window))
(image-type 'jpeg))
(setq file (expand-file-name file))
(when (not (file-exists-p file))
(error "No such file: %s" file))
(if (not original-size)
(let* ((spec
(list
(cons ?p image-dired-cmd-create-temp-image-program)
(cons ?w (image-dired-display-window-width window))
(cons ?h (image-dired-display-window-height window))
(cons ?f file)
(cons ?t new-file)))
(ret
(apply #'call-process
image-dired-cmd-create-temp-image-program nil nil nil
(mapcar
(lambda (arg) (format-spec arg spec))
image-dired-cmd-create-temp-image-options))))
(when (not (zerop ret))
(error "Could not resize image")))
(setq image-type (image-type-from-file-name file))
(copy-file file new-file t))
(with-current-buffer (image-dired-create-display-image-buffer)
(let ((inhibit-read-only t))
(erase-buffer)
(clear-image-cache)
(image-dired-insert-image image-dired-temp-image-file image-type 0 0)
(goto-char (point-min))
(set-window-vscroll window 0)
(set-window-hscroll window 0)
(image-dired-update-property 'original-file-name file)))))
Use this when you want to display the image, in a new window.
The window will use `image-dired-display-image-mode' which is
based on `image-mode'."
(declare (advertised-calling-convention (file) "29.1"))
(setq file (expand-file-name file))
(when (not (file-exists-p file))
(error "No such file: %s" file))
(let ((buf (get-buffer image-dired-display-image-buffer))
(cur-win (selected-window)))
(when buf
(kill-buffer buf))
(when-let ((buf (find-file-other-window file)))
(display-buffer buf)
(rename-buffer image-dired-display-image-buffer)
(image-dired-display-image-mode)
(select-window cur-win))))
(defun image-dired-display-thumbnail-original-image (&optional arg)
"Display current thumbnail's original image in display buffer.
@ -2104,8 +1971,6 @@ With prefix argument ARG, display image in its original size."
(message "No thumbnail at point")
(if (not file)
(message "No original file name found")
(image-dired-create-display-image-buffer)
(display-buffer image-dired-display-image-buffer)
(image-dired-display-image file arg))))))
@ -2115,8 +1980,6 @@ With prefix argument ARG, display image in its original size."
See documentation for `image-dired-display-image' for more information.
With prefix argument ARG, display image in its original size."
(interactive "P")
(image-dired-create-display-image-buffer)
(display-buffer image-dired-display-image-buffer)
(image-dired-display-image (dired-get-filename) arg))
(defun image-dired-image-at-point-p ()
@ -2410,8 +2273,6 @@ non-nil."
(when file
(if image-dired-track-movement
(image-dired-track-original-file))
(image-dired-create-display-image-buffer)
(display-buffer image-dired-display-image-buffer)
(image-dired-display-image file))))
(defun image-dired-mouse-select-thumbnail (event)
@ -2859,6 +2720,72 @@ tags to their respective image file. Internal function used by
(define-obsolete-function-alias 'image-dired-setup-dired-keybindings
#'image-dired-minor-mode "26.1")
(defcustom image-dired-temp-image-file
(expand-file-name ".image-dired_temp" image-dired-dir)
"Name of temporary image file used by various commands."
:type 'file)
(make-obsolete-variable 'image-dired-temp-image-file
"no longer used." "29.1")
(defcustom image-dired-cmd-create-temp-image-program
(if (executable-find "gm") "gm" "convert")
"Executable used to create temporary image.
Used together with `image-dired-cmd-create-temp-image-options'."
:type 'file
:version "29.1")
(make-obsolete-variable 'image-dired-cmd-create-temp-image-program
"no longer used." "29.1")
(defcustom image-dired-cmd-create-temp-image-options
(let ((opts '("-size" "%wx%h" "%f[0]"
"-resize" "%wx%h>"
"-strip" "jpeg:%t")))
(if (executable-find "gm") (cons "convert" opts) opts))
"Options of command used to create temporary image for display window.
Used together with `image-dired-cmd-create-temp-image-program',
Available format specifiers are: %w and %h which are replaced by
the calculated max size for width and height in the image display window,
%f which is replaced by the file name of the original image and %t which
is replaced by the file name of the temporary file."
:version "29.1"
:type '(repeat (string :tag "Argument")))
(make-obsolete-variable 'image-dired-cmd-create-temp-image-options
"no longer used." "29.1")
(defcustom image-dired-display-window-width-correction 1
"Number to be used to correct image display window width.
Change if the default (1) does not work (i.e. if the image does not
completely fit)."
:type 'integer)
(make-obsolete-variable 'image-dired-display-window-width-correction
"no longer used." "29.1")
(defcustom image-dired-display-window-height-correction 0
"Number to be used to correct image display window height.
Change if the default (0) does not work (i.e. if the image does not
completely fit)."
:type 'integer)
(make-obsolete-variable 'image-dired-display-window-height-correction
"no longer used." "29.1")
(defun image-dired-display-window-width (window)
"Return width, in pixels, of WINDOW."
(declare (obsolete nil "29.1"))
(- (image-dired-window-width-pixels window)
image-dired-display-window-width-correction))
(defun image-dired-display-window-height (window)
"Return height, in pixels, of WINDOW."
(declare (obsolete nil "29.1"))
(- (image-dired-window-height-pixels window)
image-dired-display-window-height-correction))
(defun image-dired-window-height-pixels (window)
"Calculate WINDOW height in pixels."
(declare (obsolete nil "29.1"))
;; Note: The mode-line consumes one line
(* (- (window-height window) 1) (frame-char-height)))
(defcustom image-dired-cmd-read-exif-data-program "exiftool"
"Program used to read EXIF data to image.
Used together with `image-dired-cmd-read-exif-data-options'."
@ -2973,6 +2900,31 @@ Dired."
((eq command 'flag) (dired-flag-file-deletion 1)))
(image-dired-thumb-update-marks))))))
(defun image-dired-display-current-image-full ()
"Display current image in full size."
(declare (obsolete image-transform-original "29.1"))
(interactive nil image-dired-thumbnail-mode)
(let ((file (image-dired-original-file-name)))
(if file
(progn
(image-dired-display-image file)
(with-current-buffer image-dired-display-image-buffer
(image-mode-fit)))
(error "No original file name at point"))))
(defun image-dired-display-current-image-sized ()
"Display current image in sized to fit window dimensions."
(declare (obsolete image-mode-fit-frame "29.1"))
(interactive nil image-dired-thumbnail-mode)
(let ((file (image-dired-original-file-name)))
(if file
(progn
(image-dired-display-image file))
(error "No original file name at point"))))
(define-obsolete-function-alias 'image-dired-create-display-image-buffer
#'ignore "29.1")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;; TEST-SECTION ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;