]> code.delx.au - gnu-emacs/blobdiff - lisp/thumbs.el
(nnmail-extra-headers): Add defvar.
[gnu-emacs] / lisp / thumbs.el
index 1fbf2d224a2143ee7bd4e4c5cc4df7fbbaa839af..0fa448d4d7a1e5aa8f8e7fac78e6837938344704 100644 (file)
@@ -1,6 +1,6 @@
 ;;; thumbs.el --- Thumbnails previewer for images files
 
 ;;; thumbs.el --- Thumbnails previewer for images files
 
-;; Copyright 2004 Free Software Foundation, Inc
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
 
 ;; Author: Jean-Philippe Theberge <jphiltheberge@videotron.ca>
 ;; Keywords: Multimedia
 
 ;; Author: Jean-Philippe Theberge <jphiltheberge@videotron.ca>
 ;; Keywords: Multimedia
@@ -19,9 +19,9 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-;;              
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+;;
 ;; Thanks: Alex Schroeder <alex@gnu.org> for maintaining the package at some time
 ;;         The peoples at #emacs@freenode.net for numerous help
 ;;         RMS for emacs and the GNU project.
 ;; Thanks: Alex Schroeder <alex@gnu.org> for maintaining the package at some time
 ;;         The peoples at #emacs@freenode.net for numerous help
 ;;         RMS for emacs and the GNU project.
@@ -30,8 +30,8 @@
 ;;; Commentary:
 
 ;; This package create two new mode: thumbs-mode and
 ;;; Commentary:
 
 ;; This package create two new mode: thumbs-mode and
-;; thumbs-view-image-mode. It is used for images browsing and viewing
-;; from within emacs. Minimal image manipulation functions are also
+;; thumbs-view-image-mode.  It is used for images browsing and viewing
+;; from within Emacs.  Minimal image manipulation functions are also
 ;; available via external programs.
 ;;
 ;; The 'convert' program from 'ImageMagick'
 ;; available via external programs.
 ;;
 ;; The 'convert' program from 'ImageMagick'
 
 (defgroup thumbs nil
   "Thumbnails previewer."
 
 (defgroup thumbs nil
   "Thumbnails previewer."
+  :version "22.1"
   :group 'multimedia)
 
   :group 'multimedia)
 
-(defcustom thumbs-thumbsdir
-  (expand-file-name "~/.emacs-thumbs")
+(defcustom thumbs-thumbsdir "~/.emacs-thumbs"
   "*Directory to store thumbnails."
   :type 'directory
   :group 'thumbs)
   "*Directory to store thumbnails."
   :type 'directory
   :group 'thumbs)
 
 (defcustom thumbs-per-line 5
   "*Number of thumbnails per line to show in directory."
 
 (defcustom thumbs-per-line 5
   "*Number of thumbnails per line to show in directory."
-  :type 'string
+  :type 'integer
   :group 'thumbs)
 
 (defcustom thumbs-thumbsdir-max-size 50000000
   "Max size for thumbnails directory.
   :group 'thumbs)
 
 (defcustom thumbs-thumbsdir-max-size 50000000
   "Max size for thumbnails directory.
-When it reach that size (in bytes), a warning is send."
-  :type 'string
+When it reaches that size (in bytes), a warning is sent."
+  :type 'integer
   :group 'thumbs)
 
 (defcustom thumbs-conversion-program
   :group 'thumbs)
 
 (defcustom thumbs-conversion-program
-  (if (equal 'windows-nt system-type)
+  (if (eq system-type 'windows-nt)
       "convert.exe"
     (or (executable-find "convert")
        "/usr/X11R6/bin/convert"))
       "convert.exe"
     (or (executable-find "convert")
        "/usr/X11R6/bin/convert"))
@@ -104,32 +104,31 @@ It must be 'convert'."
 
 (defcustom thumbs-relief 5
   "*Size of button-like border around thumbnails."
 
 (defcustom thumbs-relief 5
   "*Size of button-like border around thumbnails."
-  :type 'string
+  :type 'integer
   :group 'thumbs)
 
 (defcustom thumbs-margin 2
   "*Size of the margin around thumbnails.
 This is where you see the cursor."
   :group 'thumbs)
 
 (defcustom thumbs-margin 2
   "*Size of the margin around thumbnails.
 This is where you see the cursor."
-  :type 'string
+  :type 'integer
   :group 'thumbs)
 
 (defcustom thumbs-thumbsdir-auto-clean t
   "If set, delete older file in the thumbnails directory.
 Deletion is done at load time when the directory size is bigger
   :group 'thumbs)
 
 (defcustom thumbs-thumbsdir-auto-clean t
   "If set, delete older file in the thumbnails directory.
 Deletion is done at load time when the directory size is bigger
-than 'thumbs-thumbsdir-max-size'."
+than `thumbs-thumbsdir-max-size'."
   :type 'boolean
   :group 'thumbs)
 
 (defcustom thumbs-image-resizing-step 10
   :type 'boolean
   :group 'thumbs)
 
 (defcustom thumbs-image-resizing-step 10
-  "Step by wich to resize image."
-  :type 'string
+  "Step by which to resize image."
+  :type 'integer
   :group 'thumbs)
 
   :group 'thumbs)
 
-(defcustom thumbs-temp-dir
-  "/tmp/"
+(defcustom thumbs-temp-dir temporary-file-directory
   "Temporary directory to use.
   "Temporary directory to use.
-Leaving it to default '/tmp/' can let another user
-see some of your images."
+Defaults to `temporary-file-directory'.  Leaving it to
+this value can let another user see some of your images."
   :type 'directory
   :group 'thumbs)
 
   :type 'directory
   :group 'thumbs)
 
@@ -139,56 +138,66 @@ see some of your images."
   :group 'thumbs)
 
 ;; Initialize some variable, for later use.
   :group 'thumbs)
 
 ;; Initialize some variable, for later use.
-(defvar thumbs-temp-file
-  (concat thumbs-temp-dir thumbs-temp-prefix)
-  "Temporary filesname for images.")
-
-(defvar thumbs-current-tmp-filename
-  nil
+(defvar thumbs-current-tmp-filename nil
   "Temporary filename of current image.")
   "Temporary filename of current image.")
-(defvar thumbs-current-image-filename
-  nil
+(make-variable-buffer-local 'thumbs-current-tmp-filename)
+
+(defvar thumbs-current-image-filename nil
   "Filename of current image.")
   "Filename of current image.")
-(defvar thumbs-current-image-size
-  nil
-  "Size of current image.")
-(defvar thumbs-image-num
-  nil
-  "Number of current image.")
-(defvar thumbs-current-dir
-  nil
-  "Current directory.")
-(defvar thumbs-markedL
-  nil
-  "List of marked files.")
+(make-variable-buffer-local 'thumbs-current-image-filename)
 
 
-;; Make sure auto-image-file-mode is ON.
-(auto-image-file-mode t)
+(defvar thumbs-current-image-size nil
+  "Size of current image.")
 
 
-;; Create the thumbs directory if it does not exists.
-(setq thumbs-thumbsdir (expand-file-name thumbs-thumbsdir))
+(defvar thumbs-image-num nil
+  "Number of current image.")
+(make-variable-buffer-local 'thumbs-image-num)
 
 
-(when (not (file-directory-p thumbs-thumbsdir))
-  (progn
-    (make-directory thumbs-thumbsdir)
-    (message "Creating thumbnails directory")))
+(defvar thumbs-current-dir nil
+  "Current directory.")
 
 
-(defvar thumbs-gensym-counter 0)
+(defvar thumbs-markedL nil
+  "List of marked files.")
 
 
-(defun thumbs-gensym (&optional arg)
-  "Generate a new uninterned symbol.
-The name is made by appending a number to PREFIX, default \"Thumbs\"."
-  (let ((prefix (if (stringp arg) arg "Thumbs"))
-       (num (if (integerp arg) arg
-              (prog1
-                  thumbs-gensym-counter
-                (setq thumbs-gensym-counter (1+ thumbs-gensym-counter))))))
-    (make-symbol (format "%s%d" prefix num))))
+(defalias 'thumbs-gensym
+    (if (fboundp 'gensym)
+        'gensym
+      ;; Copied from cl-macs.el
+      (defvar thumbs-gensym-counter 0)
+      (lambda (&optional prefix)
+       "Generate a new uninterned symbol.
+The name is made by appending a number to PREFIX, default \"G\"."
+       (let ((pfix (if (stringp prefix) prefix "G"))
+             (num (if (integerp prefix) prefix
+                    (prog1 thumbs-gensym-counter
+                      (setq thumbs-gensym-counter
+                            (1+ thumbs-gensym-counter))))))
+         (make-symbol (format "%s%d" pfix num))))))
+
+(defsubst thumbs-temp-dir ()
+  (file-name-as-directory (expand-file-name thumbs-temp-dir)))
+
+(defun thumbs-temp-file ()
+  "Return a unique temporary filename for an image."
+  (format "%s%s-%s.jpg"
+          (thumbs-temp-dir)
+          thumbs-temp-prefix
+          (thumbs-gensym "T")))
+
+(defun thumbs-thumbsdir ()
+  "Return the current thumbnails directory (from `thumbs-thumbsdir').
+Create the thumbnails directory if it does not exist."
+  (let ((thumbs-thumbsdir (file-name-as-directory
+                           (expand-file-name thumbs-thumbsdir))))
+    (unless (file-directory-p thumbs-thumbsdir)
+      (make-directory thumbs-thumbsdir)
+      (message "Creating thumbnails directory"))
+    thumbs-thumbsdir))
 
 (defun thumbs-cleanup-thumbsdir ()
   "Clean the thumbnails directory.
 
 (defun thumbs-cleanup-thumbsdir ()
   "Clean the thumbnails directory.
-If the total size of all files in 'thumbs-thumbsdir' is bigger than
-'thumbs-thumbsdir-max-size', files are deleted until the max size is
+If the total size of all files in `thumbs-thumbsdir' is bigger than
+`thumbs-thumbsdir-max-size', files are deleted until the max size is
 reached."
   (let* ((filesL
          (sort
 reached."
   (let* ((filesL
          (sort
@@ -196,8 +205,8 @@ reached."
            (lambda (f)
              (let ((fattribsL (file-attributes f)))
                `(,(nth 4 fattribsL) ,(nth 7 fattribsL) ,f)))
            (lambda (f)
              (let ((fattribsL (file-attributes f)))
                `(,(nth 4 fattribsL) ,(nth 7 fattribsL) ,f)))
-           (directory-files thumbs-thumbsdir t (image-file-name-regexp)))
-          '(lambda (l1 l2) (time-less-p (car l1)(car l2)))))
+           (directory-files (thumbs-thumbsdir) t (image-file-name-regexp)))
+          '(lambda (l1 l2) (time-less-p (car l1) (car l2)))))
         (dirsize (apply '+ (mapcar (lambda (x) (cadr x)) filesL))))
     (while (> dirsize thumbs-thumbsdir-max-size)
       (progn
         (dirsize (apply '+ (mapcar (lambda (x) (cadr x)) filesL))))
     (while (> dirsize thumbs-thumbsdir-max-size)
       (progn
@@ -216,11 +225,11 @@ reached."
 FILEIN is the input file,
 FILEOUT is the output file,
 ACTION is the command to send to convert.
 FILEIN is the input file,
 FILEOUT is the output file,
 ACTION is the command to send to convert.
-Optional argument are:
+Optional arguments are:
 ARG any arguments to the ACTION command,
 ARG any arguments to the ACTION command,
-OUTPUT-FORMAT is the file format to output, default is jpeg
+OUTPUT-FORMAT is the file format to output (default is jpeg),
 ACTION-PREFIX is the symbol to place before the ACTION command
 ACTION-PREFIX is the symbol to place before the ACTION command
-              (default to '-' but can sometime be '+')."
+              (defaults to '-' but can sometimes be '+')."
   (let ((command (format "%s %s%s %s \"%s\" \"%s:%s\""
                         thumbs-conversion-program
                         (or action-prefix "-")
   (let ((command (format "%s %s%s %s \"%s\" \"%s:%s\""
                         thumbs-conversion-program
                         (or action-prefix "-")
@@ -240,7 +249,7 @@ ACTION-PREFIX is the symbol to place before the ACTION command
   (round (- n (/ (* d n) 100))))
 
 (defun thumbs-increment-image-size (s)
   (round (- n (/ (* d n) 100))))
 
 (defun thumbs-increment-image-size (s)
-  "Increment S (a cons of width x heigh)."
+  "Increment S (a cons of width x height)."
   (cons
    (thumbs-increment-image-size-element (car s)
                                        thumbs-image-resizing-step)
   (cons
    (thumbs-increment-image-size-element (car s)
                                        thumbs-image-resizing-step)
@@ -248,7 +257,7 @@ ACTION-PREFIX is the symbol to place before the ACTION command
                                        thumbs-image-resizing-step)))
 
 (defun thumbs-decrement-image-size (s)
                                        thumbs-image-resizing-step)))
 
 (defun thumbs-decrement-image-size (s)
-  "Decrement S (a cons of width x heigh)."
+  "Decrement S (a cons of width x height)."
   (cons
    (thumbs-decrement-image-size-element (car s)
                                        thumbs-image-resizing-step)
   (cons
    (thumbs-decrement-image-size-element (car s)
                                        thumbs-image-resizing-step)
@@ -257,14 +266,14 @@ ACTION-PREFIX is the symbol to place before the ACTION command
 
 (defun thumbs-resize-image (&optional increment size)
   "Resize image in current buffer.
 
 (defun thumbs-resize-image (&optional increment size)
   "Resize image in current buffer.
-if INCREMENT is set, make the image bigger, else smaller.
+If INCREMENT is set, make the image bigger, else smaller.
 Or, alternatively, a SIZE may be specified."
   (interactive)
   ;; cleaning of old temp file
   (condition-case nil
     (apply 'delete-file
           (directory-files
 Or, alternatively, a SIZE may be specified."
   (interactive)
   ;; cleaning of old temp file
   (condition-case nil
     (apply 'delete-file
           (directory-files
-           thumbs-temp-dir t
+           (thumbs-temp-dir) t
            thumbs-temp-prefix))
     (error nil))
   (let ((buffer-read-only nil)
            thumbs-temp-prefix))
     (error nil))
   (let ((buffer-read-only nil)
@@ -275,7 +284,7 @@ Or, alternatively, a SIZE may be specified."
                  thumbs-current-image-size)
               (thumbs-decrement-image-size
                thumbs-current-image-size))))
                  thumbs-current-image-size)
               (thumbs-decrement-image-size
                thumbs-current-image-size))))
-       (tmp (format "%s%s.jpg" thumbs-temp-file (thumbs-gensym))))
+       (tmp (thumbs-temp-file)))
     (erase-buffer)
     (thumbs-call-convert thumbs-current-image-filename
                         tmp "sample"
     (erase-buffer)
     (thumbs-call-convert thumbs-current-image-filename
                         tmp "sample"
@@ -285,7 +294,7 @@ Or, alternatively, a SIZE may be specified."
     (setq thumbs-current-tmp-filename tmp)))
 
 (defun thumbs-resize-interactive (width height)
     (setq thumbs-current-tmp-filename tmp)))
 
 (defun thumbs-resize-interactive (width height)
-  "Resize Image interactively to specified WIDTH and HEIGHT."
+  "Resize image interactively to specified WIDTH and HEIGHT."
   (interactive "nWidth: \nnHeight: ")
   (thumbs-resize-image nil (cons width height)))
 
   (interactive "nWidth: \nnHeight: ")
   (thumbs-resize-image nil (cons width height)))
 
@@ -301,18 +310,21 @@ Or, alternatively, a SIZE may be specified."
 
 (defun thumbs-thumbname (img)
   "Return a thumbnail name for the image IMG."
 
 (defun thumbs-thumbname (img)
   "Return a thumbnail name for the image IMG."
-  (concat thumbs-thumbsdir "/"
-         (subst-char-in-string
-          ?\  ?\_
-          (apply
-           'concat
-           (split-string
-            (expand-file-name img) "/")))))
+  (convert-standard-filename
+   (let ((filename (expand-file-name img)))
+     (format "%s%08x-%s.jpg"
+             (thumbs-thumbsdir)
+             (sxhash filename)
+             (subst-char-in-string
+              ?\s ?\_
+              (apply
+               'concat
+               (split-string filename "/")))))))
 
 (defun thumbs-make-thumb (img)
   "Create the thumbnail for IMG."
 
 (defun thumbs-make-thumb (img)
   "Create the thumbnail for IMG."
-  (let* ((fn (expand-file-name img))
-        (tn (thumbs-thumbname img)))
+  (let ((fn (expand-file-name img))
+        (tn (thumbs-thumbname img)))
     (if (or (not (file-exists-p tn))
            ;;  This is not the right fix, but I don't understand
            ;;  the external program or why it produces a geometry
     (if (or (not (file-exists-p tn))
            ;;  This is not the right fix, but I don't understand
            ;;  the external program or why it produces a geometry
@@ -348,19 +360,19 @@ Or, alternatively, a SIZE may be specified."
   "Insert image IMG at point.
 TYPE and RELIEF will be used in constructing the image; see `image'
 in the emacs-lisp manual for further documentation.
   "Insert image IMG at point.
 TYPE and RELIEF will be used in constructing the image; see `image'
 in the emacs-lisp manual for further documentation.
-if MARKED is non-nil, the image is marked."
+If MARKED is non-nil, the image is marked."
   (let ((i `(image :type ,type
                   :file ,img
                   :relief ,relief
                   :conversion ,(if marked 'disabled)
                   :margin ,thumbs-margin)))
     (insert-image i)
   (let ((i `(image :type ,type
                   :file ,img
                   :relief ,relief
                   :conversion ,(if marked 'disabled)
                   :margin ,thumbs-margin)))
     (insert-image i)
-    (setq thumbs-current-image-size
-         (image-size i t))))
+    (set (make-local-variable 'thumbs-current-image-size)
+         (image-size i t))))
 
 (defun thumbs-insert-thumb (img &optional marked)
   "Insert the thumbnail for IMG at point.
 
 (defun thumbs-insert-thumb (img &optional marked)
   "Insert the thumbnail for IMG at point.
-if MARKED is non-nil, the image is marked"
+If MARKED is non-nil, the image is marked."
   (thumbs-insert-image
    (thumbs-make-thumb img) 'jpeg thumbs-relief marked)
   (put-text-property (1- (point)) (point)
   (thumbs-insert-image
    (thumbs-make-thumb img) 'jpeg thumbs-relief marked)
   (put-text-property (1- (point)) (point)
@@ -377,8 +389,9 @@ if MARKED is non-nil, the image is marked"
     (unless (bobp) (newline))))
 
 (defun thumbs-show-thumbs-list (L &optional buffer-name same-window)
     (unless (bobp) (newline))))
 
 (defun thumbs-show-thumbs-list (L &optional buffer-name same-window)
-  (when (not (display-images-p))
-    (error "Images are not supported in this Emacs session"))
+  (unless (and (display-images-p)
+               (image-type-available-p 'jpeg))
+    (error "Required image type is not supported in this Emacs session"))
   (funcall (if same-window 'switch-to-buffer 'pop-to-buffer)
           (or buffer-name "*THUMB-View*"))
   (let ((inhibit-read-only t))
   (funcall (if same-window 'switch-to-buffer 'pop-to-buffer)
           (or buffer-name "*THUMB-View*"))
   (let ((inhibit-read-only t))
@@ -386,8 +399,7 @@ if MARKED is non-nil, the image is marked"
     (thumbs-mode)
     (thumbs-do-thumbs-insertion L)
     (goto-char (point-min))
     (thumbs-mode)
     (thumbs-do-thumbs-insertion L)
     (goto-char (point-min))
-    (setq thumbs-current-dir default-directory)
-    (make-variable-buffer-local 'thumbs-current-dir)))
+    (set (make-local-variable 'thumbs-current-dir) default-directory)))
 
 ;;;###autoload
 (defun thumbs-show-all-from-dir (dir &optional reg same-window)
 
 ;;;###autoload
 (defun thumbs-show-all-from-dir (dir &optional reg same-window)
@@ -402,7 +414,7 @@ and SAME-WINDOW to show thumbs in the same window."
 
 ;;;###autoload
 (defun thumbs-dired-show-marked ()
 
 ;;;###autoload
 (defun thumbs-dired-show-marked ()
-  "In Dired, make a thumbs buffer with all marked files."
+  "In dired, make a thumbs buffer with all marked files."
   (interactive)
   (thumbs-show-thumbs-list (dired-get-marked-files) nil t))
 
   (interactive)
   (thumbs-show-thumbs-list (dired-get-marked-files) nil t))
 
@@ -416,7 +428,7 @@ and SAME-WINDOW to show thumbs in the same window."
 (defalias 'thumbs 'thumbs-show-all-from-dir)
 
 (defun thumbs-find-image (img &optional num otherwin)
 (defalias 'thumbs 'thumbs-show-all-from-dir)
 
 (defun thumbs-find-image (img &optional num otherwin)
-  (funcall 
+  (funcall
    (if otherwin 'switch-to-buffer-other-window 'switch-to-buffer)
    (concat "*Image: " (file-name-nondirectory img) " - "
           (number-to-string (or num 0)) "*"))
    (if otherwin 'switch-to-buffer-other-window 'switch-to-buffer)
    (concat "*Image: " (file-name-nondirectory img) " - "
           (number-to-string (or num 0)) "*"))
@@ -425,16 +437,12 @@ and SAME-WINDOW to show thumbs in the same window."
     (setq thumbs-current-image-filename img
          thumbs-current-tmp-filename nil
          thumbs-image-num (or num 0))
     (setq thumbs-current-image-filename img
          thumbs-current-tmp-filename nil
          thumbs-image-num (or num 0))
-    (make-variable-buffer-local 'thumbs-current-image-filename)
-    (make-variable-buffer-local 'thumbs-current-tmp-filename)
-    (make-variable-buffer-local 'thumbs-current-image-size)
-    (make-variable-buffer-local 'thumbs-image-num)
     (delete-region (point-min)(point-max))
     (thumbs-insert-image img (thumbs-image-type img) 0)))
 
 (defun thumbs-find-image-at-point (&optional img otherwin)
   "Display image IMG for thumbnail at point.
     (delete-region (point-min)(point-max))
     (thumbs-insert-image img (thumbs-image-type img) 0)))
 
 (defun thumbs-find-image-at-point (&optional img otherwin)
   "Display image IMG for thumbnail at point.
-use another window it OTHERWIN is t."
+Use another window if OTHERWIN is t."
   (interactive)
   (let* ((i (or img (thumbs-current-image))))
     (thumbs-find-image i (point) otherwin)))
   (interactive)
   (let* ((i (or img (thumbs-current-image))))
     (thumbs-find-image i (point) otherwin)))
@@ -498,7 +506,7 @@ Open another window."
       (nreverse list))))
 
 (defun thumbs-delete-images ()
       (nreverse list))))
 
 (defun thumbs-delete-images ()
-  "Delete the image at point (and it's thumbnail) (or marked files if any)."
+  "Delete the image at point (and its thumbnail) (or marked files if any)."
   (interactive)
   (let ((files (or thumbs-markedL (list (thumbs-current-image)))))
     (if (yes-or-no-p (format "Really delete %d files? " (length files)))
   (interactive)
   (let ((files (or thumbs-markedL (list (thumbs-current-image)))))
     (if (yes-or-no-p (format "Really delete %d files? " (length files)))
@@ -519,7 +527,7 @@ Open another window."
                      (delq x thumbs-markedL)))))))))
 
 (defun thumbs-rename-images (newfile)
                      (delq x thumbs-markedL)))))))))
 
 (defun thumbs-rename-images (newfile)
-  "Rename the image at point (and it's thumbnail) (or marked files if any)."
+  "Rename the image at point (and its thumbnail) (or marked files if any)."
   (interactive "FRename to file or directory: ")
   (let ((files (or thumbs-markedL (list (thumbs-current-image))))
        failures)
   (interactive "FRename to file or directory: ")
   (let ((files (or thumbs-markedL (list (thumbs-current-image))))
        failures)
@@ -557,11 +565,7 @@ Open another window."
 (defun thumbs-kill-buffer ()
   "Kill the current buffer."
   (interactive)
 (defun thumbs-kill-buffer ()
   "Kill the current buffer."
   (interactive)
-  (let ((buffer (current-buffer)))
-    (condition-case nil
-       (delete-window (selected-window))
-      (error nil))
-    (kill-buffer buffer)))
+  (quit-window t (selected-window)))
 
 (defun thumbs-show-image-num (num)
   "Show the image with number NUM."
 
 (defun thumbs-show-image-num (num)
   "Show the image with number NUM."
@@ -573,7 +577,7 @@ Open another window."
            thumbs-current-image-filename i))))
 
 (defun thumbs-next-image ()
            thumbs-current-image-filename i))))
 
 (defun thumbs-next-image ()
-  "Show next image."
+  "Show the next image."
   (interactive)
   (let* ((i (1+ thumbs-image-num))
         (list (thumbs-file-alist))
   (interactive)
   (let* ((i (1+ thumbs-image-num))
         (list (thumbs-file-alist))
@@ -629,16 +633,16 @@ Open another window."
 
 (defun thumbs-modify-image (action &optional arg)
   "Call convert to do ACTION on image with argument ARG.
 
 (defun thumbs-modify-image (action &optional arg)
   "Call convert to do ACTION on image with argument ARG.
-ACTION and ARG should be legal convert command."
+ACTION and ARG should be a valid convert command."
   (interactive "sAction: \nsValue: ")
   ;; cleaning of old temp file
   (mapc 'delete-file
        (directory-files
   (interactive "sAction: \nsValue: ")
   ;; cleaning of old temp file
   (mapc 'delete-file
        (directory-files
-        thumbs-temp-dir
+        (thumbs-temp-dir)
         t
         thumbs-temp-prefix))
   (let ((buffer-read-only nil)
         t
         thumbs-temp-prefix))
   (let ((buffer-read-only nil)
-       (tmp (format "%s%s.jpg" thumbs-temp-file (thumbs-gensym))))
+       (tmp (thumbs-temp-file)))
     (erase-buffer)
     (thumbs-call-convert thumbs-current-image-filename
                         tmp
     (erase-buffer)
     (thumbs-call-convert thumbs-current-image-filename
                         tmp
@@ -753,9 +757,8 @@ ACTION and ARG should be legal convert command."
 (define-derived-mode thumbs-mode
   fundamental-mode "thumbs"
   "Preview images in a thumbnails buffer"
 (define-derived-mode thumbs-mode
   fundamental-mode "thumbs"
   "Preview images in a thumbnails buffer"
-  (make-variable-buffer-local 'thumbs-markedL)
   (setq buffer-read-only t)
   (setq buffer-read-only t)
-  (setq thumbs-markedL nil))
+  (set (make-local-variable 'thumbs-markedL) nil))
 
 (defvar thumbs-view-image-mode-map
   (let ((map (make-sparse-keymap)))
 
 (defvar thumbs-view-image-mode-map
   (let ((map (make-sparse-keymap)))
@@ -769,18 +772,19 @@ ACTION and ARG should be legal convert command."
     (define-key map "r" 'thumbs-resize-interactive)
     (define-key map "s" 'thumbs-save-current-image)
     (define-key map "q" 'thumbs-kill-buffer)
     (define-key map "r" 'thumbs-resize-interactive)
     (define-key map "s" 'thumbs-save-current-image)
     (define-key map "q" 'thumbs-kill-buffer)
-    (define-key map "w" 'thunbs-set-root)
+    (define-key map "w" 'thumbs-set-root)
     map)
   "Keymap for `thumbs-view-image-mode'.")
 
 ;; thumbs-view-image-mode
 (put 'thumbs-view-image-mode 'mode-class 'special)
 (define-derived-mode thumbs-view-image-mode
     map)
   "Keymap for `thumbs-view-image-mode'.")
 
 ;; thumbs-view-image-mode
 (put 'thumbs-view-image-mode 'mode-class 'special)
 (define-derived-mode thumbs-view-image-mode
-  fundamental-mode "image-view-mode")
+  fundamental-mode "image-view-mode"
+  (setq buffer-read-only t))
 
 ;;;###autoload
 (defun thumbs-dired-setroot ()
 
 ;;;###autoload
 (defun thumbs-dired-setroot ()
-  "In dired, Call the setroot program on the image at point."
+  "In dired, call the setroot program on the image at point."
   (interactive)
   (thumbs-call-setroot-command (dired-get-filename)))
 
   (interactive)
   (thumbs-call-setroot-command (dired-get-filename)))
 
@@ -791,7 +795,5 @@ ACTION and ARG should be legal convert command."
 
 (provide 'thumbs)
 
 
 (provide 'thumbs)
 
+;; arch-tag: f9ac1ef8-83fc-42c0-8069-1fae43fd2e5c
 ;;; thumbs.el ends here
 ;;; thumbs.el ends here
-
-
-;;; arch-tag: f9ac1ef8-83fc-42c0-8069-1fae43fd2e5c