[Commits] [SCM] claws branch, master, updated. 3.14.1-55-gb4d895b

wwp at claws-mail.org wwp at claws-mail.org
Wed Dec 14 11:09:34 CET 2016


The branch, master has been updated
       via  b4d895b8b87dcb0850a6f628d95a45c8dcf13d56 (commit)
      from  06f63cb892ca160d54fb28ca4a185c89b7b901fb (commit)

Summary of changes:
 src/toolbar.c |  109 ++++++++++++++++++++++++++++++++++++++-------------------
 src/toolbar.h |    2 ++
 2 files changed, 75 insertions(+), 36 deletions(-)


- Log -----------------------------------------------------------------
commit b4d895b8b87dcb0850a6f628d95a45c8dcf13d56
Author: wwp <wwp at free.fr>
Date:   Wed Dec 14 11:06:18 2016 +0100

    Fix possibly broken toolbar_compose.xml by migrating A_SENDL actions names
    to A_SEND_LATER. An attempt to rewrite the whole toolbar .xml file was done
    when only a part of it was read, leading to toolbar elements loss; the
    rewrite of migrated toolbar configs is now done a posteriori.
    Also, the renaming/migration magics swallowed the existing one
    for A_SYL_ACTIONS.

diff --git a/src/toolbar.c b/src/toolbar.c
index b48b804..1f36f71 100644
--- a/src/toolbar.c
+++ b/src/toolbar.c
@@ -79,7 +79,7 @@ static void toolbar_init(Toolbar * toolbar);
 static gboolean      toolbar_is_duplicate		(gint           action,
 					      	 ToolbarType	source);
 static void   toolbar_parse_item		(XMLFile        *file,
-					      	 ToolbarType	source);
+					      	 ToolbarType	source, gboolean *rewrite);
 
 static gint   toolbar_ret_val_from_text		(const gchar	*text);
 static gchar *toolbar_ret_text_from_val		(gint           val);
@@ -233,9 +233,9 @@ struct {
 	{ "A_IGNORE_THREAD", 	N_("Ignore thread")                        },
 	{ "A_WATCH_THREAD", 	N_("Watch thread")                         },
 	{ "A_MARK", 			N_("Mark Message")                         },
-	{ "A_UNMARK", 			N_("Unmark Message")                         },
+	{ "A_UNMARK", 			N_("Unmark Message")                       },
 	{ "A_LOCK", 			N_("Lock Message")                         },
-	{ "A_UNLOCK", 			N_("Unlock Message")                         },
+	{ "A_UNLOCK", 			N_("Unlock Message")                       },
 	{ "A_ALL_READ",			N_("Mark all Messages as read")            },
 	{ "A_ALL_UNREAD",		N_("Mark all Messages as unread")          },
 	{ "A_READ", 			N_("Mark Message as read")                 },
@@ -252,7 +252,7 @@ struct {
 	{ "A_INSERT",        	N_("Insert file")                          },   
 	{ "A_ATTACH",        	N_("Attach file")                          },
 	{ "A_SIG",           	N_("Insert signature")                     },
-	{ "A_REP_SIG",          N_("Replace signature")                     },
+	{ "A_REP_SIG",          N_("Replace signature")                    },
 	{ "A_EXTEDITOR",     	N_("Edit with external editor")            },
 	{ "A_LINEWRAP_CURRENT",	N_("Wrap long lines of current paragraph") }, 
 	{ "A_LINEWRAP_ALL",     N_("Wrap all long lines")                  }, 
@@ -266,9 +266,22 @@ struct {
 	{ "A_CANCEL_ALL",       N_("Cancel receiving/sending")             },
 	{ "A_CLOSE",            N_("Close window")                         },
 	{ "A_SEPARATOR",     	N_("Separator")                            },
-	{ "A_CLAWS_PLUGINS",    N_("Claws Mail Plugins")                   },
+	{ "A_CLAWS_PLUGINS",    N_("Claws Mail Plugins")                   }
 };
 
+/* migration table: support reading toolbar configuration files with
+   old action names and converting them to current action names,
+   see toolbar_parse_item(), which makes uses of this alias table.
+*/
+struct {
+	const gchar *old_name;
+	const gchar *current_name;
+} toolbar_migration [] = {
+	{ "A_SYL_ACTIONS",   "A_CLAWS_ACTIONS" },
+	{ "A_SENDL",         "A_SEND_LATER" },
+	{ NULL,              NULL }
+};
+	
 /* struct holds configuration files and a list of
  * currently active toolbar items 
  * TOOLBAR_MAIN, TOOLBAR_COMPOSE and TOOLBAR_MSGVIEW
@@ -390,12 +403,11 @@ GList *toolbar_get_action_items(ToolbarType source)
 	return items;
 }
 
-static void toolbar_parse_item(XMLFile *file, ToolbarType source)
+static void toolbar_parse_item(XMLFile *file, ToolbarType source, gboolean *rewrite)
 {
 	GList *attr;
 	gchar *name, *value;
 	ToolbarItem *item = NULL;
-	gboolean rewrite = FALSE;
 
 	attr = xml_get_current_tag_attr(file);
 	item = g_new0(ToolbarItem, 1);
@@ -409,52 +421,64 @@ static void toolbar_parse_item(XMLFile *file, ToolbarType source)
 			item->text = g_strdup (*value ? gettext(value):"");
 		else if (g_utf8_collate(name, TOOLBAR_ICON_ACTION) == 0)
 			item->index = toolbar_ret_val_from_text(value);
-		if (item->index == -1 && !strcmp(value, "A_DELETE")) {
+
+		if ((item->index == -1) && !strcmp(value, "A_DELETE")) {
 			/* switch button */
 			item->index = A_TRASH;
 			g_free(item->file);
 			item->file = g_strdup("trash_btn");
 			g_free(item->text);
 			item->text = g_strdup(C_("Toolbar", "Trash"));
-			rewrite = TRUE;
+			*rewrite = TRUE;
 		}
-		if (item->index == -1 && !strcmp(value, "A_SYL_ACTIONS")) {
-			/* switch button */
-			item->index = A_CLAWS_ACTIONS;
-			rewrite = TRUE;
+		if (item->index == -1) {
+			/* item not found in table: try migrating old action names to current ones */
+			gint i;
+
+			/* replace action name */
+			for (i = 0; toolbar_migration[i].old_name != NULL; i++) {
+				if (g_utf8_collate(value, toolbar_migration[i].old_name) == 0) {
+					item->index = toolbar_ret_val_from_text(toolbar_migration[i].current_name);
+					if (item->index != -1) {
+						*rewrite = TRUE;
+						debug_print("toolbar_parse_item: migrating action label from '%s' to '%s'\n",
+							value, toolbar_migration[i].current_name);
+						break;
+					}
+				}
+			}
 		}
+		if ((item->index == -1) && !rewrite)
+			g_warning("toolbar_parse_item: unrecognized action name '%s'\n", value);
+
 		attr = g_list_next(attr);
 	}
 	if (item->index != -1) {
-		
 		if (!toolbar_is_duplicate(item->index, source)) 
 			toolbar_config[source].item_list = g_slist_append(toolbar_config[source].item_list,
 									 item);
 	}
-	if (rewrite) {
-		toolbar_save_config_file(source);
-	}
 }
 
 const gchar *toolbar_get_short_text(int action) {
 	switch(action) {
-	case A_GO_FOLDERS: 	return _("Folders");
-	case A_OPEN_MAIL: 	return _("Open");
 	case A_RECEIVE_ALL: 	return _("Get Mail");
 	case A_RECEIVE_CUR: 	return _("Get");
 	case A_SEND_QUEUED: 	return _("Send");
 	case A_COMPOSE_EMAIL: 	return C_("Toolbar", "Compose");
 	case A_COMPOSE_NEWS: 	return C_("Toolbar", "Compose");
 	case A_REPLY_MESSAGE: 	return _("Reply");
-	case A_REPLY_ALL: 	return _("All");
 	case A_REPLY_SENDER: 	return C_("Toolbar", "Sender");
+	case A_REPLY_ALL: 	return _("All");
 	case A_REPLY_ML: 	return _("List");
+	case A_OPEN_MAIL: 	return _("Open");
 	case A_FORWARD: 	return _("Forward");
 	case A_TRASH: 		return C_("Toolbar", "Trash");
 	case A_DELETE_REAL:	return _("Delete");
-	case A_LEARN_SPAM: 	return _("Spam");
+	case A_EXECUTE:		return _("Execute");
 	case A_GOTO_PREV: 	return _("Prev");
 	case A_GOTO_NEXT: 	return _("Next");
+
 	case A_IGNORE_THREAD: 	return _("Ignore thread");
 	case A_WATCH_THREAD: 	return _("Watch thread");
 	case A_MARK: 		return _("Mark");
@@ -465,9 +489,12 @@ const gchar *toolbar_get_short_text(int action) {
 	case A_ALL_UNREAD: 	return _("All unread");
 	case A_READ: 		return _("Read");
 	case A_UNREAD: 		return _("Unread");
+
 	case A_PRINT:	 	return _("Print");
-	case A_CLOSE: 		return _("Close");
+	case A_LEARN_SPAM: 	return _("Spam");
+	case A_GO_FOLDERS: 	return _("Folders");
 	case A_PREFERENCES:	return _("Preferences");
+
 	case A_SEND: 		return _("Send");
 	case A_SEND_LATER:	return _("Send later");
 	case A_DRAFT: 		return _("Draft");
@@ -479,36 +506,37 @@ const gchar *toolbar_get_short_text(int action) {
 	case A_LINEWRAP_CURRENT:return _("Wrap para.");
 	case A_LINEWRAP_ALL:	return _("Wrap all");
 	case A_ADDRBOOK: 	return _("Address");
-	case A_CANCEL_INC:	return _("Stop");
-	case A_CANCEL_SEND:	return _("Stop");
-	case A_CANCEL_ALL:	return _("Stop all");
-	case A_EXECUTE:		return _("Execute");
 	#ifdef USE_ENCHANT
 	case A_CHECK_SPELLING:	return _("Check spelling");
 	#endif
+
+	case A_CANCEL_INC:	return _("Stop");
+	case A_CANCEL_SEND:	return _("Stop");
+	case A_CANCEL_ALL:	return _("Stop all");
+	case A_CLOSE: 		return _("Close");
 	default:		return "";
 	}
 }
 
 gint toolbar_get_icon(int action) {
 	switch(action) {
-	case A_GO_FOLDERS: 	return STOCK_PIXMAP_GO_FOLDERS;
-	case A_OPEN_MAIL: 	return STOCK_PIXMAP_OPEN_MAIL;
 	case A_RECEIVE_ALL: 	return STOCK_PIXMAP_MAIL_RECEIVE_ALL;
 	case A_RECEIVE_CUR: 	return STOCK_PIXMAP_MAIL_RECEIVE;
 	case A_SEND_QUEUED: 	return STOCK_PIXMAP_MAIL_SEND_QUEUE;
 	case A_COMPOSE_EMAIL: 	return STOCK_PIXMAP_MAIL_COMPOSE;
 	case A_COMPOSE_NEWS: 	return STOCK_PIXMAP_NEWS_COMPOSE;
 	case A_REPLY_MESSAGE: 	return STOCK_PIXMAP_MAIL_REPLY;
-	case A_REPLY_ALL: 	return STOCK_PIXMAP_MAIL_REPLY_TO_ALL;
 	case A_REPLY_SENDER: 	return STOCK_PIXMAP_MAIL_REPLY_TO_AUTHOR;
+	case A_REPLY_ALL: 	return STOCK_PIXMAP_MAIL_REPLY_TO_ALL;
 	case A_REPLY_ML: 	return STOCK_PIXMAP_MAIL_REPLY_TO_LIST;
+	case A_OPEN_MAIL: 	return STOCK_PIXMAP_OPEN_MAIL;
 	case A_FORWARD: 	return STOCK_PIXMAP_MAIL_FORWARD;
 	case A_TRASH: 		return STOCK_PIXMAP_TRASH;
 	case A_DELETE_REAL:	return STOCK_PIXMAP_DELETE;
-	case A_LEARN_SPAM: 	return STOCK_PIXMAP_SPAM_BTN;
+	case A_EXECUTE:		return STOCK_PIXMAP_EXEC;
 	case A_GOTO_PREV: 	return STOCK_PIXMAP_UP_ARROW;
 	case A_GOTO_NEXT: 	return STOCK_PIXMAP_DOWN_ARROW;
+
 	case A_IGNORE_THREAD: 	return STOCK_PIXMAP_MARK_IGNORETHREAD;
 	case A_WATCH_THREAD: 	return STOCK_PIXMAP_MARK_WATCHTHREAD;
 	case A_MARK:   		return STOCK_PIXMAP_MARK_MARK;
@@ -519,9 +547,12 @@ gint toolbar_get_icon(int action) {
 	case A_ALL_UNREAD:	return STOCK_PIXMAP_MARK_ALLUNREAD;
 	case A_READ:   		return STOCK_PIXMAP_MARK_READ;
 	case A_UNREAD:   	return STOCK_PIXMAP_MARK_UNREAD;
+
 	case A_PRINT:	 	return STOCK_PIXMAP_PRINTER;
-	case A_CLOSE: 		return STOCK_PIXMAP_CLOSE;
+	case A_LEARN_SPAM: 	return STOCK_PIXMAP_SPAM_BTN;
+	case A_GO_FOLDERS: 	return STOCK_PIXMAP_GO_FOLDERS;
 	case A_PREFERENCES:	return STOCK_PIXMAP_PREFERENCES;
+
 	case A_SEND: 		return STOCK_PIXMAP_MAIL_SEND;
 	case A_SEND_LATER:	return STOCK_PIXMAP_MAIL_SEND_QUEUE;
 	case A_DRAFT: 		return STOCK_PIXMAP_MAIL;
@@ -533,13 +564,14 @@ gint toolbar_get_icon(int action) {
 	case A_LINEWRAP_CURRENT:return STOCK_PIXMAP_LINEWRAP_CURRENT;
 	case A_LINEWRAP_ALL:	return STOCK_PIXMAP_LINEWRAP_ALL;
 	case A_ADDRBOOK: 	return STOCK_PIXMAP_ADDRESS_BOOK;
-	case A_CANCEL_INC:	return STOCK_PIXMAP_CANCEL;
-	case A_CANCEL_SEND:	return STOCK_PIXMAP_CANCEL;
-	case A_CANCEL_ALL:	return STOCK_PIXMAP_CANCEL;
-	case A_EXECUTE:		return STOCK_PIXMAP_EXEC;
 	#ifdef USE_ENCHANT
 	case A_CHECK_SPELLING:	return STOCK_PIXMAP_CHECK_SPELLING;
 	#endif
+
+	case A_CANCEL_INC:	return STOCK_PIXMAP_CANCEL;
+	case A_CANCEL_SEND:	return STOCK_PIXMAP_CANCEL;
+	case A_CANCEL_ALL:	return STOCK_PIXMAP_CANCEL;
+	case A_CLOSE: 		return STOCK_PIXMAP_CLOSE;
 	default:		return -1;
 	}
 }
@@ -775,6 +807,7 @@ void toolbar_read_config_file(ToolbarType source)
 	XMLFile *file   = NULL;
 	gchar *fileSpec = NULL;
 	jmp_buf    jumper;
+	gboolean rewrite = FALSE;
 
 	debug_print("read Toolbar Configuration from %s\n", toolbar_config[source].conf_file);
 
@@ -802,7 +835,7 @@ void toolbar_read_config_file(ToolbarType source)
 
 			/* Get next tag (icon, icon_text or icon_action) */
 			if (xml_compare_tag(file, TOOLBAR_TAG_ITEM)) {
-				toolbar_parse_item(file, source);
+				toolbar_parse_item(file, source, &rewrite);
 			} else if (xml_compare_tag(file, TOOLBAR_TAG_SEPARATOR)) {
 				ToolbarItem *item = g_new0(ToolbarItem, 1);
 			
@@ -814,6 +847,10 @@ void toolbar_read_config_file(ToolbarType source)
 
 		}
 		xml_close_file(file);
+		if (rewrite) {
+			debug_print("toolbar_read_config_file: rewriting toolbar\n");
+			toolbar_save_config_file(source);
+		}
 	}
 
 	if ((!file) || (g_slist_length(toolbar_config[source].item_list) == 0)) {
diff --git a/src/toolbar.h b/src/toolbar.h
index 1a11b9a..4b84bb6 100644
--- a/src/toolbar.h
+++ b/src/toolbar.h
@@ -171,6 +171,7 @@ enum {
 	A_EXECUTE,
 	A_GOTO_PREV,
 	A_GOTO_NEXT,
+
 	A_IGNORE_THREAD,
 	A_WATCH_THREAD,
 	A_MARK,
@@ -181,6 +182,7 @@ enum {
 	A_ALL_UNREAD,
 	A_READ,
 	A_UNREAD,
+
 	A_PRINT,
 	A_LEARN_SPAM,
 	A_GO_FOLDERS,

-----------------------------------------------------------------------


hooks/post-receive
-- 
Claws Mail


More information about the Commits mailing list