# HG changeset patch # User Sadrul Habib Chowdhury # Date 1196760742 0 # Node ID 8c1bcaaaac3445e1ee8b63551d5aa031922c0f55 # Parent 8922d61c738aedaaeea49a66561c4d411d11128e# Parent c7e81e9cc4768968d61d1eaf882e4cdf740629d8 merge of '6cc61e144190cb90c18c63d45b7d7abd95a67008' and '7adb724fcfb08212b94d02541fea98c6b1a20658' diff -r 8922d61c738a -r 8c1bcaaaac34 libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Tue Dec 04 09:30:25 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.c Tue Dec 04 09:32:22 2007 +0000 @@ -1369,7 +1369,9 @@ msim_msg_dump("msim_check_inbox_cb: reply=%s\n", reply); body = msim_msg_get_dictionary(reply, "body"); - g_return_if_fail(body != NULL); + + if (body == NULL) + return; old_inbox_status = session->inbox_status; @@ -1433,6 +1435,11 @@ session = (MsimSession *)data; + if (!MSIM_SESSION_VALID(session)) { + purple_debug_info("msim", "msim_check_inbox: session invalid, stopping the mail check.\n"); + return FALSE; + } + purple_debug_info("msim", "msim_check_inbox: checking mail\n"); g_return_val_if_fail(msim_send(session, "persist", MSIM_TYPE_INTEGER, 1, @@ -1645,7 +1652,7 @@ /* Check mail if they want to. */ if (purple_account_get_check_mail(session->account)) { - purple_timeout_add(MSIM_MAIL_INTERVAL_CHECK, + session->inbox_handle = purple_timeout_add(MSIM_MAIL_INTERVAL_CHECK, (GSourceFunc)msim_check_inbox, session); msim_check_inbox(session); } @@ -1947,8 +1954,8 @@ break; case MSIM_STATUS_CODE_IDLE: - /* will be handled below */ - purple_status_code = -1; + /* Treat idle as an available status. */ + purple_status_code = PURPLE_STATUS_AVAILABLE; break; default: diff -r 8922d61c738a -r 8c1bcaaaac34 libpurple/protocols/myspace/session.c --- a/libpurple/protocols/myspace/session.c Tue Dec 04 09:30:25 2007 +0000 +++ b/libpurple/protocols/myspace/session.c Tue Dec 04 09:32:22 2007 +0000 @@ -63,6 +63,7 @@ session->next_rid = 1; session->last_comm = time(NULL); session->inbox_status = 0; + session->inbox_handle = 0; return session; } @@ -90,6 +91,11 @@ msim_msg_free(session->server_info); } + /* Stop checking the inbox at the end of the session. */ + if (session->inbox_handle) { + purple_timeout_remove(session->inbox_handle); + } + g_free(session); } diff -r 8922d61c738a -r 8c1bcaaaac34 libpurple/protocols/myspace/session.h --- a/libpurple/protocols/myspace/session.h Tue Dec 04 09:30:25 2007 +0000 +++ b/libpurple/protocols/myspace/session.h Tue Dec 04 09:32:22 2007 +0000 @@ -45,6 +45,7 @@ guint next_rid; /**< Next request/response ID */ time_t last_comm; /**< Time received last communication */ guint inbox_status; /**< Bit field of inbox notifications */ + guint inbox_handle; /**< The handle for the mail check timer */ } MsimSession; /* Check if an MsimSession is valid */ diff -r 8922d61c738a -r 8c1bcaaaac34 libpurple/protocols/oscar/family_feedbag.c --- a/libpurple/protocols/oscar/family_feedbag.c Tue Dec 04 09:30:25 2007 +0000 +++ b/libpurple/protocols/oscar/family_feedbag.c Tue Dec 04 09:32:22 2007 +0000 @@ -341,13 +341,9 @@ */ struct aim_ssi_item *aim_ssi_itemlist_exists(struct aim_ssi_item *list, const char *sn) { - struct aim_ssi_item *cur; - if (!list || !sn) + if (!sn) return NULL; - for (cur=list; cur; cur=cur->next) - if ((cur->type == AIM_SSI_TYPE_BUDDY) && (cur->name) && (!aim_sncmp(cur->name, sn))) - return cur; - return NULL; + return aim_ssi_itemlist_finditem(list, NULL, sn, AIM_SSI_TYPE_BUDDY); } /** diff -r 8922d61c738a -r 8c1bcaaaac34 pidgin/gtkblist.c --- a/pidgin/gtkblist.c Tue Dec 04 09:30:25 2007 +0000 +++ b/pidgin/gtkblist.c Tue Dec 04 09:32:22 2007 +0000 @@ -3371,6 +3371,34 @@ return g_string_free(str, FALSE); } +static GHashTable *cached_emblems; + +static void _cleanup_cached_emblem(gpointer data, GObject *obj) { + g_hash_table_remove(cached_emblems, data); +} + +static GdkPixbuf * _pidgin_blist_get_cached_emblem(gchar *path) { + GdkPixbuf *pb = g_hash_table_lookup(cached_emblems, path); + + if (pb != NULL) { + /* The caller gets a reference */ + g_object_ref(pb); + g_free(path); + } else { + pb = gdk_pixbuf_new_from_file(path, NULL); + if (pb != NULL) { + /* We don't want to own a ref to the pixbuf, but we need to keep clean up. */ + /* I'm not sure if it would be better to just keep our ref and not let the emblem ever be destroyed */ + g_object_weak_ref(G_OBJECT(pb), _cleanup_cached_emblem, path); + g_hash_table_insert(cached_emblems, path, pb); + } else + g_free(path); + } + + return pb; +} + + GdkPixbuf * pidgin_blist_get_emblem(PurpleBlistNode *node) { @@ -3381,7 +3409,6 @@ PurplePluginProtocolInfo *prpl_info; const char *name = NULL; char *filename, *path; - GdkPixbuf *ret; PurplePresence *p; if(PURPLE_BLIST_NODE_IS_CONTACT(node)) { @@ -3394,11 +3421,9 @@ gtkbuddynode = node->ui_data; p = purple_buddy_get_presence(buddy); if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_MOBILE)) { - path = g_build_filename(DATADIR, "pixmaps", "pidgin", "emblems", + path = g_build_filename(DATADIR, "pixmaps", "pidgin", "emblems", "16", "mobile.png", NULL); - ret = gdk_pixbuf_new_from_file(path, NULL); - g_free(path); - return ret; + return _pidgin_blist_get_cached_emblem(path); } if (((struct _pidgin_blist_node*)(node->parent->ui_data))->contact_expanded) { @@ -3410,26 +3435,22 @@ return NULL; } + g_return_val_if_fail(buddy != NULL, NULL); + if (!purple_privacy_check(buddy->account, purple_buddy_get_name(buddy))) { path = g_build_filename(DATADIR, "pixmaps", "pidgin", "emblems", "16", "blocked.png", NULL); - ret = gdk_pixbuf_new_from_file(path, NULL); - g_free(path); - return ret; + return _pidgin_blist_get_cached_emblem(path); } p = purple_buddy_get_presence(buddy); if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_MOBILE)) { path = g_build_filename(DATADIR, "pixmaps", "pidgin", "emblems", "16", "mobile.png", NULL); - ret = gdk_pixbuf_new_from_file(path, NULL); - g_free(path); - return ret; + return _pidgin_blist_get_cached_emblem(path); } if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_TUNE)) { path = g_build_filename(DATADIR, "pixmaps", "pidgin", "emblems", "16", "music.png", NULL); - ret = gdk_pixbuf_new_from_file(path, NULL); - g_free(path); - return ret; + return _pidgin_blist_get_cached_emblem(path); } prpl = purple_find_prpl(purple_account_get_protocol_id(buddy->account)); @@ -3446,12 +3467,10 @@ filename = g_strdup_printf("%s.png", name); path = g_build_filename(DATADIR, "pixmaps", "pidgin", "emblems", "16", filename, NULL); - ret = gdk_pixbuf_new_from_file(path, NULL); - g_free(filename); - g_free(path); - - return ret; + + /* _pidgin_blist_get_cached_emblem() assumes ownership of path */ + return _pidgin_blist_get_cached_emblem(path); } @@ -5691,7 +5710,6 @@ static char *pidgin_get_group_title(PurpleBlistNode *gnode, gboolean expanded) { PurpleGroup *group; - GdkColor textcolor; gboolean selected; char group_count[12] = ""; char *mark, *esc; @@ -5699,7 +5717,6 @@ GtkTreeIter iter; group = (PurpleGroup*)gnode; - textcolor = gtkblist->treeview->style->fg[GTK_STATE_ACTIVE]; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)), NULL, &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, @@ -5714,12 +5731,7 @@ } esc = g_markup_escape_text(group->name, -1); - if (selected) - mark = g_strdup_printf("%s%s", esc ? esc : "", group_count); - else - mark = g_strdup_printf("%s%s", - textcolor.red>>8, textcolor.green>>8, textcolor.blue>>8, - esc ? esc : "", group_count); + mark = g_strdup_printf("%s%s", esc ? esc : "", group_count); g_free(esc); return mark; @@ -6897,6 +6909,8 @@ { void *gtk_blist_handle = pidgin_blist_get_handle(); + cached_emblems = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + purple_signal_connect(purple_connections_get_handle(), "signed-on", gtk_blist_handle, PURPLE_CALLBACK(account_signon_cb), NULL); @@ -6948,6 +6962,8 @@ void pidgin_blist_uninit(void) { + g_hash_table_destroy(cached_emblems); + purple_signals_unregister_by_instance(pidgin_blist_get_handle()); purple_signals_disconnect_by_handle(pidgin_blist_get_handle()); } diff -r 8922d61c738a -r 8c1bcaaaac34 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Tue Dec 04 09:30:25 2007 +0000 +++ b/pidgin/gtkconv.c Tue Dec 04 09:32:22 2007 +0000 @@ -4349,7 +4349,7 @@ pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(gtkconv->entry)); pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(gtkconv->entry)); - height = (oneline.height + pad_top + pad_bottom) * lines; + height = (oneline.height + pad_top + pad_bottom) * (lines + 1); height += (oneline.height + pad_inside) * (wrapped_lines - lines); gtkconv->auto_resize = TRUE; @@ -7820,7 +7820,7 @@ } styles[] = { {"pidgin_tab_label_typing_default", "tab-label-typing", "#4e9a06"}, {"pidgin_tab_label_typed_default", "tab-label-typed", "#c4a000"}, - {"pidgin_tab_label_attention_default", "tab-label-attention", "#204a87"}, + {"pidgin_tab_label_attention_default", "tab-label-attention", "#006aff"}, {"pidgin_tab_label_unreadchat_default", "tab-label-unreadchat", "#cc0000"}, {"pidgin_tab_label_event_default", "tab-label-event", "#888a85"}, {NULL, NULL, NULL} diff -r 8922d61c738a -r 8c1bcaaaac34 pidgin/gtkutils.c --- a/pidgin/gtkutils.c Tue Dec 04 09:30:25 2007 +0000 +++ b/pidgin/gtkutils.c Tue Dec 04 09:32:22 2007 +0000 @@ -2451,7 +2451,13 @@ g_signal_connect(G_OBJECT(dialog->icon_filesel), "destroy", G_CALLBACK(icon_filesel_delete_cb), dialog); #endif /* FILECHOOSER */ - return dialog->icon_filesel; + +#ifdef _WIN32 + g_signal_connect(G_OBJECT(dialog->icon_filesel), "show", + G_CALLBACK(winpidgin_ensure_onscreen), dialog->icon_filesel); +#endif + + return dialog->icon_filesel; }