# HG changeset patch # User Sadrul Habib Chowdhury # Date 1192159776 0 # Node ID 6bbd66f67fa8bdebaf0bc21279c6cfea61fb9d15 # Parent e98c08afb706bfa082bb6e81436d8dc74fc07d04# Parent c7b20abc38855196cf354e72d17d6b7a4452e158 propagate from branch 'im.pidgin.pidgin' (head fa0e512d79dfe479bc36c2436089b51854ef3eb5) to branch 'im.pidgin.pidgin.next.minor' (head ea579831d8561ac6b0cde4b034383b02b3e51ae5) diff -r e98c08afb706 -r 6bbd66f67fa8 configure.ac --- a/configure.ac Fri Oct 12 02:57:26 2007 +0000 +++ b/configure.ac Fri Oct 12 03:29:36 2007 +0000 @@ -142,13 +142,21 @@ dnl If we don't have msgfmt, then po/ is going to fail -- ensure that dnl AM_GLIB_GNU_GETTEXT found it. -if test x$MSGFMT = xno +if test x$MSGFMT = xno -o x$MSGFMT$GMSGFMT = x then AC_ERROR([ The msgfmt command is required to build libpurple. If it is installed on your system, ensure that it is in your path. If it is not, install GNU gettext to continue. + +If you have msgfmt installed, but for some reason this error message +is still displayed, you have encountered what appears to be a bug in +third-party configure macros. Try setting the MSGFMT environment +variable to the absolute path to your msgfmt binary and trying +configure again, like this: + +MSGFMT=/path/to/msgfmt ./configure ... ]) fi diff -r e98c08afb706 -r 6bbd66f67fa8 libpurple/protocols/bonjour/Makefile.mingw --- a/libpurple/protocols/bonjour/Makefile.mingw Fri Oct 12 02:57:26 2007 +0000 +++ b/libpurple/protocols/bonjour/Makefile.mingw Fri Oct 12 03:29:36 2007 +0000 @@ -36,7 +36,7 @@ -I$(PIDGIN_TREE_TOP) LIB_PATHS += -L$(GTK_TOP)/lib \ - -L$(BONJOUR_TOP)/lib \ + -L$(BONJOUR_TOP)/lib/win32 \ -L$(LIBXML2_TOP)/lib \ -L$(PURPLE_TOP) diff -r e98c08afb706 -r 6bbd66f67fa8 libpurple/protocols/qq/buddy_info.c --- a/libpurple/protocols/qq/buddy_info.c Fri Oct 12 02:57:26 2007 +0000 +++ b/libpurple/protocols/qq/buddy_info.c Fri Oct 12 03:29:36 2007 +0000 @@ -306,12 +306,10 @@ g_free(mid); } -static gchar *parse_field(GList **list, gboolean choice) +static gchar *parse_field(PurpleRequestField *field, gboolean choice) { gchar *value; - PurpleRequestField *field; - field = (PurpleRequestField *) (*list)->data; if (choice) { value = g_strdup_printf("%d", purple_request_field_choice_get_value(field)); } else { @@ -321,7 +319,6 @@ else value = utf8_to_qq(value, QQ_CHARSET_DEFAULT); } - *list = g_list_remove_link(*list, *list); return value; } @@ -331,7 +328,7 @@ { PurpleConnection *gc; qq_data *qd; - GList *list, *groups; + GList *groups; contact_info *info; gc = mid->gc; @@ -341,34 +338,76 @@ info = mid->info; groups = purple_request_fields_get_groups(fields); - list = purple_request_field_group_get_fields(groups->data); - info->uid = parse_field(&list, FALSE); - info->nick = parse_field(&list, FALSE); - info->name = parse_field(&list, FALSE); - info->age = parse_field(&list, FALSE); - info->gender = parse_field(&list, TRUE); - info->country = parse_field(&list, FALSE); - info->province = parse_field(&list, FALSE); - info->city = parse_field(&list, FALSE); - groups = g_list_remove_link(groups, groups); - list = purple_request_field_group_get_fields(groups->data); - info->horoscope = parse_field(&list, TRUE); - info->occupation = parse_field(&list, FALSE); - info->zodiac = parse_field(&list, TRUE); - info->blood = parse_field(&list, TRUE); - info->college = parse_field(&list, FALSE); - info->email = parse_field(&list, FALSE); - info->address = parse_field(&list, FALSE); - info->zipcode = parse_field(&list, FALSE); - info->hp_num = parse_field(&list, FALSE); - info->tel = parse_field(&list, FALSE); - info->homepage = parse_field(&list, FALSE); - groups = g_list_remove_link(groups, groups); - list = purple_request_field_group_get_fields(groups->data); - info->intro = parse_field(&list, FALSE); + while (groups != NULL) { + PurpleRequestFieldGroup *group = groups->data; + const char *g_name = purple_request_field_group_get_title(group); + GList *fields = purple_request_field_group_get_fields(group); + + if (g_name == NULL) + continue; + + while (fields != NULL) { + PurpleRequestField *field = fields->data; + const char *f_id = purple_request_field_get_id(field); + + if (!strcmp(QQ_PRIMARY_INFORMATION, g_name)) { + + if (!strcmp(f_id, "uid")) + info->uid = parse_field(field, FALSE); + else if (!strcmp(f_id, "nick")) + info->nick = parse_field(field, FALSE); + else if (!strcmp(f_id, "name")) + info->name = parse_field(field, FALSE); + else if (!strcmp(f_id, "age")) + info->age = parse_field(field, FALSE); + else if (!strcmp(f_id, "gender")) + info->gender = parse_field(field, TRUE); + else if (!strcmp(f_id, "country")) + info->country = parse_field(field, FALSE); + else if (!strcmp(f_id, "province")) + info->province = parse_field(field, FALSE); + else if (!strcmp(f_id, "city")) + info->city = parse_field(field, FALSE); + + } else if (!strcmp(QQ_ADDITIONAL_INFORMATION, g_name)) { - g_list_free(groups); + if (!strcmp(f_id, "horoscope")) + info->horoscope = parse_field(field, TRUE); + else if (!strcmp(f_id, "occupation")) + info->occupation = parse_field(field, FALSE); + else if (!strcmp(f_id, "zodiac")) + info->zodiac = parse_field(field, TRUE); + else if (!strcmp(f_id, "blood")) + info->blood = parse_field(field, TRUE); + else if (!strcmp(f_id, "college")) + info->college = parse_field(field, FALSE); + else if (!strcmp(f_id, "email")) + info->email = parse_field(field, FALSE); + else if (!strcmp(f_id, "address")) + info->address = parse_field(field, FALSE); + else if (!strcmp(f_id, "zipcode")) + info->zipcode = parse_field(field, FALSE); + else if (!strcmp(f_id, "hp_num")) + info->hp_num = parse_field(field, FALSE); + else if (!strcmp(f_id, "tel")) + info->tel = parse_field(field, FALSE); + else if (!strcmp(f_id, "homepage")) + info->homepage = parse_field(field, FALSE); + } else if (!strcmp(QQ_INTRO, g_name)) { + + if (!strcmp(f_id, "intro")) + info->intro = parse_field(field, FALSE); + + } + + fields = fields->next; + } + + groups = groups->next; + } + + /* This casting looks like a horrible idea to me -DAA */ qq_send_packet_modify_info(gc, (gchar **) info); g_strfreev((gchar **) mid->info); @@ -438,6 +477,7 @@ add_string_field_to_group(group, "country", QQ_COUNTRY, info->country); add_string_field_to_group(group, "province", QQ_PROVINCE, info->province); add_string_field_to_group(group, "city", QQ_CITY, info->city); + group = setup_field_group(fields, QQ_ADDITIONAL_INFORMATION); add_choice_field_to_group(group, "horoscope", QQ_HOROSCOPE, info->horoscope, horoscope_names, QQ_HOROSCOPE_SIZE); add_string_field_to_group(group, "occupation", QQ_OCCUPATION, info->occupation); diff -r e98c08afb706 -r 6bbd66f67fa8 pidgin/gtkblist.c --- a/pidgin/gtkblist.c Fri Oct 12 02:57:26 2007 +0000 +++ b/pidgin/gtkblist.c Fri Oct 12 03:29:36 2007 +0000 @@ -5300,7 +5300,7 @@ static void buddy_node(PurpleBuddy *buddy, GtkTreeIter *iter, PurpleBlistNode *node) { PurplePresence *presence; - GdkPixbuf *status, *avatar, *emblem; + GdkPixbuf *status, *avatar, *emblem, *prpl_icon; char *mark; char *idle = NULL; gboolean expanded = ((struct _pidgin_blist_node *)(node->parent->ui_data))->contact_expanded; @@ -5310,7 +5310,7 @@ if (editing_blist) return; - + status = pidgin_blist_get_status_icon((PurpleBlistNode*)buddy, PIDGIN_STATUS_ICON_SMALL); @@ -5357,6 +5357,8 @@ } } + prpl_icon = pidgin_create_prpl_icon(buddy->account, PIDGIN_PRPL_ICON_SMALL); + gtk_tree_store_set(gtkblist->treemodel, iter, STATUS_ICON_COLUMN, status, STATUS_ICON_VISIBLE_COLUMN, TRUE, @@ -5367,7 +5369,7 @@ BUDDY_ICON_VISIBLE_COLUMN, biglist, EMBLEM_COLUMN, emblem, EMBLEM_VISIBLE_COLUMN, (emblem != NULL), - PROTOCOL_ICON_COLUMN, pidgin_create_prpl_icon(buddy->account, PIDGIN_PRPL_ICON_SMALL), + PROTOCOL_ICON_COLUMN, prpl_icon, PROTOCOL_ICON_VISIBLE_COLUMN, purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_protocol_icons"), BGCOLOR_COLUMN, NULL, CONTACT_EXPANDER_COLUMN, NULL, @@ -5383,6 +5385,8 @@ g_object_unref(status); if(avatar) g_object_unref(avatar); + if(prpl_icon) + g_object_unref(prpl_icon); } /* This is a variation on the original gtk_blist_update_contact. Here we @@ -5503,9 +5507,7 @@ if(purple_account_is_connected(chat->account)) { GtkTreeIter iter; - GdkPixbuf *status; - GdkPixbuf *avatar; - GdkPixbuf *emblem; + GdkPixbuf *status, *avatar, *emblem, *prpl_icon; char *mark; gboolean showicons = purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_buddy_icons"); PidginBlistNode *ui; @@ -5536,6 +5538,8 @@ mark = bold; } + prpl_icon = pidgin_create_prpl_icon(chat->account, PIDGIN_PRPL_ICON_SMALL); + gtk_tree_store_set(gtkblist->treemodel, &iter, STATUS_ICON_COLUMN, status, STATUS_ICON_VISIBLE_COLUMN, TRUE, @@ -5543,7 +5547,7 @@ BUDDY_ICON_VISIBLE_COLUMN, purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_buddy_icons"), EMBLEM_COLUMN, emblem, EMBLEM_VISIBLE_COLUMN, emblem != NULL, - PROTOCOL_ICON_COLUMN, pidgin_create_prpl_icon(chat->account, PIDGIN_PRPL_ICON_SMALL), + PROTOCOL_ICON_COLUMN, prpl_icon, PROTOCOL_ICON_VISIBLE_COLUMN, purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_protocol_icons"), NAME_COLUMN, mark, GROUP_EXPANDER_VISIBLE_COLUMN, FALSE, @@ -5556,6 +5560,8 @@ g_object_unref(status); if(avatar) g_object_unref(avatar); + if(prpl_icon) + g_object_unref(prpl_icon); } else { pidgin_blist_hide_node(list, node, TRUE); } diff -r e98c08afb706 -r 6bbd66f67fa8 pidgin/gtkdocklet.c --- a/pidgin/gtkdocklet.c Fri Oct 12 02:57:26 2007 +0000 +++ b/pidgin/gtkdocklet.c Fri Oct 12 03:29:36 2007 +0000 @@ -473,6 +473,87 @@ return menuitem; } + +static void +plugin_act(GtkObject *obj, PurplePluginAction *pam) +{ + if (pam && pam->callback) + pam->callback(pam); +} + +static void +build_plugin_actions(GtkWidget *menu, PurplePlugin *plugin, + gpointer context) +{ + GtkWidget *menuitem; + PurplePluginAction *action = NULL; + GList *actions, *l; + + actions = PURPLE_PLUGIN_ACTIONS(plugin, context); + + for (l = actions; l != NULL; l = l->next) + { + if (l->data) + { + action = (PurplePluginAction *) l->data; + action->plugin = plugin; + action->context = context; + + menuitem = gtk_menu_item_new_with_label(action->label); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + + g_signal_connect(G_OBJECT(menuitem), "activate", + G_CALLBACK(plugin_act), action); + g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", + action, + (GDestroyNotify)purple_plugin_action_free); + gtk_widget_show(menuitem); + } + else + pidgin_separator(menu); + } + + g_list_free(actions); +} + + +static void +docklet_plugin_actions(GtkWidget *menu) +{ + GtkWidget *menuitem, *submenu; + PurplePlugin *plugin = NULL; + GList *l; + int c = 0; + + g_return_if_fail(menu != NULL); + + /* Add a submenu for each plugin with custom actions */ + for (l = purple_plugins_get_loaded(); l; l = l->next) { + plugin = (PurplePlugin *) l->data; + + if (PURPLE_IS_PROTOCOL_PLUGIN(plugin)) + continue; + + if (!PURPLE_PLUGIN_HAS_ACTIONS(plugin)) + continue; + + menuitem = gtk_image_menu_item_new_with_label(_(plugin->info->name)); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + gtk_widget_show(menuitem); + + submenu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); + gtk_widget_show(submenu); + + build_plugin_actions(submenu, plugin, NULL); + + c++; + } + if(c>0) + pidgin_separator(menu); +} + + static void docklet_menu() { static GtkWidget *menu = NULL; @@ -539,6 +620,9 @@ pidgin_separator(menu); + /* add plugin actions */ + docklet_plugin_actions(menu); + pidgin_new_item_from_stock(menu, _("Quit"), GTK_STOCK_QUIT, G_CALLBACK(purple_core_quit), NULL, 0, 0, NULL); #ifdef _WIN32 diff -r e98c08afb706 -r 6bbd66f67fa8 pidgin/gtklog.c --- a/pidgin/gtklog.c Fri Oct 12 02:57:26 2007 +0000 +++ b/pidgin/gtklog.c Fri Oct 12 03:29:36 2007 +0000 @@ -680,6 +680,7 @@ PidginLogViewer *lv = NULL; const char *name = screenname; char *title; + GdkPixbuf *prpl_icon; g_return_if_fail(account != NULL); g_return_if_fail(screenname != NULL); @@ -717,9 +718,14 @@ title = g_strdup_printf(_("Conversations with %s"), name); } + prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM); + display_log_viewer(ht, purple_log_get_logs(type, screenname, account), - title, gtk_image_new_from_pixbuf(pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM)), + title, gtk_image_new_from_pixbuf(prpl_icon), purple_log_get_total_size(type, screenname, account)); + + if (prpl_icon) + g_object_unref(prpl_icon); g_free(title); }