all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Jan D." <jan.h.d@swipnet.se>
Cc: emacs-devel@gnu.org
Subject: Re: Icon update
Date: Wed, 29 Mar 2006 12:11:21 +0200	[thread overview]
Message-ID: <442A5D49.1000302@swipnet.se> (raw)
In-Reply-To: <m2mzfankt1.fsf@sl392.st-edmunds.cam.ac.uk>

[-- Attachment #1: Type: text/plain, Size: 713 bytes --]



Leon wrote:
> "Jan D." <jan.h.d@swipnet.se> writes:
> 
>> David Kastrup wrote:
>>> Bill Wohler <wohler@newt.com> 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.

[-- Attachment #2: emacs-stock.diff --]
[-- Type: text/x-patch, Size: 18463 bytes --]

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;
  

[-- Attachment #3: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

  parent reply	other threads:[~2006-03-29 10:11 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-03-26 22:57 Icon update Bill Wohler
2006-03-26 22:59 ` Bill Wohler
2006-03-27 19:55   ` David Kastrup
2006-03-28  6:33     ` Jan D.
2006-03-29  0:42       ` Leon
2006-03-29  4:17         ` Bill Wohler
2006-03-29 10:11         ` Jan D. [this message]
2006-03-29 19:03           ` Leon
2006-03-29 20:06             ` Leon
2006-03-29 20:34               ` Stefan Monnier
2006-03-29 20:42                 ` Leon
2006-03-30  7:05                   ` Jan D.
2006-03-30 19:39                     ` Bill Wohler
2006-03-31 12:22                       ` Jan D.
2006-03-31 17:37                         ` Bill Wohler
2006-04-01 12:19                           ` Jan D.
2006-04-01 16:22                             ` Bill Wohler
2006-04-01 20:06                               ` Bill Wohler
2006-04-03  6:28                               ` Jan D.
2006-04-03 22:09                                 ` Bill Wohler
2006-04-04  6:48                                   ` Jan D.
2006-04-04 19:04                                   ` Bill Wohler
2006-04-04 19:09                                     ` Lennart Borgman
2006-04-04 19:30                                       ` Bill Wohler
2006-04-05  7:08                                         ` Jan D.
2006-04-05  7:13                                           ` Miles Bader
2006-03-30 20:41                     ` Leon
2006-03-31  1:52                       ` Bill Wohler
2006-03-31 12:29                         ` Jan D.
2006-03-29 21:47                 ` Bill Wohler
2006-03-29 22:50                   ` Stefan Monnier
2006-03-30  6:56               ` Jan D.
2006-03-30 20:26                 ` Leon
2006-03-30  6:43             ` Jan D.
2006-03-28 19:22 ` Bill Wohler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=442A5D49.1000302@swipnet.se \
    --to=jan.h.d@swipnet.se \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.