comparison finch/gntblist.c @ 22217:ad357ca94de9

We will probably eventually use purple_object_[get|set]_ui_data. Until then, this will do.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 26 Jan 2008 22:33:08 +0000
parents 2b426862ffbf
children 797230b3e48e
comparison
equal deleted inserted replaced
22216:b99d6d21cd79 22217:ad357ca94de9
154 { 154 {
155 gboolean offline = purple_prefs_get_bool(PREF_ROOT "/showoffline"); 155 gboolean offline = purple_prefs_get_bool(PREF_ROOT "/showoffline");
156 156
157 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { 157 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
158 PurpleBuddy *buddy = (PurpleBuddy*)node; 158 PurpleBuddy *buddy = (PurpleBuddy*)node;
159 FinchBlistNode *fnode = node->ui_data; 159 FinchBlistNode *fnode = FINCH_GET_DATA(node);
160 if (!purple_buddy_get_contact(buddy)) 160 if (!purple_buddy_get_contact(buddy))
161 return FALSE; /* When a new buddy is added and show-offline is set */ 161 return FALSE; /* When a new buddy is added and show-offline is set */
162 if (PURPLE_BUDDY_IS_ONLINE(buddy)) 162 if (PURPLE_BUDDY_IS_ONLINE(buddy))
163 return TRUE; /* The buddy is online */ 163 return TRUE; /* The buddy is online */
164 if (!purple_account_is_connected(purple_buddy_get_account(buddy))) 164 if (!purple_account_is_connected(purple_buddy_get_account(buddy)))
311 static GList *managers; 311 static GList *managers;
312 312
313 static FinchBlistNode * 313 static FinchBlistNode *
314 create_finch_blist_node(PurpleBlistNode *node, gpointer row) 314 create_finch_blist_node(PurpleBlistNode *node, gpointer row)
315 { 315 {
316 FinchBlistNode *fnode = node->ui_data; 316 FinchBlistNode *fnode = FINCH_GET_DATA(node);
317 if (!fnode) { 317 if (!fnode) {
318 fnode = g_new0(FinchBlistNode, 1); 318 fnode = g_new0(FinchBlistNode, 1);
319 fnode->signed_timer = 0; 319 fnode->signed_timer = 0;
320 node->ui_data = fnode; 320 FINCH_SET_DATA(node, fnode);
321 } 321 }
322 fnode->row = row; 322 fnode->row = row;
323 return fnode; 323 return fnode;
324 } 324 }
325 325
326 static void 326 static void
327 reset_blist_node_ui_data(PurpleBlistNode *node) 327 reset_blist_node_ui_data(PurpleBlistNode *node)
328 { 328 {
329 FinchBlistNode *fnode = node->ui_data; 329 FinchBlistNode *fnode = FINCH_GET_DATA(node);
330 if (fnode == NULL) 330 if (fnode == NULL)
331 return; 331 return;
332 if (fnode->signed_timer) 332 if (fnode->signed_timer)
333 purple_timeout_remove(fnode->signed_timer); 333 purple_timeout_remove(fnode->signed_timer);
334 g_free(fnode); 334 g_free(fnode);
335 node->ui_data = NULL; 335 FINCH_SET_DATA(node, NULL);
336 } 336 }
337 337
338 static int 338 static int
339 get_display_color(PurpleBlistNode *node) 339 get_display_color(PurpleBlistNode *node)
340 { 340 {
363 363
364 static GntTextFormatFlags 364 static GntTextFormatFlags
365 get_blist_node_flag(PurpleBlistNode *node) 365 get_blist_node_flag(PurpleBlistNode *node)
366 { 366 {
367 GntTextFormatFlags flag = 0; 367 GntTextFormatFlags flag = 0;
368 FinchBlistNode *fnode = node->ui_data; 368 FinchBlistNode *fnode = FINCH_GET_DATA(node);
369 369
370 if (ggblist->tagged && g_list_find(ggblist->tagged, node)) 370 if (ggblist->tagged && g_list_find(ggblist->tagged, node))
371 flag |= GNT_TEXT_FLAG_BOLD; 371 flag |= GNT_TEXT_FLAG_BOLD;
372 372
373 if (fnode && fnode->signed_timer) 373 if (fnode && fnode->signed_timer)
374 flag |= GNT_TEXT_FLAG_BLINK; 374 flag |= GNT_TEXT_FLAG_BLINK;
375 else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { 375 else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
376 node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact *)node); 376 node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact *)node);
377 fnode = node->ui_data; 377 fnode = FINCH_GET_DATA(node);
378 if (fnode && fnode->signed_timer) 378 if (fnode && fnode->signed_timer)
379 flag |= GNT_TEXT_FLAG_BLINK; 379 flag |= GNT_TEXT_FLAG_BLINK;
380 } 380 }
381 381
382 return flag; 382 return flag;
394 is_contact_online(PurpleContact *contact) 394 is_contact_online(PurpleContact *contact)
395 { 395 {
396 PurpleBlistNode *node; 396 PurpleBlistNode *node;
397 for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)contact)); node; 397 for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)contact)); node;
398 node = purple_blist_node_get_sibling_next(node)) { 398 node = purple_blist_node_get_sibling_next(node)) {
399 FinchBlistNode *fnode = node->ui_data; 399 FinchBlistNode *fnode = FINCH_GET_DATA(node);
400 if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) || 400 if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) ||
401 (fnode && fnode->signed_timer)) 401 (fnode && fnode->signed_timer))
402 return TRUE; 402 return TRUE;
403 } 403 }
404 return FALSE; 404 return FALSE;
426 } 426 }
427 427
428 static void 428 static void
429 add_node(PurpleBlistNode *node, FinchBlist *ggblist) 429 add_node(PurpleBlistNode *node, FinchBlist *ggblist)
430 { 430 {
431 if (node->ui_data) 431 if (FINCH_GET_DATA(node))
432 return; 432 return;
433 433
434 if (!ggblist->manager->can_add_node(node)) 434 if (!ggblist->manager->can_add_node(node))
435 return; 435 return;
436 436
460 } 460 }
461 461
462 static void 462 static void
463 node_remove(PurpleBuddyList *list, PurpleBlistNode *node) 463 node_remove(PurpleBuddyList *list, PurpleBlistNode *node)
464 { 464 {
465 FinchBlist *ggblist = list->ui_data; 465 FinchBlist *ggblist = FINCH_GET_DATA(list);
466 PurpleBlistNode *parent; 466 PurpleBlistNode *parent;
467 467
468 if (ggblist == NULL || node->ui_data == NULL) 468 if (ggblist == NULL || FINCH_GET_DATA(node)== NULL)
469 return; 469 return;
470 470
471 gnt_tree_remove(GNT_TREE(ggblist->tree), node); 471 gnt_tree_remove(GNT_TREE(ggblist->tree), node);
472 reset_blist_node_ui_data(node); 472 reset_blist_node_ui_data(node);
473 if (ggblist->tagged) 473 if (ggblist->tagged)
494 /* It really looks like this should never happen ... but it does. 494 /* It really looks like this should never happen ... but it does.
495 This will at least emit a warning to the log when it 495 This will at least emit a warning to the log when it
496 happens, so maybe someone will figure it out. */ 496 happens, so maybe someone will figure it out. */
497 g_return_if_fail(node != NULL); 497 g_return_if_fail(node != NULL);
498 498
499 if (list->ui_data == NULL) 499 if (FINCH_GET_DATA(list)== NULL)
500 return; /* XXX: this is probably the place to auto-join chats */ 500 return; /* XXX: this is probably the place to auto-join chats */
501 501
502 if (ggblist->window == NULL) 502 if (ggblist->window == NULL)
503 return; 503 return;
504 504
505 if (node->ui_data != NULL) { 505 if (FINCH_GET_DATA(node)!= NULL) {
506 gnt_tree_change_text(GNT_TREE(ggblist->tree), node, 506 gnt_tree_change_text(GNT_TREE(ggblist->tree), node,
507 0, get_display_name(node)); 507 0, get_display_name(node));
508 gnt_tree_sort_row(GNT_TREE(ggblist->tree), node); 508 gnt_tree_sort_row(GNT_TREE(ggblist->tree), node);
509 blist_update_row_flags(node); 509 blist_update_row_flags(node);
510 if (gnt_tree_get_parent_key(GNT_TREE(ggblist->tree), node) != 510 if (gnt_tree_get_parent_key(GNT_TREE(ggblist->tree), node) !=
512 node_remove(list, node); 512 node_remove(list, node);
513 } 513 }
514 514
515 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { 515 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
516 PurpleBuddy *buddy = (PurpleBuddy*)node; 516 PurpleBuddy *buddy = (PurpleBuddy*)node;
517 add_node((PurpleBlistNode*)buddy, list->ui_data); 517 add_node((PurpleBlistNode*)buddy, FINCH_GET_DATA(list));
518 node_update(list, purple_blist_node_get_parent(node)); 518 node_update(list, purple_blist_node_get_parent(node));
519 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { 519 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
520 add_node(node, list->ui_data); 520 add_node(node, FINCH_GET_DATA(list));
521 } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { 521 } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
522 if (node->ui_data == NULL) { 522 if (FINCH_GET_DATA(node)== NULL) {
523 /* The core seems to expect the UI to add the buddies. */ 523 /* The core seems to expect the UI to add the buddies. */
524 for (node = purple_blist_node_get_first_child(node); node; node = purple_blist_node_get_sibling_next(node)) 524 for (node = purple_blist_node_get_first_child(node); node; node = purple_blist_node_get_sibling_next(node))
525 add_node(node, list->ui_data); 525 add_node(node, FINCH_GET_DATA(list));
526 } 526 }
527 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { 527 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
528 if (!ggblist->manager->can_add_node(node)) 528 if (!ggblist->manager->can_add_node(node))
529 node_remove(list, node); 529 node_remove(list, node);
530 else 530 else
531 add_node(node, list->ui_data); 531 add_node(node, FINCH_GET_DATA(list));
532 } 532 }
533 } 533 }
534 534
535 static void 535 static void
536 new_list(PurpleBuddyList *list) 536 new_list(PurpleBuddyList *list)
537 { 537 {
538 if (ggblist) 538 if (ggblist)
539 return; 539 return;
540 540
541 ggblist = g_new0(FinchBlist, 1); 541 ggblist = g_new0(FinchBlist, 1);
542 list->ui_data = ggblist; 542 FINCH_SET_DATA(list, ggblist);
543 ggblist->manager = finch_blist_manager_find(purple_prefs_get_string(PREF_ROOT "/grouping")); 543 ggblist->manager = finch_blist_manager_find(purple_prefs_get_string(PREF_ROOT "/grouping"));
544 if (!ggblist->manager) 544 if (!ggblist->manager)
545 ggblist->manager = &default_manager; 545 ggblist->manager = &default_manager;
546 } 546 }
547 547
761 static void 761 static void
762 add_group(PurpleGroup *group, FinchBlist *ggblist) 762 add_group(PurpleGroup *group, FinchBlist *ggblist)
763 { 763 {
764 gpointer parent; 764 gpointer parent;
765 PurpleBlistNode *node = (PurpleBlistNode *)group; 765 PurpleBlistNode *node = (PurpleBlistNode *)group;
766 if (node->ui_data) 766 if (FINCH_GET_DATA(node))
767 return; 767 return;
768 parent = ggblist->manager->find_parent((PurpleBlistNode*)group); 768 parent = ggblist->manager->find_parent((PurpleBlistNode*)group);
769 create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group, 769 create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group,
770 gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), 770 gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)),
771 parent, NULL)); 771 parent, NULL));
834 static void 834 static void
835 add_chat(PurpleChat *chat, FinchBlist *ggblist) 835 add_chat(PurpleChat *chat, FinchBlist *ggblist)
836 { 836 {
837 gpointer parent; 837 gpointer parent;
838 PurpleBlistNode *node = (PurpleBlistNode *)chat; 838 PurpleBlistNode *node = (PurpleBlistNode *)chat;
839 if (node->ui_data) 839 if (FINCH_GET_DATA(node))
840 return; 840 return;
841 if (!purple_account_is_connected(chat->account)) 841 if (!purple_account_is_connected(chat->account))
842 return; 842 return;
843 843
844 parent = ggblist->manager->find_parent((PurpleBlistNode*)chat); 844 parent = ggblist->manager->find_parent((PurpleBlistNode*)chat);
853 { 853 {
854 gpointer parent; 854 gpointer parent;
855 PurpleBlistNode *node = (PurpleBlistNode*)contact; 855 PurpleBlistNode *node = (PurpleBlistNode*)contact;
856 const char *name; 856 const char *name;
857 857
858 if (node->ui_data) 858 if (FINCH_GET_DATA(node))
859 return; 859 return;
860 860
861 name = get_display_name(node); 861 name = get_display_name(node);
862 if (name == NULL) 862 if (name == NULL)
863 return; 863 return;
876 { 876 {
877 gpointer parent; 877 gpointer parent;
878 PurpleBlistNode *node = (PurpleBlistNode *)buddy; 878 PurpleBlistNode *node = (PurpleBlistNode *)buddy;
879 PurpleContact *contact; 879 PurpleContact *contact;
880 880
881 if (node->ui_data) 881 if (FINCH_GET_DATA(node))
882 return; 882 return;
883 883
884 contact = purple_buddy_get_contact(buddy); 884 contact = purple_buddy_get_contact(buddy);
885 parent = ggblist->manager->find_parent((PurpleBlistNode*)buddy); 885 parent = ggblist->manager->find_parent((PurpleBlistNode*)buddy);
886 886
934 if (!conv) { 934 if (!conv) {
935 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, 935 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
936 purple_buddy_get_account(buddy), 936 purple_buddy_get_account(buddy),
937 purple_buddy_get_name(buddy)); 937 purple_buddy_get_name(buddy));
938 } else { 938 } else {
939 FinchConv *ggconv = conv->ui_data; 939 FinchConv *ggconv = FINCH_GET_DATA(conv);
940 gnt_window_present(ggconv->window); 940 gnt_window_present(ggconv->window);
941 } 941 }
942 finch_conversation_set_active(conv); 942 finch_conversation_set_active(conv);
943 } 943 }
944 else if (PURPLE_BLIST_NODE_IS_CHAT(node)) 944 else if (PURPLE_BLIST_NODE_IS_CHAT(node))
1810 static void 1810 static void
1811 reset_blist_window(GntWidget *window, gpointer null) 1811 reset_blist_window(GntWidget *window, gpointer null)
1812 { 1812 {
1813 PurpleBlistNode *node; 1813 PurpleBlistNode *node;
1814 purple_signals_disconnect_by_handle(finch_blist_get_handle()); 1814 purple_signals_disconnect_by_handle(finch_blist_get_handle());
1815 purple_get_blist()->ui_data = NULL; 1815 FINCH_SET_DATA(purple_get_blist(), NULL);
1816 1816
1817 node = purple_blist_get_root(); 1817 node = purple_blist_get_root();
1818 while (node) { 1818 while (node) {
1819 reset_blist_node_ui_data(node); 1819 reset_blist_node_ui_data(node);
1820 node = purple_blist_node_next(node, TRUE); 1820 node = purple_blist_node_next(node, TRUE);
2322 2322
2323 static gboolean 2323 static gboolean
2324 buddy_recent_signed_on_off(gpointer data) 2324 buddy_recent_signed_on_off(gpointer data)
2325 { 2325 {
2326 PurpleBlistNode *node = data; 2326 PurpleBlistNode *node = data;
2327 FinchBlistNode *fnode = node->ui_data; 2327 FinchBlistNode *fnode = FINCH_GET_DATA(node);
2328 2328
2329 purple_timeout_remove(fnode->signed_timer); 2329 purple_timeout_remove(fnode->signed_timer);
2330 fnode->signed_timer = 0; 2330 fnode->signed_timer = 0;
2331 2331
2332 if (!ggblist->manager->can_add_node(node)) { 2332 if (!ggblist->manager->can_add_node(node)) {
2342 2342
2343 static gboolean 2343 static gboolean
2344 buddy_signed_on_off_cb(gpointer data) 2344 buddy_signed_on_off_cb(gpointer data)
2345 { 2345 {
2346 PurpleBlistNode *node = data; 2346 PurpleBlistNode *node = data;
2347 FinchBlistNode *fnode = node->ui_data; 2347 FinchBlistNode *fnode = FINCH_GET_DATA(node);
2348 if (!ggblist || !fnode) 2348 if (!ggblist || !fnode)
2349 return FALSE; 2349 return FALSE;
2350 2350
2351 if (fnode->signed_timer) 2351 if (fnode->signed_timer)
2352 purple_timeout_remove(fnode->signed_timer); 2352 purple_timeout_remove(fnode->signed_timer);