| 106 |
106 |
| 107 static GtkWidget *accountmenu = NULL; |
107 static GtkWidget *accountmenu = NULL; |
| 108 |
108 |
| 109 static guint visibility_manager_count = 0; |
109 static guint visibility_manager_count = 0; |
| 110 static gboolean gtk_blist_obscured = FALSE; |
110 static gboolean gtk_blist_obscured = FALSE; |
| |
111 static gboolean editing_blist = FALSE; |
| 111 |
112 |
| 112 static GList *pidgin_blist_sort_methods = NULL; |
113 static GList *pidgin_blist_sort_methods = NULL; |
| 113 static struct pidgin_blist_sort_method *current_sort_method = NULL; |
114 static struct pidgin_blist_sort_method *current_sort_method = NULL; |
| 114 static void sort_method_none(PurpleBlistNode *node, PurpleBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter); |
115 static void sort_method_none(PurpleBlistNode *node, PurpleBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter); |
| 115 |
116 |
| 308 static void gtk_blist_menu_join_cb(GtkWidget *w, PurpleChat *chat) |
309 static void gtk_blist_menu_join_cb(GtkWidget *w, PurpleChat *chat) |
| 309 { |
310 { |
| 310 gtk_blist_join_chat(chat); |
311 gtk_blist_join_chat(chat); |
| 311 } |
312 } |
| 312 |
313 |
| |
314 static void gtk_blist_renderer_editing_cancelled_cb(GtkCellRenderer *renderer, PurpleBuddyList *list) |
| |
315 { |
| |
316 editing_blist = FALSE; |
| |
317 pidgin_blist_refresh(list); |
| |
318 } |
| |
319 |
| 313 static void gtk_blist_renderer_editing_started_cb(GtkCellRenderer *renderer, |
320 static void gtk_blist_renderer_editing_started_cb(GtkCellRenderer *renderer, |
| 314 GtkCellEditable *editable, |
321 GtkCellEditable *editable, |
| 315 gchar *path_str, |
322 gchar *path_str, |
| 316 gpointer user_data) |
323 gpointer user_data) |
| 317 { |
324 { |
| 344 |
351 |
| 345 if (GTK_IS_ENTRY (editable)) { |
352 if (GTK_IS_ENTRY (editable)) { |
| 346 GtkEntry *entry = GTK_ENTRY (editable); |
353 GtkEntry *entry = GTK_ENTRY (editable); |
| 347 gtk_entry_set_text(entry, text); |
354 gtk_entry_set_text(entry, text); |
| 348 } |
355 } |
| |
356 editing_blist = TRUE; |
| 349 } |
357 } |
| 350 |
358 |
| 351 static void gtk_blist_renderer_edited_cb(GtkCellRendererText *text_rend, char *arg1, |
359 static void gtk_blist_renderer_edited_cb(GtkCellRendererText *text_rend, char *arg1, |
| 352 char *arg2, gpointer nada) |
360 char *arg2, PurpleBuddyList *list) |
| 353 { |
361 { |
| 354 GtkTreeIter iter; |
362 GtkTreeIter iter; |
| 355 GtkTreePath *path; |
363 GtkTreePath *path; |
| 356 GValue val; |
364 GValue val; |
| 357 PurpleBlistNode *node; |
365 PurpleBlistNode *node; |
| 358 PurpleGroup *dest; |
366 PurpleGroup *dest; |
| 359 |
367 |
| |
368 editing_blist = FALSE; |
| 360 path = gtk_tree_path_new_from_string (arg1); |
369 path = gtk_tree_path_new_from_string (arg1); |
| 361 gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); |
370 gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); |
| 362 gtk_tree_path_free (path); |
371 gtk_tree_path_free (path); |
| 363 val.g_type = 0; |
372 val.g_type = 0; |
| 364 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
373 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
| 2863 { N_("/Tools/R_oom List"), NULL, pidgin_roomlist_dialog_show, 0, "<Item>", NULL }, |
2878 { N_("/Tools/R_oom List"), NULL, pidgin_roomlist_dialog_show, 0, "<Item>", NULL }, |
| 2864 { N_("/Tools/System _Log"), NULL, gtk_blist_show_systemlog_cb, 0, "<Item>", NULL }, |
2879 { N_("/Tools/System _Log"), NULL, gtk_blist_show_systemlog_cb, 0, "<Item>", NULL }, |
| 2865 { N_("/Tools/_Debug Window"), NULL, toggle_debug, 0, "<Item>", NULL }, |
2880 { N_("/Tools/_Debug Window"), NULL, toggle_debug, 0, "<Item>", NULL }, |
| 2866 { "/Tools/sep3", NULL, NULL, 0, "<Separator>", NULL }, |
2881 { "/Tools/sep3", NULL, NULL, 0, "<Separator>", NULL }, |
| 2867 { N_("/Tools/Mute _Sounds"), "<CTL>S", pidgin_blist_mute_sounds_cb, 0, "<CheckItem>", NULL }, |
2882 { N_("/Tools/Mute _Sounds"), "<CTL>S", pidgin_blist_mute_sounds_cb, 0, "<CheckItem>", NULL }, |
| |
2883 /* Help */ |
| |
2884 { N_("/_Help"), NULL, NULL, 0, "<Branch>", NULL }, |
| |
2885 { N_("/Help/Online _Help"), "F1", gtk_blist_show_onlinehelp_cb, 0, "<StockItem>", GTK_STOCK_HELP }, |
| |
2886 { N_("/Help/_Debug Window"), NULL, toggle_debug, 0, "<Item>", NULL }, |
| |
2887 { N_("/Help/_About"), NULL, pidgin_dialogs_about, 0, "<Item>", NULL }, |
| 2868 }; |
2888 }; |
| 2869 |
2889 |
| 2870 /********************************************************* |
2890 /********************************************************* |
| 2871 * Private Utility functions * |
2891 * Private Utility functions * |
| 2872 *********************************************************/ |
2892 *********************************************************/ |
| 2988 |
3008 |
| 2989 /* Logged In */ |
3009 /* Logged In */ |
| 2990 signon = purple_presence_get_login_time(presence); |
3010 signon = purple_presence_get_login_time(presence); |
| 2991 if (full && PURPLE_BUDDY_IS_ONLINE(b) && signon > 0) |
3011 if (full && PURPLE_BUDDY_IS_ONLINE(b) && signon > 0) |
| 2992 { |
3012 { |
| 2993 tmp = purple_str_seconds_to_string(time(NULL) - signon); |
3013 if (time(NULL) - signon > 63072000 /* 2 years */) { |
| |
3014 /* |
| |
3015 * Our local clock must be wrong, show the actual |
| |
3016 * date instead of "4 days", etc. |
| |
3017 */ |
| |
3018 tmp = g_strdup(purple_date_format_long(localtime(&signon))); |
| |
3019 } else |
| |
3020 tmp = purple_str_seconds_to_string(time(NULL) - signon); |
| 2994 purple_notify_user_info_add_pair(user_info, _("Logged In"), tmp); |
3021 purple_notify_user_info_add_pair(user_info, _("Logged In"), tmp); |
| 2995 g_free(tmp); |
3022 g_free(tmp); |
| 2996 } |
3023 } |
| 2997 |
3024 |
| 2998 /* Idle */ |
3025 /* Idle */ |
| 3727 node->ui_data = g_new0(struct _pidgin_blist_node, 1); |
3754 node->ui_data = g_new0(struct _pidgin_blist_node, 1); |
| 3728 } |
3755 } |
| 3729 |
3756 |
| 3730 gboolean pidgin_blist_node_is_contact_expanded(PurpleBlistNode *node) |
3757 gboolean pidgin_blist_node_is_contact_expanded(PurpleBlistNode *node) |
| 3731 { |
3758 { |
| 3732 if PURPLE_BLIST_NODE_IS_BUDDY(node) |
3759 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { |
| 3733 node = node->parent; |
3760 node = node->parent; |
| |
3761 if (node == NULL) |
| |
3762 return FALSE; |
| |
3763 } |
| 3734 |
3764 |
| 3735 g_return_val_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node), FALSE); |
3765 g_return_val_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node), FALSE); |
| 3736 |
3766 |
| 3737 return ((struct _pidgin_blist_node *)node->ui_data)->contact_expanded; |
3767 return ((struct _pidgin_blist_node *)node->ui_data)->contact_expanded; |
| 3738 } |
3768 } |
| 4434 "cell-background-gdk", BGCOLOR_COLUMN, |
4464 "cell-background-gdk", BGCOLOR_COLUMN, |
| 4435 #endif |
4465 #endif |
| 4436 "markup", NAME_COLUMN, |
4466 "markup", NAME_COLUMN, |
| 4437 NULL); |
4467 NULL); |
| 4438 g_signal_connect(G_OBJECT(rend), "editing-started", G_CALLBACK(gtk_blist_renderer_editing_started_cb), NULL); |
4468 g_signal_connect(G_OBJECT(rend), "editing-started", G_CALLBACK(gtk_blist_renderer_editing_started_cb), NULL); |
| 4439 g_signal_connect(G_OBJECT(rend), "edited", G_CALLBACK(gtk_blist_renderer_edited_cb), NULL); |
4469 g_signal_connect(G_OBJECT(rend), "editing-canceled", G_CALLBACK(gtk_blist_renderer_editing_cancelled_cb), list); |
| |
4470 g_signal_connect(G_OBJECT(rend), "edited", G_CALLBACK(gtk_blist_renderer_edited_cb), list); |
| 4440 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); |
4471 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); |
| 4441 #if GTK_CHECK_VERSION(2,6,0) |
4472 #if GTK_CHECK_VERSION(2,6,0) |
| 4442 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
4473 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
| 4443 #endif |
4474 #endif |
| 4444 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), column); |
4475 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), column); |
| 4776 gtk_tree_row_reference_new(GTK_TREE_MODEL(gtkblist->treemodel), |
4807 gtk_tree_row_reference_new(GTK_TREE_MODEL(gtkblist->treemodel), |
| 4777 newpath); |
4808 newpath); |
| 4778 |
4809 |
| 4779 gtk_tree_path_free(newpath); |
4810 gtk_tree_path_free(newpath); |
| 4780 |
4811 |
| 4781 gtk_tree_store_set(gtkblist->treemodel, iter, |
4812 if (!editing_blist) |
| 4782 NODE_COLUMN, node, |
4813 gtk_tree_store_set(gtkblist->treemodel, iter, |
| 4783 -1); |
4814 NODE_COLUMN, node, |
| |
4815 -1); |
| 4784 |
4816 |
| 4785 if(node->parent) { |
4817 if(node->parent) { |
| 4786 GtkTreePath *expand = NULL; |
4818 GtkTreePath *expand = NULL; |
| 4787 struct _pidgin_blist_node *gtkparentnode = node->parent->ui_data; |
4819 struct _pidgin_blist_node *gtkparentnode = node->parent->ui_data; |
| 4788 |
4820 |
| 4811 gboolean show = FALSE; |
4843 gboolean show = FALSE; |
| 4812 PurpleBlistNode* gnode; |
4844 PurpleBlistNode* gnode; |
| 4813 |
4845 |
| 4814 g_return_if_fail(node != NULL); |
4846 g_return_if_fail(node != NULL); |
| 4815 |
4847 |
| |
4848 if (editing_blist) |
| |
4849 return; |
| |
4850 |
| 4816 if (PURPLE_BLIST_NODE_IS_GROUP(node)) |
4851 if (PURPLE_BLIST_NODE_IS_GROUP(node)) |
| 4817 gnode = node; |
4852 gnode = node; |
| 4818 else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
4853 else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
| 4819 gnode = node->parent->parent; |
4854 gnode = node->parent->parent; |
| 4820 else if (PURPLE_BLIST_NODE_IS_CONTACT(node) || PURPLE_BLIST_NODE_IS_CHAT(node)) |
4855 else if (PURPLE_BLIST_NODE_IS_CONTACT(node) || PURPLE_BLIST_NODE_IS_CHAT(node)) |
| 4912 gboolean expanded = ((struct _pidgin_blist_node *)(node->parent->ui_data))->contact_expanded; |
4947 gboolean expanded = ((struct _pidgin_blist_node *)(node->parent->ui_data))->contact_expanded; |
| 4913 gboolean selected = (gtkblist->selected_node == node); |
4948 gboolean selected = (gtkblist->selected_node == node); |
| 4914 gboolean biglist = purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_buddy_icons"); |
4949 gboolean biglist = purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_buddy_icons"); |
| 4915 presence = purple_buddy_get_presence(buddy); |
4950 presence = purple_buddy_get_presence(buddy); |
| 4916 |
4951 |
| |
4952 if (editing_blist) |
| |
4953 return; |
| |
4954 |
| 4917 status = pidgin_blist_get_status_icon((PurpleBlistNode*)buddy, |
4955 status = pidgin_blist_get_status_icon((PurpleBlistNode*)buddy, |
| 4918 PIDGIN_STATUS_ICON_SMALL); |
4956 PIDGIN_STATUS_ICON_SMALL); |
| 4919 |
4957 |
| 4920 /* Speed it up if we don't want buddy icons. */ |
4958 /* Speed it up if we don't want buddy icons. */ |
| 4921 if(biglist) |
4959 if(biglist) |
| 5086 static void pidgin_blist_update_chat(PurpleBuddyList *list, PurpleBlistNode *node) |
5126 static void pidgin_blist_update_chat(PurpleBuddyList *list, PurpleBlistNode *node) |
| 5087 { |
5127 { |
| 5088 PurpleChat *chat; |
5128 PurpleChat *chat; |
| 5089 |
5129 |
| 5090 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); |
5130 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); |
| |
5131 if (editing_blist) |
| |
5132 return; |
| 5091 |
5133 |
| 5092 /* First things first, update the group */ |
5134 /* First things first, update the group */ |
| 5093 pidgin_blist_update_group(list, node->parent); |
5135 pidgin_blist_update_group(list, node->parent); |
| 5094 |
5136 |
| 5095 chat = (PurpleChat*)node; |
5137 chat = (PurpleChat*)node; |