]> code.delx.au - gnu-emacs/commitdiff
(image-type-auto-detectable): Don't autodetect x[pb]m.
authorChong Yidong <cyd@stupidchicken.com>
Fri, 9 Feb 2007 16:50:16 +0000 (16:50 +0000)
committerChong Yidong <cyd@stupidchicken.com>
Fri, 9 Feb 2007 16:50:16 +0000 (16:50 +0000)
(image-type-auto-detected-p): Fail if another match is found in
auto-mode-alist.

lisp/image.el

index 22fa704d2203a3c420368fdb16007e778bf4c08e..c9269abce3e113f99158911ef7c7d92341eb954b 100644 (file)
@@ -65,13 +65,16 @@ a non-nil value, TYPE is the image's type.")
 When the name of an image file match REGEXP, it is assumed to
 be of image type IMAGE-TYPE.")
 
+;; We rely on `auto-mode-alist' to detect xbm and xpm files, instead
+;; of content autodetection.  Their contents are just C code, so it is
+;; easy to generate false matches.
 (defvar image-type-auto-detectable
   '((pbm . t)
-    (xbm . t)
+    (xbm . nil)
     (bmp . maybe)
     (gif . maybe)
     (png . maybe)
-    (xpm . maybe)
+    (xpm . nil)
     (jpeg . maybe)
     (tiff . maybe)
     (postscript . nil))
@@ -340,15 +343,30 @@ Image types are symbols like `xbm' or `jpeg'."
 ;;;###autoload
 (defun image-type-auto-detected-p ()
   "Return t iff the current buffer contains an auto-detectable image.
-Whether image types are auto-detectable or not depends on the setting
-of the variable `image-type-auto-detectable'.
-
-This function is intended to be used from `magic-mode-alist' (which see)."
+This function is intended to be used from `magic-mode-alist' (which see).
+
+First, compare the beginning of the buffer with `image-type-header-regexps'.
+If an appropriate image type is found, check if that image type can be
+autodetected using the variable `image-type-auto-detectable'.  Finally,
+if `buffer-file-name' is non-nil, check if it matches another major mode
+in `auto-mode-alist' apart from `image-mode'; if there is another match,
+the autodetection is considered to have failed.  Return t if all the above
+steps succeed."
   (let* ((type (image-type-from-buffer))
         (auto (and type (cdr (assq type image-type-auto-detectable)))))
     (and auto
-        (or (eq auto t)
-            (image-type-available-p type)))))
+        (or (eq auto t) (image-type-available-p type))
+        (or (null buffer-file-name)
+            (not (assoc-default
+                  buffer-file-name
+                  (delq nil (mapcar 
+                             (lambda (elt)
+                               (unless (memq (or (car-safe (cdr elt))
+                                                 (cdr elt))
+                                             '(image-mode image-mode-maybe))
+                                 elt))
+                             auto-mode-alist))
+                  'string-match))))))
 
 
 ;;;###autoload