* Request for enhancement: support PNG icons in toolbar
@ 2007-01-18 20:18 Benjamin Hawkes-Lewis
2007-01-18 22:55 ` Leo
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Benjamin Hawkes-Lewis @ 2007-01-18 20:18 UTC (permalink / raw)
[-- Attachment #1: Type: text/plain, Size: 1341 bytes --]
Currently, when libpng is available, Emacs has support for PNG. But it
only searches for XBM, XPM, and PBM icons for its toolbar, even though
PNG icons are considerably more attractive. I've written a patch for the
tool-bar.el from Emacs CVS, which tests for PNG support before adding
the PNG format to the search, facilitating a prettier Emacs toolbar.
tool-bar-local-item-from-menu and tool-bar-local-item duplicated the
image finding code, which I have moved for simplicity into a new,
separate function tool-bar-find-best-icon.
When editing the source I noticed it doesn't currently check whether
support for the other image file types is present or not, but I didn't
change this in case it was desired.
ChangeLog, new tool-bar.el, and tool-bar.el.diff (vs. current CVS)
attached.
NB for testers. You must compile Emacs with the new tool-bar.el if you
wish it to use it to load the main Emacs toolbar, since it is dumped
into Emacs.
If you're running X11 and you'd like some PNG icons to try with your
Emacs, see:
http://www.benjaminhawkeslewis.com/www/svn/emacs/themes/icons/
which currently features a screen shot of the toolbar in its full PNG
glory and some Ubuntu-themed icons. I haven't gotten round to adding
icons for news modes and so on, but the toolbar will happily fall back
to uglier icons.
--
Benjamin Hawkes-Lewis
[-- Attachment #2: ChangeLog --]
[-- Type: text/x-changelog, Size: 486 bytes --]
2007-01-17 Benjamin Hawkes-Lewis <bhawkeslewis@googlemail.com>
* tool-bar.el (tool-bar-find-best-icon): Added function to find the most suitable icon file for a given base name. Moved the code for doing this from tool-bar-local-item-from-menu and tool-bar-local-item, where it was needless duplicated.
2007-01-14 Benjamin Hawkes-Lewis <bhawkeslewis@googlemail.com>
* tool-bar.el (tool-bar-local-item-from-menu): Added support for PNG icons.
(tool-bar-local-item): Likewise.
[-- Attachment #3: tool-bar.el --]
[-- Type: text/x-emacs-lisp, Size: 12240 bytes --]
;;; tool-bar.el --- setting up the tool bar
;;
;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
;; 2005, 2006 Free Software Foundation, Inc.
;;
;; Author: Dave Love <fx@gnu.org>
;; Keywords: mouse frames
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; 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., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; Provides `tool-bar-mode' to control display of the tool-bar and
;; bindings for the global tool bar with convenience functions
;; `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 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'
;; property.)
;; Todo: Somehow make tool bars easily customizable by the naive?
;;; Code:
;; The autoload cookie doesn't work when preloading.
;; Deleting it means invoking this command won't work
;; when you are on a tty. I hope that won't cause too much trouble -- rms.
(define-minor-mode tool-bar-mode
"Toggle use of the tool bar.
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."
:init-value nil
:global t
:group 'mouse
:group 'frames
(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))))
;;;###autoload
;; We want to pretend the toolbar by standard is on, as this will make
;; customize consider disabling the toolbar a customization, and save
;; that. We could do this for real by setting :init-value above, but
;; that would turn on the toolbar in MS Windows where it is currently
;; useless, and it would overwrite disabling the tool bar from X
;; resources. If anyone want to implement this in a cleaner way,
;; please do so.
;; -- Per Abrahamsen <abraham@dina.kvl.dk> 2002-02-21.
(put 'tool-bar-mode 'standard-value '(t))
(defvar tool-bar-map (make-sparse-keymap)
"Keymap for the tool bar.
Define this locally to override the global tool bar.")
(global-set-key [tool-bar]
'(menu-item "tool bar" ignore
:filter (lambda (ignore) tool-bar-map)))
;;;###autoload
(defun tool-bar-add-item (icon def key &rest props)
"Add an item to the tool bar.
ICON names the image, DEF is the key definition and KEY is a symbol
for the fake function key in the menu keymap. Remaining arguments
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 containing the image to use.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item'."
(apply 'tool-bar-local-item icon def key tool-bar-map props))
;;;###autoload
(defun tool-bar-find-best-icon (base-name)
"Find the best available icon with for local display capabilities
BASE NAME is the sought filename without path or extension.
For color screens, the function will first try to find low-color/BASE-NAME.xpm if display-color-cells is less or equal to 256, then BASE-NAME.png if PNG is supported, then BASE-NAME.xpm, then BASE-NAME.pbm, and finally BASE-NAME.xbm.
For monochrome screens, the function will first try to find BASE-NAME.pbm, then BASE-NAME.xbm, then low-color/BASE-NAME.xpm, then BASE-NAME.png if PNG is supported, then BASE-NAME.xpm.
Currently, the function does not test for XPM support, only PNG.
If no suitable icon file is found, returns nil."
(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))))
(xpm-spec (list :type 'xpm :file (concat base-name ".xpm")))
(xpm-lo-spec (if (> (display-color-cells) 256)
nil ;; Not required
(list :type 'xpm :file
(concat "low-color/" base-name ".xpm"))))
(pbm-spec (append (list :type 'pbm :file
(concat base-name ".pbm")) colors))
(xbm-spec (append (list :type 'xbm :file
(concat base-name ".xbm")) colors))
;; Add PNG if supported.
(png-spec (if (image-type-available-p 'png)
(append (list :type 'png :file
(concat base-name ".png")) colors)
nil ; Not supported
))
;; Formats listed in order of decreasing preference.
(formats-for-monochrome-screens
(list pbm-spec ; Concise monochrome
xbm-spec ; Verbose monochrome
xpm-lo-spec ; Low-color
png-spec ; High quality color: nil if unsupported
xpm-spec ; Poor quality color
))
(formats-for-color-screens
(list xpm-lo-spec ; Low-color: nil if not preferred
png-spec ; High quality color: nil if unsupported
xpm-spec ; Poor quality color
pbm-spec ; Concise monochrome
xbm-spec ; Verbose monochrome
)))
(find-image
(if (display-color-p)
formats-for-color-screens
formats-for-monochrome-screens)))
)
;;;###autoload
(defun tool-bar-local-item (icon def key map &rest props)
"Add an item to the tool bar in map MAP.
ICON names the image, DEF is the key definition and KEY is a symbol
for the fake function key in the menu keymap. Remaining arguments
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 containing the image to use."
(let* ((image (tool-bar-find-best-icon icon)))
(when (and (display-images-p) image)
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
(define-key-after map (vector key)
`(menu-item ,(symbol-name key) ,def :image ,image ,@props)))))
;;;###autoload
(defun tool-bar-add-item-from-menu (command icon &optional map &rest props)
"Define tool bar binding for COMMAND in keymap MAP using the given ICON.
This makes a binding for COMMAND in `tool-bar-map', copying its
binding from the menu bar in MAP (which defaults to `global-map'), but
modifies the binding by adding an image specification for ICON. It
finds ICON just like `tool-bar-add-item'. PROPS are additional
properties to add to the binding.
MAP must contain appropriate binding for `[menu-bar]' which holds a keymap.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item-from-menu'."
(apply 'tool-bar-local-item-from-menu command icon
(default-value 'tool-bar-map) map props))
;;;###autoload
(defun tool-bar-local-item-from-menu (command icon in-map &optional from-map &rest props)
"Define local tool bar binding for COMMAND using the given ICON.
This makes a binding for COMMAND in IN-MAP, copying its binding from
the menu bar in FROM-MAP (which defaults to `global-map'), but
modifies the binding by adding an image specification for ICON. It
finds ICON just like `tool-bar-add-item'. PROPS are additional
properties to add to the binding.
FROM-MAP must contain appropriate binding for `[menu-bar]' which
holds a keymap."
(unless from-map
(setq from-map global-map))
(let* ((menu-bar-map (lookup-key from-map [menu-bar]))
(keys (where-is-internal command menu-bar-map))
(image (tool-bar-find-best-icon icon))
submap key)
(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)
;; We're looking for a binding of the command in a submap of
;; the menu bar map, so the key sequence must be two or more
;; long.
(if (and (vectorp k)
(> (length k) 1))
(let ((m (lookup-key menu-bar-map (substring k 0 -1)))
;; Last element in the bound key sequence:
(kk (aref k (1- (length k)))))
(if (and (keymapp m)
(symbolp kk))
(setq submap m
key kk)))))
(when (and (symbolp submap) (boundp submap))
(setq submap (eval submap)))
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
(let ((defn (assq key (cdr submap))))
(if (eq (cadr defn) 'menu-item)
(define-key-after in-map (vector key)
(append (cdr defn) (list :image image) props))
(setq defn (cdr defn))
(define-key-after in-map (vector key)
(let ((rest (cdr defn)))
;; If the rest of the definition starts
;; with a list of menu cache info, get rid of that.
(if (and (consp rest) (consp (car rest)))
(setq rest (cdr rest)))
(append `(menu-item ,(car defn) ,rest)
(list :image image) props))))))))
;;; Set up some global items. Additions/deletions up for grabs.
(defun tool-bar-setup ()
;; 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 'menu-find-file-existing "open")
(tool-bar-add-item-from-menu 'dired "diropen")
(tool-bar-add-item-from-menu 'kill-this-buffer "close")
(tool-bar-add-item-from-menu 'save-buffer "save" nil
:visible '(or buffer-file-name
(not (eq 'special
(get major-mode
'mode-class)))))
(tool-bar-add-item-from-menu 'write-file "saveas" nil
: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))))
(tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [cut])
"cut" nil
:visible '(not (eq 'special (get major-mode
'mode-class))))
(tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [copy])
"copy")
(tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [paste])
"paste" nil
:visible '(not (eq 'special (get major-mode
'mode-class))))
(tool-bar-add-item-from-menu 'nonincremental-search-forward "search")
;;(tool-bar-add-item-from-menu 'ispell-buffer "spell")
;; There's no icon appropriate for News and we need a command rather
;; than a lambda for Read Mail.
;;(tool-bar-add-item-from-menu 'compose-mail "mail/compose")
(tool-bar-add-item-from-menu 'print-buffer "print")
;; tool-bar-add-item-from-menu itself operates on
;; (default-value 'tool-bar-map), but when we don't use that function,
;; we must explicitly operate on the default value.
(let ((tool-bar-map (default-value 'tool-bar-map)))
(tool-bar-add-item "preferences" 'customize 'customize
:help "Edit preferences (customize)")
(tool-bar-add-item "help" (lambda ()
(interactive)
(popup-menu menu-bar-help-menu))
'help
:help "Pop up the Help menu"))
)
(provide 'tool-bar)
;;; arch-tag: 15f30f0a-d0d7-4d50-bbb7-f48fd0c8582f
;;; tool-bar.el ends here
[-- Attachment #4: tool-bar.el.diff --]
[-- Type: text/x-patch, Size: 8153 bytes --]
*** /cvs/emacs/lisp/tool-bar.el 2007-01-18 20:14:52.000000000 +0000
--- tool-bar.el 2007-01-18 14:18:55.000000000 +0000
***************
*** 98,113 ****
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 containing the image to use. The
! function will first try to use low-color/ICON.xpm if display-color-cells
! is less or equal to 256, then ICON.xpm, then ICON.pbm, and finally
! ICON.xbm, using `find-image'.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item'."
(apply 'tool-bar-local-item icon def key tool-bar-map props))
;;;###autoload
(defun tool-bar-local-item (icon def key map &rest props)
"Add an item to the tool bar in map MAP.
ICON names the image, DEF is the key definition and KEY is a symbol
--- 98,163 ----
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 containing the image to use.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item'."
(apply 'tool-bar-local-item icon def key tool-bar-map props))
;;;###autoload
+ (defun tool-bar-find-best-icon (base-name)
+ "Find the best available icon with for local display capabilities
+
+ BASE NAME is the sought filename without path or extension.
+
+ For color screens, the function will first try to find low-color/BASE-NAME.xpm if display-color-cells is less or equal to 256, then BASE-NAME.png if PNG is supported, then BASE-NAME.xpm, then BASE-NAME.pbm, and finally BASE-NAME.xbm.
+
+ For monochrome screens, the function will first try to find BASE-NAME.pbm, then BASE-NAME.xbm, then low-color/BASE-NAME.xpm, then BASE-NAME.png if PNG is supported, then BASE-NAME.xpm.
+
+ Currently, the function does not test for XPM support, only PNG.
+
+ If no suitable icon file is found, returns nil."
+ (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))))
+ (xpm-spec (list :type 'xpm :file (concat base-name ".xpm")))
+ (xpm-lo-spec (if (> (display-color-cells) 256)
+ nil ;; Not required
+ (list :type 'xpm :file
+ (concat "low-color/" base-name ".xpm"))))
+ (pbm-spec (append (list :type 'pbm :file
+ (concat base-name ".pbm")) colors))
+ (xbm-spec (append (list :type 'xbm :file
+ (concat base-name ".xbm")) colors))
+ ;; Add PNG if supported.
+ (png-spec (if (image-type-available-p 'png)
+ (append (list :type 'png :file
+ (concat base-name ".png")) colors)
+ nil ; Not supported
+ ))
+ ;; Formats listed in order of decreasing preference.
+ (formats-for-monochrome-screens
+ (list pbm-spec ; Concise monochrome
+ xbm-spec ; Verbose monochrome
+ xpm-lo-spec ; Low-color
+ png-spec ; High quality color: nil if unsupported
+ xpm-spec ; Poor quality color
+ ))
+ (formats-for-color-screens
+ (list xpm-lo-spec ; Low-color: nil if not preferred
+ png-spec ; High quality color: nil if unsupported
+ xpm-spec ; Poor quality color
+ pbm-spec ; Concise monochrome
+ xbm-spec ; Verbose monochrome
+ )))
+ (find-image
+ (if (display-color-p)
+ formats-for-color-screens
+ formats-for-monochrome-screens)))
+ )
+
+ ;;;###autoload
(defun tool-bar-local-item (icon def key map &rest props)
"Add an item to the tool bar in map MAP.
ICON names the image, DEF is the key definition and KEY is a symbol
***************
*** 115,142 ****
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 containing the image to use. The
! function will first try to use low-color/ICON.xpm if display-color-cells
! is less or equal to 256, then ICON.xpm, then ICON.pbm, and finally
! ICON.xbm, using `find-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))))
! (xpm-spec (list :type 'xpm :file (concat icon ".xpm")))
! (xpm-lo-spec (if (> (display-color-cells) 256)
! nil
! (list :type 'xpm :file
! (concat "low-color/" icon ".xpm"))))
! (pbm-spec (append (list :type 'pbm :file
! (concat icon ".pbm")) colors))
! (xbm-spec (append (list :type 'xbm :file
! (concat icon ".xbm")) colors))
! (image (find-image
! (if (display-color-p)
! (list xpm-lo-spec xpm-spec pbm-spec xbm-spec)
! (list pbm-spec xbm-spec xpm-lo-spec xpm-spec)))))
!
(when (and (display-images-p) image)
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
--- 165,172 ----
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 containing the image to use."
! (let* ((image (tool-bar-find-best-icon icon)))
(when (and (display-images-p) image)
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
***************
*** 148,155 ****
"Define tool bar binding for COMMAND in keymap MAP using the given ICON.
This makes a binding for COMMAND in `tool-bar-map', copying its
binding from the menu bar in MAP (which defaults to `global-map'), but
! modifies the binding by adding an image specification for ICON. It
! finds ICON just like `tool-bar-add-item'. PROPS are additional
properties to add to the binding.
MAP must contain appropriate binding for `[menu-bar]' which holds a keymap.
--- 178,185 ----
"Define tool bar binding for COMMAND in keymap MAP using the given ICON.
This makes a binding for COMMAND in `tool-bar-map', copying its
binding from the menu bar in MAP (which defaults to `global-map'), but
! modifies the binding by adding an image specification for ICON. It
! finds ICON just like `tool-bar-add-item'. PROPS are additional
properties to add to the binding.
MAP must contain appropriate binding for `[menu-bar]' which holds a keymap.
***************
*** 174,196 ****
(setq from-map global-map))
(let* ((menu-bar-map (lookup-key from-map [menu-bar]))
(keys (where-is-internal command menu-bar-map))
! (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))))
! (xpm-spec (list :type 'xpm :file (concat icon ".xpm")))
! (xpm-lo-spec (if (> (display-color-cells) 256)
! nil
! (list :type 'xpm :file
! (concat "low-color/" icon ".xpm"))))
! (pbm-spec (append (list :type 'pbm :file
! (concat icon ".pbm")) colors))
! (xbm-spec (append (list :type 'xbm :file
! (concat icon ".xbm")) colors))
! (spec (if (display-color-p)
! (list xpm-lo-spec xpm-spec pbm-spec xbm-spec)
! (list pbm-spec xbm-spec xpm-lo-spec xpm-spec)))
! (image (find-image spec))
submap key)
(when (and (display-images-p) image)
;; We'll pick up the last valid entry in the list of keys if
--- 204,210 ----
(setq from-map global-map))
(let* ((menu-bar-map (lookup-key from-map [menu-bar]))
(keys (where-is-internal command menu-bar-map))
! (image (tool-bar-find-best-icon icon))
submap key)
(when (and (display-images-p) image)
;; We'll pick up the last valid entry in the list of keys if
[-- Attachment #5: Type: text/plain, Size: 142 bytes --]
_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Request for enhancement: support PNG icons in toolbar
2007-01-18 20:18 Benjamin Hawkes-Lewis
@ 2007-01-18 22:55 ` Leo
2007-01-19 10:43 ` Richard Stallman
2007-12-01 9:45 ` Leo
2 siblings, 0 replies; 5+ messages in thread
From: Leo @ 2007-01-18 22:55 UTC (permalink / raw)
On 2007-01-18, Benjamin Hawkes-Lewis said:
> Currently, when libpng is available, Emacs has support for PNG. But it
> only searches for XBM, XPM, and PBM icons for its toolbar, even though
> PNG icons are considerably more attractive. I've written a patch for the
> tool-bar.el from Emacs CVS, which tests for PNG support before adding
> the PNG format to the search, facilitating a prettier Emacs toolbar.
>
> tool-bar-local-item-from-menu and tool-bar-local-item duplicated the
> image finding code, which I have moved for simplicity into a new,
> separate function tool-bar-find-best-icon.
>
> When editing the source I noticed it doesn't currently check whether
> support for the other image file types is present or not, but I didn't
> change this in case it was desired.
>
> ChangeLog, new tool-bar.el, and tool-bar.el.diff (vs. current CVS)
> attached.
>
> NB for testers. You must compile Emacs with the new tool-bar.el if you
> wish it to use it to load the main Emacs toolbar, since it is dumped
> into Emacs.
>
> If you're running X11 and you'd like some PNG icons to try with your
> Emacs, see:
>
> http://www.benjaminhawkeslewis.com/www/svn/emacs/themes/icons/
>
> which currently features a screen shot of the toolbar in its full
> PNG glory and some Ubuntu-themed icons. I haven't gotten round to
> adding icons for news modes and so on, but the toolbar will happily
> fall back to uglier icons.
Thank you very much. I have been looking for it ;)
--
Leo <sdl.web AT gmail.com> (GPG Key: 9283AA3F)
^ permalink raw reply [flat|nested] 5+ messages in thread
* Request for enhancement: support PNG icons in toolbar
@ 2007-01-19 0:16 Benjamin Hawkes-Lewis
0 siblings, 0 replies; 5+ messages in thread
From: Benjamin Hawkes-Lewis @ 2007-01-19 0:16 UTC (permalink / raw)
[-- Attachment #1: Type: text/plain, Size: 1341 bytes --]
Currently, when libpng is available, Emacs has support for PNG. But it
only searches for XBM, XPM, and PBM icons for its toolbar, even though
PNG icons are considerably more attractive. I've written a patch for the
tool-bar.el from Emacs CVS, which tests for PNG support before adding
the PNG format to the search, facilitating a prettier Emacs toolbar.
tool-bar-local-item-from-menu and tool-bar-local-item duplicated the
image finding code, which I have moved for simplicity into a new,
separate function tool-bar-find-best-icon.
When editing the source I noticed it doesn't currently check whether
support for the other image file types is present or not, but I didn't
change this in case it was desired.
ChangeLog, new tool-bar.el, and tool-bar.el.diff (vs. current CVS)
attached.
NB for testers. You must compile Emacs with the new tool-bar.el if you
wish it to use it to load the main Emacs toolbar, since it is dumped
into Emacs.
If you're running X11 and you'd like some PNG icons to try with your
Emacs, see:
http://www.benjaminhawkeslewis.com/www/svn/emacs/themes/icons/
which currently features a screen shot of the toolbar in its full PNG
glory and some Ubuntu-themed icons. I haven't gotten round to adding
icons for news modes and so on, but the toolbar will happily fall back
to uglier icons.
--
Benjamin Hawkes-Lewis
[-- Attachment #2: ChangeLog --]
[-- Type: text/x-changelog, Size: 486 bytes --]
2007-01-17 Benjamin Hawkes-Lewis <bhawkeslewis@googlemail.com>
* tool-bar.el (tool-bar-find-best-icon): Added function to find the most suitable icon file for a given base name. Moved the code for doing this from tool-bar-local-item-from-menu and tool-bar-local-item, where it was needless duplicated.
2007-01-14 Benjamin Hawkes-Lewis <bhawkeslewis@googlemail.com>
* tool-bar.el (tool-bar-local-item-from-menu): Added support for PNG icons.
(tool-bar-local-item): Likewise.
[-- Attachment #3: tool-bar.el --]
[-- Type: text/x-emacs-lisp, Size: 12240 bytes --]
;;; tool-bar.el --- setting up the tool bar
;;
;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
;; 2005, 2006 Free Software Foundation, Inc.
;;
;; Author: Dave Love <fx@gnu.org>
;; Keywords: mouse frames
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; 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., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; Provides `tool-bar-mode' to control display of the tool-bar and
;; bindings for the global tool bar with convenience functions
;; `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 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'
;; property.)
;; Todo: Somehow make tool bars easily customizable by the naive?
;;; Code:
;; The autoload cookie doesn't work when preloading.
;; Deleting it means invoking this command won't work
;; when you are on a tty. I hope that won't cause too much trouble -- rms.
(define-minor-mode tool-bar-mode
"Toggle use of the tool bar.
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."
:init-value nil
:global t
:group 'mouse
:group 'frames
(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))))
;;;###autoload
;; We want to pretend the toolbar by standard is on, as this will make
;; customize consider disabling the toolbar a customization, and save
;; that. We could do this for real by setting :init-value above, but
;; that would turn on the toolbar in MS Windows where it is currently
;; useless, and it would overwrite disabling the tool bar from X
;; resources. If anyone want to implement this in a cleaner way,
;; please do so.
;; -- Per Abrahamsen <abraham@dina.kvl.dk> 2002-02-21.
(put 'tool-bar-mode 'standard-value '(t))
(defvar tool-bar-map (make-sparse-keymap)
"Keymap for the tool bar.
Define this locally to override the global tool bar.")
(global-set-key [tool-bar]
'(menu-item "tool bar" ignore
:filter (lambda (ignore) tool-bar-map)))
;;;###autoload
(defun tool-bar-add-item (icon def key &rest props)
"Add an item to the tool bar.
ICON names the image, DEF is the key definition and KEY is a symbol
for the fake function key in the menu keymap. Remaining arguments
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 containing the image to use.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item'."
(apply 'tool-bar-local-item icon def key tool-bar-map props))
;;;###autoload
(defun tool-bar-find-best-icon (base-name)
"Find the best available icon with for local display capabilities
BASE NAME is the sought filename without path or extension.
For color screens, the function will first try to find low-color/BASE-NAME.xpm if display-color-cells is less or equal to 256, then BASE-NAME.png if PNG is supported, then BASE-NAME.xpm, then BASE-NAME.pbm, and finally BASE-NAME.xbm.
For monochrome screens, the function will first try to find BASE-NAME.pbm, then BASE-NAME.xbm, then low-color/BASE-NAME.xpm, then BASE-NAME.png if PNG is supported, then BASE-NAME.xpm.
Currently, the function does not test for XPM support, only PNG.
If no suitable icon file is found, returns nil."
(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))))
(xpm-spec (list :type 'xpm :file (concat base-name ".xpm")))
(xpm-lo-spec (if (> (display-color-cells) 256)
nil ;; Not required
(list :type 'xpm :file
(concat "low-color/" base-name ".xpm"))))
(pbm-spec (append (list :type 'pbm :file
(concat base-name ".pbm")) colors))
(xbm-spec (append (list :type 'xbm :file
(concat base-name ".xbm")) colors))
;; Add PNG if supported.
(png-spec (if (image-type-available-p 'png)
(append (list :type 'png :file
(concat base-name ".png")) colors)
nil ; Not supported
))
;; Formats listed in order of decreasing preference.
(formats-for-monochrome-screens
(list pbm-spec ; Concise monochrome
xbm-spec ; Verbose monochrome
xpm-lo-spec ; Low-color
png-spec ; High quality color: nil if unsupported
xpm-spec ; Poor quality color
))
(formats-for-color-screens
(list xpm-lo-spec ; Low-color: nil if not preferred
png-spec ; High quality color: nil if unsupported
xpm-spec ; Poor quality color
pbm-spec ; Concise monochrome
xbm-spec ; Verbose monochrome
)))
(find-image
(if (display-color-p)
formats-for-color-screens
formats-for-monochrome-screens)))
)
;;;###autoload
(defun tool-bar-local-item (icon def key map &rest props)
"Add an item to the tool bar in map MAP.
ICON names the image, DEF is the key definition and KEY is a symbol
for the fake function key in the menu keymap. Remaining arguments
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 containing the image to use."
(let* ((image (tool-bar-find-best-icon icon)))
(when (and (display-images-p) image)
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
(define-key-after map (vector key)
`(menu-item ,(symbol-name key) ,def :image ,image ,@props)))))
;;;###autoload
(defun tool-bar-add-item-from-menu (command icon &optional map &rest props)
"Define tool bar binding for COMMAND in keymap MAP using the given ICON.
This makes a binding for COMMAND in `tool-bar-map', copying its
binding from the menu bar in MAP (which defaults to `global-map'), but
modifies the binding by adding an image specification for ICON. It
finds ICON just like `tool-bar-add-item'. PROPS are additional
properties to add to the binding.
MAP must contain appropriate binding for `[menu-bar]' which holds a keymap.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item-from-menu'."
(apply 'tool-bar-local-item-from-menu command icon
(default-value 'tool-bar-map) map props))
;;;###autoload
(defun tool-bar-local-item-from-menu (command icon in-map &optional from-map &rest props)
"Define local tool bar binding for COMMAND using the given ICON.
This makes a binding for COMMAND in IN-MAP, copying its binding from
the menu bar in FROM-MAP (which defaults to `global-map'), but
modifies the binding by adding an image specification for ICON. It
finds ICON just like `tool-bar-add-item'. PROPS are additional
properties to add to the binding.
FROM-MAP must contain appropriate binding for `[menu-bar]' which
holds a keymap."
(unless from-map
(setq from-map global-map))
(let* ((menu-bar-map (lookup-key from-map [menu-bar]))
(keys (where-is-internal command menu-bar-map))
(image (tool-bar-find-best-icon icon))
submap key)
(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)
;; We're looking for a binding of the command in a submap of
;; the menu bar map, so the key sequence must be two or more
;; long.
(if (and (vectorp k)
(> (length k) 1))
(let ((m (lookup-key menu-bar-map (substring k 0 -1)))
;; Last element in the bound key sequence:
(kk (aref k (1- (length k)))))
(if (and (keymapp m)
(symbolp kk))
(setq submap m
key kk)))))
(when (and (symbolp submap) (boundp submap))
(setq submap (eval submap)))
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
(let ((defn (assq key (cdr submap))))
(if (eq (cadr defn) 'menu-item)
(define-key-after in-map (vector key)
(append (cdr defn) (list :image image) props))
(setq defn (cdr defn))
(define-key-after in-map (vector key)
(let ((rest (cdr defn)))
;; If the rest of the definition starts
;; with a list of menu cache info, get rid of that.
(if (and (consp rest) (consp (car rest)))
(setq rest (cdr rest)))
(append `(menu-item ,(car defn) ,rest)
(list :image image) props))))))))
;;; Set up some global items. Additions/deletions up for grabs.
(defun tool-bar-setup ()
;; 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 'menu-find-file-existing "open")
(tool-bar-add-item-from-menu 'dired "diropen")
(tool-bar-add-item-from-menu 'kill-this-buffer "close")
(tool-bar-add-item-from-menu 'save-buffer "save" nil
:visible '(or buffer-file-name
(not (eq 'special
(get major-mode
'mode-class)))))
(tool-bar-add-item-from-menu 'write-file "saveas" nil
: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))))
(tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [cut])
"cut" nil
:visible '(not (eq 'special (get major-mode
'mode-class))))
(tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [copy])
"copy")
(tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [paste])
"paste" nil
:visible '(not (eq 'special (get major-mode
'mode-class))))
(tool-bar-add-item-from-menu 'nonincremental-search-forward "search")
;;(tool-bar-add-item-from-menu 'ispell-buffer "spell")
;; There's no icon appropriate for News and we need a command rather
;; than a lambda for Read Mail.
;;(tool-bar-add-item-from-menu 'compose-mail "mail/compose")
(tool-bar-add-item-from-menu 'print-buffer "print")
;; tool-bar-add-item-from-menu itself operates on
;; (default-value 'tool-bar-map), but when we don't use that function,
;; we must explicitly operate on the default value.
(let ((tool-bar-map (default-value 'tool-bar-map)))
(tool-bar-add-item "preferences" 'customize 'customize
:help "Edit preferences (customize)")
(tool-bar-add-item "help" (lambda ()
(interactive)
(popup-menu menu-bar-help-menu))
'help
:help "Pop up the Help menu"))
)
(provide 'tool-bar)
;;; arch-tag: 15f30f0a-d0d7-4d50-bbb7-f48fd0c8582f
;;; tool-bar.el ends here
[-- Attachment #4: tool-bar.el.diff --]
[-- Type: text/x-patch, Size: 8153 bytes --]
*** /cvs/emacs/lisp/tool-bar.el 2007-01-18 20:14:52.000000000 +0000
--- tool-bar.el 2007-01-18 14:18:55.000000000 +0000
***************
*** 98,113 ****
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 containing the image to use. The
! function will first try to use low-color/ICON.xpm if display-color-cells
! is less or equal to 256, then ICON.xpm, then ICON.pbm, and finally
! ICON.xbm, using `find-image'.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item'."
(apply 'tool-bar-local-item icon def key tool-bar-map props))
;;;###autoload
(defun tool-bar-local-item (icon def key map &rest props)
"Add an item to the tool bar in map MAP.
ICON names the image, DEF is the key definition and KEY is a symbol
--- 98,163 ----
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 containing the image to use.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item'."
(apply 'tool-bar-local-item icon def key tool-bar-map props))
;;;###autoload
+ (defun tool-bar-find-best-icon (base-name)
+ "Find the best available icon with for local display capabilities
+
+ BASE NAME is the sought filename without path or extension.
+
+ For color screens, the function will first try to find low-color/BASE-NAME.xpm if display-color-cells is less or equal to 256, then BASE-NAME.png if PNG is supported, then BASE-NAME.xpm, then BASE-NAME.pbm, and finally BASE-NAME.xbm.
+
+ For monochrome screens, the function will first try to find BASE-NAME.pbm, then BASE-NAME.xbm, then low-color/BASE-NAME.xpm, then BASE-NAME.png if PNG is supported, then BASE-NAME.xpm.
+
+ Currently, the function does not test for XPM support, only PNG.
+
+ If no suitable icon file is found, returns nil."
+ (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))))
+ (xpm-spec (list :type 'xpm :file (concat base-name ".xpm")))
+ (xpm-lo-spec (if (> (display-color-cells) 256)
+ nil ;; Not required
+ (list :type 'xpm :file
+ (concat "low-color/" base-name ".xpm"))))
+ (pbm-spec (append (list :type 'pbm :file
+ (concat base-name ".pbm")) colors))
+ (xbm-spec (append (list :type 'xbm :file
+ (concat base-name ".xbm")) colors))
+ ;; Add PNG if supported.
+ (png-spec (if (image-type-available-p 'png)
+ (append (list :type 'png :file
+ (concat base-name ".png")) colors)
+ nil ; Not supported
+ ))
+ ;; Formats listed in order of decreasing preference.
+ (formats-for-monochrome-screens
+ (list pbm-spec ; Concise monochrome
+ xbm-spec ; Verbose monochrome
+ xpm-lo-spec ; Low-color
+ png-spec ; High quality color: nil if unsupported
+ xpm-spec ; Poor quality color
+ ))
+ (formats-for-color-screens
+ (list xpm-lo-spec ; Low-color: nil if not preferred
+ png-spec ; High quality color: nil if unsupported
+ xpm-spec ; Poor quality color
+ pbm-spec ; Concise monochrome
+ xbm-spec ; Verbose monochrome
+ )))
+ (find-image
+ (if (display-color-p)
+ formats-for-color-screens
+ formats-for-monochrome-screens)))
+ )
+
+ ;;;###autoload
(defun tool-bar-local-item (icon def key map &rest props)
"Add an item to the tool bar in map MAP.
ICON names the image, DEF is the key definition and KEY is a symbol
***************
*** 115,142 ****
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 containing the image to use. The
! function will first try to use low-color/ICON.xpm if display-color-cells
! is less or equal to 256, then ICON.xpm, then ICON.pbm, and finally
! ICON.xbm, using `find-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))))
! (xpm-spec (list :type 'xpm :file (concat icon ".xpm")))
! (xpm-lo-spec (if (> (display-color-cells) 256)
! nil
! (list :type 'xpm :file
! (concat "low-color/" icon ".xpm"))))
! (pbm-spec (append (list :type 'pbm :file
! (concat icon ".pbm")) colors))
! (xbm-spec (append (list :type 'xbm :file
! (concat icon ".xbm")) colors))
! (image (find-image
! (if (display-color-p)
! (list xpm-lo-spec xpm-spec pbm-spec xbm-spec)
! (list pbm-spec xbm-spec xpm-lo-spec xpm-spec)))))
!
(when (and (display-images-p) image)
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
--- 165,172 ----
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 containing the image to use."
! (let* ((image (tool-bar-find-best-icon icon)))
(when (and (display-images-p) image)
(unless (image-mask-p image)
(setq image (append image '(:mask heuristic))))
***************
*** 148,155 ****
"Define tool bar binding for COMMAND in keymap MAP using the given ICON.
This makes a binding for COMMAND in `tool-bar-map', copying its
binding from the menu bar in MAP (which defaults to `global-map'), but
! modifies the binding by adding an image specification for ICON. It
! finds ICON just like `tool-bar-add-item'. PROPS are additional
properties to add to the binding.
MAP must contain appropriate binding for `[menu-bar]' which holds a keymap.
--- 178,185 ----
"Define tool bar binding for COMMAND in keymap MAP using the given ICON.
This makes a binding for COMMAND in `tool-bar-map', copying its
binding from the menu bar in MAP (which defaults to `global-map'), but
! modifies the binding by adding an image specification for ICON. It
! finds ICON just like `tool-bar-add-item'. PROPS are additional
properties to add to the binding.
MAP must contain appropriate binding for `[menu-bar]' which holds a keymap.
***************
*** 174,196 ****
(setq from-map global-map))
(let* ((menu-bar-map (lookup-key from-map [menu-bar]))
(keys (where-is-internal command menu-bar-map))
! (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))))
! (xpm-spec (list :type 'xpm :file (concat icon ".xpm")))
! (xpm-lo-spec (if (> (display-color-cells) 256)
! nil
! (list :type 'xpm :file
! (concat "low-color/" icon ".xpm"))))
! (pbm-spec (append (list :type 'pbm :file
! (concat icon ".pbm")) colors))
! (xbm-spec (append (list :type 'xbm :file
! (concat icon ".xbm")) colors))
! (spec (if (display-color-p)
! (list xpm-lo-spec xpm-spec pbm-spec xbm-spec)
! (list pbm-spec xbm-spec xpm-lo-spec xpm-spec)))
! (image (find-image spec))
submap key)
(when (and (display-images-p) image)
;; We'll pick up the last valid entry in the list of keys if
--- 204,210 ----
(setq from-map global-map))
(let* ((menu-bar-map (lookup-key from-map [menu-bar]))
(keys (where-is-internal command menu-bar-map))
! (image (tool-bar-find-best-icon icon))
submap key)
(when (and (display-images-p) image)
;; We'll pick up the last valid entry in the list of keys if
[-- Attachment #5: Type: text/plain, Size: 142 bytes --]
_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Request for enhancement: support PNG icons in toolbar
2007-01-18 20:18 Benjamin Hawkes-Lewis
2007-01-18 22:55 ` Leo
@ 2007-01-19 10:43 ` Richard Stallman
2007-12-01 9:45 ` Leo
2 siblings, 0 replies; 5+ messages in thread
From: Richard Stallman @ 2007-01-19 10:43 UTC (permalink / raw)
Cc: emacs-devel
This is big enough to need legal papers. I will tell you how to
arrange for them, and we can install this after the release.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Request for enhancement: support PNG icons in toolbar
2007-01-18 20:18 Benjamin Hawkes-Lewis
2007-01-18 22:55 ` Leo
2007-01-19 10:43 ` Richard Stallman
@ 2007-12-01 9:45 ` Leo
2 siblings, 0 replies; 5+ messages in thread
From: Leo @ 2007-12-01 9:45 UTC (permalink / raw)
To: emacs-devel
On 2007-01-18 20:18 +0000, Benjamin Hawkes-Lewis wrote:
> Currently, when libpng is available, Emacs has support for PNG. But it
> only searches for XBM, XPM, and PBM icons for its toolbar, even though
> PNG icons are considerably more attractive. I've written a patch for the
> tool-bar.el from Emacs CVS, which tests for PNG support before adding
> the PNG format to the search, facilitating a prettier Emacs toolbar.
Hi All,
Do you know what happened to this proposal?
Thanks,
--
.: Leo :. [ sdl.web AT gmail.com ] .: [ GPG Key: 9283AA3F ] :.
Use the best OS -- http://www.fedoraproject.org/
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2007-12-01 9:45 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-19 0:16 Request for enhancement: support PNG icons in toolbar Benjamin Hawkes-Lewis
-- strict thread matches above, loose matches on Subject: below --
2007-01-18 20:18 Benjamin Hawkes-Lewis
2007-01-18 22:55 ` Leo
2007-01-19 10:43 ` Richard Stallman
2007-12-01 9:45 ` Leo
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.