# HG changeset patch # User John Bailey # Date 1209533839 0 # Node ID 087c3ed328d3e1037d5ed6f31fbd15edc2f4f6ef # Parent 0be4c1f0fa5554eeec0b855ddbfcac8e12ca3b87 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. diff -r 0be4c1f0fa55 -r 087c3ed328d3 libpurple/protocols/msn/msn.c --- 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 = diff -r 0be4c1f0fa55 -r 087c3ed328d3 libpurple/protocols/msnp9/msn.c --- 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 = diff -r 0be4c1f0fa55 -r 087c3ed328d3 libpurple/protocols/myspace/myspace.c --- 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 */ }; diff -r 0be4c1f0fa55 -r 087c3ed328d3 libpurple/prpl.h --- 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) \ diff -r 0be4c1f0fa55 -r 087c3ed328d3 pidgin/gtkaccount.c --- 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",