changeset 22777:087c3ed328d3

This modifies Jaywalker's patch to use a GHashTable, per Stu's suggestion in the XMPP conference. After some thought and discussion, I decided to have the prpls create the hash table on each call. This allows some dynamic key creation in case we would need it in the future.
author John Bailey <rekkanoryo@rekkanoryo.org>
date Wed, 30 Apr 2008 05:37:19 +0000
parents 0be4c1f0fa55
children 1cd829a1d27e 424037c8a343
files libpurple/protocols/msn/msn.c libpurple/protocols/msnp9/msn.c libpurple/protocols/myspace/myspace.c libpurple/prpl.h pidgin/gtkaccount.c
diffstat 5 files changed, 73 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/msn/msn.c	Wed Apr 30 03:24:35 2008 +0000
+++ b/libpurple/protocols/msn/msn.c	Wed Apr 30 05:37:19 2008 +0000
@@ -132,8 +132,16 @@
 	return list;
 }
 
-const char *msn_get_login_label() {
-	return _("E-mail Address...");
+static GHashTable *
+msn_get_account_text_table()
+{
+	GHashTable *table;
+	
+	table = g_hash_table_new(g_str_hash, g_str_equal);
+	
+	g_hash_table_insert(table, "login_label", (gpointer)_("E-mail Address..."));
+
+	return table;
 }
 
 static PurpleCmdRet
@@ -2309,7 +2317,7 @@
 	NULL,					/* unregister_user */
 	msn_send_attention,                     /* send_attention */
 	msn_attention_types,                    /* attention_types */
-	msn_get_login_label			/* account_login_label */
+	msn_get_account_text_table			/* get_account_text_table */
 };
 
 static PurplePluginInfo info =
--- a/libpurple/protocols/msnp9/msn.c	Wed Apr 30 03:24:35 2008 +0000
+++ b/libpurple/protocols/msnp9/msn.c	Wed Apr 30 05:37:19 2008 +0000
@@ -133,9 +133,16 @@
 	return list;
 }
 
+static GHashTable *
+msn_get_account_text_table()
+{
+	GHashTable *table;
 
-const char *msn_get_login_label() {
-	return _("E-mail Address...");
+	table = g_hash_table_new(g_str_hash, g_str_equal);
+
+	g_hash_table_insert(table, "login_label", (gpointer)_("E-mail Address..."));
+
+	return table;
 }
 
 static PurpleCmdRet
@@ -2151,7 +2158,7 @@
 	NULL,					/* unregister_user */
 	msn_send_attention,                     /* send_attention */
 	msn_attention_types,                    /* attention_types */
-	msn_get_login_label			/* account_login_label */
+	msn_get_account_text_table			/* get_account_text_table */
 };
 
 static PurplePluginInfo info =
--- a/libpurple/protocols/myspace/myspace.c	Wed Apr 30 03:24:35 2008 +0000
+++ b/libpurple/protocols/myspace/myspace.c	Wed Apr 30 05:37:19 2008 +0000
@@ -2449,8 +2449,16 @@
 	return normalized;
 }
 
-const char *msim_get_login_label() {
-	return _("E-mail Address...");
+static GHashTable *
+msim_get_account_text_table()
+{
+	GHashTable *table;
+
+	table = g_hash_table_new(g_str_hash, g_str_equal);
+
+	g_hash_table_insert(table, "login_label", (gpointer)_("E-mail Address..."));
+
+	return table;
 }
 
 /** Return whether the buddy can be messaged while offline.
@@ -3135,7 +3143,7 @@
 	NULL,                  /* unregister_user */
 	msim_send_attention,   /* send_attention */
 	msim_attention_types,  /* attention_types */
-	msim_get_login_label /* get screen name field title */
+	msim_get_account_text_table /* get_account_text_table */
 };
 
 
--- a/libpurple/prpl.h	Wed Apr 30 03:24:35 2008 +0000
+++ b/libpurple/prpl.h	Wed Apr 30 05:37:19 2008 +0000
@@ -398,11 +398,15 @@
 	gboolean (*send_attention)(PurpleConnection *gc, const char *username, guint type);
 	GList *(*get_attention_types)(PurpleAccount *acct);
 
-	/* This allows protocols to specify a more specific term for the "ScreenName" field
-	 * in the add account window. This helps avoid confusion for users using protocols
-	 * such as MySpace or MSN
+	/** This allows protocols to specify additional strings to be used for
+	 * various purposes.  The idea is to stuff a bunch of strings in this hash
+	 * table instead of expanding the struct for every addition.  This hash
+	 * table is allocated every call and MUST be unrefed by the caller.
+	 *
+	 * @param account The account to specify.  This can be NULL.
+	 * @return The protocol's string hash table.
 	 */
-	const char *(*account_login_label)(void);
+	GHashTable *(*get_account_text_table)(PurpleAccount *account);
 };
 
 #define PURPLE_IS_PROTOCOL_PLUGIN(plugin) \
--- a/pidgin/gtkaccount.c	Wed Apr 30 03:24:35 2008 +0000
+++ b/pidgin/gtkaccount.c	Wed Apr 30 05:37:19 2008 +0000
@@ -258,10 +258,19 @@
 static gboolean
 screenname_focus_cb(GtkWidget *widget, GdkEventFocus *event, AccountPrefsDialog *dialog)
 {
-	if (!strcmp(gtk_entry_get_text(GTK_ENTRY(widget)),dialog->prpl_info->account_login_label())) {
-		gtk_entry_set_text(GTK_ENTRY(widget),"");
-		gtk_widget_modify_text(widget,GTK_STATE_NORMAL,NULL);
+	GHashTable *table;
+	const char *label;
+	
+	table = dialog->prpl_info->get_account_text_table(NULL);
+	label = g_hash_table_lookup(table, "login_label");
+
+	if(!strcmp(gtk_entry_get_text(GTK_ENTRY(widget)), label)) {
+		gtk_entry_set_text(GTK_ENTRY(widget), "");
+		gtk_widget_modify_text(widget, GTK_STATE_NORMAL,NULL);
 	}
+
+	g_hash_table_unref(table);
+
 	return FALSE;
 }
 
@@ -284,16 +293,25 @@
 screenname_nofocus_cb(GtkWidget *widget, GdkEventFocus *event, AccountPrefsDialog *dialog)
 {
 	GdkColor color = {0, 34952, 35466, 34181};
+	GHashTable *table;
+	const char *label;
+
+	table = dialog->prpl_info->get_account_text_table(NULL);
+	label = g_hash_table_lookup(table, "login_label");
+
 	if (*gtk_entry_get_text(GTK_ENTRY(widget)) == '\0') {
 		/* We have to avoid hitting the screenname_changed_cb function 
 		 * because it enables buttons we don't want enabled yet ;)
 		 */
 		g_signal_handlers_block_by_func(widget, G_CALLBACK(screenname_changed_cb), dialog);
-		gtk_entry_set_text(GTK_ENTRY(widget),dialog->prpl_info->account_login_label());
+		gtk_entry_set_text(GTK_ENTRY(widget), label);
 		/* Make sure we can hit it again */
 		g_signal_handlers_unblock_by_func(widget, G_CALLBACK(screenname_changed_cb), dialog);
-		gtk_widget_modify_text(widget,GTK_STATE_NORMAL,&color);
+		gtk_widget_modify_text(widget, GTK_STATE_NORMAL, &color);
 	}
+
+	g_hash_table_unref(table);
+
 	return FALSE;
 }
 
@@ -392,6 +410,8 @@
 	GList *l, *l2;
 	char *username = NULL;
 	GdkColor color = {0, 34952, 35466, 34181};
+	GHashTable *table;
+	const char *label;
 
 	if (dialog->protocol_menu != NULL)
 	{
@@ -438,13 +458,18 @@
 
 	add_pref_box(dialog, vbox, _("Screen _name:"), dialog->screenname_entry);
 
-	if (dialog->prpl_info->account_login_label) {
-		gtk_entry_set_text(dialog->screenname_entry,dialog->prpl_info->account_login_label());
+	if (dialog->prpl_info->get_account_text_table) {
+		table = dialog->prpl_info->get_account_text_table(NULL);
+		label = g_hash_table_lookup(table, "login_label");
+
+		gtk_entry_set_text(GTK_ENTRY(dialog->screenname_entry), label);
 		g_signal_connect(G_OBJECT(dialog->screenname_entry), "focus-in-event",
 						G_CALLBACK(screenname_focus_cb), dialog);
 		g_signal_connect(G_OBJECT(dialog->screenname_entry), "focus-out-event",
 						G_CALLBACK(screenname_nofocus_cb), dialog);
-		gtk_widget_modify_text(dialog->screenname_entry,GTK_STATE_NORMAL,&color);
+		gtk_widget_modify_text(dialog->screenname_entry, GTK_STATE_NORMAL, &color);
+
+		g_hash_table_unref(table);
 	}
 
 	g_signal_connect(G_OBJECT(dialog->screenname_entry), "changed",