-;;; tool-bar.el --- Setting up the tool bar
+;;; tool-bar.el --- setting up the tool bar
;;
-;; Copyright (C) 2000 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001 Free Software Foundation, Inc.
;;
;; Author: Dave Love <fx@gnu.org>
;; Keywords: mouse frames
;; `tool-bar-add-item' and `tool-bar-add-item-from-menu'.
;; The normal global binding for [tool-bar] (below) uses the value of
-;; `tool-bar-map' as the actual keymap used to define the tool bar.
-;; Modes may either bind items under the [tool-bar] prefix key of the
-;; local map to add to the global bar or may set `tool-bar-map'
-;; buffer-locally to overirde it. (Some items are removed from the
+;; `tool-bar-map' as the actual keymap to define the tool bar. Modes
+;; may either bind items under the [tool-bar] prefix key of the local
+;; map to add to the global bar or may set `tool-bar-map'
+;; buffer-locally to override it. (Some items are removed from the
;; global bar in modes which have `special' as their `mode-class'
;; properlty.)
;;;###autoload
(define-minor-mode tool-bar-mode
"Toggle use of the tool bar.
-With ARG, display the tool bar if and only if ARG is positive.
+With numeric ARG, display the tool bar if and only if ARG is positive.
See `tool-bar-add-item' and `tool-bar-add-item-from-menu' for
conveniently adding tool bar items."
- nil nil nil
:global t
:group 'mouse
:group 'frames
- (let ((lines (if tool-bar-mode 1 0)))
- ;; Alter existing frames...
- (mapc (lambda (frame)
- (modify-frame-parameters frame
- (list (cons 'tool-bar-lines lines))))
- (frame-list))
- ;; ...and future ones.
- (let ((elt (assq 'tool-bar-lines default-frame-alist)))
- (if elt
- (setcdr elt lines)
- (add-to-list 'default-frame-alist (cons 'tool-bar-lines lines)))))
- (if (and tool-bar-mode
- (display-graphic-p)
- (= 1 (length (default-value 'tool-bar-map)))) ; not yet setup
- (tool-bar-setup)))
+ (and (display-images-p)
+ (let ((lines (if tool-bar-mode 1 0)))
+ ;; Alter existing frames...
+ (mapc (lambda (frame)
+ (modify-frame-parameters frame
+ (list (cons 'tool-bar-lines lines))))
+ (frame-list))
+ ;; ...and future ones.
+ (let ((elt (assq 'tool-bar-lines default-frame-alist)))
+ (if elt
+ (setcdr elt lines)
+ (add-to-list 'default-frame-alist (cons 'tool-bar-lines lines)))))
+ (if (and tool-bar-mode
+ (display-graphic-p)
+ (= 1 (length (default-value 'tool-bar-map)))) ; not yet setup
+ (tool-bar-setup))))
(defvar tool-bar-map (make-sparse-keymap)
"Keymap for the tool bar.
PROPS are additional items to add to the menu item specification. See
Info node `(elisp)Tool Bar'. Items are added from left to right.
-ICON is the base name of a file cnntaining the image to use. The
-function will try to use first ICON.xpm, ICON.pbm then ICON.xbm using
-`find-image'.
+ICON is the base name of a file containing the image to use. The
+function will first try to use ICON.xpm, then ICON.pbm, and finally
+ICON.xbm, using `find-image'.
Keybindings are made in the map `tool-bar-map'. To define items in
some local map, bind `tool-bar-map' with `let' around calls of this
function."
- (let ((image (find-image `((:type xpm :file ,(concat icon ".xpm"))
- (:type pbm :file ,(concat icon ".pbm"))
- (:type xbm :file ,(concat icon ".xbm"))))))
- (when image
+ (let* ((fg (face-attribute 'tool-bar :foreground))
+ (bg (face-attribute 'tool-bar :background))
+ (colors (nconc (if (eq fg 'unspecified) nil (list :foreground fg))
+ (if (eq bg 'unspecified) nil (list :background bg))))
+ (image (find-image
+ (if (display-color-p)
+ (list (list :type 'xpm :file (concat icon ".xpm"))
+ (append (list :type 'pbm :file (concat icon ".pbm"))
+ colors)
+ (append (list :type 'xbm :file (concat icon ".xbm"))
+ colors))
+ (list (append (list :type 'pbm :file (concat icon ".pbm"))
+ colors)
+ (append (list :type 'xbm :file (concat icon ".xbm"))
+ colors)
+ (list :type 'xpm :file (concat icon ".xpm")))))))
+ (when (and (display-images-p) image)
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
(define-key-after tool-bar-map (vector key)
(setq map global-map))
(let* ((menu-bar-map (lookup-key map [menu-bar]))
(keys (where-is-internal command menu-bar-map))
- (image (find-image `((:type xpm :file ,(concat icon ".xpm"))
- (:type pbm :file ,(concat icon ".pbm"))
- (:type xbm :file ,(concat icon ".xbm")))))
+ (fg (face-attribute 'tool-bar :foreground))
+ (bg (face-attribute 'tool-bar :background))
+ (colors (nconc (if (eq fg 'unspecified) nil (list :foreground fg))
+ (if (eq bg 'unspecified) nil (list :background bg))))
+ (spec (if (display-color-p)
+ (list (list :type 'xpm :file (concat icon ".xpm"))
+ (append (list :type 'pbm :file (concat icon ".pbm"))
+ colors)
+ (append (list :type 'xbm :file (concat icon ".xbm"))
+ colors))
+ (list (append (list :type 'pbm :file (concat icon ".pbm"))
+ colors)
+ (append (list :type 'xbm :file (concat icon ".xbm"))
+ colors)
+ (list :type 'xpm :file (concat icon ".xpm")))))
+ (image (find-image spec))
submap key)
- (when image
+ (when (and (display-images-p) image)
;; We'll pick up the last valid entry in the list of keys if
;; there's more than one.
(dolist (k keys)
(setq submap (eval submap)))
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
- (define-key-after tool-bar-map (vector key)
- (append (cdr (assq key (cdr submap))) (list :image image) props)))))
+ (let ((defn (assq key (cdr submap))))
+ (if (eq (cadr defn) 'menu-item)
+ (define-key-after tool-bar-map (vector key)
+ (append (cdr defn) (list :image image) props))
+ (setq defn (cdr defn))
+ (define-key-after tool-bar-map (vector key)
+ (append `(menu-item ,(car defn) ,(cddr defn))
+ (list :image image) props)))))))
;;; Set up some global items. Additions/deletions up for grabs.
(defun tool-bar-setup ()
- (tool-bar-add-item-from-menu 'save-buffers-kill-emacs "exit")
+ ;; People say it's bad to have EXIT on the tool bar, since users
+ ;; might inadvertently click that button.
+ ;;(tool-bar-add-item-from-menu 'save-buffers-kill-emacs "exit")
(tool-bar-add-item-from-menu 'find-file "new")
(tool-bar-add-item-from-menu 'dired "open")
(tool-bar-add-item-from-menu 'kill-this-buffer "close")
(tool-bar-add-item-from-menu 'save-buffer "save" nil
- :visible '(not (eq 'special (get major-mode
- 'mode-class))))
+ :visible '(or buffer-file-name
+ (not (eq 'special
+ (get major-mode
+ 'mode-class)))))
(tool-bar-add-item-from-menu 'write-file "saveas" nil
- :visible '(not (eq 'special (get major-mode
- 'mode-class))))
+ :visible '(or buffer-file-name
+ (not (eq 'special
+ (get major-mode
+ 'mode-class)))))
(tool-bar-add-item-from-menu 'undo "undo" nil
:visible '(not (eq 'special (get major-mode
'mode-class))))