Mercurial > pidgin
comparison finch/gntconv.c @ 19321:39d3a81a5850
Update the 'send to' menu in conversation windows when necessary.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sat, 18 Aug 2007 00:11:13 +0000 |
parents | 3597903cf8ff |
children | 9c03677be7c5 |
comparison
equal
deleted
inserted
replaced
19320:5126f14002f9 | 19321:39d3a81a5850 |
---|---|
58 | 58 |
59 #include "config.h" | 59 #include "config.h" |
60 | 60 |
61 static void finch_write_common(PurpleConversation *conv, const char *who, | 61 static void finch_write_common(PurpleConversation *conv, const char *who, |
62 const char *message, PurpleMessageFlags flags, time_t mtime); | 62 const char *message, PurpleMessageFlags flags, time_t mtime); |
63 static void generate_send_to_menu(FinchConv *ggc); | |
63 | 64 |
64 static void | 65 static void |
65 send_typing_notification(GntWidget *w, FinchConv *ggconv) | 66 send_typing_notification(GntWidget *w, FinchConv *ggconv) |
66 { | 67 { |
67 const char *text = gnt_entry_get_text(GNT_ENTRY(ggconv->entry)); | 68 const char *text = gnt_entry_get_text(GNT_ENTRY(ggconv->entry)); |
197 purple_prefs_set_int(PREF_ROOT "/position/x", x); | 198 purple_prefs_set_int(PREF_ROOT "/position/x", x); |
198 purple_prefs_set_int(PREF_ROOT "/position/y", y); | 199 purple_prefs_set_int(PREF_ROOT "/position/y", y); |
199 } | 200 } |
200 | 201 |
201 static PurpleConversation * | 202 static PurpleConversation * |
202 find_conv_with_contact(PurpleConversation *conv) | 203 find_conv_with_contact(PurpleAccount *account, const char *name) |
203 { | 204 { |
204 PurpleBlistNode *node; | 205 PurpleBlistNode *node; |
205 PurpleBuddy *buddy = purple_find_buddy(conv->account, conv->name); | 206 PurpleBuddy *buddy = purple_find_buddy(account, name); |
206 PurpleConversation *ret = NULL; | 207 PurpleConversation *ret = NULL; |
207 | 208 |
208 if (!buddy) | 209 if (!buddy) |
209 return NULL; | 210 return NULL; |
210 | 211 |
270 { | 271 { |
271 finch_write_common(conv, NULL, _("You have left this chat."), | 272 finch_write_common(conv, NULL, _("You have left this chat."), |
272 PURPLE_MESSAGE_SYSTEM, time(NULL)); | 273 PURPLE_MESSAGE_SYSTEM, time(NULL)); |
273 } | 274 } |
274 | 275 |
276 static void | |
277 buddy_signed_on_off(PurpleBuddy *buddy, gpointer null) | |
278 { | |
279 PurpleConversation *conv = find_conv_with_contact(buddy->account, buddy->name); | |
280 if (conv == NULL) | |
281 return; | |
282 generate_send_to_menu(conv->ui_data); | |
283 } | |
284 | |
285 static void | |
286 account_signed_on_off(PurpleConnection *gc, gpointer null) | |
287 { | |
288 GList *ims = purple_get_ims(); | |
289 while (ims) { | |
290 PurpleConversation *conv = ims->data; | |
291 PurpleConversation *cc = find_conv_with_contact(conv->account, conv->name); | |
292 if (cc) | |
293 generate_send_to_menu(cc->ui_data); | |
294 ims = ims->next; | |
295 } | |
296 } | |
297 | |
275 static gpointer | 298 static gpointer |
276 finch_conv_get_handle() | 299 finch_conv_get_handle() |
277 { | 300 { |
278 static int handle; | 301 static int handle; |
279 return &handle; | 302 return &handle; |
337 | 360 |
338 buds = purple_find_buddies(ggc->active_conv->account, ggc->active_conv->name); | 361 buds = purple_find_buddies(ggc->active_conv->account, ggc->active_conv->name); |
339 if (!buds) | 362 if (!buds) |
340 return; | 363 return; |
341 | 364 |
342 item = gnt_menuitem_new(_("Send To")); | 365 if ((item = ggc->u.im->sendto) == NULL) { |
343 gnt_menu_add_item(GNT_MENU(menu), item); | 366 item = gnt_menuitem_new(_("Send To")); |
367 gnt_menu_add_item(GNT_MENU(menu), item); | |
368 ggc->u.im->sendto = item; | |
369 } | |
344 sub = gnt_menu_new(GNT_MENU_POPUP); | 370 sub = gnt_menu_new(GNT_MENU_POPUP); |
345 gnt_menuitem_set_submenu(item, GNT_MENU(sub)); | 371 gnt_menuitem_set_submenu(item, GNT_MENU(sub)); |
346 | 372 |
347 for (; buds; buds = buds->next) { | 373 for (; buds; buds = g_slist_delete_link(buds, buds)) { |
348 PurpleBlistNode *node = (PurpleBlistNode *)purple_buddy_get_contact((PurpleBuddy *)buds->data); | 374 PurpleBlistNode *node = (PurpleBlistNode *)purple_buddy_get_contact((PurpleBuddy *)buds->data); |
349 for (node = node->child; node != NULL; node = node->next) { | 375 for (node = node->child; node != NULL; node = node->next) { |
350 PurpleBuddy *buddy = (PurpleBuddy *)node; | 376 PurpleBuddy *buddy = (PurpleBuddy *)node; |
351 PurpleAccount *account = purple_buddy_get_account(buddy); | 377 PurpleAccount *account = purple_buddy_get_account(buddy); |
352 if (purple_account_is_connected(account)) { | 378 if (purple_account_is_connected(account)) { |
355 if (!g_list_find(list, presence)) | 381 if (!g_list_find(list, presence)) |
356 list = g_list_prepend(list, presence); | 382 list = g_list_prepend(list, presence); |
357 } | 383 } |
358 } | 384 } |
359 } | 385 } |
360 for (list = g_list_last(list); list != NULL; list = list->prev) { | 386 for (list = g_list_reverse(list); list != NULL; list = g_list_delete_link(list, list)) { |
361 PurplePresence *pre = list->data; | 387 PurplePresence *pre = list->data; |
362 PurpleBuddy *buddy = purple_presence_get_buddy(pre); | 388 PurpleBuddy *buddy = purple_presence_get_buddy(pre); |
363 PurpleAccount *account = purple_buddy_get_account(buddy); | 389 PurpleAccount *account = purple_buddy_get_account(buddy); |
364 gchar *name = g_strdup(purple_buddy_get_name(buddy)); | 390 gchar *name = g_strdup(purple_buddy_get_name(buddy)); |
365 gchar *text = g_strdup_printf("%s (%s)", purple_buddy_get_name(buddy), purple_account_get_username(account)); | 391 gchar *text = g_strdup_printf("%s (%s)", purple_buddy_get_name(buddy), purple_account_get_username(account)); |
368 gnt_menu_add_item(GNT_MENU(sub), item); | 394 gnt_menu_add_item(GNT_MENU(sub), item); |
369 gnt_menuitem_set_callback(item, send_to_cb, NULL); | 395 gnt_menuitem_set_callback(item, send_to_cb, NULL); |
370 g_object_set_data(G_OBJECT(item), "purple_account", account); | 396 g_object_set_data(G_OBJECT(item), "purple_account", account); |
371 g_object_set_data_full(G_OBJECT(item), "purple_buddy_name", name, g_free); | 397 g_object_set_data_full(G_OBJECT(item), "purple_buddy_name", name, g_free); |
372 } | 398 } |
373 g_list_free(list); | |
374 g_slist_free(buds); | |
375 } | 399 } |
376 | 400 |
377 static void | 401 static void |
378 gg_create_menu(FinchConv *ggc) | 402 gg_create_menu(FinchConv *ggc) |
379 { | 403 { |
460 PurpleAccount *account; | 484 PurpleAccount *account; |
461 | 485 |
462 if (ggc) | 486 if (ggc) |
463 return; | 487 return; |
464 | 488 |
465 cc = find_conv_with_contact(conv); | 489 cc = find_conv_with_contact(conv->account, conv->name); |
466 if (cc && cc->ui_data) | 490 if (cc && cc->ui_data) |
467 ggc = cc->ui_data; | 491 ggc = cc->ui_data; |
468 else | 492 else |
469 ggc = g_new0(FinchConv, 1); | 493 ggc = g_new0(FinchConv, 1); |
470 | 494 |
502 case PURPLE_CONV_TYPE_ANY: | 526 case PURPLE_CONV_TYPE_ANY: |
503 gnt_widget_set_name(ggc->window, "conversation-window-any" ); | 527 gnt_widget_set_name(ggc->window, "conversation-window-any" ); |
504 break; | 528 break; |
505 } | 529 } |
506 | 530 |
507 gg_create_menu(ggc); | |
508 | |
509 ggc->tv = gnt_text_view_new(); | 531 ggc->tv = gnt_text_view_new(); |
510 gnt_widget_set_name(ggc->tv, "conversation-window-textview"); | 532 gnt_widget_set_name(ggc->tv, "conversation-window-textview"); |
511 gnt_widget_set_size(ggc->tv, purple_prefs_get_int(PREF_ROOT "/size/width"), | 533 gnt_widget_set_size(ggc->tv, purple_prefs_get_int(PREF_ROOT "/size/width"), |
512 purple_prefs_get_int(PREF_ROOT "/size/height")); | 534 purple_prefs_get_int(PREF_ROOT "/size/height")); |
513 | 535 |
525 gnt_box_add_widget(GNT_BOX(hbox), tree); | 547 gnt_box_add_widget(GNT_BOX(hbox), tree); |
526 gnt_box_add_widget(GNT_BOX(ggc->window), hbox); | 548 gnt_box_add_widget(GNT_BOX(ggc->window), hbox); |
527 g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(create_conv_from_userlist), ggc); | 549 g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(create_conv_from_userlist), ggc); |
528 gnt_widget_set_visible(tree, purple_prefs_get_bool(PREF_USERLIST)); | 550 gnt_widget_set_visible(tree, purple_prefs_get_bool(PREF_USERLIST)); |
529 } else { | 551 } else { |
552 ggc->u.im = g_new0(FinchConvIm, 1); | |
530 gnt_box_add_widget(GNT_BOX(ggc->window), ggc->tv); | 553 gnt_box_add_widget(GNT_BOX(ggc->window), ggc->tv); |
531 } | 554 } |
532 | 555 |
533 ggc->info = gnt_vbox_new(FALSE); | 556 ggc->info = gnt_vbox_new(FALSE); |
534 gnt_box_add_widget(GNT_BOX(ggc->window), ggc->info); | 557 gnt_box_add_widget(GNT_BOX(ggc->window), ggc->info); |
555 g_signal_connect(G_OBJECT(ggc->window), "position_set", G_CALLBACK(save_position_cb), NULL); | 578 g_signal_connect(G_OBJECT(ggc->window), "position_set", G_CALLBACK(save_position_cb), NULL); |
556 | 579 |
557 if (type == PURPLE_CONV_TYPE_IM) { | 580 if (type == PURPLE_CONV_TYPE_IM) { |
558 g_signal_connect(G_OBJECT(ggc->entry), "text_changed", G_CALLBACK(send_typing_notification), ggc); | 581 g_signal_connect(G_OBJECT(ggc->entry), "text_changed", G_CALLBACK(send_typing_notification), ggc); |
559 } | 582 } |
583 | |
584 gg_create_menu(ggc); | |
560 | 585 |
561 g_free(title); | 586 g_free(title); |
562 gnt_box_give_focus_to_child(GNT_BOX(ggc->window), ggc->entry); | 587 gnt_box_give_focus_to_child(GNT_BOX(ggc->window), ggc->entry); |
563 g_signal_connect(G_OBJECT(ggc->window), "gained-focus", G_CALLBACK(gained_focus_cb), ggc); | 588 g_signal_connect(G_OBJECT(ggc->window), "gained-focus", G_CALLBACK(gained_focus_cb), ggc); |
564 } | 589 } |
1014 PURPLE_CALLBACK(update_buddy_typing), NULL); | 1039 PURPLE_CALLBACK(update_buddy_typing), NULL); |
1015 purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", finch_conv_get_handle(), | 1040 purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", finch_conv_get_handle(), |
1016 PURPLE_CALLBACK(update_buddy_typing), NULL); | 1041 PURPLE_CALLBACK(update_buddy_typing), NULL); |
1017 purple_signal_connect(purple_conversations_get_handle(), "chat-left", finch_conv_get_handle(), | 1042 purple_signal_connect(purple_conversations_get_handle(), "chat-left", finch_conv_get_handle(), |
1018 PURPLE_CALLBACK(chat_left_cb), NULL); | 1043 PURPLE_CALLBACK(chat_left_cb), NULL); |
1044 purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", finch_conv_get_handle(), | |
1045 PURPLE_CALLBACK(buddy_signed_on_off), NULL); | |
1046 purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", finch_conv_get_handle(), | |
1047 PURPLE_CALLBACK(buddy_signed_on_off), NULL); | |
1048 purple_signal_connect(purple_connections_get_handle(), "signed-on", finch_conv_get_handle(), | |
1049 PURPLE_CALLBACK(account_signed_on_off), NULL); | |
1050 purple_signal_connect(purple_connections_get_handle(), "signed-off", finch_conv_get_handle(), | |
1051 PURPLE_CALLBACK(account_signed_on_off), NULL); | |
1019 } | 1052 } |
1020 | 1053 |
1021 void finch_conversation_uninit() | 1054 void finch_conversation_uninit() |
1022 { | 1055 { |
1023 purple_signals_disconnect_by_handle(finch_conv_get_handle()); | 1056 purple_signals_disconnect_by_handle(finch_conv_get_handle()); |