| 639 editing_blist = FALSE; |
639 editing_blist = FALSE; |
| 640 g_object_set(G_OBJECT(renderer), "editable", FALSE, NULL); |
640 g_object_set(G_OBJECT(renderer), "editable", FALSE, NULL); |
| 641 pidgin_blist_refresh(list); |
641 pidgin_blist_refresh(list); |
| 642 } |
642 } |
| 643 |
643 |
| 644 static void gtk_blist_renderer_editing_started_cb(GtkCellRenderer *renderer, |
644 static void |
| 645 GtkCellEditable *editable, |
645 gtk_blist_renderer_editing_started_cb(G_GNUC_UNUSED GtkCellRenderer *renderer, |
| 646 gchar *path_str, |
646 GtkCellEditable *editable, |
| 647 gpointer user_data) |
647 gchar *path_str, gpointer user_data) |
| 648 { |
648 { |
| 649 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(user_data); |
649 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(user_data); |
| 650 GtkTreeIter iter; |
650 GtkTreeIter iter; |
| 651 GtkTreePath *path = NULL; |
651 GtkTreePath *path = NULL; |
| 652 PurpleBlistNode *node; |
652 PurpleBlistNode *node; |
| 783 g_free(msg); |
783 g_free(msg); |
| 784 } else |
784 } else |
| 785 g_list_free(merges); |
785 g_list_free(merges); |
| 786 } |
786 } |
| 787 |
787 |
| 788 static void gtk_blist_renderer_edited_cb(GtkCellRendererText *text_rend, char *arg1, |
788 static void |
| 789 char *arg2, PurpleBuddyList *list) |
789 gtk_blist_renderer_edited_cb(G_GNUC_UNUSED GtkCellRendererText *text_rend, |
| |
790 char *arg1, char *arg2, PurpleBuddyList *list) |
| 790 { |
791 { |
| 791 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(list); |
792 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(list); |
| 792 GtkTreeIter iter; |
793 GtkTreeIter iter; |
| 793 GtkTreePath *path; |
794 GtkTreePath *path; |
| 794 PurpleBlistNode *node; |
795 PurpleBlistNode *node; |
| 902 /* |
903 /* |
| 903 * Check the values of all the text entry boxes. If any required input |
904 * Check the values of all the text entry boxes. If any required input |
| 904 * strings are empty then don't allow the user to click on "OK." |
905 * strings are empty then don't allow the user to click on "OK." |
| 905 */ |
906 */ |
| 906 static void |
907 static void |
| 907 set_sensitive_if_input_chat_cb(GtkWidget *entry, gpointer user_data) |
908 set_sensitive_if_input_chat_cb(G_GNUC_UNUSED GtkWidget *entry, |
| |
909 gpointer user_data) |
| 908 { |
910 { |
| 909 PurpleProtocol *protocol; |
911 PurpleProtocol *protocol; |
| 910 PurpleConnection *gc; |
912 PurpleConnection *gc; |
| 911 PidginChatData *data; |
913 PidginChatData *data; |
| 912 GList *tmp; |
914 GList *tmp; |
| 982 return FALSE; |
984 return FALSE; |
| 983 } |
985 } |
| 984 |
986 |
| 985 static void |
987 static void |
| 986 make_blist_request_dialog(PidginBlistRequestData *data, PurpleAccount *account, |
988 make_blist_request_dialog(PidginBlistRequestData *data, PurpleAccount *account, |
| 987 const char *title, const char *window_role, const char *label_text, |
989 const char *title, const char *label_text, |
| 988 GCallback callback_func, GtkCustomFilterFunc filter_func, |
990 GCallback callback_func, |
| 989 GCallback response_cb) |
991 GtkCustomFilterFunc filter_func, |
| |
992 GCallback response_cb) |
| 990 { |
993 { |
| 991 GtkWidget *label; |
994 GtkWidget *label; |
| 992 GtkWidget *img; |
995 GtkWidget *img; |
| 993 GtkWidget *content_area; |
996 GtkWidget *content_area; |
| 994 GtkWidget *hbox; |
997 GtkWidget *hbox; |
| 1181 PidginAccountChooser *chooser = NULL; |
1184 PidginAccountChooser *chooser = NULL; |
| 1182 |
1185 |
| 1183 data = g_new0(PidginChatData, 1); |
1186 data = g_new0(PidginChatData, 1); |
| 1184 |
1187 |
| 1185 make_blist_request_dialog((PidginBlistRequestData *)data, NULL, |
1188 make_blist_request_dialog((PidginBlistRequestData *)data, NULL, |
| 1186 _("Join a Chat"), "join_chat", |
1189 _("Join a Chat"), |
| 1187 _("Please enter the appropriate information about the chat " |
1190 _("Please enter the appropriate information about the chat " |
| 1188 "you would like to join.\n"), |
1191 "you would like to join.\n"), |
| 1189 G_CALLBACK(chat_select_account_cb), |
1192 G_CALLBACK(chat_select_account_cb), |
| 1190 chat_account_filter_func, (GCallback)do_joinchat); |
1193 chat_account_filter_func, (GCallback)do_joinchat); |
| 1191 gtk_dialog_add_buttons(GTK_DIALOG(data->rq_data.window), |
1194 gtk_dialog_add_buttons(GTK_DIALOG(data->rq_data.window), |
| 1202 rebuild_chat_entries(data, NULL); |
1205 rebuild_chat_entries(data, NULL); |
| 1203 |
1206 |
| 1204 gtk_widget_show(data->rq_data.window); |
1207 gtk_widget_show(data->rq_data.window); |
| 1205 } |
1208 } |
| 1206 |
1209 |
| 1207 static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) |
1210 static void |
| |
1211 gtk_blist_row_expanded_cb(G_GNUC_UNUSED GtkTreeView *tv, GtkTreeIter *iter, |
| |
1212 G_GNUC_UNUSED GtkTreePath *path, gpointer user_data) |
| 1208 { |
1213 { |
| 1209 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(user_data); |
1214 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(user_data); |
| 1210 PurpleBlistNode *node; |
1215 PurpleBlistNode *node; |
| 1211 |
1216 |
| 1212 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &node, -1); |
1217 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &node, -1); |
| 1225 purple_blist_node_set_bool(node, "collapsed", FALSE); |
1230 purple_blist_node_set_bool(node, "collapsed", FALSE); |
| 1226 gtk_widget_trigger_tooltip_query(gtkblist->treeview); |
1231 gtk_widget_trigger_tooltip_query(gtkblist->treeview); |
| 1227 } |
1232 } |
| 1228 } |
1233 } |
| 1229 |
1234 |
| 1230 static void gtk_blist_row_collapsed_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) |
1235 static void |
| |
1236 gtk_blist_row_collapsed_cb(G_GNUC_UNUSED GtkTreeView *tv, GtkTreeIter *iter, |
| |
1237 G_GNUC_UNUSED GtkTreePath *path, gpointer user_data) |
| 1231 { |
1238 { |
| 1232 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(user_data); |
1239 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(user_data); |
| 1233 PurpleBlistNode *node; |
1240 PurpleBlistNode *node; |
| 1234 |
1241 |
| 1235 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &node, -1); |
1242 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &node, -1); |
| 1262 } else if(PURPLE_IS_META_CONTACT(node)) { |
1269 } else if(PURPLE_IS_META_CONTACT(node)) { |
| 1263 pidgin_blist_collapse_contact_cb(NULL, node); |
1270 pidgin_blist_collapse_contact_cb(NULL, node); |
| 1264 } |
1271 } |
| 1265 } |
1272 } |
| 1266 |
1273 |
| 1267 static void gtk_blist_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { |
1274 static void |
| |
1275 gtk_blist_row_activated_cb(G_GNUC_UNUSED GtkTreeView *tv, GtkTreePath *path, |
| |
1276 G_GNUC_UNUSED GtkTreeViewColumn *col, gpointer data) |
| |
1277 { |
| 1268 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(data); |
1278 PidginBuddyList *gtkblist = PIDGIN_BUDDY_LIST(data); |
| 1269 PurpleBlistNode *node; |
1279 PurpleBlistNode *node; |
| 1270 GtkTreeIter iter; |
1280 GtkTreeIter iter; |
| 1271 |
1281 |
| 1272 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); |
1282 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); |
| 1309 |
1319 |
| 1310 return FALSE; |
1320 return FALSE; |
| 1311 } |
1321 } |
| 1312 |
1322 |
| 1313 static void |
1323 static void |
| 1314 pidgin_blist_expand_contact_cb(GtkWidget *w, PurpleBlistNode *node) |
1324 pidgin_blist_expand_contact_cb(G_GNUC_UNUSED GtkWidget *w, |
| |
1325 PurpleBlistNode *node) |
| 1315 { |
1326 { |
| 1316 PidginBlistNode *gtknode; |
1327 PidginBlistNode *gtknode; |
| 1317 GtkTreeIter iter, parent; |
1328 GtkTreeIter iter, parent; |
| 1318 PurpleBlistNode *bnode; |
1329 PurpleBlistNode *bnode; |
| 1319 GtkTreePath *path; |
1330 GtkTreePath *path; |
| 1345 g_idle_add(scroll_to_expanded_cell, ex); |
1356 g_idle_add(scroll_to_expanded_cell, ex); |
| 1346 } |
1357 } |
| 1347 } |
1358 } |
| 1348 |
1359 |
| 1349 static void |
1360 static void |
| 1350 pidgin_blist_collapse_contact_cb(GtkWidget *w, PurpleBlistNode *node) |
1361 pidgin_blist_collapse_contact_cb(G_GNUC_UNUSED GtkWidget *w, |
| |
1362 PurpleBlistNode *node) |
| 1351 { |
1363 { |
| 1352 PurpleBlistNode *bnode; |
1364 PurpleBlistNode *bnode; |
| 1353 PidginBlistNode *gtknode; |
1365 PidginBlistNode *gtknode; |
| 1354 |
1366 |
| 1355 if(!PURPLE_IS_META_CONTACT(node)) |
1367 if(!PURPLE_IS_META_CONTACT(node)) |
| 2474 return g_string_free(str, FALSE); |
2486 return g_string_free(str, FALSE); |
| 2475 } |
2487 } |
| 2476 |
2488 |
| 2477 static GHashTable *cached_emblems; |
2489 static GHashTable *cached_emblems; |
| 2478 |
2490 |
| 2479 static void _cleanup_cached_emblem(gpointer data, GObject *obj) { |
2491 static void |
| |
2492 _cleanup_cached_emblem(gpointer data, G_GNUC_UNUSED GObject *obj) { |
| 2480 g_hash_table_remove(cached_emblems, data); |
2493 g_hash_table_remove(cached_emblems, data); |
| 2481 } |
2494 } |
| 2482 |
2495 |
| 2483 static GdkPixbuf * _pidgin_blist_get_cached_emblem(gchar *path) { |
2496 static GdkPixbuf * _pidgin_blist_get_cached_emblem(gchar *path) { |
| 2484 GdkPixbuf *pb = g_hash_table_lookup(cached_emblems, path); |
2497 GdkPixbuf *pb = g_hash_table_lookup(cached_emblems, path); |
| 2776 gtknode->row = NULL; |
2789 gtknode->row = NULL; |
| 2777 } |
2790 } |
| 2778 |
2791 |
| 2779 static void |
2792 static void |
| 2780 conversation_updated_cb(PurpleConversation *conv, PurpleConversationUpdateType type, |
2793 conversation_updated_cb(PurpleConversation *conv, PurpleConversationUpdateType type, |
| 2781 PidginBuddyList *gtkblist) |
2794 G_GNUC_UNUSED PidginBuddyList *gtkblist) |
| 2782 { |
2795 { |
| 2783 PurpleAccount *account = purple_conversation_get_account(conv); |
2796 PurpleAccount *account = purple_conversation_get_account(conv); |
| 2784 |
2797 |
| 2785 if (type != PURPLE_CONVERSATION_UPDATE_UNSEEN) |
2798 if (type != PURPLE_CONVERSATION_UPDATE_UNSEEN) |
| 2786 return; |
2799 return; |
| 2805 return; |
2818 return; |
| 2806 ui->conv = NULL; |
2819 ui->conv = NULL; |
| 2807 } |
2820 } |
| 2808 |
2821 |
| 2809 static void |
2822 static void |
| 2810 conversation_created_cb(PurpleConversation *conv, PidginBuddyList *gtkblist) |
2823 conversation_created_cb(PurpleConversation *conv, |
| |
2824 G_GNUC_UNUSED PidginBuddyList *gtkblist) |
| 2811 { |
2825 { |
| 2812 PurpleAccount *account = purple_conversation_get_account(conv); |
2826 PurpleAccount *account = purple_conversation_get_account(conv); |
| 2813 |
2827 |
| 2814 if (PURPLE_IS_IM_CONVERSATION(conv)) { |
2828 if (PURPLE_IS_IM_CONVERSATION(conv)) { |
| 2815 GSList *buddies = purple_blist_find_buddies(account, purple_conversation_get_name(conv)); |
2829 GSList *buddies = purple_blist_find_buddies(account, purple_conversation_get_name(conv)); |
| 2852 |
2866 |
| 2853 g_free(node); |
2867 g_free(node); |
| 2854 } |
2868 } |
| 2855 |
2869 |
| 2856 static void |
2870 static void |
| 2857 pidgin_blist_new_node(PurpleBuddyList *list, PurpleBlistNode *node) { |
2871 pidgin_blist_new_node(G_GNUC_UNUSED PurpleBuddyList *list, |
| |
2872 PurpleBlistNode *node) |
| |
2873 { |
| 2858 PidginBlistNode *pidgin_node = NULL; |
2874 PidginBlistNode *pidgin_node = NULL; |
| 2859 |
2875 |
| 2860 pidgin_node = g_new0(PidginBlistNode, 1); |
2876 pidgin_node = g_new0(PidginBlistNode, 1); |
| 2861 |
2877 |
| 2862 g_object_set_data_full(G_OBJECT(node), UI_DATA, pidgin_node, |
2878 g_object_set_data_full(G_OBJECT(node), UI_DATA, pidgin_node, |
| 2895 id = "alphabetical"; |
2911 id = "alphabetical"; |
| 2896 } |
2912 } |
| 2897 pidgin_blist_sort_method_set(id); |
2913 pidgin_blist_sort_method_set(id); |
| 2898 } |
2914 } |
| 2899 |
2915 |
| 2900 static void _prefs_change_sort_method(const char *pref_name, PurplePrefType type, |
2916 static void |
| 2901 gconstpointer val, gpointer data) |
2917 _prefs_change_sort_method(const char *pref_name, |
| |
2918 G_GNUC_UNUSED PurplePrefType type, gconstpointer val, |
| |
2919 G_GNUC_UNUSED gpointer data) |
| 2902 { |
2920 { |
| 2903 if(purple_strequal(pref_name, PIDGIN_PREFS_ROOT "/blist/sort_type")) |
2921 if(purple_strequal(pref_name, PIDGIN_PREFS_ROOT "/blist/sort_type")) |
| 2904 pidgin_blist_sort_method_set(val); |
2922 pidgin_blist_sort_method_set(val); |
| 2905 } |
2923 } |
| 2906 |
2924 |
| 3283 } |
3301 } |
| 3284 |
3302 |
| 3285 return FALSE; |
3303 return FALSE; |
| 3286 } |
3304 } |
| 3287 |
3305 |
| 3288 static void pidgin_blist_selection_changed(GtkTreeSelection *selection, gpointer data) |
3306 static void |
| |
3307 pidgin_blist_selection_changed(GtkTreeSelection *selection, |
| |
3308 G_GNUC_UNUSED gpointer data) |
| 3289 { |
3309 { |
| 3290 PurpleBlistNode *new_selection = NULL; |
3310 PurpleBlistNode *new_selection = NULL; |
| 3291 GtkTreeIter iter; |
3311 GtkTreeIter iter; |
| 3292 |
3312 |
| 3293 if(gtk_tree_selection_get_selected(selection, NULL, &iter)){ |
3313 if(gtk_tree_selection_get_selected(selection, NULL, &iter)){ |
| 3704 /* gtk_window_iconify(GTK_WINDOW(gtkblist->window)); */ |
3727 /* gtk_window_iconify(GTK_WINDOW(gtkblist->window)); */ |
| 3705 } |
3728 } |
| 3706 } |
3729 } |
| 3707 |
3730 |
| 3708 static void |
3731 static void |
| 3709 pidgin_blist_request_add_buddy(PurpleBuddyList *list, PurpleAccount *account, |
3732 pidgin_blist_request_add_buddy(G_GNUC_UNUSED PurpleBuddyList *list, |
| 3710 const char *username, const char *group, |
3733 PurpleAccount *account, const char *username, |
| 3711 const char *alias) |
3734 const char *group, const char *alias) |
| 3712 { |
3735 { |
| 3713 GtkWidget *dialog = NULL; |
3736 GtkWidget *dialog = NULL; |
| 3714 |
3737 |
| 3715 dialog = pidgin_add_buddy_dialog_new(account, username, alias, NULL, group); |
3738 dialog = pidgin_add_buddy_dialog_new(account, username, alias, NULL, group); |
| 3716 |
3739 |
| 3717 gtk_widget_show(dialog); |
3740 gtk_widget_show(dialog); |
| 3718 } |
3741 } |
| 3719 |
3742 |
| 3720 static void |
3743 static void |
| 3721 pidgin_blist_request_add_chat(PurpleBuddyList *list, PurpleAccount *account, |
3744 pidgin_blist_request_add_chat(G_GNUC_UNUSED PurpleBuddyList *list, |
| 3722 PurpleGroup *group, const char *alias, |
3745 PurpleAccount *account, PurpleGroup *group, |
| 3723 const char *name) |
3746 const char *alias, const char *name) |
| 3724 { |
3747 { |
| 3725 GtkWidget *dialog = NULL; |
3748 GtkWidget *dialog = NULL; |
| 3726 |
3749 |
| 3727 dialog = pidgin_add_chat_dialog_new(account, group, alias, name); |
3750 dialog = pidgin_add_chat_dialog_new(account, group, alias, name); |
| 3728 |
3751 |
| 3729 gtk_widget_show(dialog); |
3752 gtk_widget_show(dialog); |
| 3730 } |
3753 } |
| 3731 |
3754 |
| 3732 static void |
3755 static void |
| 3733 add_group_cb(PurpleConnection *gc, const char *group_name) |
3756 add_group_cb(G_GNUC_UNUSED PurpleConnection *connection, |
| |
3757 const char *group_name) |
| 3734 { |
3758 { |
| 3735 PurpleGroup *group; |
3759 PurpleGroup *group; |
| 3736 |
3760 |
| 3737 if ((group_name == NULL) || (*group_name == '\0')) |
3761 if ((group_name == NULL) || (*group_name == '\0')) |
| 3738 return; |
3762 return; |
| 3740 group = purple_group_new(group_name); |
3764 group = purple_group_new(group_name); |
| 3741 purple_blist_add_group(group, NULL); |
3765 purple_blist_add_group(group, NULL); |
| 3742 } |
3766 } |
| 3743 |
3767 |
| 3744 static void |
3768 static void |
| 3745 pidgin_blist_request_add_group(PurpleBuddyList *list) |
3769 pidgin_blist_request_add_group(G_GNUC_UNUSED PurpleBuddyList *list) |
| 3746 { |
3770 { |
| 3747 purple_request_input(NULL, _("Add Group"), NULL, |
3771 purple_request_input(NULL, _("Add Group"), NULL, |
| 3748 _("Please enter the name of the group to be added."), |
3772 _("Please enter the name of the group to be added."), |
| 3749 NULL, FALSE, FALSE, NULL, |
3773 NULL, FALSE, FALSE, NULL, |
| 3750 _("Add"), G_CALLBACK(add_group_cb), |
3774 _("Add"), G_CALLBACK(add_group_cb), |
| 3756 pidgin_blist_get_default_gtk_blist(void) |
3780 pidgin_blist_get_default_gtk_blist(void) |
| 3757 { |
3781 { |
| 3758 return gtkblist; |
3782 return gtkblist; |
| 3759 } |
3783 } |
| 3760 |
3784 |
| 3761 static gboolean autojoin_cb(PurpleConnection *gc, gpointer data) |
3785 static gboolean |
| |
3786 autojoin_cb(PurpleConnection *gc, G_GNUC_UNUSED gpointer data) |
| 3762 { |
3787 { |
| 3763 PurpleAccount *account = purple_connection_get_account(gc); |
3788 PurpleAccount *account = purple_connection_get_account(gc); |
| 3764 PurpleBlistNode *gnode, *cnode; |
3789 PurpleBlistNode *gnode, *cnode; |
| 3765 for (gnode = purple_blist_get_default_root(); gnode; |
3790 for (gnode = purple_blist_get_default_root(); gnode; |
| 3766 gnode = gnode->next) { |
3791 gnode = gnode->next) { |
| 3886 |
3911 |
| 3887 /************************************************************************** |
3912 /************************************************************************** |
| 3888 * GTK Buddy list GObject code |
3913 * GTK Buddy list GObject code |
| 3889 **************************************************************************/ |
3914 **************************************************************************/ |
| 3890 static void |
3915 static void |
| 3891 pidgin_buddy_list_init(PidginBuddyList *self) |
3916 pidgin_buddy_list_init(G_GNUC_UNUSED PidginBuddyList *self) |
| 3892 { |
3917 { |
| 3893 } |
3918 } |
| 3894 |
3919 |
| 3895 static void |
3920 static void |
| 3896 pidgin_buddy_list_finalize(GObject *obj) |
3921 pidgin_buddy_list_finalize(GObject *obj) |
| 3998 |
4023 |
| 3999 /****************************************** |
4024 /****************************************** |
| 4000 ** Sort Methods |
4025 ** Sort Methods |
| 4001 ******************************************/ |
4026 ******************************************/ |
| 4002 |
4027 |
| 4003 static void sort_method_none(PurpleBlistNode *node, PurpleBuddyList *blist, GtkTreeIter parent_iter, GtkTreeIter *cur, GtkTreeIter *iter) |
4028 static void |
| |
4029 sort_method_none(PurpleBlistNode *node, G_GNUC_UNUSED PurpleBuddyList *blist, |
| |
4030 GtkTreeIter parent_iter, GtkTreeIter *cur, GtkTreeIter *iter) |
| 4004 { |
4031 { |
| 4005 PurpleBlistNode *sibling = node->prev; |
4032 PurpleBlistNode *sibling = node->prev; |
| 4006 GtkTreeIter sibling_iter; |
4033 GtkTreeIter sibling_iter; |
| 4007 |
4034 |
| 4008 if (cur != NULL) { |
4035 if (cur != NULL) { |