[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Icon update
From: |
Jan D. |
Subject: |
Re: Icon update |
Date: |
Wed, 29 Mar 2006 12:11:21 +0200 |
User-agent: |
Thunderbird 1.5 (X11/20051201) |
Leon wrote:
"Jan D." <address@hidden> writes:
David Kastrup wrote:
Bill Wohler <address@hidden> writes:
By the way, if anyone has GTK experience, the Emacs code should be using
the GTK libraries to render the icons and only using our built-in icons
as a fall-back. That way, Emacs icons will pick up theme changes.
I have a patch that does just that, but I decided to wait with it
until after the release. It will only work for Emacs compiled with
GTK, but I guess that is obvious.
Jan D.
Sounds interesting. May I have a copy of the patch? Thanks.
Attached. But some icons don't have stock items, so the effect may be strange
for some themes.
Jan D.
Index: lisp/info.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/info.el,v
retrieving revision 1.481
diff -u -c -r1.481 info.el
*** lisp/info.el 11 Mar 2006 22:35:18 -0000 1.481
--- lisp/info.el 29 Mar 2006 10:05:16 -0000
***************
*** 3209,3224 ****
(defvar info-tool-bar-map
(if (display-graphic-p)
(let ((map (make-sparse-keymap)))
! (tool-bar-local-item-from-menu 'Info-exit "close" map Info-mode-map)
! (tool-bar-local-item-from-menu 'Info-history-back "left-arrow" map
Info-mode-map)
! (tool-bar-local-item-from-menu 'Info-history-forward "right-arrow" map
Info-mode-map)
(tool-bar-local-item-from-menu 'Info-prev "prev-node" map Info-mode-map)
(tool-bar-local-item-from-menu 'Info-next "next-node" map Info-mode-map)
(tool-bar-local-item-from-menu 'Info-up "up-node" map Info-mode-map)
! (tool-bar-local-item-from-menu 'Info-top-node "home" map Info-mode-map)
! (tool-bar-local-item-from-menu 'Info-goto-node "jump-to" map
Info-mode-map)
! (tool-bar-local-item-from-menu 'Info-index "index" map Info-mode-map)
! (tool-bar-local-item-from-menu 'Info-search "search" map Info-mode-map)
map)))
(defvar Info-menu-last-node nil)
--- 3209,3231 ----
(defvar info-tool-bar-map
(if (display-graphic-p)
(let ((map (make-sparse-keymap)))
! (tool-bar-local-item-from-menu 'Info-exit "close" map Info-mode-map
! :stock "gtk-close")
! (tool-bar-local-item-from-menu 'Info-history-back "left-arrow" map
Info-mode-map
! :stock "gtk-go-back")
! (tool-bar-local-item-from-menu 'Info-history-forward "right-arrow" map
Info-mode-map
! :stock "gtk-go-forward")
(tool-bar-local-item-from-menu 'Info-prev "prev-node" map Info-mode-map)
(tool-bar-local-item-from-menu 'Info-next "next-node" map Info-mode-map)
(tool-bar-local-item-from-menu 'Info-up "up-node" map Info-mode-map)
! (tool-bar-local-item-from-menu 'Info-top-node "home" map Info-mode-map
! :stock "gtk-home")
! (tool-bar-local-item-from-menu 'Info-goto-node "jump-to" map
Info-mode-map
! :stock "gtk-jump-to")
! (tool-bar-local-item-from-menu 'Info-index "index" map Info-mode-map
! :stock "gtk-index")
! (tool-bar-local-item-from-menu 'Info-search "search" map Info-mode-map
! :stock "gtk-find")
map)))
(defvar Info-menu-last-node nil)
Index: lisp/tool-bar.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/tool-bar.el,v
retrieving revision 1.5
diff -u -c -r1.5 tool-bar.el
*** lisp/tool-bar.el 6 Feb 2006 14:33:35 -0000 1.5
--- lisp/tool-bar.el 29 Mar 2006 10:05:16 -0000
***************
*** 232,279 ****
;; 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 "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")
)
--- 232,291 ----
;; 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" nil :stock "gtk-new")
! (tool-bar-add-item-from-menu 'menu-find-file-existing "open"
! nil :stock "gtk-open")
! (tool-bar-add-item-from-menu 'dired "diropen"
! nil :stock "gtk-directory")
! (tool-bar-add-item-from-menu 'kill-this-buffer "close"
! nil :stock "gtk-close")
(tool-bar-add-item-from-menu 'save-buffer "save" nil
+ :stock "gtk-save"
:visible '(or buffer-file-name
(not (eq 'special
(get major-mode
'mode-class)))))
(tool-bar-add-item-from-menu 'write-file "saveas" nil
+ :stock "gtk-save-as"
:visible '(or buffer-file-name
(not (eq 'special
(get major-mode
'mode-class)))))
(tool-bar-add-item-from-menu 'undo "undo" nil
+ :stock "gtk-undo"
:visible '(not (eq 'special (get major-mode
'mode-class))))
(tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [cut])
"cut" nil
+ :stock "gtk-cut"
:visible '(not (eq 'special (get major-mode
'mode-class))))
(tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [copy])
! "copy" nil :stock "gtk-copy")
(tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [paste])
"paste" nil
+ :stock "gtk-paste"
:visible '(not (eq 'special (get major-mode
'mode-class))))
! (tool-bar-add-item-from-menu 'nonincremental-search-forward "search"
! nil :stock "gtk-find")
;;(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"
! nil :stock "gtk-print")
(tool-bar-add-item "preferences" 'customize 'customize
+ :stock "gtk-preferences"
:help "Edit preferences (customize)")
(tool-bar-add-item "help" (lambda ()
(interactive)
(popup-menu menu-bar-help-menu))
'help
+ :stock "gtk-help"
:help "Pop up the Help menu")
)
Index: src/dispextern.h
===================================================================
RCS file: /cvsroot/emacs/emacs/src/dispextern.h,v
retrieving revision 1.215
diff -u -c -r1.215 dispextern.h
*** src/dispextern.h 15 Mar 2006 07:55:36 -0000 1.215
--- src/dispextern.h 29 Mar 2006 10:05:17 -0000
***************
*** 2539,2544 ****
--- 2539,2547 ----
/* Help string. */
TOOL_BAR_ITEM_HELP,
+ /* Stock image. */
+ TOOL_BAR_ITEM_STOCK_IMAGE,
+
/* Sentinel = number of slots in tool_bar_items occupied by one
tool-bar item. */
TOOL_BAR_ITEM_NSLOTS
Index: src/gtkutil.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/gtkutil.c,v
retrieving revision 1.84
diff -u -c -r1.84 gtkutil.c
*** src/gtkutil.c 24 Feb 2006 15:36:39 -0000 1.84
--- src/gtkutil.c 29 Mar 2006 10:05:17 -0000
***************
*** 3243,3248 ****
--- 3243,3253 ----
#define XG_TOOL_BAR_LAST_MODIFIER "emacs-tool-bar-modifier"
+ /* The key for the data we put in the GtkImage widgets. The data is
+ the stock name used by Emacs. We use this to see if we need to update
+ the GtkImage with a new image. */
+ #define XG_TOOL_BAR_STOCK_NAME "emacs-tool-bar-stock-name"
+
/* Callback function invoked when a tool bar item is pressed.
W is the button widget in the tool bar that got pressed,
CLIENT_DATA is an integer that is the index of the button in the
***************
*** 3525,3530 ****
--- 3530,3536 ----
GList *iter;
struct x_output *x = f->output_data.x;
int hmargin, vmargin;
+ GtkToolbar *wtoolbar;
if (! FRAME_GTK_WIDGET (f))
return;
***************
*** 3558,3566 ****
if (! x->toolbar_widget)
xg_create_tool_bar (f);
! gtk_widget_size_request (x->toolbar_widget, &old_req);
!
! icon_list = gtk_container_get_children (GTK_CONTAINER (x->toolbar_widget));
iter = icon_list;
for (i = 0; i < f->n_tool_bar_items; ++i)
--- 3564,3573 ----
if (! x->toolbar_widget)
xg_create_tool_bar (f);
! wtoolbar = GTK_TOOLBAR (x->toolbar_widget);
! gtk_widget_size_request (GTK_WIDGET (wtoolbar), &old_req);
!
! icon_list = gtk_container_get_children (GTK_CONTAINER (wtoolbar));
iter = icon_list;
for (i = 0; i < f->n_tool_bar_items; ++i)
***************
*** 3571,3622 ****
int selected_p = !NILP (PROP (TOOL_BAR_ITEM_SELECTED_P));
int idx;
int img_id;
! struct image *img;
Lisp_Object image;
GtkWidget *wicon = iter ? GTK_WIDGET (iter->data) : 0;
if (iter) iter = g_list_next (iter);
! /* If image is a vector, choose the image according to the
! button state. */
! image = PROP (TOOL_BAR_ITEM_IMAGES);
! if (VECTORP (image))
! {
! if (enabled_p)
! idx = (selected_p
! ? TOOL_BAR_IMAGE_ENABLED_SELECTED
! : TOOL_BAR_IMAGE_ENABLED_DESELECTED);
! else
! idx = (selected_p
! ? TOOL_BAR_IMAGE_DISABLED_SELECTED
! : TOOL_BAR_IMAGE_DISABLED_DESELECTED);
!
! xassert (ASIZE (image) >= idx);
! image = AREF (image, idx);
! }
! else
! idx = -1;
! /* Ignore invalid image specifications. */
! if (!valid_image_p (image))
{
! if (wicon) gtk_widget_hide (wicon);
! continue;
}
! img_id = lookup_image (f, image);
! img = IMAGE_FROM_ID (f, img_id);
! prepare_image_for_display (f, img);
- if (img->load_failed_p || img->pixmap == None)
- {
- if (wicon) gtk_widget_hide (wicon);
- continue;
}
if (! wicon)
{
! GtkWidget *w = xg_get_image_for_pixmap (f, img, x->widget, NULL);
GtkToolItem *ti = gtk_tool_button_new (w, "");
gtk_misc_set_padding (GTK_MISC (w), hmargin, vmargin);
--- 3578,3663 ----
int selected_p = !NILP (PROP (TOOL_BAR_ITEM_SELECTED_P));
int idx;
int img_id;
! int icon_size = 0;
! struct image *img = NULL;
Lisp_Object image;
+ Lisp_Object stock;
GtkWidget *wicon = iter ? GTK_WIDGET (iter->data) : 0;
+ GtkStockItem stock_item;
+ char *stock_name = NULL;
if (iter) iter = g_list_next (iter);
! stock = PROP (TOOL_BAR_ITEM_STOCK_IMAGE);
! if (! NILP (stock) && STRINGP (stock)
! && gtk_stock_lookup (SSDATA (stock), &stock_item))
{
! stock_name = SSDATA (stock);
! icon_size = gtk_toolbar_get_icon_size (wtoolbar);
}
+ else
+ {
+ /* No stock image, or stock item not known. Try regular image. */
! /* If image is a vector, choose the image according to the
! button state. */
! image = PROP (TOOL_BAR_ITEM_IMAGES);
! if (VECTORP (image))
! {
! if (enabled_p)
! idx = (selected_p
! ? TOOL_BAR_IMAGE_ENABLED_SELECTED
! : TOOL_BAR_IMAGE_ENABLED_DESELECTED);
! else
! idx = (selected_p
! ? TOOL_BAR_IMAGE_DISABLED_SELECTED
! : TOOL_BAR_IMAGE_DISABLED_DESELECTED);
!
! xassert (ASIZE (image) >= idx);
! image = AREF (image, idx);
! }
! else
! idx = -1;
!
! /* Ignore invalid image specifications. */
! if (!valid_image_p (image))
! {
! if (wicon) gtk_widget_hide (wicon);
! continue;
! }
!
! img_id = lookup_image (f, image);
! img = IMAGE_FROM_ID (f, img_id);
! prepare_image_for_display (f, img);
!
! if (img->load_failed_p || img->pixmap == None)
! {
! if (wicon) gtk_widget_hide (wicon);
! continue;
! }
}
if (! wicon)
{
! GtkWidget *w;
! if (stock_name)
! {
! w = gtk_image_new_from_stock (stock_name, icon_size);
! g_object_set_data_full (G_OBJECT (w), XG_TOOL_BAR_STOCK_NAME,
! (gpointer) xstrdup (stock_name),
! (GDestroyNotify) xfree);
! }
! else
! {
! w = xg_get_image_for_pixmap (f, img, x->widget, NULL);
! /* Save the image so we can see if an update is needed when
! this function is called again. */
! g_object_set_data (G_OBJECT (w), XG_TOOL_BAR_IMAGE_DATA,
! (gpointer)img->pixmap);
! }
!
GtkToolItem *ti = gtk_tool_button_new (w, "");
gtk_misc_set_padding (GTK_MISC (w), hmargin, vmargin);
***************
*** 3632,3641 ****
gtk_widget_show (GTK_WIDGET (ti));
gtk_widget_show (GTK_WIDGET (w));
- /* Save the image so we can see if an update is needed when
- this function is called again. */
- g_object_set_data (G_OBJECT (w), XG_TOOL_BAR_IMAGE_DATA,
- (gpointer)img->pixmap);
g_object_set_data (G_OBJECT (ti), XG_FRAME_DATA, (gpointer)f);
--- 3673,3678 ----
***************
*** 3684,3698 ****
GtkImage *wimage = GTK_IMAGE (chlist->data);
Pixmap old_img = (Pixmap)g_object_get_data (G_OBJECT (wimage),
XG_TOOL_BAR_IMAGE_DATA);
g_list_free (chlist);
! gtk_misc_set_padding (GTK_MISC (wimage), hmargin, vmargin);
! if (old_img != img->pixmap)
! (void) xg_get_image_for_pixmap (f, img, x->widget, wimage);
!
! g_object_set_data (G_OBJECT (wimage), XG_TOOL_BAR_IMAGE_DATA,
! (gpointer)img->pixmap);
gtk_widget_set_sensitive (wicon, enabled_p);
gtk_widget_show (wicon);
--- 3721,3751 ----
GtkImage *wimage = GTK_IMAGE (chlist->data);
Pixmap old_img = (Pixmap)g_object_get_data (G_OBJECT (wimage),
XG_TOOL_BAR_IMAGE_DATA);
+ gpointer old_stock_name = g_object_get_data (G_OBJECT (wimage),
+
XG_TOOL_BAR_STOCK_NAME);
g_list_free (chlist);
! if (stock_name &&
! (! old_stock_name || strcmp (old_stock_name, stock_name) != 0))
! {
! gtk_image_set_from_stock (wimage, stock_name, icon_size);
! g_object_set_data_full (G_OBJECT (wimage),
XG_TOOL_BAR_STOCK_NAME,
! (gpointer) xstrdup (stock_name),
! (GDestroyNotify) xfree);
! g_object_set_data (G_OBJECT (wimage), XG_TOOL_BAR_IMAGE_DATA,
! NULL);
! }
! else if (img && old_img != img->pixmap)
! {
! (void) xg_get_image_for_pixmap (f, img, x->widget, wimage);
! g_object_set_data (G_OBJECT (wimage), XG_TOOL_BAR_IMAGE_DATA,
! (gpointer)img->pixmap);
!
! g_object_set_data (G_OBJECT (wimage), XG_TOOL_BAR_STOCK_NAME,
! NULL);
! }
! gtk_misc_set_padding (GTK_MISC (wimage), hmargin, vmargin);
gtk_widget_set_sensitive (wicon, enabled_p);
gtk_widget_show (wicon);
***************
*** 3710,3716 ****
iter = g_list_next (iter);
}
! gtk_widget_size_request (x->toolbar_widget, &new_req);
if (old_req.height != new_req.height
&& ! FRAME_X_OUTPUT (f)->toolbar_detached)
{
--- 3763,3769 ----
iter = g_list_next (iter);
}
! gtk_widget_size_request (GTK_WIDGET (wtoolbar), &new_req);
if (old_req.height != new_req.height
&& ! FRAME_X_OUTPUT (f)->toolbar_detached)
{
Index: src/keyboard.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/keyboard.c,v
retrieving revision 1.851
diff -u -c -r1.851 keyboard.c
*** src/keyboard.c 29 Mar 2006 08:00:23 -0000 1.851
--- src/keyboard.c 29 Mar 2006 10:05:18 -0000
***************
*** 7573,7582 ****
static int ntool_bar_items;
! /* The symbols `tool-bar', and `:image'. */
extern Lisp_Object Qtool_bar;
Lisp_Object QCimage;
/* Function prototypes. */
--- 7573,7583 ----
static int ntool_bar_items;
! /* The symbols `tool-bar', `:image' and `:stock'. */
extern Lisp_Object Qtool_bar;
Lisp_Object QCimage;
+ Lisp_Object Qstock;
/* Function prototypes. */
***************
*** 7862,7867 ****
--- 7863,7871 ----
/* Value is either a single image specification or a vector
of 4 such specifications for the different button states. */
PROP (TOOL_BAR_ITEM_IMAGES) = value;
+ else if (EQ (key, Qstock))
+ /* ':stock STRING' */
+ PROP (TOOL_BAR_ITEM_STOCK_IMAGE) = value;
}
/* If got a filter apply it on binding. */
***************
*** 10846,10851 ****
--- 10850,10858 ----
staticpro (&Qhelp_echo);
Qhelp_echo = intern ("help-echo");
+ staticpro (&Qstock);
+ Qstock = intern (":stock");
+
staticpro (&item_properties);
item_properties = Qnil;
- Icon update, Bill Wohler, 2006/03/26
- Re: Icon update, Bill Wohler, 2006/03/26
- Re: Icon update, David Kastrup, 2006/03/27
- Re: Icon update, Jan D., 2006/03/28
- Re: Icon update, Leon, 2006/03/28
- Re: Icon update, Bill Wohler, 2006/03/28
- Re: Icon update,
Jan D. <=
- Re: Icon update, Leon, 2006/03/29
- Re: Icon update, Leon, 2006/03/29
- Re: Icon update, Stefan Monnier, 2006/03/29
- Re: Icon update, Leon, 2006/03/29
- Re: Icon update, Jan D., 2006/03/30
- Re: Icon update, Bill Wohler, 2006/03/30
- Re: Icon update, Jan D., 2006/03/31
- Re: Icon update, Bill Wohler, 2006/03/31
- Re: Icon update, Leon, 2006/03/30
- Re: Icon update, Bill Wohler, 2006/03/30