| 167 { |
167 { |
| 168 gboolean offline = purple_prefs_get_bool(PREF_ROOT "/showoffline"); |
168 gboolean offline = purple_prefs_get_bool(PREF_ROOT "/showoffline"); |
| 169 |
169 |
| 170 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { |
170 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { |
| 171 PurpleBuddy *buddy = (PurpleBuddy*)node; |
171 PurpleBuddy *buddy = (PurpleBuddy*)node; |
| 172 FinchBlistNode *fnode = FINCH_GET_DATA(node); |
172 FinchBlistNode *fnode = purple_blist_node_get_ui_data(node); |
| 173 if (!purple_buddy_get_contact(buddy)) |
173 if (!purple_buddy_get_contact(buddy)) |
| 174 return FALSE; /* When a new buddy is added and show-offline is set */ |
174 return FALSE; /* When a new buddy is added and show-offline is set */ |
| 175 if (PURPLE_BUDDY_IS_ONLINE(buddy)) |
175 if (PURPLE_BUDDY_IS_ONLINE(buddy)) |
| 176 return TRUE; /* The buddy is online */ |
176 return TRUE; /* The buddy is online */ |
| 177 if (!purple_account_is_connected(purple_buddy_get_account(buddy))) |
177 if (!purple_account_is_connected(purple_buddy_get_account(buddy))) |
| 327 static GList *managers; |
327 static GList *managers; |
| 328 |
328 |
| 329 static FinchBlistNode * |
329 static FinchBlistNode * |
| 330 create_finch_blist_node(PurpleBlistNode *node, gpointer row) |
330 create_finch_blist_node(PurpleBlistNode *node, gpointer row) |
| 331 { |
331 { |
| 332 FinchBlistNode *fnode = FINCH_GET_DATA(node); |
332 FinchBlistNode *fnode = purple_blist_node_get_ui_data(node); |
| 333 if (!fnode) { |
333 if (!fnode) { |
| 334 fnode = g_new0(FinchBlistNode, 1); |
334 fnode = g_new0(FinchBlistNode, 1); |
| 335 fnode->signed_timer = 0; |
335 fnode->signed_timer = 0; |
| 336 FINCH_SET_DATA(node, fnode); |
336 purple_blist_node_set_ui_data(node, fnode); |
| 337 } |
337 } |
| 338 fnode->row = row; |
338 fnode->row = row; |
| 339 return fnode; |
339 return fnode; |
| 340 } |
340 } |
| 341 |
341 |
| 342 static void |
342 static void |
| 343 reset_blist_node_ui_data(PurpleBlistNode *node) |
343 reset_blist_node_ui_data(PurpleBlistNode *node) |
| 344 { |
344 { |
| 345 FinchBlistNode *fnode = FINCH_GET_DATA(node); |
345 FinchBlistNode *fnode = purple_blist_node_get_ui_data(node); |
| 346 if (fnode == NULL) |
346 if (fnode == NULL) |
| 347 return; |
347 return; |
| 348 if (fnode->signed_timer) |
348 if (fnode->signed_timer) |
| 349 purple_timeout_remove(fnode->signed_timer); |
349 purple_timeout_remove(fnode->signed_timer); |
| 350 g_free(fnode); |
350 g_free(fnode); |
| 351 FINCH_SET_DATA(node, NULL); |
351 purple_blist_node_set_ui_data(node, NULL); |
| 352 } |
352 } |
| 353 |
353 |
| 354 static int |
354 static int |
| 355 get_display_color(PurpleBlistNode *node) |
355 get_display_color(PurpleBlistNode *node) |
| 356 { |
356 { |
| 379 |
379 |
| 380 static GntTextFormatFlags |
380 static GntTextFormatFlags |
| 381 get_blist_node_flag(PurpleBlistNode *node) |
381 get_blist_node_flag(PurpleBlistNode *node) |
| 382 { |
382 { |
| 383 GntTextFormatFlags flag = 0; |
383 GntTextFormatFlags flag = 0; |
| 384 FinchBlistNode *fnode = FINCH_GET_DATA(node); |
384 FinchBlistNode *fnode = purple_blist_node_get_ui_data(node); |
| 385 |
385 |
| 386 if (ggblist->tagged && g_list_find(ggblist->tagged, node)) |
386 if (ggblist->tagged && g_list_find(ggblist->tagged, node)) |
| 387 flag |= GNT_TEXT_FLAG_BOLD; |
387 flag |= GNT_TEXT_FLAG_BOLD; |
| 388 |
388 |
| 389 if (fnode && fnode->signed_timer) |
389 if (fnode && fnode->signed_timer) |
| 390 flag |= GNT_TEXT_FLAG_BLINK; |
390 flag |= GNT_TEXT_FLAG_BLINK; |
| 391 else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
391 else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
| 392 node = PURPLE_BLIST_NODE(purple_contact_get_priority_buddy(PURPLE_CONTACT(node))); |
392 node = PURPLE_BLIST_NODE(purple_contact_get_priority_buddy(PURPLE_CONTACT(node))); |
| 393 fnode = FINCH_GET_DATA(node); |
393 fnode = purple_blist_node_get_ui_data(node); |
| 394 if (fnode && fnode->signed_timer) |
394 if (fnode && fnode->signed_timer) |
| 395 flag |= GNT_TEXT_FLAG_BLINK; |
395 flag |= GNT_TEXT_FLAG_BLINK; |
| 396 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { |
396 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { |
| 397 /* If the node is collapsed, then check to see if any of the priority buddies of |
397 /* If the node is collapsed, then check to see if any of the priority buddies of |
| 398 * any of the contacts within this group recently signed on/off, and set the blink |
398 * any of the contacts within this group recently signed on/off, and set the blink |
| 404 if (!gnt_tree_get_expanded(GNT_TREE(ggblist->tree), node)) { |
404 if (!gnt_tree_get_expanded(GNT_TREE(ggblist->tree), node)) { |
| 405 for (node = purple_blist_node_get_first_child(node); node; |
405 for (node = purple_blist_node_get_first_child(node); node; |
| 406 node = purple_blist_node_get_sibling_next(node)) { |
406 node = purple_blist_node_get_sibling_next(node)) { |
| 407 PurpleBlistNode *pnode; |
407 PurpleBlistNode *pnode; |
| 408 pnode = purple_contact_get_priority_buddy((PurpleContact*)node); |
408 pnode = purple_contact_get_priority_buddy((PurpleContact*)node); |
| 409 fnode = FINCH_GET_DATA(node); |
409 fnode = purple_blist_node_get_ui_data(node); |
| 410 if (fnode && fnode->signed_timer) { |
410 if (fnode && fnode->signed_timer) { |
| 411 flag |= GNT_TEXT_FLAG_BLINK; |
411 flag |= GNT_TEXT_FLAG_BLINK; |
| 412 break; |
412 break; |
| 413 } |
413 } |
| 414 } |
414 } |
| 431 is_contact_online(PurpleContact *contact) |
431 is_contact_online(PurpleContact *contact) |
| 432 { |
432 { |
| 433 PurpleBlistNode *node; |
433 PurpleBlistNode *node; |
| 434 for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)contact)); node; |
434 for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)contact)); node; |
| 435 node = purple_blist_node_get_sibling_next(node)) { |
435 node = purple_blist_node_get_sibling_next(node)) { |
| 436 FinchBlistNode *fnode = FINCH_GET_DATA(node); |
436 FinchBlistNode *fnode = purple_blist_node_get_ui_data(node); |
| 437 if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) || |
437 if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) || |
| 438 (fnode && fnode->signed_timer)) |
438 (fnode && fnode->signed_timer)) |
| 439 return TRUE; |
439 return TRUE; |
| 440 } |
440 } |
| 441 return FALSE; |
441 return FALSE; |
| 500 node_remove(PurpleBuddyList *list, PurpleBlistNode *node) |
500 node_remove(PurpleBuddyList *list, PurpleBlistNode *node) |
| 501 { |
501 { |
| 502 FinchBlist *ggblist = FINCH_GET_DATA(list); |
502 FinchBlist *ggblist = FINCH_GET_DATA(list); |
| 503 PurpleBlistNode *parent; |
503 PurpleBlistNode *parent; |
| 504 |
504 |
| 505 if (ggblist == NULL || FINCH_GET_DATA(node) == NULL) |
505 if (ggblist == NULL || purple_blist_node_get_ui_data(node) == NULL) |
| 506 return; |
506 return; |
| 507 |
507 |
| 508 if (PURPLE_BLIST_NODE_IS_GROUP(node) && ggblist->new_group) { |
508 if (PURPLE_BLIST_NODE_IS_GROUP(node) && ggblist->new_group) { |
| 509 ggblist->new_group = g_list_remove(ggblist->new_group, node); |
509 ggblist->new_group = g_list_remove(ggblist->new_group, node); |
| 510 } |
510 } |
| 541 return; /* XXX: this is probably the place to auto-join chats */ |
541 return; /* XXX: this is probably the place to auto-join chats */ |
| 542 |
542 |
| 543 if (ggblist->window == NULL) |
543 if (ggblist->window == NULL) |
| 544 return; |
544 return; |
| 545 |
545 |
| 546 if (FINCH_GET_DATA(node)!= NULL) { |
546 if (purple_blist_node_get_ui_data(node)!= NULL) { |
| 547 gnt_tree_change_text(GNT_TREE(ggblist->tree), node, |
547 gnt_tree_change_text(GNT_TREE(ggblist->tree), node, |
| 548 0, get_display_name(node)); |
548 0, get_display_name(node)); |
| 549 gnt_tree_sort_row(GNT_TREE(ggblist->tree), node); |
549 gnt_tree_sort_row(GNT_TREE(ggblist->tree), node); |
| 550 blist_update_row_flags(node); |
550 blist_update_row_flags(node); |
| 551 if (gnt_tree_get_parent_key(GNT_TREE(ggblist->tree), node) != |
551 if (gnt_tree_get_parent_key(GNT_TREE(ggblist->tree), node) != |
| 558 add_node((PurpleBlistNode*)buddy, FINCH_GET_DATA(list)); |
558 add_node((PurpleBlistNode*)buddy, FINCH_GET_DATA(list)); |
| 559 node_update(list, purple_blist_node_get_parent(node)); |
559 node_update(list, purple_blist_node_get_parent(node)); |
| 560 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { |
560 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { |
| 561 add_node(node, FINCH_GET_DATA(list)); |
561 add_node(node, FINCH_GET_DATA(list)); |
| 562 } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
562 } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
| 563 if (FINCH_GET_DATA(node)== NULL) { |
563 if (purple_blist_node_get_ui_data(node)== NULL) { |
| 564 /* The core seems to expect the UI to add the buddies. */ |
564 /* The core seems to expect the UI to add the buddies. */ |
| 565 for (node = purple_blist_node_get_first_child(node); node; node = purple_blist_node_get_sibling_next(node)) |
565 for (node = purple_blist_node_get_first_child(node); node; node = purple_blist_node_get_sibling_next(node)) |
| 566 add_node(node, FINCH_GET_DATA(list)); |
566 add_node(node, FINCH_GET_DATA(list)); |
| 567 } |
567 } |
| 568 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { |
568 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { |
| 837 ggblist->new_group_timeout = purple_timeout_add_seconds(SHOW_EMPTY_GROUP_TIMEOUT, |
837 ggblist->new_group_timeout = purple_timeout_add_seconds(SHOW_EMPTY_GROUP_TIMEOUT, |
| 838 remove_new_empty_group, NULL); |
838 remove_new_empty_group, NULL); |
| 839 |
839 |
| 840 /* Select the group */ |
840 /* Select the group */ |
| 841 if (ggblist->tree) { |
841 if (ggblist->tree) { |
| 842 FinchBlistNode *fnode = FINCH_GET_DATA((PurpleBlistNode*)grp); |
842 FinchBlistNode *fnode = purple_blist_node_get_ui_data((PurpleBlistNode*)grp); |
| 843 if (!fnode) |
843 if (!fnode) |
| 844 add_node((PurpleBlistNode*)grp, ggblist); |
844 add_node((PurpleBlistNode*)grp, ggblist); |
| 845 gnt_tree_set_selected(GNT_TREE(ggblist->tree), grp); |
845 gnt_tree_set_selected(GNT_TREE(ggblist->tree), grp); |
| 846 } |
846 } |
| 847 } |
847 } |
| 885 static void |
885 static void |
| 886 add_group(PurpleGroup *group, FinchBlist *ggblist) |
886 add_group(PurpleGroup *group, FinchBlist *ggblist) |
| 887 { |
887 { |
| 888 gpointer parent; |
888 gpointer parent; |
| 889 PurpleBlistNode *node = (PurpleBlistNode *)group; |
889 PurpleBlistNode *node = (PurpleBlistNode *)group; |
| 890 if (FINCH_GET_DATA(node)) |
890 if (purple_blist_node_get_ui_data(node)) |
| 891 return; |
891 return; |
| 892 parent = ggblist->manager->find_parent((PurpleBlistNode*)group); |
892 parent = ggblist->manager->find_parent((PurpleBlistNode*)group); |
| 893 create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group, |
893 create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group, |
| 894 gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), |
894 gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), |
| 895 parent, NULL)); |
895 parent, NULL)); |
| 958 static void |
958 static void |
| 959 add_chat(PurpleChat *chat, FinchBlist *ggblist) |
959 add_chat(PurpleChat *chat, FinchBlist *ggblist) |
| 960 { |
960 { |
| 961 gpointer parent; |
961 gpointer parent; |
| 962 PurpleBlistNode *node = (PurpleBlistNode *)chat; |
962 PurpleBlistNode *node = (PurpleBlistNode *)chat; |
| 963 if (FINCH_GET_DATA(node)) |
963 if (purple_blist_node_get_ui_data(node)) |
| 964 return; |
964 return; |
| 965 if (!purple_account_is_connected(purple_chat_get_account(chat))) |
965 if (!purple_account_is_connected(purple_chat_get_account(chat))) |
| 966 return; |
966 return; |
| 967 |
967 |
| 968 parent = ggblist->manager->find_parent((PurpleBlistNode*)chat); |
968 parent = ggblist->manager->find_parent((PurpleBlistNode*)chat); |
| 1000 { |
1000 { |
| 1001 gpointer parent; |
1001 gpointer parent; |
| 1002 PurpleBlistNode *node = (PurpleBlistNode *)buddy; |
1002 PurpleBlistNode *node = (PurpleBlistNode *)buddy; |
| 1003 PurpleContact *contact; |
1003 PurpleContact *contact; |
| 1004 |
1004 |
| 1005 if (FINCH_GET_DATA(node)) |
1005 if (purple_blist_node_get_ui_data(node)) |
| 1006 return; |
1006 return; |
| 1007 |
1007 |
| 1008 contact = purple_buddy_get_contact(buddy); |
1008 contact = purple_buddy_get_contact(buddy); |
| 1009 parent = ggblist->manager->find_parent((PurpleBlistNode*)buddy); |
1009 parent = ggblist->manager->find_parent((PurpleBlistNode*)buddy); |
| 1010 |
1010 |
| 2543 |
2543 |
| 2544 static gboolean |
2544 static gboolean |
| 2545 buddy_recent_signed_on_off(gpointer data) |
2545 buddy_recent_signed_on_off(gpointer data) |
| 2546 { |
2546 { |
| 2547 PurpleBlistNode *node = data; |
2547 PurpleBlistNode *node = data; |
| 2548 FinchBlistNode *fnode = FINCH_GET_DATA(node); |
2548 FinchBlistNode *fnode = purple_blist_node_get_ui_data(node); |
| 2549 |
2549 |
| 2550 purple_timeout_remove(fnode->signed_timer); |
2550 purple_timeout_remove(fnode->signed_timer); |
| 2551 fnode->signed_timer = 0; |
2551 fnode->signed_timer = 0; |
| 2552 |
2552 |
| 2553 if (!ggblist->manager->can_add_node(node)) { |
2553 if (!ggblist->manager->can_add_node(node)) { |
| 2563 |
2563 |
| 2564 static gboolean |
2564 static gboolean |
| 2565 buddy_signed_on_off_cb(gpointer data) |
2565 buddy_signed_on_off_cb(gpointer data) |
| 2566 { |
2566 { |
| 2567 PurpleBlistNode *node = data; |
2567 PurpleBlistNode *node = data; |
| 2568 FinchBlistNode *fnode = FINCH_GET_DATA(node); |
2568 FinchBlistNode *fnode = purple_blist_node_get_ui_data(node); |
| 2569 if (!ggblist || !fnode) |
2569 if (!ggblist || !fnode) |
| 2570 return FALSE; |
2570 return FALSE; |
| 2571 |
2571 |
| 2572 if (fnode->signed_timer) |
2572 if (fnode->signed_timer) |
| 2573 purple_timeout_remove(fnode->signed_timer); |
2573 purple_timeout_remove(fnode->signed_timer); |