# HG changeset patch # User Ka-Hing Cheung # Date 1185128246 0 # Node ID 0ad0bdb0063b766bf47d67aab1e2e9cbbd4ca8c1 # Parent 823946ddd52743837950768ed3d6301455051df4# Parent 784f98a1bc7f6ea605e61294353c7beee1151b9a merge of '36ee98cd262baf7d57502c08fc185518ed93532a' and '4155ac2acf86fd3365a2f8ea18bd1cb4d1db4f0e' diff -r 823946ddd527 -r 0ad0bdb0063b COPYRIGHT --- a/COPYRIGHT Sat Jul 21 06:22:15 2007 +0000 +++ b/COPYRIGHT Sun Jul 22 18:17:26 2007 +0000 @@ -372,6 +372,7 @@ Todd Troxell Brad Turcotte Junichi Uekawa +Igor Vlasenko István Váradi Martijn van Beers Arjan van de Ven diff -r 823946ddd527 -r 0ad0bdb0063b configure.ac --- a/configure.ac Sat Jul 21 06:22:15 2007 +0000 +++ b/configure.ac Sun Jul 22 18:17:26 2007 +0000 @@ -2069,6 +2069,8 @@ pidgin/pixmaps/icons/Makefile pidgin/pixmaps/icons/16/Makefile pidgin/pixmaps/icons/16/scalable/Makefile + pidgin/pixmaps/icons/22/Makefile + pidgin/pixmaps/icons/22/scalable/Makefile pidgin/pixmaps/icons/24/Makefile pidgin/pixmaps/icons/24/scalable/Makefile pidgin/pixmaps/icons/32/Makefile diff -r 823946ddd527 -r 0ad0bdb0063b libpurple/Makefile.am --- a/libpurple/Makefile.am Sat Jul 21 06:22:15 2007 +0000 +++ b/libpurple/Makefile.am Sun Jul 22 18:17:26 2007 +0000 @@ -225,11 +225,11 @@ libpurple_la_DEPENDENCIES = $(STATIC_LINK_LIBS) libpurple_la_LDFLAGS = -export-dynamic -version-info $(PURPLE_LT_VERSION_INFO) -no-undefined libpurple_la_LIBADD = \ + $(STATIC_LINK_LIBS) \ $(DBUS_LIBS) \ $(GLIB_LIBS) \ $(LIBXML_LIBS) \ $(LIBNM_LIBS) \ - $(STATIC_LINK_LIBS) \ $(INTLLIBS) \ -lm diff -r 823946ddd527 -r 0ad0bdb0063b libpurple/protocols/oscar/flap_connection.c --- a/libpurple/protocols/oscar/flap_connection.c Sat Jul 21 06:22:15 2007 +0000 +++ b/libpurple/protocols/oscar/flap_connection.c Sun Jul 22 18:17:26 2007 +0000 @@ -356,16 +356,21 @@ FlapConnection *conn; OscarData *od; PurpleAccount *account; + aim_rxcallback_t userfunc; conn = data; od = conn->od; account = (PURPLE_CONNECTION_IS_VALID(od->gc) ? purple_connection_get_account(od->gc) : NULL); purple_debug_info("oscar", "Destroying oscar connection of " - "type 0x%04hx\n", conn->type); + "type 0x%04hx. Disconnect reason is %d\n", + conn->type, conn->disconnect_reason); od->oscar_connections = g_slist_remove(od->oscar_connections, conn); + if ((userfunc = aim_callhandler(od, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR))) + userfunc(od, conn, NULL, conn->disconnect_code, conn->error_message); + /* * TODO: If we don't have a SNAC_FAMILY_LOCATE connection then * we should try to request one instead of disconnecting. @@ -375,7 +380,10 @@ { /* No more FLAP connections! Sign off this PurpleConnection! */ gchar *tmp; - if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED) + if (conn->disconnect_code == 0x0001) { + tmp = g_strdup(_("You have signed on from another location.")); + od->gc->wants_to_die = TRUE; + } else if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED) tmp = g_strdup(_("Server closed the connection.")); else if (conn->disconnect_reason == OSCAR_DISCONNECT_LOST_CONNECTION) tmp = g_strdup_printf(_("Lost connection with server:\n%s"), @@ -695,8 +703,6 @@ { GSList *tlvlist; char *msg = NULL; - guint16 code = 0; - aim_rxcallback_t userfunc; if (byte_stream_empty(&frame->data) == 0) { /* XXX should do something with this */ @@ -713,13 +719,17 @@ tlvlist = aim_tlvlist_read(&frame->data); if (aim_tlv_gettlv(tlvlist, 0x0009, 1)) - code = aim_tlv_get16(tlvlist, 0x0009, 1); + conn->disconnect_code = aim_tlv_get16(tlvlist, 0x0009, 1); if (aim_tlv_gettlv(tlvlist, 0x000b, 1)) msg = aim_tlv_getstr(tlvlist, 0x000b, 1); - if ((userfunc = aim_callhandler(od, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR))) - userfunc(od, conn, frame, code, msg); + /* + * The server ended this FLAP connnection, so let's be nice and + * close the physical TCP connection + */ + flap_connection_schedule_destroy(conn, + OSCAR_DISCONNECT_REMOTE_CLOSED, msg); aim_tlvlist_free(tlvlist); diff -r 823946ddd527 -r 0ad0bdb0063b libpurple/protocols/oscar/oscar.c --- a/libpurple/protocols/oscar/oscar.c Sat Jul 21 06:22:15 2007 +0000 +++ b/libpurple/protocols/oscar/oscar.c Sun Jul 22 18:17:26 2007 +0000 @@ -1383,7 +1383,6 @@ } purple_debug_info("oscar", "Login Error Code 0x%04hx\n", info->errorcode); purple_debug_info("oscar", "Error URL: %s\n", info->errorurl); - od->killme = TRUE; return 1; } @@ -1410,7 +1409,6 @@ if (newconn->connect_data == NULL) { purple_connection_error(gc, _("Could Not Connect")); - od->killme = TRUE; return 0; } @@ -1433,12 +1431,10 @@ purple_parse_auth_securid_request_no_cb(gpointer user_data, const char *value) { PurpleConnection *gc = user_data; - OscarData *od = gc->proto_data; /* Disconnect */ gc->wants_to_die = TRUE; purple_connection_error(gc, _("The SecurID key entered is invalid.")); - od->killme = TRUE; } static int @@ -3472,33 +3468,32 @@ purple_debug_info("oscar", "Disconnected. Code is 0x%04x and msg is %s\n", code, (msg != NULL ? msg : "")); - g_return_val_if_fail(fr != NULL, 1); g_return_val_if_fail(conn != NULL, 1); - if (conn->type == SNAC_FAMILY_LOCATE) { - if (code == 0x0001) { - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("You have signed on from another location.")); - } else { - purple_connection_error(gc, _("You have been signed off for an unknown reason.")); - } - od->killme = TRUE; - } else if (conn->type == SNAC_FAMILY_CHAT) { + if (conn->type == SNAC_FAMILY_CHAT) { struct chat_connection *cc; - PurpleConversation *conv; + PurpleConversation *conv = NULL; cc = find_oscar_chat_by_conn(gc, conn); - conv = purple_find_chat(gc, cc->id); - - if (conv != NULL) + if (cc != NULL) { - gchar *buf; - buf = g_strdup_printf(_("You have been disconnected from chat " - "room %s."), cc->name); - purple_conversation_write(conv, NULL, buf, PURPLE_MESSAGE_ERROR, time(NULL)); - g_free(buf); + conv = purple_find_chat(gc, cc->id); + + if (conv != NULL) + { + /* + * TOOD: Have flap_connection_destroy_cb() send us the + * error message stored in 'tmp', which should be + * human-friendly, and print that to the chat room. + */ + gchar *buf; + buf = g_strdup_printf(_("You have been disconnected from chat " + "room %s."), cc->name); + purple_conversation_write(conv, NULL, buf, PURPLE_MESSAGE_ERROR, time(NULL)); + g_free(buf); + } + oscar_chat_kill(gc, cc); } - oscar_chat_kill(gc, cc); } return 1; @@ -4328,10 +4323,15 @@ tmp2 = purple_markup_strip_html(tmp1); g_free(tmp1); - - tmp1 = purple_strdup_withhtml(tmp2); + + /* re-escape the entities */ + tmp1 = g_markup_escape_text(tmp2, -1); g_free(tmp2); + tmp2 = purple_strdup_withhtml(tmp1); + g_free(tmp1); + tmp1 = tmp2; + purple_plugin_oscar_convert_to_best_encoding(gc, name, tmp1, (char **)&args.msg, &args.msglen, &args.charset, &args.charsubset); purple_debug_info("oscar", "Sending %s as %s because the original was too long.", diff -r 823946ddd527 -r 0ad0bdb0063b libpurple/protocols/oscar/oscar.h --- a/libpurple/protocols/oscar/oscar.h Sat Jul 21 06:22:15 2007 +0000 +++ b/libpurple/protocols/oscar/oscar.h Sun Jul 22 18:17:26 2007 +0000 @@ -378,6 +378,7 @@ guint destroy_timeout; OscarDisconnectReason disconnect_reason; gchar *error_message; + guint16 disconnect_code; /* A few variables that are only used when connecting */ PurpleProxyConnectData *connect_data; @@ -442,7 +443,6 @@ GHashTable *buddyinfo; GSList *requesticon; - gboolean killme; gboolean icq; guint icontimer; guint getblisttimer; diff -r 823946ddd527 -r 0ad0bdb0063b libpurple/protocols/oscar/tlv.c --- a/libpurple/protocols/oscar/tlv.c Sat Jul 21 06:22:15 2007 +0000 +++ b/libpurple/protocols/oscar/tlv.c Sun Jul 22 18:17:26 2007 +0000 @@ -718,12 +718,10 @@ for (cur = list, i = 0; cur != NULL; cur = cur->next) { tlv = cur->data; - if (tlv != NULL) { /* TODO: This NULL check shouldn't be needed */ - if (tlv->type == type) - i++; - if (i >= nth) - return tlv; - } + if (tlv->type == type) + i++; + if (i >= nth) + return tlv; } return NULL; diff -r 823946ddd527 -r 0ad0bdb0063b libpurple/protocols/sametime/sametime.c --- a/libpurple/protocols/sametime/sametime.c Sat Jul 21 06:22:15 2007 +0000 +++ b/libpurple/protocols/sametime/sametime.c Sun Jul 22 18:17:26 2007 +0000 @@ -3189,7 +3189,8 @@ pd = gc->proto_data; ret = mwServiceAware_getText(pd->srvc_aware, &t); - return ret? g_markup_escape_text(ret, -1): NULL; + + return (ret && g_utf8_validate(ret, -1, NULL)) ? g_markup_escape_text(ret, -1): NULL; } @@ -3254,7 +3255,7 @@ message = mwServiceAware_getText(pd->srvc_aware, &idb); status = status_text(b); - if(message != NULL && purple_utf8_strcasecmp(status, message)) { + if(message != NULL && g_utf8_validate(message, -1, NULL) && purple_utf8_strcasecmp(status, message)) { tmp = g_markup_escape_text(message, -1); purple_notify_user_info_add_pair(user_info, status, tmp); g_free(tmp); @@ -4151,7 +4152,7 @@ /* XXX Is this adding a status message in its own section rather than with the "Status" label? */ tmp2 = mwServiceAware_getText(pd->srvc_aware, &idb); - if(tmp2) { + if(tmp2 && g_utf8_validate(tmp2, -1, NULL)) { tmp = g_markup_escape_text(tmp2, -1); purple_notify_user_info_add_section_break(user_info); purple_notify_user_info_add_pair(user_info, NULL, tmp); diff -r 823946ddd527 -r 0ad0bdb0063b libpurple/util.c --- a/libpurple/util.c Sat Jul 21 06:22:15 2007 +0000 +++ b/libpurple/util.c Sun Jul 22 18:17:26 2007 +0000 @@ -3994,6 +3994,10 @@ if (*c <= ' ' || *c >= 127) return FALSE; if (strchr(rfc822_specials, *c)) return FALSE; } + + /* It's obviously not an email address if we didn't find an '@' above */ + if (*c == '\0') return FALSE; + /* strictly we should return false if (*(c - 1) == '.') too, but I think * we should permit user.@domain type addresses - they do work :) */ if (c == address) return FALSE; diff -r 823946ddd527 -r 0ad0bdb0063b pidgin/gtkconv.c --- a/pidgin/gtkconv.c Sat Jul 21 06:22:15 2007 +0000 +++ b/pidgin/gtkconv.c Sun Jul 22 18:17:26 2007 +0000 @@ -83,9 +83,10 @@ }PidginConvFields; enum { - ICON_COLUMN, - TEXT_COLUMN, - NUM_COLUMNS + CONV_ICON_COLUMN, + CONV_TEXT_COLUMN, + CONV_EMBLEM_COLUMN, + CONV_NUM_COLUMNS } PidginInfopaneColumns; #define PIDGIN_CONV_ALL ((1 << 7) - 1) @@ -2335,8 +2336,10 @@ { PidginConversation *gtkconv; PidginWindow *win; + PurpleBuddy *b; GList *l; GdkPixbuf *status = NULL; + GdkPixbuf *emblem = NULL; g_return_if_fail(conv != NULL); @@ -2345,7 +2348,11 @@ if (conv != gtkconv->active_conv) return; + status = pidgin_conv_get_tab_icon(conv, TRUE); + b = purple_find_buddy(conv->account, conv->name); + if (b) + emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b); g_return_if_fail(status != NULL); @@ -2354,7 +2361,12 @@ gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model), &(gtkconv->infopane_iter), - ICON_COLUMN, status, -1); + CONV_ICON_COLUMN, status, -1); + + gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model), + &(gtkconv->infopane_iter), + CONV_EMBLEM_COLUMN, emblem, -1); + if (status != NULL) g_object_unref(status); @@ -4412,7 +4424,7 @@ gtkconv->infopane = gtk_cell_view_new(); - gtkconv->infopane_model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING); + gtkconv->infopane_model = gtk_list_store_new(CONV_NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, GDK_TYPE_PIXBUF); gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane), GTK_TREE_MODEL(gtkconv->infopane_model)); gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter)); @@ -4425,18 +4437,23 @@ rend = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE); - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", ICON_COLUMN, NULL); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", CONV_ICON_COLUMN, NULL); g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL); rend = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, TRUE); - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "markup", TEXT_COLUMN, NULL); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "markup", CONV_TEXT_COLUMN, NULL); g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); #if GTK_CHECK_VERSION(2, 6, 0) g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); #endif + rend = gtk_cell_renderer_pixbuf_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", CONV_EMBLEM_COLUMN, NULL); + g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL); + /* Setup the gtkimhtml widget */ frame = pidgin_create_imhtml(FALSE, >kconv->imhtml, NULL, &imhtml_sw); if (chat) { @@ -4787,6 +4804,11 @@ else gtk_widget_hide(gtkconv->toolbar); + if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/im/show_buddy_icons")) + gtk_widget_show(gtkconv->infopane_hbox); + else + gtk_widget_hide(gtkconv->infopane_hbox); + gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps")); gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), @@ -6199,7 +6221,7 @@ topic ? topic : ""); } gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter), - TEXT_COLUMN, markup, -1); + CONV_TEXT_COLUMN, markup, -1); if (title != markup) g_free(markup); @@ -6766,9 +6788,14 @@ for (l = purple_get_conversations(); l != NULL; l = l->next) { PurpleConversation *conv = l->data; - - if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) + if (GPOINTER_TO_INT(value)) + gtk_widget_show(PIDGIN_CONVERSATION(conv)->infopane_hbox); + else + gtk_widget_hide(PIDGIN_CONVERSATION(conv)->infopane_hbox); + + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { pidgin_conv_update_buddy_icon(conv); + } } } @@ -8421,6 +8448,10 @@ win->gtkconvs = g_list_append(win->gtkconvs, gtkconv); gtkconv->win = win; + if (win->gtkconvs && win->gtkconvs->next && win->gtkconvs->next->next == NULL) + pidgin_conv_tab_pack(win, ((PidginConversation*)win->gtkconvs->data)); + + /* Close button. */ gtkconv->close = gtk_button_new(); gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &close_button_width, &close_button_height); @@ -8490,9 +8521,11 @@ /* Er, bug in notebooks? Switch to the page manually. */ gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); - gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE); - } else + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), + purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs")); + } else { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE); + } focus_gtkconv = g_list_nth_data(pidgin_conv_window_get_gtkconvs(win), gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook))); @@ -8518,11 +8551,14 @@ angle = 270; #if GTK_CHECK_VERSION(2,6,0) - if (!angle) + if (!angle && pidgin_conv_window_get_gtkconv_count(win) > 1) { g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); - else + gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); + } else { g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_NONE, NULL); - gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); + gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), -1); + } + if (tabs_side) { gtk_label_set_width_chars( GTK_LABEL(gtkconv->tab_label), @@ -8581,7 +8617,9 @@ gtk_notebook_set_tab_label(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, ebox); } - gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); + gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, + !tabs_side && !angle && pidgin_conv_window_get_gtkconv_count(win) > 1, + TRUE, GTK_PACK_START); /* show the widgets */ /* XXX gtk_widget_show(gtkconv->icon); */ @@ -8608,13 +8646,14 @@ /* go back to tabless */ if (pidgin_conv_window_get_gtkconv_count(win) <= 2) { - gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE); + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), + purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs")); } win->gtkconvs = g_list_remove(win->gtkconvs, gtkconv); - if (!win->gtkconvs || !win->gtkconvs->next) - gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE); + if (win->gtkconvs && win->gtkconvs->next == NULL) + pidgin_conv_tab_pack(win, win->gtkconvs->data); if (!win->gtkconvs && win != hidden_convwin) pidgin_conv_window_destroy(win); diff -r 823946ddd527 -r 0ad0bdb0063b pidgin/gtkprefs.c --- a/pidgin/gtkprefs.c Sat Jul 21 06:22:15 2007 +0000 +++ b/pidgin/gtkprefs.c Sun Jul 22 18:17:26 2007 +0000 @@ -994,7 +994,7 @@ pidgin_prefs_checkbox(_("Show _formatting on incoming messages"), PIDGIN_PREFS_ROOT "/conversations/show_incoming_formatting", vbox); - iconpref1 = pidgin_prefs_checkbox(_("Show buddy _icons"), + iconpref1 = pidgin_prefs_checkbox(_("Show Buddy _Details"), PIDGIN_PREFS_ROOT "/conversations/im/show_buddy_icons", vbox); iconpref2 = pidgin_prefs_checkbox(_("Enable buddy ic_on animation"), PIDGIN_PREFS_ROOT "/conversations/im/animate_buddy_icons", vbox); diff -r 823946ddd527 -r 0ad0bdb0063b pidgin/pixmaps/icons/22/Makefile.am --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/icons/22/Makefile.am Sun Jul 22 18:17:26 2007 +0000 @@ -0,0 +1,8 @@ +SUBDIRS = scalable + +EXTRA_DIST = pidgin.png + +pidginiconspixdir = $(datadir)/icons/hicolor/24x24/apps + +pidginiconspix_DATA = $(EXTRA_DIST) + diff -r 823946ddd527 -r 0ad0bdb0063b pidgin/pixmaps/icons/22/pidgin.png Binary file pidgin/pixmaps/icons/22/pidgin.png has changed diff -r 823946ddd527 -r 0ad0bdb0063b pidgin/pixmaps/icons/22/scalable/Makefile.am --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/icons/22/scalable/Makefile.am Sun Jul 22 18:17:26 2007 +0000 @@ -0,0 +1,1 @@ +EXTRA_DIST = pidgin.svg diff -r 823946ddd527 -r 0ad0bdb0063b pidgin/pixmaps/icons/22/scalable/pidgin.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/icons/22/scalable/pidgin.svg Sun Jul 22 18:17:26 2007 +0000 @@ -0,0 +1,591 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff -r 823946ddd527 -r 0ad0bdb0063b pidgin/plugins/gevolution/gevolution.c --- a/pidgin/plugins/gevolution/gevolution.c Sat Jul 21 06:22:15 2007 +0000 +++ b/pidgin/plugins/gevolution/gevolution.c Sun Jul 22 18:17:26 2007 +0000 @@ -227,11 +227,13 @@ if (app != NULL) { char *command_line = g_strdup_printf("%s mailto:%s", app, mail); + char *quoted = g_shell_quote(command_line); g_free(app); g_free(mail); - g_spawn_command_line_async(command_line, NULL); + g_spawn_command_line_async(quoted, NULL); g_free(command_line); + g_free(quoted); } else {