pidgin/gtkblist.c

changeset 18191
087e7ed44d3d
parent 18122
9bf9970c1b6a
parent 18178
d461ccafa1fb
child 18193
a1939279bed1
equal deleted inserted replaced
18190:bcf28ef7e8ff 18191:087e7ed44d3d
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);
399 purple_blist_alias_chat((PurpleChat*)node, arg2); 408 purple_blist_alias_chat((PurpleChat*)node, arg2);
400 break; 409 break;
401 default: 410 default:
402 break; 411 break;
403 } 412 }
413 pidgin_blist_refresh(list);
404 } 414 }
405 415
406 static void gtk_blist_menu_alias_cb(GtkWidget *w, PurpleBlistNode *node) 416 static void gtk_blist_menu_alias_cb(GtkWidget *w, PurpleBlistNode *node)
407 { 417 {
408 GtkTreeIter iter; 418 GtkTreeIter iter;
477 } 487 }
478 488
479 static void gtk_blist_show_systemlog_cb() 489 static void gtk_blist_show_systemlog_cb()
480 { 490 {
481 pidgin_syslog_show(); 491 pidgin_syslog_show();
492 }
493
494 static void gtk_blist_show_onlinehelp_cb()
495 {
496 purple_notify_uri(NULL, PURPLE_WEBSITE "documentation");
482 } 497 }
483 498
484 static void 499 static void
485 do_join_chat(PidginJoinChatData *data) 500 do_join_chat(PidginJoinChatData *data)
486 { 501 {
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)
4990 { 5028 {
4991 PurpleBlistNode *cnode; 5029 PurpleBlistNode *cnode;
4992 PurpleContact *contact; 5030 PurpleContact *contact;
4993 PurpleBuddy *buddy; 5031 PurpleBuddy *buddy;
4994 struct _pidgin_blist_node *gtknode; 5032 struct _pidgin_blist_node *gtknode;
5033 if (editing_blist)
5034 return;
4995 5035
4996 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) 5036 if (PURPLE_BLIST_NODE_IS_BUDDY(node))
4997 cnode = node->parent; 5037 cnode = node->parent;
4998 else 5038 else
4999 cnode = node; 5039 cnode = node;
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;

mercurial