summaryrefslogtreecommitdiff
path: root/lisp/image/image-dired.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/image/image-dired.el')
-rw-r--r--lisp/image/image-dired.el103
1 files changed, 73 insertions, 30 deletions
diff --git a/lisp/image/image-dired.el b/lisp/image/image-dired.el
index 26d5811f159..9eb68e240fe 100644
--- a/lisp/image/image-dired.el
+++ b/lisp/image/image-dired.el
@@ -162,8 +162,27 @@ to use the Thumbnail Managing Standard; they will be saved in
`image-dired-thumbnail-storage'."
:type 'directory)
+(defcustom image-dired-thumb-naming 'sha1-filename
+ "How `image-dired' names thumbnail files.
+When set to `sha1-filename' the name of thumbnail is built by
+computing the SHA-1 of the full file name of the image.
+
+When set to `sha1-contents' the name of thumbnail is built by
+computing the SHA-1 of first 4KiB of the image contents (See
+`image-dired-contents-sha1').
+
+In both case, a \"jpg\" extension is appended to save as JPEG.
+
+The value of this option is ignored if Image-Dired is customized
+to use the Thumbnail Managing Standard or the per-directory
+thumbnails setting. See `image-dired-thumbnail-storage'."
+ :type '(choice :tag "How to name thumbnail files"
+ (const :tag "SHA-1 of the image file name" sha1-filename)
+ (const :tag "SHA-1 of the image contents" sha1-contents))
+ :version "30.1")
+
(defcustom image-dired-thumbnail-storage 'image-dired
- "How `image-dired' stores thumbnail files.
+ "Where `image-dired' stores thumbnail files.
There are three ways that Image-Dired can store and generate
thumbnails:
@@ -189,6 +208,9 @@ thumbnails:
Set this user option to `per-directory'.
+To control the naming of thumbnails for alternative (2) above,
+customize the value of `image-dired-thumb-naming'.
+
To control the default size of thumbnails for alternatives (2)
and (3) above, customize the value of `image-dired-thumb-size'.
@@ -197,7 +219,7 @@ format, as mandated by that standard; otherwise save them as JPEG.
For more information on the Thumbnail Managing Standard, see:
https://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html"
- :type '(choice :tag "How to store thumbnail files"
+ :type '(choice :tag "Where to store thumbnail files"
(const :tag "Use image-dired-dir" image-dired)
(const :tag "Thumbnail Managing Standard (normal 128x128)"
standard)
@@ -424,11 +446,10 @@ This affects the following commands:
(file-name-nondirectory thumb-file)))
thumb-file))
-(defun image-dired-insert-thumbnail ( file original-file-name
- associated-dired-buffer image-number)
+(defun image-dired-insert-thumbnail (file original-file-name
+ associated-dired-buffer)
"Insert thumbnail image FILE.
-Add text properties ORIGINAL-FILE-NAME, ASSOCIATED-DIRED-BUFFER
-and IMAGE-NUMBER."
+Add text properties ORIGINAL-FILE-NAME, ASSOCIATED-DIRED-BUFFER."
(let (beg end)
(setq beg (point))
(image-dired-insert-image
@@ -452,7 +473,6 @@ and IMAGE-NUMBER."
'keymap nil
'original-file-name original-file-name
'associated-dired-buffer associated-dired-buffer
- 'image-number image-number
'tags (image-dired-list-tags original-file-name)
'mouse-face 'highlight
'comment (image-dired-get-comment original-file-name)))))
@@ -570,7 +590,7 @@ used or not. If non-nil, use `display-buffer' instead of
`image-dired-previous-line-and-display' where we do not want the
thumbnail buffer to be selected."
(interactive "P" nil dired-mode)
- (setq image-dired--generate-thumbs-start (current-time))
+ (setq image-dired--generate-thumbs-start (current-time))
(let ((buf (image-dired-create-thumbnail-buffer))
files dired-buf)
(if arg
@@ -587,8 +607,8 @@ thumbnail buffer to be selected."
(dolist (file files)
(when (string-match-p (image-dired--file-name-regexp) file)
(image-dired-insert-thumbnail
- (image-dired--get-create-thumbnail-file file) file dired-buf
- (cl-incf image-dired--number-of-thumbnails)))))
+ (image-dired--get-create-thumbnail-file file) file dired-buf)
+ (cl-incf image-dired--number-of-thumbnails))))
(if (> image-dired--number-of-thumbnails 0)
(if do-not-pop
(display-buffer buf)
@@ -704,21 +724,22 @@ On reaching end or beginning of buffer, stop and show a message."
(not (if reverse (bobp) (eobp))))
(forward-char (if reverse -1 1))))
-(defmacro image-dired--movement-command (to &optional reverse)
- `(progn
- (goto-char ,to)
- (image-dired--movement-ensure-point-pos ,reverse)
- (when image-dired-track-movement
- (image-dired-track-original-file))
- (image-dired--update-header-line)))
-
-(defmacro image-dired--movement-command-line (&optional reverse)
- `(image-dired--movement-command
- (let ((goal-column (current-column)))
- (forward-line ,(if reverse -1 1))
- (move-to-column goal-column)
- (point))
- ,reverse))
+(defun image-dired--update-after-move (reverse)
+ "Book-keeping after move."
+ (image-dired--movement-ensure-point-pos reverse)
+ (when image-dired-track-movement
+ (image-dired-track-original-file))
+ (image-dired--update-header-line))
+
+(defun image-dired--movement-command (to &optional reverse)
+ (goto-char to)
+ (image-dired--update-after-move reverse))
+
+(defun image-dired--movement-command-line (&optional reverse)
+ (let ((goal-column (current-column)))
+ (forward-line (if reverse -1 1))
+ (move-to-column goal-column)
+ (image-dired--update-after-move reverse)))
(defun image-dired-next-line ()
"Move to next line in the thumbnail buffer."
@@ -750,6 +771,21 @@ On reaching end or beginning of buffer, stop and show a message."
(interactive nil image-dired-thumbnail-mode)
(image-dired--movement-command (pos-eol) 'reverse))
+(defun image-dired-scroll (&optional down)
+ "Scroll in the thumbnail buffer."
+ (let ((goal-column (current-column)))
+ (if down (scroll-down) (scroll-up))
+ (move-to-column goal-column)
+ (image-dired--update-after-move down)))
+
+(defun image-dired-scroll-up ()
+ (interactive nil image-dired-thumbnail-mode)
+ (image-dired-scroll))
+
+(defun image-dired-scroll-down ()
+ (interactive nil image-dired-thumbnail-mode)
+ (image-dired-scroll 'down))
+
;;; Header line
@@ -789,7 +825,10 @@ comment."
(let ((file-name (image-dired-original-file-name))
(dired-buf (buffer-name (image-dired-associated-dired-buffer)))
(image-count (format "%s/%s"
- (get-text-property (point) 'image-number)
+ ;; Line-up adds one space between two
+ ;; images: this formula takes this into
+ ;; account.
+ (1+ (/ (point) 2))
image-dired--number-of-thumbnails))
(props (string-join (get-text-property (point) 'tags) ", "))
(comment (get-text-property (point) 'comment))
@@ -957,6 +996,8 @@ You probably want to use this together with
"<remap> <end-of-buffer>" #'image-dired-end-of-buffer
"<remap> <move-beginning-of-line>" #'image-dired-move-beginning-of-line
"<remap> <move-end-of-line>" #'image-dired-move-end-of-line
+ "<remap> <scroll-up-command>" #'image-dired-scroll-up
+ "<remap> <scroll-down-command>" #'image-dired-scroll-down
:menu
'("Image-Dired"
@@ -1127,10 +1168,12 @@ With a negative prefix argument, prompt user for the delay."
"Remove current thumbnail from thumbnail buffer and line up."
(interactive nil image-dired-thumbnail-mode)
(let ((inhibit-read-only t))
- (delete-char 1))
+ (delete-char 1)
+ (cl-decf image-dired--number-of-thumbnails))
(let ((pos (point)))
(image-dired--line-up-with-method)
- (goto-char pos)))
+ (goto-char pos)
+ (image-dired--update-header-line)))
(defun image-dired-line-up ()
"Line up thumbnails according to `image-dired-thumbs-per-row'.
@@ -1880,8 +1923,8 @@ when using per-directory thumbnail file storage"))
(if (file-exists-p image-dired-gallery-dir)
(if (not (file-directory-p image-dired-gallery-dir))
(error "Variable image-dired-gallery-dir is not a directory"))
- ;; FIXME: Should we set umask to 077 here, as we do for thumbnails?
- (make-directory image-dired-gallery-dir))
+ (with-file-modes #o700
+ (make-directory image-dired-gallery-dir)))
;; Open index file
(with-temp-file index-file
(if (file-exists-p index-file)