summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog.API6
-rw-r--r--configure.ac12
-rw-r--r--doc/conversation-signals.dox13
-rw-r--r--libpurple/conversation.c6
-rw-r--r--libpurple/protocols/bonjour/bonjour.c1
-rw-r--r--libpurple/protocols/gg/gg.c1
-rw-r--r--libpurple/protocols/irc/irc.c1
-rw-r--r--libpurple/protocols/jabber/chat.c15
-rw-r--r--libpurple/protocols/jabber/chat.h1
-rw-r--r--libpurple/protocols/jabber/libxmpp.c2
-rw-r--r--libpurple/protocols/jabber/presence.c1
-rw-r--r--libpurple/protocols/msn/msn.c15
-rw-r--r--libpurple/protocols/msnp9/msn.c15
-rw-r--r--libpurple/protocols/myspace/myspace.c18
-rw-r--r--libpurple/protocols/novell/novell.c1
-rw-r--r--libpurple/protocols/oscar/libaim.c2
-rw-r--r--libpurple/protocols/oscar/libicq.c2
-rw-r--r--libpurple/protocols/qq/qq.c1
-rw-r--r--libpurple/protocols/silc/silc.c1
-rw-r--r--libpurple/protocols/silc10/silc.c2
-rw-r--r--libpurple/protocols/simple/simple.c1
-rw-r--r--libpurple/protocols/yahoo/yahoo.c2
-rw-r--r--libpurple/protocols/zephyr/zephyr.c2
-rw-r--r--libpurple/prpl.h38
-rw-r--r--libpurple/server.c6
-rw-r--r--libpurple/server.h11
-rw-r--r--pidgin/gtkaccount.c69
27 files changed, 222 insertions, 23 deletions
diff --git a/ChangeLog.API b/ChangeLog.API
index 48d41e5682..81f6a48d4d 100644
--- a/ChangeLog.API
+++ b/ChangeLog.API
@@ -1,6 +1,10 @@
Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
-version 2.x.x:
+version 2.5.0:
+ libpurple:
+ Added:
+ * purple_serv_got_join_chat_failed
+ * chat-join-failed signal (see conversation-signals.dox)
perl:
Added:
* Purple::Prefs::get_children_names.
diff --git a/configure.ac b/configure.ac
index b3de322b27..4077075cc4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -43,19 +43,19 @@ AC_PREREQ([2.50])
#
# Make sure to update finch/libgnt/configure.ac with libgnt version changes.
#
-m4_define([purple_lt_current], [4])
+m4_define([purple_lt_current], [5])
m4_define([purple_major_version], [2])
-m4_define([purple_minor_version], [4])
-m4_define([purple_micro_version], [2])
+m4_define([purple_minor_version], [5])
+m4_define([purple_micro_version], [0])
m4_define([purple_version_suffix], [devel])
m4_define([purple_version],
[purple_major_version.purple_minor_version.purple_micro_version])
m4_define([purple_display_version], purple_version[]m4_ifdef([purple_version_suffix],[purple_version_suffix]))
-m4_define([gnt_lt_current], [4])
+m4_define([gnt_lt_current], [5])
m4_define([gnt_major_version], [2])
-m4_define([gnt_minor_version], [4])
-m4_define([gnt_micro_version], [2])
+m4_define([gnt_minor_version], [5])
+m4_define([gnt_micro_version], [0])
m4_define([gnt_version_suffix], [devel])
m4_define([gnt_version],
[gnt_major_version.gnt_minor_version.gnt_micro_version])
diff --git a/doc/conversation-signals.dox b/doc/conversation-signals.dox
index 80c4de8b3b..5028ba9b31 100644
--- a/doc/conversation-signals.dox
+++ b/doc/conversation-signals.dox
@@ -27,6 +27,7 @@
@signal chat-invited-user
@signal chat-invited
@signal chat-joined
+ @signal chat-join-failed
@signal chat-left
@signal chat-topic-changed
@signal conversation-extended-menu
@@ -302,6 +303,18 @@ void (*chat_buddy_joined)(PurpleConversation *conv, const char *name,
@param new_arrival If the buddy is a new arrival.
@endsignaldef
+ @signaldef chat-join-failed
+ @signalproto
+void (*chat_join_failed)(PurpleConnection *gc, GHashTable *components);
+ @endsignalproto
+ @signaldesc
+ Emitted when an account fails to join a chat room
+ @param gc The PurpleConnection of the account which failed to join the chat.
+ @param data The components passed to serv_join_chat() originally.
+ The hash function should be g_str_hash() and the equal
+ function should be g_str_equal().
+ @endsignaldef
+
@signaldef chat-buddy-flags
@signalproto
void (*chat_buddy_flags)(PurpleConversation *conv, const char *name,
diff --git a/libpurple/conversation.c b/libpurple/conversation.c
index d5cdb7dd57..581ea1babf 100644
--- a/libpurple/conversation.c
+++ b/libpurple/conversation.c
@@ -2381,6 +2381,12 @@ purple_conversations_init(void)
purple_value_new(PURPLE_TYPE_SUBTYPE,
PURPLE_SUBTYPE_CONVERSATION));
+ purple_signal_register(handle, "chat-join-failed",
+ purple_marshal_VOID__POINTER_POINTER, NULL, 2,
+ purple_value_new(PURPLE_TYPE_SUBTYPE,
+ PURPLE_SUBTYPE_CONNECTION),
+ purple_value_new(PURPLE_TYPE_POINTER));
+
purple_signal_register(handle, "chat-left",
purple_marshal_VOID__POINTER, NULL, 1,
purple_value_new(PURPLE_TYPE_SUBTYPE,
diff --git a/libpurple/protocols/bonjour/bonjour.c b/libpurple/protocols/bonjour/bonjour.c
index ed4675c7a4..9f72a74068 100644
--- a/libpurple/protocols/bonjour/bonjour.c
+++ b/libpurple/protocols/bonjour/bonjour.c
@@ -487,6 +487,7 @@ static PurplePluginProtocolInfo prpl_info =
NULL,
NULL,
NULL,
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/gg/gg.c b/libpurple/protocols/gg/gg.c
index ac33693f5b..f1466447cc 100644
--- a/libpurple/protocols/gg/gg.c
+++ b/libpurple/protocols/gg/gg.c
@@ -2152,6 +2152,7 @@ static PurplePluginProtocolInfo prpl_info =
NULL,
NULL,
NULL,
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
/* }}} */
diff --git a/libpurple/protocols/irc/irc.c b/libpurple/protocols/irc/irc.c
index 03c918e1ad..dd1af3a803 100644
--- a/libpurple/protocols/irc/irc.c
+++ b/libpurple/protocols/irc/irc.c
@@ -905,6 +905,7 @@ static PurplePluginProtocolInfo prpl_info =
NULL,
NULL,
NULL,
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/jabber/chat.c b/libpurple/protocols/jabber/chat.c
index b3ef6549ad..a99b290660 100644
--- a/libpurple/protocols/jabber/chat.c
+++ b/libpurple/protocols/jabber/chat.c
@@ -198,6 +198,12 @@ char *jabber_get_chat_name(GHashTable *data) {
return chat_name;
}
+static void insert_in_hash_table(gpointer key, gpointer value, gpointer user_data)
+{
+ GHashTable *hash_table = (GHashTable *)user_data;
+ g_hash_table_insert(hash_table, g_strdup(key), g_strdup(value));
+}
+
void jabber_chat_join(PurpleConnection *gc, GHashTable *data)
{
JabberChat *chat;
@@ -226,18 +232,21 @@ void jabber_chat_join(PurpleConnection *gc, GHashTable *data)
char *buf = g_strdup_printf(_("%s is not a valid room name"), room);
purple_notify_error(gc, _("Invalid Room Name"), _("Invalid Room Name"),
buf);
+ purple_serv_got_join_chat_failed(gc, data);
g_free(buf);
return;
} else if(!jabber_nameprep_validate(server)) {
char *buf = g_strdup_printf(_("%s is not a valid server name"), server);
purple_notify_error(gc, _("Invalid Server Name"),
_("Invalid Server Name"), buf);
+ purple_serv_got_join_chat_failed(gc, data);
g_free(buf);
return;
} else if(!jabber_resourceprep_validate(handle)) {
char *buf = g_strdup_printf(_("%s is not a valid room handle"), handle);
purple_notify_error(gc, _("Invalid Room Handle"),
_("Invalid Room Handle"), buf);
+ purple_serv_got_join_chat_failed(gc, data);
g_free(buf);
return;
}
@@ -256,6 +265,11 @@ void jabber_chat_join(PurpleConnection *gc, GHashTable *data)
chat->server = g_strdup(server);
chat->handle = g_strdup(handle);
+ /* Copy the data hash table to chat->components */
+ chat->components = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, g_free);
+ g_hash_table_foreach(data, insert_in_hash_table, chat->components);
+
chat->members = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
(GDestroyNotify)jabber_chat_member_free);
@@ -316,6 +330,7 @@ void jabber_chat_free(JabberChat *chat)
g_free(chat->server);
g_free(chat->handle);
g_hash_table_destroy(chat->members);
+ g_hash_table_destroy(chat->components);
g_free(chat);
}
diff --git a/libpurple/protocols/jabber/chat.h b/libpurple/protocols/jabber/chat.h
index 1004d877f7..6c680d0940 100644
--- a/libpurple/protocols/jabber/chat.h
+++ b/libpurple/protocols/jabber/chat.h
@@ -41,6 +41,7 @@ typedef struct _JabberChat {
char *room;
char *server;
char *handle;
+ GHashTable *components;
int id;
PurpleConversation *conv;
gboolean muc;
diff --git a/libpurple/protocols/jabber/libxmpp.c b/libpurple/protocols/jabber/libxmpp.c
index 1198f7902b..0d719a6ca0 100644
--- a/libpurple/protocols/jabber/libxmpp.c
+++ b/libpurple/protocols/jabber/libxmpp.c
@@ -116,7 +116,7 @@ static PurplePluginProtocolInfo prpl_info =
jabber_send_attention, /* send_attention */
jabber_attention_types, /* attention_types */
- /* padding */
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/jabber/presence.c b/libpurple/protocols/jabber/presence.c
index faae4a4af6..e902354eeb 100644
--- a/libpurple/protocols/jabber/presence.c
+++ b/libpurple/protocols/jabber/presence.c
@@ -587,6 +587,7 @@ void jabber_presence_parse(JabberStream *js, xmlnode *packet)
serv_got_chat_left(js->gc, chat->id);
} else {
title = g_strdup_printf(_("Error joining chat %s"), from);
+ purple_serv_got_join_chat_failed(js->gc, chat->components);
}
purple_notify_error(js->gc, title, title, msg);
g_free(title);
diff --git a/libpurple/protocols/msn/msn.c b/libpurple/protocols/msn/msn.c
index 9fba5b236e..3b25646e1f 100644
--- a/libpurple/protocols/msn/msn.c
+++ b/libpurple/protocols/msn/msn.c
@@ -132,6 +132,17 @@ msn_attention_types(PurpleAccount *account)
return list;
}
+static GHashTable *
+msn_get_account_text_table(PurpleAccount *unused)
+{
+ 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
msn_cmd_nudge(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data)
@@ -2307,8 +2318,8 @@ static PurplePluginProtocolInfo prpl_info =
msn_send_attention, /* send_attention */
msn_attention_types, /* attention_types */
- /* padding */
- NULL
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
+ msn_get_account_text_table, /* get_account_text_table */
};
static PurplePluginInfo info =
diff --git a/libpurple/protocols/msnp9/msn.c b/libpurple/protocols/msnp9/msn.c
index 33ce61efd4..67a0a40f00 100644
--- a/libpurple/protocols/msnp9/msn.c
+++ b/libpurple/protocols/msnp9/msn.c
@@ -133,6 +133,17 @@ msn_attention_types(PurpleAccount *account)
return list;
}
+static GHashTable *
+msn_get_account_text_table(PurpleAccount *unused)
+{
+ 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
msn_cmd_nudge(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data)
@@ -2148,8 +2159,8 @@ static PurplePluginProtocolInfo prpl_info =
msn_send_attention, /* send_attention */
msn_attention_types, /* attention_types */
- /* padding */
- NULL
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
+ msn_get_account_text_table, /* get_account_text_table */
};
static PurplePluginInfo info =
diff --git a/libpurple/protocols/myspace/myspace.c b/libpurple/protocols/myspace/myspace.c
index 58c48902a5..dad42d8b58 100644
--- a/libpurple/protocols/myspace/myspace.c
+++ b/libpurple/protocols/myspace/myspace.c
@@ -2449,6 +2449,18 @@ const char *msim_normalize(const PurpleAccount *account, const char *str) {
return normalized;
}
+static GHashTable *
+msim_get_account_text_table(PurpleAccount *unused)
+{
+ 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.
*
* The protocol supports offline messages in just the same way as online
@@ -3131,14 +3143,16 @@ static PurplePluginProtocolInfo prpl_info = {
NULL, /* unregister_user */
msim_send_attention, /* send_attention */
msim_attention_types, /* attention_types */
- NULL /* _purple_reserved4 */
+
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
+ msim_get_account_text_table, /* get_account_text_table */
};
/** Based on MSN's plugin info comments. */
static PurplePluginInfo info = {
- PURPLE_PLUGIN_MAGIC,
+ PURPLE_PLUGIN_MAGIC,
PURPLE_MAJOR_VERSION,
PURPLE_MINOR_VERSION,
PURPLE_PLUGIN_PROTOCOL, /**< type */
diff --git a/libpurple/protocols/novell/novell.c b/libpurple/protocols/novell/novell.c
index faa384d05f..e36b799d40 100644
--- a/libpurple/protocols/novell/novell.c
+++ b/libpurple/protocols/novell/novell.c
@@ -3517,6 +3517,7 @@ static PurplePluginProtocolInfo prpl_info = {
NULL,
NULL,
NULL,
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/oscar/libaim.c b/libpurple/protocols/oscar/libaim.c
index a9bda549df..ead36b3538 100644
--- a/libpurple/protocols/oscar/libaim.c
+++ b/libpurple/protocols/oscar/libaim.c
@@ -96,7 +96,7 @@ static PurplePluginProtocolInfo prpl_info =
NULL, /* send_attention */
NULL, /* get_attention_types */
- /* padding */
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/oscar/libicq.c b/libpurple/protocols/oscar/libicq.c
index e234477871..fb23bc67e5 100644
--- a/libpurple/protocols/oscar/libicq.c
+++ b/libpurple/protocols/oscar/libicq.c
@@ -96,7 +96,7 @@ static PurplePluginProtocolInfo prpl_info =
NULL, /* send_attention */
NULL, /* get_attention_types */
- /* padding */
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/qq/qq.c b/libpurple/protocols/qq/qq.c
index 70b85f5919..6fa761aca0 100644
--- a/libpurple/protocols/qq/qq.c
+++ b/libpurple/protocols/qq/qq.c
@@ -706,6 +706,7 @@ static PurplePluginProtocolInfo prpl_info = {
NULL,
NULL,
NULL,
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/silc/silc.c b/libpurple/protocols/silc/silc.c
index 51ad6bddb5..049a013a5f 100644
--- a/libpurple/protocols/silc/silc.c
+++ b/libpurple/protocols/silc/silc.c
@@ -2071,6 +2071,7 @@ static PurplePluginProtocolInfo prpl_info =
NULL,
NULL,
NULL,
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/silc10/silc.c b/libpurple/protocols/silc10/silc.c
index 04a8c68361..47519e0857 100644
--- a/libpurple/protocols/silc10/silc.c
+++ b/libpurple/protocols/silc10/silc.c
@@ -1800,10 +1800,10 @@ static PurplePluginProtocolInfo prpl_info =
NULL, /* send_raw */
NULL, /* roomlist_room_serialize */
- /* padding */
NULL,
NULL,
NULL,
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/simple/simple.c b/libpurple/protocols/simple/simple.c
index 81006d3bc5..df3780149e 100644
--- a/libpurple/protocols/simple/simple.c
+++ b/libpurple/protocols/simple/simple.c
@@ -2052,6 +2052,7 @@ static PurplePluginProtocolInfo prpl_info =
NULL,
NULL,
NULL,
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/yahoo/yahoo.c b/libpurple/protocols/yahoo/yahoo.c
index a4c818ad72..e8922f0498 100644
--- a/libpurple/protocols/yahoo/yahoo.c
+++ b/libpurple/protocols/yahoo/yahoo.c
@@ -4383,7 +4383,7 @@ static PurplePluginProtocolInfo prpl_info =
yahoo_send_attention,
yahoo_attention_types,
- /* padding */
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/protocols/zephyr/zephyr.c b/libpurple/protocols/zephyr/zephyr.c
index 83f96aef2d..feee332cf3 100644
--- a/libpurple/protocols/zephyr/zephyr.c
+++ b/libpurple/protocols/zephyr/zephyr.c
@@ -2907,10 +2907,10 @@ static PurplePluginProtocolInfo prpl_info = {
NULL, /* send_raw */
NULL, /* roomlist_room_serialize */
- /* padding */
NULL,
NULL,
NULL,
+ sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL
};
diff --git a/libpurple/prpl.h b/libpurple/prpl.h
index 7bd8542291..33a07ebdb3 100644
--- a/libpurple/prpl.h
+++ b/libpurple/prpl.h
@@ -399,9 +399,45 @@ struct _PurplePluginProtocolInfo
gboolean (*send_attention)(PurpleConnection *gc, const char *username, guint type);
GList *(*get_attention_types)(PurpleAccount *acct);
- void (*_purple_reserved4)(void);
+ /**
+ * The size of the PurplePluginProtocolInfo. This should always be sizeof(PurplePluginProtocolInfo).
+ * This allows adding more functions to this struct without requiring a major version bump.
+ */
+ unsigned long struct_size;
+
+ /* NOTE:
+ * If more functions are added, they should accessed using the following syntax:
+ *
+ * if (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, new_function))
+ * prpl->new_function(...);
+ *
+ * instead of
+ *
+ * if (prpl->new_function != NULL)
+ * prpl->new_function(...);
+ *
+ * The PURPLE_PROTOCOL_PLUGIN_HAS_FUNC macro can be used for the older member
+ * functions (e.g. login, send_im etc.) too.
+ */
+
+ /** 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. The hash table should be
+ * destroyed by the caller when it's no longer needed.
+ */
+ GHashTable *(*get_account_text_table)(PurpleAccount *account);
};
+#define PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, member) \
+ (((G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < G_STRUCT_OFFSET(PurplePluginProtocolInfo, struct_size)) \
+ || (G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < prpl->struct_size)) && \
+ prpl->member != NULL)
+
+
#define PURPLE_IS_PROTOCOL_PLUGIN(plugin) \
((plugin)->info->type == PURPLE_PLUGIN_PROTOCOL)
diff --git a/libpurple/server.c b/libpurple/server.c
index 48f10070df..13410d2336 100644
--- a/libpurple/server.c
+++ b/libpurple/server.c
@@ -967,6 +967,12 @@ void serv_got_chat_left(PurpleConnection *g, int id)
purple_signal_emit(purple_conversations_get_handle(), "chat-left", conv);
}
+void purple_serv_got_join_chat_failed(PurpleConnection *gc, GHashTable *data)
+{
+ purple_signal_emit(purple_conversations_get_handle(), "chat-join-failed",
+ gc, data);
+}
+
void serv_got_chat_in(PurpleConnection *g, int id, const char *who,
PurpleMessageFlags flags, const char *message, time_t mtime)
{
diff --git a/libpurple/server.h b/libpurple/server.h
index ee4b70ad74..83172474c9 100644
--- a/libpurple/server.h
+++ b/libpurple/server.h
@@ -166,6 +166,17 @@ void serv_got_chat_invite(PurpleConnection *gc, const char *name,
PurpleConversation *serv_got_joined_chat(PurpleConnection *gc,
int id, const char *name);
+/**
+ * Called by a prpl when an attempt to join a chat via serv_join_chat()
+ * fails.
+ *
+ * @param gc The connection on which chat joining failed
+ * @param data The components passed to serv_join_chat() originally.
+ * The hash function should be g_str_hash() and the equal
+ * function should be g_str_equal().
+ */
+void purple_serv_got_join_chat_failed(PurpleConnection *gc, GHashTable *data);
+
void serv_got_chat_left(PurpleConnection *g, int id);
void serv_got_chat_in(PurpleConnection *g, int id, const char *who,
PurpleMessageFlags flags, const char *message, time_t mtime);
diff --git a/pidgin/gtkaccount.c b/pidgin/gtkaccount.c
index 83307b0828..ee167ebaa8 100644
--- a/pidgin/gtkaccount.c
+++ b/pidgin/gtkaccount.c
@@ -255,6 +255,25 @@ set_account_protocol_cb(GtkWidget *item, const char *id,
}
}
+static gboolean
+screenname_focus_cb(GtkWidget *widget, GdkEventFocus *event, AccountPrefsDialog *dialog)
+{
+ 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_destroy(table);
+
+ return FALSE;
+}
+
static void
screenname_changed_cb(GtkEntry *entry, AccountPrefsDialog *dialog)
{
@@ -270,6 +289,32 @@ screenname_changed_cb(GtkEntry *entry, AccountPrefsDialog *dialog)
}
}
+static gboolean
+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), 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);
+ }
+
+ g_hash_table_destroy(table);
+
+ return FALSE;
+}
+
static void
icon_filesel_choose_cb(const char *filename, gpointer data)
{
@@ -410,6 +455,25 @@ add_login_options(AccountPrefsDialog *dialog, GtkWidget *parent)
add_pref_box(dialog, vbox, _("_Username:"), dialog->screenname_entry);
+ if (dialog->account != NULL)
+ username = g_strdup(purple_account_get_username(dialog->account));
+
+ if (!username && PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(dialog->prpl_info, get_account_text_table)) {
+ 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");
+
+ 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);
+ g_hash_table_destroy(table);
+ }
+
g_signal_connect(G_OBJECT(dialog->screenname_entry), "changed",
G_CALLBACK(screenname_changed_cb), dialog);
@@ -419,9 +483,6 @@ add_login_options(AccountPrefsDialog *dialog, GtkWidget *parent)
else
user_splits = dialog->prpl_info->user_splits;
- if (dialog->account != NULL)
- username = g_strdup(purple_account_get_username(dialog->account));
-
if (dialog->user_split_entries != NULL) {
g_list_free(dialog->user_split_entries);
dialog->user_split_entries = NULL;
@@ -1513,6 +1574,8 @@ pidgin_account_dialog_show(PidginAccountDialogType type,
/* Show the window. */
gtk_widget_show(win);
+ if (!account)
+ gtk_widget_grab_focus(dialog->protocol_menu);
}
/**************************************************************************