Mercurial > pidgin
changeset 22198:a07c5798467f
merge of '7e6f3aa974ad4672e16bd0ac3839d416c87160f1'
and 'eeef57ab07e5cf7182b765f603a8f2a771081f74'
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Fri, 25 Jan 2008 02:08:05 +0000 |
parents | a67c0aa4db9c (diff) 1e103e1b845f (current diff) |
children | 5aacf801f6b6 |
files | |
diffstat | 17 files changed, 98 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog.API Thu Jan 24 21:15:43 2008 +0000 +++ b/ChangeLog.API Fri Jan 25 02:08:05 2008 +0000 @@ -35,6 +35,8 @@ * purple_blist_node_get_first_child * purple_blist_node_get_sibling_next * purple_chat_get_account + * Added last_received to PurpleConnection, the time_t of the + last received packet. Pidgin: Added:
--- a/libpurple/connection.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/connection.c Fri Jan 25 02:08:05 2008 +0000 @@ -52,8 +52,19 @@ PurpleConnection *gc = data; PurplePluginProtocolInfo *prpl_info = NULL; - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if (gc == NULL) + return; + + /* Only send keep-alives if we haven't heard from the + * server in a while. + */ + if ((time(NULL) - gc->last_received) < KEEPALIVE_INTERVAL) + return; + + if (gc->prpl == NULL) + return; + + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); if (prpl_info && prpl_info->keepalive) prpl_info->keepalive(gc);
--- a/libpurple/connection.h Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/connection.h Fri Jan 25 02:08:05 2008 +0000 @@ -251,6 +251,8 @@ gboolean wants_to_die; guint disconnect_timeout; /**< Timer used for nasty stack tricks */ + time_t last_received; /**< When we last received a packet. Set by the + prpl to avoid sending unneeded keepalives */ }; #ifdef __cplusplus
--- a/libpurple/protocols/gg/gg.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/gg/gg.c Fri Jan 25 02:08:05 2008 +0000 @@ -1314,7 +1314,7 @@ _("Unable to read socket")); return; } - + gc->last_received = time(NULL); switch (ev->type) { case GG_EVENT_NONE: /* Nothing happened. */
--- a/libpurple/protocols/irc/irc.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/irc/irc.c Fri Jan 25 02:08:05 2008 +0000 @@ -572,6 +572,7 @@ { char *cur, *end; + irc->account->gc->last_received = time(NULL); irc->inbufused += len; irc->inbuf[irc->inbufused] = '\0';
--- a/libpurple/protocols/jabber/jabber.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.c Fri Jan 25 02:08:05 2008 +0000 @@ -432,6 +432,7 @@ } while((len = purple_ssl_read(gsc, buf, sizeof(buf) - 1)) > 0) { + gc->last_received = time(NULL); buf[len] = '\0'; purple_debug(PURPLE_DEBUG_INFO, "jabber", "Recv (ssl)(%d): %s\n", len, buf); jabber_parser_process(js, buf, len); @@ -459,6 +460,7 @@ return; if((len = read(js->fd, buf, sizeof(buf) - 1)) > 0) { + gc->last_received = time(NULL); #ifdef HAVE_CYRUS_SASL if (js->sasl_maxbuf>0) { const char *out;
--- a/libpurple/protocols/msn/servconn.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/msn/servconn.c Fri Jan 25 02:08:05 2008 +0000 @@ -391,6 +391,7 @@ session = servconn->session; len = read(servconn->fd, buf, sizeof(buf) - 1); + servconn->session->account->gc->last_connected = time(NULL); if (len <= 0) { switch (errno) {
--- a/libpurple/protocols/msnp9/servconn.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/msnp9/servconn.c Fri Jan 25 02:08:05 2008 +0000 @@ -387,6 +387,7 @@ session = servconn->session; len = read(servconn->fd, buf, sizeof(buf) - 1); + servconn->session->account->gc->last_received = time(NULL); if (len < 0 && errno == EAGAIN) return;
--- a/libpurple/protocols/myspace/myspace.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/myspace/myspace.c Fri Jan 25 02:08:05 2008 +0000 @@ -2475,6 +2475,7 @@ * the file descriptor, but it sometimes differs from the 'source' parameter. */ n = recv(session->fd, session->rxbuf + session->rxoff, MSIM_READ_BUF_SIZE - session->rxoff, 0); + gc->last_received = time(NULL); if (n < 0 && errno == EAGAIN) { return;
--- a/libpurple/protocols/oscar/flap_connection.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/oscar/flap_connection.c Fri Jan 25 02:08:05 2008 +0000 @@ -817,6 +817,7 @@ OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); break; } + conn->od->gc->last_received = time(NULL); /* If we don't even have a complete FLAP header then do nothing */ conn->header_received += read;
--- a/libpurple/protocols/sametime/sametime.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/sametime/sametime.c Fri Jan 25 02:08:05 2008 +0000 @@ -1695,7 +1695,9 @@ int len; len = read(sock, buf, BUF_LEN); - if(len > 0) mwSession_recv(session, buf, len); + if(len > 0) { + mwSession_recv(session, buf, len); + } return len; }
--- a/libpurple/protocols/simple/simple.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/simple/simple.c Fri Jan 25 02:08:05 2008 +0000 @@ -1675,7 +1675,7 @@ if(sip->fd == source) sip->fd = -1; return; } - + gc->last_received = time(NULL); conn->inbufused += len; conn->inbuf[conn->inbufused] = '\0';
--- a/libpurple/protocols/yahoo/yahoo.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Fri Jan 25 02:08:05 2008 +0000 @@ -2506,7 +2506,7 @@ _("Server closed the connection.")); return; } - + gc->last_received = time(NULL); yd->rxqueue = g_realloc(yd->rxqueue, len + yd->rxlen); memcpy(yd->rxqueue + yd->rxlen, buf, len); yd->rxlen += len;
--- a/libpurple/tests/test_util.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/tests/test_util.c Fri Jan 25 02:08:05 2008 +0000 @@ -71,6 +71,13 @@ START_TEST(test_util_email_is_valid) { fail_unless(purple_email_is_valid("purple-devel@lists.sf.net")); + fail_if(purple_email_is_valid("purple-devel@@lists.sf.net")); + fail_if(purple_email_is_valid("purple@devel@lists.sf.net")); + fail_if(purple_email_is_valid("purple-devel@list..sf.net")); + fail_if(purple_email_is_valid("purple-devel")); + fail_if(purple_email_is_valid("@lists.sf.net")); + fail_if(purple_email_is_valid("")); + fail_if(purple_email_is_valid("totally bogus")); } END_TEST
--- a/libpurple/util.c Thu Jan 24 21:15:43 2008 +0000 +++ b/libpurple/util.c Fri Jan 25 02:08:05 2008 +0000 @@ -1445,7 +1445,6 @@ ALLOW_TAG("pre"); ALLOW_TAG("q"); ALLOW_TAG("span"); - ALLOW_TAG("strong"); ALLOW_TAG("ul"); @@ -1465,9 +1464,14 @@ plain = g_string_append_c(plain, '\n'); continue; } - if(!g_ascii_strncasecmp(c, "<b>", 3) || !g_ascii_strncasecmp(c, "<bold>", strlen("<bold>"))) { + if(!g_ascii_strncasecmp(c, "<b>", 3) || !g_ascii_strncasecmp(c, "<bold>", strlen("<bold>")) || !g_ascii_strncasecmp(c, "<strong>", strlen("<strong>"))) { struct purple_parse_tag *pt = g_new0(struct purple_parse_tag, 1); - pt->src_tag = *(c+2) == '>' ? "b" : "bold"; + if (*(c+2) == '>') + pt->src_tag = "b"; + else if (*(c+2) == 'o') + pt->src_tag = "bold"; + else + pt->src_tag = "strong"; pt->dest_tag = "span"; tags = g_list_prepend(tags, pt); c = strchr(c, '>') + 1;
--- a/pidgin/gtkconv.c Thu Jan 24 21:15:43 2008 +0000 +++ b/pidgin/gtkconv.c Fri Jan 25 02:08:05 2008 +0000 @@ -169,6 +169,7 @@ static void pidgin_conv_set_position_size(PidginWindow *win, int x, int y, int width, int height); +static gboolean pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y); static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) { static GdkColor col; @@ -6885,6 +6886,18 @@ gray_stuff_out(PIDGIN_CONVERSATION(conv)); } +static gboolean +pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y) +{ + gint pane_x, pane_y, x_rel; + PidginConversation *gtkconv; + + gdk_window_get_origin(win->notebook->window, &pane_x, &pane_y); + x_rel = x - pane_x; + gtkconv = pidgin_conv_window_get_active_gtkconv(win); + return (x_rel > gtkconv->infopane->allocation.x + gtkconv->infopane->allocation.width / 2); +} + int pidgin_conv_get_tab_at_xy(PidginWindow *win, int x, int y, gboolean *to_right) { @@ -6920,7 +6933,7 @@ tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), page); /* Make sure the tab is not hidden beyond an arrow */ - if (!GTK_WIDGET_DRAWABLE(tab)) + if (!GTK_WIDGET_DRAWABLE(tab) && gtk_notebook_get_show_tabs(notebook)) continue; if (horiz) { @@ -8179,7 +8192,6 @@ GtkWidget *tab; gint page_num; gboolean horiz_tabs = FALSE; - PidginConversation *gtkconv; gboolean to_right = FALSE; /* Get the window that the cursor is over. */ @@ -8193,20 +8205,27 @@ dest_notebook = GTK_NOTEBOOK(dest_win->notebook); - page_num = pidgin_conv_get_tab_at_xy(dest_win, - e->x_root, e->y_root, &to_right); - to_right = to_right && (win != dest_win); + if (gtk_notebook_get_show_tabs(dest_notebook)) { + page_num = pidgin_conv_get_tab_at_xy(dest_win, + e->x_root, e->y_root, &to_right); + to_right = to_right && (win != dest_win); + tab = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num)->tabby; + } else { + page_num = 0; + to_right = pidgin_conv_xy_to_right_infopane(dest_win, e->x_root, e->y_root); + tab = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num)->infopane; + } if (gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_TOP || gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_BOTTOM) { horiz_tabs = TRUE; } - gtkconv = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num); - tab = gtkconv->tabby; - if (gtk_notebook_get_show_tabs(dest_notebook) == FALSE) { - dnd_hints_show_relative(HINT_ARROW_DOWN, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_TOP); - dnd_hints_show_relative(HINT_ARROW_UP, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_BOTTOM); + if (gtk_notebook_get_show_tabs(dest_notebook) == FALSE && win == dest_win) + { + /* dragging a tab from a single-tabbed window over its own window */ + dnd_hints_hide_all(); + return TRUE; } else if (horiz_tabs) { if (((gpointer)win == (gpointer)dest_win && win->drag_tab < page_num) || to_right) { dnd_hints_show_relative(HINT_ARROW_DOWN, tab, HINT_POSITION_RIGHT, HINT_POSITION_TOP); @@ -8403,6 +8422,7 @@ notebook_release_cb(GtkWidget *widget, GdkEventButton *e, PidginWindow *win) { PidginWindow *dest_win; + GtkNotebook *dest_notebook; PurpleConversation *conv; PidginConversation *gtkconv; gint dest_page_num = 0; @@ -8478,9 +8498,16 @@ "conversation-dragging", win, dest_win); /* Get the destination page number. */ - if (!new_window) - dest_page_num = pidgin_conv_get_tab_at_xy(dest_win, - e->x_root, e->y_root, &to_right); + if (!new_window) { + dest_notebook = GTK_NOTEBOOK(dest_win->notebook); + if (gtk_notebook_get_show_tabs(dest_notebook)) { + dest_page_num = pidgin_conv_get_tab_at_xy(dest_win, + e->x_root, e->y_root, &to_right); + } else { + dest_page_num = 0; + to_right = pidgin_conv_xy_to_right_infopane(dest_win, e->x_root, e->y_root); + } + } gtkconv = pidgin_conv_window_get_gtkconv_at_index(win, win->drag_tab);
--- a/pidgin/gtkimhtml.c Thu Jan 24 21:15:43 2008 +0000 +++ b/pidgin/gtkimhtml.c Fri Jan 25 02:08:05 2008 +0000 @@ -1455,6 +1455,9 @@ gtk_text_buffer_create_tag(imhtml->text_buffer, "SUP", "rise", 5000, NULL); gtk_text_buffer_create_tag(imhtml->text_buffer, "PRE", "family", "Monospace", NULL); gtk_text_buffer_create_tag(imhtml->text_buffer, "search", "background", "#22ff00", "weight", "bold", NULL); +#if GTK_CHECK_VERSION(2,10,10) + gtk_text_buffer_create_tag(imhtml->text_buffer, "comment", "invisible", FALSE, NULL); +#endif /* When hovering over a link, we show the hand cursor--elsewhere we show the plain ol' pointer cursor */ imhtml->hand_cursor = gdk_cursor_new (GDK_HAND2); @@ -2981,10 +2984,15 @@ gtk_text_buffer_insert(imhtml->text_buffer, iter, ws, wpos); +#if GTK_CHECK_VERSION(2,10,10) + wpos = g_snprintf (ws, len, "%s", tag); + gtk_text_buffer_insert_with_tags_by_name(imhtml->text_buffer, iter, ws, wpos, "comment", NULL); +#else if (imhtml->show_comments && !(options & GTK_IMHTML_NO_COMMENTS)) { wpos = g_snprintf (ws, len, "%s", tag); gtk_text_buffer_insert(imhtml->text_buffer, iter, ws, wpos); } +#endif ws[0] = '\0'; wpos = 0; /* NEW_BIT (NEW_COMMENT_BIT); */ @@ -3130,6 +3138,12 @@ void gtk_imhtml_show_comments (GtkIMHtml *imhtml, gboolean show) { +#if GTK_CHECK_VERSION(2,10,10) + GtkTextTag *tag; + tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(imhtml->text_buffer), "comment"); + if (tag) + g_object_set(G_OBJECT(tag), "invisible", !show, NULL); +#endif imhtml->show_comments = show; }