Mercurial > pidgin
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); |
