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());