pidgin/ljfisher-ssl-client-auth

merge of 'b7cfae50e10c44cf3be062d0172c15bef3d04355'

2011-03-01, Elliott Sales de Andrade
3c15f73efbad
merge of 'b7cfae50e10c44cf3be062d0172c15bef3d04355'
and '9c05c935a848e8973908d662ec3147140f83870d'
--- a/ChangeLog Mon Feb 28 09:19:34 2011 +0000
+++ b/ChangeLog Tue Mar 01 06:24:50 2011 +0000
@@ -4,6 +4,12 @@
General:
* Our bundled libgadu should now build on HP-UX.
+ Pidgin:
+ * Sort by Status no longer causes buddies to move around when you
+ click them.
+ * Fix embedding in the system tray on older GTK+ releases (such as on
+ CentOS 5.5 and older Fedora).
+
AIM:
* Fix a bug where some buddies from your buddy list might not show up.
Affected non-English ICQ users the most. (#13386)
--- a/libpurple/protocols/msn/contact.c Mon Feb 28 09:19:34 2011 +0000
+++ b/libpurple/protocols/msn/contact.c Tue Mar 01 06:24:50 2011 +0000
@@ -363,10 +363,9 @@
char *type;
char *member_id;
MsnUser *user;
- xmlnode *annotation, *display;
+ xmlnode *annotation;
guint nid = MSN_NETWORK_UNKNOWN;
char *invite = NULL;
- char *display_text;
passport = xmlnode_get_data(xmlnode_get_child(member, node));
if (!msn_email_is_valid(passport)) {
@@ -376,13 +375,8 @@
type = xmlnode_get_data(xmlnode_get_child(member, "Type"));
member_id = xmlnode_get_data(xmlnode_get_child(member, "MembershipId"));
- if ((display = xmlnode_get_child(member, "DisplayName"))) {
- display_text = xmlnode_get_data(display);
- } else {
- display_text = NULL;
- }
- user = msn_userlist_find_add_user(session->userlist, passport, display_text);
+ user = msn_userlist_find_add_user(session->userlist, passport, NULL);
for (annotation = xmlnode_get_child(member, "Annotations/Annotation");
annotation;
@@ -423,7 +417,6 @@
g_free(type);
g_free(member_id);
g_free(invite);
- g_free(display_text);
}
static void
--- a/libpurple/protocols/msn/msn.c Mon Feb 28 09:19:34 2011 +0000
+++ b/libpurple/protocols/msn/msn.c Tue Mar 01 06:24:50 2011 +0000
@@ -110,11 +110,9 @@
g_return_val_if_fail(str != NULL, NULL);
- g_snprintf(buf, sizeof(buf), "%s%s", str,
- (strchr(str, '@') ? "" : "@hotmail.com"));
-
- tmp = g_utf8_strdown(buf, -1);
- strncpy(buf, tmp, sizeof(buf));
+ tmp = g_strchomp(g_utf8_strdown(str, -1));
+ g_snprintf(buf, sizeof(buf), "%s%s", tmp,
+ (strchr(tmp, '@') ? "" : "@hotmail.com"));
g_free(tmp);
return buf;
--- a/libpurple/protocols/msn/p2p.c Mon Feb 28 09:19:34 2011 +0000
+++ b/libpurple/protocols/msn/p2p.c Tue Mar 01 06:24:50 2011 +0000
@@ -23,72 +23,139 @@
*/
#include "internal.h"
+#include "debug.h"
#include "p2p.h"
#include "msnutils.h"
MsnP2PInfo *
-msn_p2p_info_new(void)
+msn_p2p_info_new(MsnP2PVersion version)
{
- return g_new0(MsnP2PInfo, 1);
+ MsnP2PInfo *info = g_new0(MsnP2PInfo, 1);
+ info->version = version;
+
+ switch (version) {
+ case MSN_P2P_VERSION_ONE:
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", version);
+ g_free(info);
+ info = NULL;
+ }
+
+ return info;
}
MsnP2PInfo *
msn_p2p_info_dup(MsnP2PInfo *info)
{
MsnP2PInfo *new_info = g_new0(MsnP2PInfo, 1);
- *new_info = *info;
+
+ new_info->version = info->version;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ case MSN_P2P_VERSION_TWO:
+ *new_info = *info;
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ g_free(new_info);
+ new_info = NULL;
+ }
+
return new_info;
}
void
msn_p2p_info_free(MsnP2PInfo *info)
{
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
g_free(info);
}
size_t
msn_p2p_header_from_wire(MsnP2PInfo *info, const char *wire)
{
- MsnP2PHeader *header;
+ size_t len;
- header = &info->header;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE: {
+ MsnP2PHeader *header = &info->header.v1;
- header->session_id = msn_pop32le(wire);
- header->id = msn_pop32le(wire);
- header->offset = msn_pop64le(wire);
- header->total_size = msn_pop64le(wire);
- header->length = msn_pop32le(wire);
- header->flags = msn_pop32le(wire);
- header->ack_id = msn_pop32le(wire);
- header->ack_sub_id = msn_pop32le(wire);
- header->ack_size = msn_pop64le(wire);
+ header->session_id = msn_pop32le(wire);
+ header->id = msn_pop32le(wire);
+ header->offset = msn_pop64le(wire);
+ header->total_size = msn_pop64le(wire);
+ header->length = msn_pop32le(wire);
+ header->flags = msn_pop32le(wire);
+ header->ack_id = msn_pop32le(wire);
+ header->ack_sub_id = msn_pop32le(wire);
+ header->ack_size = msn_pop64le(wire);
- return P2P_PACKET_HEADER_SIZE;
+ len = P2P_PACKET_HEADER_SIZE;
+ break;
+ }
+
+ case MSN_P2P_VERSION_TWO:
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return len;
}
char *
msn_p2p_header_to_wire(MsnP2PInfo *info, size_t *len)
{
- MsnP2PHeader *header;
- char *wire;
+ char *wire = NULL;
char *tmp;
- header = &info->header;
- tmp = wire = g_new(char, P2P_PACKET_HEADER_SIZE);
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE: {
+ MsnP2PHeader *header = &info->header.v1;
+ tmp = wire = g_new(char, P2P_PACKET_HEADER_SIZE);
+
+ msn_push32le(tmp, header->session_id);
+ msn_push32le(tmp, header->id);
+ msn_push64le(tmp, header->offset);
+ msn_push64le(tmp, header->total_size);
+ msn_push32le(tmp, header->length);
+ msn_push32le(tmp, header->flags);
+ msn_push32le(tmp, header->ack_id);
+ msn_push32le(tmp, header->ack_sub_id);
+ msn_push64le(tmp, header->ack_size);
- msn_push32le(tmp, header->session_id);
- msn_push32le(tmp, header->id);
- msn_push64le(tmp, header->offset);
- msn_push64le(tmp, header->total_size);
- msn_push32le(tmp, header->length);
- msn_push32le(tmp, header->flags);
- msn_push32le(tmp, header->ack_id);
- msn_push32le(tmp, header->ack_sub_id);
- msn_push64le(tmp, header->ack_size);
+ if (len)
+ *len = P2P_PACKET_HEADER_SIZE;
+
+ break;
+ }
- if (len)
- *len = P2P_PACKET_HEADER_SIZE;
+ case MSN_P2P_VERSION_TWO:
+ if (len)
+ *len = 0;
+
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
return wire;
@@ -127,15 +194,30 @@
void
msn_p2p_info_to_string(MsnP2PInfo *info, GString *str)
{
- g_string_append_printf(str, "Session ID: %u\r\n", info->header.session_id);
- g_string_append_printf(str, "ID: %u\r\n", info->header.id);
- g_string_append_printf(str, "Offset: %" G_GUINT64_FORMAT "\r\n", info->header.offset);
- g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", info->header.total_size);
- g_string_append_printf(str, "Length: %u\r\n", info->header.length);
- g_string_append_printf(str, "Flags: 0x%x\r\n", info->header.flags);
- g_string_append_printf(str, "ACK ID: %u\r\n", info->header.ack_id);
- g_string_append_printf(str, "SUB ID: %u\r\n", info->header.ack_sub_id);
- g_string_append_printf(str, "ACK Size: %" G_GUINT64_FORMAT "\r\n", info->header.ack_size);
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE: {
+ MsnP2PHeader *header = &info->header.v1;
+ g_string_append_printf(str, "Session ID: %u\r\n", header->session_id);
+ g_string_append_printf(str, "ID: %u\r\n", header->id);
+ g_string_append_printf(str, "Offset: %" G_GUINT64_FORMAT "\r\n", header->offset);
+ g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", header->total_size);
+ g_string_append_printf(str, "Length: %u\r\n", header->length);
+ g_string_append_printf(str, "Flags: 0x%x\r\n", header->flags);
+ g_string_append_printf(str, "ACK ID: %u\r\n", header->ack_id);
+ g_string_append_printf(str, "SUB ID: %u\r\n", header->ack_sub_id);
+ g_string_append_printf(str, "ACK Size: %" G_GUINT64_FORMAT "\r\n", header->ack_size);
+
+ break;
+ }
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
g_string_append_printf(str, "Footer: 0x%08X\r\n", info->footer.value);
}
@@ -150,67 +232,232 @@
gboolean
msn_p2p_info_is_valid(MsnP2PInfo *info)
{
- return info->header.total_size >= info->header.length;
+ gboolean valid = FALSE;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ valid = info->header.v1.total_size >= info->header.v1.length;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return valid;
}
gboolean
msn_p2p_info_is_final(MsnP2PInfo *info)
{
- return info->header.offset + info->header.length >= info->header.total_size;
+ gboolean final = FALSE;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ final = info->header.v1.offset + info->header.v1.length >= info->header.v1.total_size;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return final;
}
guint32
msn_p2p_info_get_session_id(MsnP2PInfo *info)
{
- return info->header.session_id;
+ guint32 session_id = 0;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ session_id = info->header.v1.session_id;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return session_id;
}
guint32
msn_p2p_info_get_id(MsnP2PInfo *info)
{
- return info->header.id;
+ guint32 id = 0;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ id = info->header.v1.id;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return id;
}
guint64
msn_p2p_info_get_offset(MsnP2PInfo *info)
{
- return info->header.offset;
+ guint64 offset = 0;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ offset = info->header.v1.offset;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return offset;
}
guint64
msn_p2p_info_get_total_size(MsnP2PInfo *info)
{
- return info->header.total_size;
+ guint64 total_size = 0;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ total_size = info->header.v1.total_size;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return total_size;
}
guint32
msn_p2p_info_get_length(MsnP2PInfo *info)
{
- return info->header.length;
+ guint32 length = 0;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ length = info->header.v1.length;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return length;
}
guint32
msn_p2p_info_get_flags(MsnP2PInfo *info)
{
- return info->header.flags;
+ guint32 flags = 0;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ flags = info->header.v1.flags;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return flags;
}
guint32
msn_p2p_info_get_ack_id(MsnP2PInfo *info)
{
- return info->header.ack_id;
+ guint32 ack_id = 0;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ ack_id = info->header.v1.ack_id;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return ack_id;
}
guint32
msn_p2p_info_get_ack_sub_id(MsnP2PInfo *info)
{
- return info->header.ack_sub_id;
+ guint32 ack_sub_id = 0;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ ack_sub_id = info->header.v1.ack_sub_id;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return ack_sub_id;
}
guint64
msn_p2p_info_get_ack_size(MsnP2PInfo *info)
{
- return info->header.ack_size;
+ guint64 ack_size = 0;
+
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ ack_size = info->header.v1.ack_size;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
+ return ack_size;
}
guint32
@@ -222,55 +469,156 @@
void
msn_p2p_info_set_session_id(MsnP2PInfo *info, guint32 session_id)
{
- info->header.session_id = session_id;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ info->header.v1.session_id = session_id;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
}
void
msn_p2p_info_set_id(MsnP2PInfo *info, guint32 id)
{
- info->header.id = id;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ info->header.v1.id = id;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
+
}
void
msn_p2p_info_set_offset(MsnP2PInfo *info, guint64 offset)
{
- info->header.offset = offset;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ info->header.v1.offset = offset;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
}
void
msn_p2p_info_set_total_size(MsnP2PInfo *info, guint64 total_size)
{
- info->header.total_size = total_size;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ info->header.v1.total_size = total_size;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
}
void
msn_p2p_info_set_length(MsnP2PInfo *info, guint32 length)
{
- info->header.length = length;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ info->header.v1.length = length;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
}
void
msn_p2p_info_set_flags(MsnP2PInfo *info, guint32 flags)
{
- info->header.flags = flags;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ info->header.v1.flags = flags;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
}
void
msn_p2p_info_set_ack_id(MsnP2PInfo *info, guint32 ack_id)
{
- info->header.ack_id = ack_id;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ info->header.v1.ack_id = ack_id;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
}
void
msn_p2p_info_set_ack_sub_id(MsnP2PInfo *info, guint32 ack_sub_id)
{
- info->header.ack_sub_id = ack_sub_id;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ info->header.v1.ack_sub_id = ack_sub_id;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
}
void
msn_p2p_info_set_ack_size(MsnP2PInfo *info, guint64 ack_size)
{
- info->header.ack_size = ack_size;
+ switch (info->version) {
+ case MSN_P2P_VERSION_ONE:
+ info->header.v1.ack_size = ack_size;
+ break;
+
+ case MSN_P2P_VERSION_TWO:
+ /* Nothing to do! */
+ break;
+
+ default:
+ purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+ }
}
void
--- a/libpurple/protocols/msn/p2p.h Mon Feb 28 09:19:34 2011 +0000
+++ b/libpurple/protocols/msn/p2p.h Tue Mar 01 06:24:50 2011 +0000
@@ -58,8 +58,18 @@
} MsnP2PFooter;
#define P2P_PACKET_FOOTER_SIZE (1 * 4)
+typedef enum
+{
+ MSN_P2P_VERSION_ONE = 0,
+ MSN_P2P_VERSION_TWO = 1,
+} MsnP2PVersion;
+
typedef struct {
- MsnP2PHeader header;
+ MsnP2PVersion version;
+ union {
+ MsnP2PHeader v1;
+ MsnP2Pv2Header v2;
+ } header;
MsnP2PFooter footer;
} MsnP2PInfo;
@@ -94,7 +104,7 @@
} MsnP2PAppId;
MsnP2PInfo *
-msn_p2p_info_new(void);
+msn_p2p_info_new(MsnP2PVersion version);
MsnP2PInfo *
msn_p2p_info_dup(MsnP2PInfo *info);
--- a/libpurple/protocols/msn/slpmsg.c Mon Feb 28 09:19:34 2011 +0000
+++ b/libpurple/protocols/msn/slpmsg.c Tue Mar 01 06:24:50 2011 +0000
@@ -48,7 +48,7 @@
else
slpmsg->slplink = NULL;
- slpmsg->p2p_info = msn_p2p_info_new();
+ slpmsg->p2p_info = msn_p2p_info_new(MSN_P2P_VERSION_ONE);
return slpmsg;
}
--- a/libpurple/protocols/msn/slpmsg_part.c Mon Feb 28 09:19:34 2011 +0000
+++ b/libpurple/protocols/msn/slpmsg_part.c Tue Mar 01 06:24:50 2011 +0000
@@ -54,7 +54,7 @@
}
part = msn_slpmsgpart_new(NULL);
- part->info = msn_p2p_info_new();
+ part->info = msn_p2p_info_new(MSN_P2P_VERSION_ONE);
/* Extract the binary SLP header */
len = msn_p2p_header_from_wire(part->info, data);
--- a/libpurple/protocols/msn/switchboard.c Mon Feb 28 09:19:34 2011 +0000
+++ b/libpurple/protocols/msn/switchboard.c Tue Mar 01 06:24:50 2011 +0000
@@ -265,12 +265,6 @@
return;
}
- /* Don't add ourselves either... */
- if (g_str_equal(passport, purple_account_get_username(account))) {
- g_free(passport);
- return;
- }
-
if (!msnuser) {
purple_debug_info("msn","User %s is not on our list.\n", passport);
msnuser = msn_user_new(userlist, passport, NULL);
--- a/libpurple/protocols/msn/user.c Mon Feb 28 09:19:34 2011 +0000
+++ b/libpurple/protocols/msn/user.c Tue Mar 01 06:24:50 2011 +0000
@@ -223,7 +223,10 @@
{
g_return_val_if_fail(user != NULL, FALSE);
- if (user->friendly_name && name && (!strcmp(user->friendly_name, name) ||
+ if (!name)
+ return FALSE;
+
+ if (user->friendly_name && (!strcmp(user->friendly_name, name) ||
!strcmp(user->passport, name)))
return FALSE;
--- a/pidgin/gtkblist.c Mon Feb 28 09:19:34 2011 +0000
+++ b/pidgin/gtkblist.c Tue Mar 01 06:24:50 2011 +0000
@@ -7743,7 +7743,7 @@
gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter);
return;
} else {
- sort_method_none(node, blist, groupiter, cur, iter);
+ sort_method_alphabetical(node, blist, groupiter, cur, iter);
return;
}
--- a/pidgin/gtkdocklet-gtk.c Mon Feb 28 09:19:34 2011 +0000
+++ b/pidgin/gtkdocklet-gtk.c Tue Mar 01 06:24:50 2011 +0000
@@ -47,19 +47,37 @@
static gboolean
docklet_gtk_embed_timeout_cb(gpointer data)
{
- /* The docklet was not embedded within the timeout.
- * Remove it as a visibility manager, but leave the plugin
- * loaded so that it can embed automatically if/when a notification
- * area becomes available.
- */
- purple_debug_info("docklet", "failed to embed within timeout\n");
- pidgin_docklet_remove();
- purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/docklet/gtk/embedded", FALSE);
+#if !GTK_CHECK_VERSION(2,12,0)
+ if (gtk_status_icon_is_embedded(docklet)) {
+ /* Older GTK+ (<2.12) don't implement the embedded signal, but the
+ information is still accessable through the above function. */
+ purple_debug_info("docklet", "embedded\n");
+ pidgin_docklet_embedded();
+ purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/docklet/gtk/embedded", TRUE);
+ }
+ else
+#endif
+ {
+ /* The docklet was not embedded within the timeout.
+ * Remove it as a visibility manager, but leave the plugin
+ * loaded so that it can embed automatically if/when a notification
+ * area becomes available.
+ */
+ purple_debug_info("docklet", "failed to embed within timeout\n");
+ pidgin_docklet_remove();
+ purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/docklet/gtk/embedded", FALSE);
+ }
+
+#if GTK_CHECK_VERSION(2,12,0)
embed_timeout = 0;
return FALSE;
+#else
+ return TRUE;
+#endif
}
+#if GTK_CHECK_VERSION(2,12,0)
static gboolean
docklet_gtk_embedded_cb(GtkWidget *widget, gpointer data)
{
@@ -82,6 +100,7 @@
return TRUE;
}
+#endif
static void
docklet_gtk_destroyed_cb(GtkWidget *widget, gpointer data)
@@ -206,7 +225,9 @@
g_signal_connect(G_OBJECT(docklet), "activate", G_CALLBACK(docklet_gtk_status_activated_cb), NULL);
g_signal_connect(G_OBJECT(docklet), "popup-menu", G_CALLBACK(docklet_gtk_status_clicked_cb), NULL);
+#if GTK_CHECK_VERSION(2,12,0)
g_signal_connect(G_OBJECT(docklet), "notify::embedded", G_CALLBACK(docklet_gtk_embedded_cb), NULL);
+#endif
g_signal_connect(G_OBJECT(docklet), "destroy", G_CALLBACK(docklet_gtk_destroyed_cb), NULL);
gtk_status_icon_set_visible(docklet, TRUE);
@@ -226,11 +247,15 @@
*/
if (!recreate) {
pidgin_docklet_embedded();
+#if GTK_CHECK_VERSION(2,12,0)
if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/docklet/gtk/embedded")) {
embed_timeout = purple_timeout_add_seconds(LONG_EMBED_TIMEOUT, docklet_gtk_embed_timeout_cb, NULL);
} else {
embed_timeout = purple_timeout_add_seconds(SHORT_EMBED_TIMEOUT, docklet_gtk_embed_timeout_cb, NULL);
}
+#else
+ embed_timeout = purple_timeout_add_seconds(SHORT_EMBED_TIMEOUT, docklet_gtk_embed_timeout_cb, NULL);
+#endif
}
purple_debug_info("docklet", "GTK+ created\n");