comparison src/gtkconv.c @ 5908:ed8a9a3bf7e2

[gaim-migrate @ 6340] The Conversation menu is now more populated. It contains entries for the main buttons on IM and Chat conversations. Entries that are not available for a protocol or for the conversation type are now hidden. Some entries are greyed out, but it's temporary until we have a function for finding a buddy list chat entry. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Mon, 16 Jun 2003 22:55:45 +0000
parents 18486c860a46
children 865f235ffaf0
comparison
equal deleted inserted replaced
5907:18486c860a46 5908:ed8a9a3bf7e2
277 close_smiley_dialog(smiley, conv); 277 close_smiley_dialog(smiley, conv);
278 278
279 gtk_widget_grab_focus(gtkconv->entry); 279 gtk_widget_grab_focus(gtkconv->entry);
280 } 280 }
281 281
282 static void
283 menu_save_as_cb(gpointer data, guint action, GtkWidget *widget)
284 {
285 GaimWindow *win = (GaimWindow *)data;
286
287 save_convo(NULL, gaim_window_get_active_conversation(win));
288 }
289
290 static void
291 menu_view_log_cb(gpointer data, guint action, GtkWidget *widget)
292 {
293 GaimWindow *win = (GaimWindow *)data;
294 GaimConversation *conv;
295
296 conv = gaim_window_get_active_conversation(win);
297
298 conv_show_log(NULL, (char *)gaim_conversation_get_name(conv));
299 }
300
301 static void
302 menu_add_pounce_cb(gpointer data, guint action, GtkWidget *widget)
303 {
304 GaimWindow *win = (GaimWindow *)data;
305 GaimConversation *conv;
306
307 conv = gaim_window_get_active_conversation(win);
308
309 gaim_gtkpounce_dialog_show(gaim_conversation_get_account(conv),
310 gaim_conversation_get_name(conv), NULL);
311 }
312
313 static void
314 menu_insert_link_cb(gpointer data, guint action, GtkWidget *widget)
315 {
316 GaimWindow *win = (GaimWindow *)data;
317 GaimConversation *conv;
318 GaimGtkConversation *gtkconv;
319
320 conv = gaim_window_get_active_conversation(win);
321 gtkconv = GAIM_GTK_CONVERSATION(conv);
322
323 show_insert_link(gtkconv->toolbar.link, conv);
324 }
325
326 static void
327 menu_insert_image_cb(gpointer data, guint action, GtkWidget *widget)
328 {
329 GaimWindow *win = (GaimWindow *)data;
330 GaimGtkConversation *gtkconv;
331
332 gtkconv = GAIM_GTK_CONVERSATION(gaim_window_get_active_conversation(win));
333
334 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.image),
335 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.image)));
336 }
337
338 static void
339 menu_close_conv_cb(gpointer data, guint action, GtkWidget *widget)
340 {
341 GaimWindow *win = (GaimWindow *)data;
342
343 close_conv_cb(NULL, gaim_window_get_active_conversation(win));
344 }
345
346 static void
347 menu_logging_cb(gpointer data, guint action, GtkWidget *widget)
348 {
349 GaimWindow *win = (GaimWindow *)data;
350 GaimConversation *conv;
351
352 conv = gaim_window_get_active_conversation(win);
353
354 if (conv == NULL)
355 return;
356
357 gaim_conversation_set_logging(conv,
358 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)));
359 }
360
361 static void
362 menu_sounds_cb(gpointer data, guint action, GtkWidget *widget)
363 {
364 GaimWindow *win = (GaimWindow *)data;
365 GaimConversation *conv;
366 GaimGtkConversation *gtkconv;
367
368 conv = gaim_window_get_active_conversation(win);
369
370 if (!conv)
371 return;
372
373 gtkconv = GAIM_GTK_CONVERSATION(conv);
374
375 gtkconv->make_sound =
376 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
377 }
378
379 static gboolean 282 static gboolean
380 entry_key_pressed_cb_1(GtkTextBuffer *buffer) 283 entry_key_pressed_cb_1(GtkTextBuffer *buffer)
381 { 284 {
382 check_everything(buffer); 285 check_everything(buffer);
383 286
570 show_add_perm(gc, (char *)gaim_conversation_get_name(conv), FALSE); 473 show_add_perm(gc, (char *)gaim_conversation_get_name(conv), FALSE);
571 474
572 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); 475 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry);
573 } 476 }
574 477
478 static void
479 do_invite(GtkWidget *w, int resp, InviteBuddyInfo *info)
480 {
481 const char *buddy, *message;
482 GaimGtkConversation *gtkconv;
483
484 gtkconv = GAIM_GTK_CONVERSATION(info->conv);
485
486 if (resp == GTK_RESPONSE_OK) {
487 buddy = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(info->entry)->entry));
488 message = gtk_entry_get_text(GTK_ENTRY(info->message));
489
490 if (!g_ascii_strcasecmp(buddy, "")) {
491 g_free(info);
492
493 return;
494 }
495
496 serv_chat_invite(gaim_conversation_get_gc(info->conv),
497 gaim_chat_get_id(GAIM_CHAT(info->conv)),
498 message, buddy);
499 }
500
501 gtk_widget_destroy(invite_dialog);
502 invite_dialog = NULL;
503
504 g_free(info);
505 }
506
507 static void
508 invite_cb(GtkWidget *widget, GaimConversation *conv)
509 {
510 InviteBuddyInfo *info = NULL;
511
512 if (invite_dialog == NULL) {
513 GaimConnection *gc;
514 GaimWindow *win;
515 GaimGtkWindow *gtkwin;
516 GtkWidget *label;
517 GtkWidget *vbox, *hbox;
518 GtkWidget *table;
519 GtkWidget *img;
520
521 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
522
523 info = g_new0(InviteBuddyInfo, 1);
524 info->conv = conv;
525
526 gc = gaim_conversation_get_gc(conv);
527 win = gaim_conversation_get_window(conv);
528 gtkwin = GAIM_GTK_WINDOW(win);
529
530 /* Create the new dialog. */
531 invite_dialog = gtk_dialog_new_with_buttons(
532 _("Gaim - Invite Buddy Into Chat Room"),
533 GTK_WINDOW(gtkwin->window),
534 GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
535 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
536
537 gtk_dialog_set_default_response(GTK_DIALOG(invite_dialog),
538 GTK_RESPONSE_OK);
539 gtk_container_set_border_width(GTK_CONTAINER(invite_dialog), 6);
540 gtk_window_set_resizable(GTK_WINDOW(invite_dialog), FALSE);
541 gtk_dialog_set_has_separator(GTK_DIALOG(invite_dialog), FALSE);
542
543 /* Setup the outside spacing. */
544 vbox = GTK_DIALOG(invite_dialog)->vbox;
545
546 gtk_box_set_spacing(GTK_BOX(vbox), 12);
547 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
548
549 /* Setup the inner hbox and put the dialog's icon in it. */
550 hbox = gtk_hbox_new(FALSE, 12);
551 gtk_container_add(GTK_CONTAINER(vbox), hbox);
552 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
553 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
554
555 /* Setup the right vbox. */
556 vbox = gtk_vbox_new(FALSE, 0);
557 gtk_container_add(GTK_CONTAINER(hbox), vbox);
558
559 /* Put our happy label in it. */
560 label = gtk_label_new(_("Please enter the name of the user you wish "
561 "to invite, along with an optional invite "
562 "message."));
563 gtk_widget_set_size_request(label, 350, -1);
564 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
565 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
566 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
567
568 /* hbox for the table, and to give it some spacing on the left. */
569 hbox = gtk_hbox_new(FALSE, 6);
570 gtk_container_add(GTK_CONTAINER(vbox), hbox);
571
572 /* Setup the table we're going to use to lay stuff out. */
573 table = gtk_table_new(2, 2, FALSE);
574 gtk_table_set_row_spacings(GTK_TABLE(table), 6);
575 gtk_table_set_col_spacings(GTK_TABLE(table), 6);
576 gtk_container_set_border_width(GTK_CONTAINER(table), 12);
577 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
578
579 /* Now the Buddy label */
580 label = gtk_label_new(NULL);
581 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Buddy:"));
582 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
583 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
584
585 /* Now the Buddy drop-down entry field. */
586 info->entry = gtk_combo_new();
587 gtk_combo_set_case_sensitive(GTK_COMBO(info->entry), FALSE);
588 gtk_entry_set_activates_default(
589 GTK_ENTRY(GTK_COMBO(info->entry)->entry), TRUE);
590
591 gtk_table_attach_defaults(GTK_TABLE(table), info->entry, 1, 2, 0, 1);
592 gtk_label_set_mnemonic_widget(GTK_LABEL(label), info->entry);
593
594 /* Fill in the names. */
595 gtk_combo_set_popdown_strings(GTK_COMBO(info->entry),
596 generate_invite_user_names(gc));
597
598
599 /* Now the label for "Message" */
600 label = gtk_label_new(NULL);
601 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Message:"));
602 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
603 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
604
605
606 /* And finally, the Message entry field. */
607 info->message = gtk_entry_new();
608 gtk_entry_set_activates_default(GTK_ENTRY(info->message), TRUE);
609
610 gtk_table_attach_defaults(GTK_TABLE(table), info->message, 1, 2, 1, 2);
611 gtk_label_set_mnemonic_widget(GTK_LABEL(label), info->message);
612
613 /* Connect the signals. */
614 g_signal_connect(G_OBJECT(invite_dialog), "response",
615 G_CALLBACK(do_invite), info);
616 }
617
618 gtk_widget_show_all(invite_dialog);
619
620 if (info != NULL)
621 gtk_widget_grab_focus(GTK_COMBO(info->entry)->entry);
622 }
623
624 static void
625 menu_save_as_cb(gpointer data, guint action, GtkWidget *widget)
626 {
627 GaimWindow *win = (GaimWindow *)data;
628
629 save_convo(NULL, gaim_window_get_active_conversation(win));
630 }
631
632 static void
633 menu_view_log_cb(gpointer data, guint action, GtkWidget *widget)
634 {
635 GaimWindow *win = (GaimWindow *)data;
636 GaimConversation *conv;
637
638 conv = gaim_window_get_active_conversation(win);
639
640 conv_show_log(NULL, (char *)gaim_conversation_get_name(conv));
641 }
642
643 static void
644 menu_add_pounce_cb(gpointer data, guint action, GtkWidget *widget)
645 {
646 GaimWindow *win = (GaimWindow *)data;
647 GaimConversation *conv;
648
649 conv = gaim_window_get_active_conversation(win);
650
651 gaim_gtkpounce_dialog_show(gaim_conversation_get_account(conv),
652 gaim_conversation_get_name(conv), NULL);
653 }
654
655 static void
656 menu_insert_link_cb(gpointer data, guint action, GtkWidget *widget)
657 {
658 GaimWindow *win = (GaimWindow *)data;
659 GaimConversation *conv;
660 GaimGtkConversation *gtkconv;
661
662 conv = gaim_window_get_active_conversation(win);
663 gtkconv = GAIM_GTK_CONVERSATION(conv);
664
665 show_insert_link(gtkconv->toolbar.link, conv);
666 }
667
668 static void
669 menu_insert_image_cb(gpointer data, guint action, GtkWidget *widget)
670 {
671 GaimWindow *win = (GaimWindow *)data;
672 GaimGtkConversation *gtkconv;
673
674 gtkconv = GAIM_GTK_CONVERSATION(gaim_window_get_active_conversation(win));
675
676 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.image),
677 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.image)));
678 }
679
680 static void
681 menu_alias_cb(gpointer data, guint action, GtkWidget *widget)
682 {
683 GaimWindow *win = (GaimWindow *)data;
684 GaimConversation *conv;
685 struct buddy *b;
686
687 conv = gaim_window_get_active_conversation(win);
688
689 b = gaim_find_buddy(gaim_conversation_get_account(conv),
690 gaim_conversation_get_name(conv));
691
692 if (b != NULL) {
693 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM)
694 alias_dialog_bud(b);
695 #if 0
696 else if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT)
697 alias_dialog_chat((struct chat *)b);
698 #endif
699 }
700 }
701
702 static void
703 menu_get_info_cb(gpointer data, guint action, GtkWidget *widget)
704 {
705 GaimWindow *win = (GaimWindow *)data;
706 GaimConversation *conv;
707
708 conv = gaim_window_get_active_conversation(win);
709
710 info_cb(NULL, conv);
711 }
712
713 static void
714 menu_invite_cb(gpointer data, guint action, GtkWidget *widget)
715 {
716 GaimWindow *win = (GaimWindow *)data;
717 GaimConversation *conv;
718
719 conv = gaim_window_get_active_conversation(win);
720
721 invite_cb(NULL, conv);
722 }
723
724 static void
725 menu_warn_cb(gpointer data, guint action, GtkWidget *widget)
726 {
727 GaimWindow *win = (GaimWindow *)data;
728 GaimConversation *conv;
729
730 conv = gaim_window_get_active_conversation(win);
731
732 warn_cb(NULL, conv);
733 }
734
735 static void
736 menu_block_cb(gpointer data, guint action, GtkWidget *widget)
737 {
738 GaimWindow *win = (GaimWindow *)data;
739 GaimConversation *conv;
740
741 conv = gaim_window_get_active_conversation(win);
742
743 block_cb(NULL, conv);
744 }
745
746 static void
747 menu_add_remove_cb(gpointer data, guint action, GtkWidget *widget)
748 {
749 GaimWindow *win = (GaimWindow *)data;
750 GaimConversation *conv;
751
752 conv = gaim_window_get_active_conversation(win);
753
754 add_cb(NULL, conv);
755 }
756
757 static void
758 menu_close_conv_cb(gpointer data, guint action, GtkWidget *widget)
759 {
760 GaimWindow *win = (GaimWindow *)data;
761
762 close_conv_cb(NULL, gaim_window_get_active_conversation(win));
763 }
764
765 static void
766 menu_logging_cb(gpointer data, guint action, GtkWidget *widget)
767 {
768 GaimWindow *win = (GaimWindow *)data;
769 GaimConversation *conv;
770
771 conv = gaim_window_get_active_conversation(win);
772
773 if (conv == NULL)
774 return;
775
776 gaim_conversation_set_logging(conv,
777 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)));
778 }
779
780 static void
781 menu_sounds_cb(gpointer data, guint action, GtkWidget *widget)
782 {
783 GaimWindow *win = (GaimWindow *)data;
784 GaimConversation *conv;
785 GaimGtkConversation *gtkconv;
786
787 conv = gaim_window_get_active_conversation(win);
788
789 if (!conv)
790 return;
791
792 gtkconv = GAIM_GTK_CONVERSATION(conv);
793
794 gtkconv->make_sound =
795 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
796 }
797
798
799
575 void 800 void
576 im_cb(GtkWidget *widget, GaimConversation *conv) 801 im_cb(GtkWidget *widget, GaimConversation *conv)
577 { 802 {
578 GaimConversation *conv2; 803 GaimConversation *conv2;
579 GaimGtkConversation *gtkconv; 804 GaimGtkConversation *gtkconv;
646 871
647 add_chat_buddy_common(conv, name, pos); 872 add_chat_buddy_common(conv, name, pos);
648 } 873 }
649 874
650 static void 875 static void
651 menu_im_cb(GtkWidget *w, GaimConversation *conv) 876 menu_chat_im_cb(GtkWidget *w, GaimConversation *conv)
652 { 877 {
653 const char *who; 878 const char *who;
654 GaimConversation *conv2; 879 GaimConversation *conv2;
655 GaimAccount *account; 880 GaimAccount *account;
656 881
665 else 890 else
666 conv2 = gaim_conversation_new(GAIM_CONV_IM, account, who); 891 conv2 = gaim_conversation_new(GAIM_CONV_IM, account, who);
667 } 892 }
668 893
669 static void 894 static void
670 menu_info_cb(GtkWidget *w, GaimConversation *conv) 895 menu_chat_info_cb(GtkWidget *w, GaimConversation *conv)
671 { 896 {
672 GaimPluginProtocolInfo *prpl_info = NULL; 897 GaimPluginProtocolInfo *prpl_info = NULL;
673 GaimConnection *gc; 898 GaimConnection *gc;
674 char *who; 899 char *who;
675 900
689 prpl_info->get_info(gc, who); 914 prpl_info->get_info(gc, who);
690 } 915 }
691 } 916 }
692 917
693 static void 918 static void
694 menu_away_cb(GtkWidget *w, GaimConversation *conv) 919 menu_chat_get_away_cb(GtkWidget *w, GaimConversation *conv)
695 { 920 {
696 GaimPluginProtocolInfo *prpl_info = NULL; 921 GaimPluginProtocolInfo *prpl_info = NULL;
697 GaimConnection *gc; 922 GaimConnection *gc;
698 char *who; 923 char *who;
699 924
711 prpl_info->get_cb_away(gc, gaim_chat_get_id(GAIM_CHAT(conv)), who); 936 prpl_info->get_cb_away(gc, gaim_chat_get_id(GAIM_CHAT(conv)), who);
712 } 937 }
713 } 938 }
714 939
715 static void 940 static void
716 menu_add_cb(GtkWidget *w, GaimConversation *conv) 941 menu_chat_add_cb(GtkWidget *w, GaimConversation *conv)
717 { 942 {
718 GaimConnection *gc; 943 GaimConnection *gc;
719 struct buddy *b; 944 struct buddy *b;
720 char *name; 945 char *name;
721 946
795 1020
796 menu = gtk_menu_new(); 1021 menu = gtk_menu_new();
797 1022
798 button = gtk_menu_item_new_with_label(_("IM")); 1023 button = gtk_menu_item_new_with_label(_("IM"));
799 g_signal_connect(G_OBJECT(button), "activate", 1024 g_signal_connect(G_OBJECT(button), "activate",
800 G_CALLBACK(menu_im_cb), conv); 1025 G_CALLBACK(menu_chat_im_cb), conv);
801 g_object_set_data(G_OBJECT(button), "user_data", who); 1026 g_object_set_data(G_OBJECT(button), "user_data", who);
802 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); 1027 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button);
803 gtk_widget_show(button); 1028 gtk_widget_show(button);
804 1029
805 if (gaim_chat_is_user_ignored(GAIM_CHAT(conv), who)) 1030 if (gaim_chat_is_user_ignored(GAIM_CHAT(conv), who))
814 gtk_widget_show(button); 1039 gtk_widget_show(button);
815 1040
816 if (gc && prpl_info->get_info) { 1041 if (gc && prpl_info->get_info) {
817 button = gtk_menu_item_new_with_label(_("Info")); 1042 button = gtk_menu_item_new_with_label(_("Info"));
818 g_signal_connect(G_OBJECT(button), "activate", 1043 g_signal_connect(G_OBJECT(button), "activate",
819 G_CALLBACK(menu_info_cb), conv); 1044 G_CALLBACK(menu_chat_info_cb), conv);
820 g_object_set_data(G_OBJECT(button), "user_data", who); 1045 g_object_set_data(G_OBJECT(button), "user_data", who);
821 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); 1046 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button);
822 gtk_widget_show(button); 1047 gtk_widget_show(button);
823 } 1048 }
824 1049
825 if (gc && prpl_info->get_cb_away) { 1050 if (gc && prpl_info->get_cb_away) {
826 button = gtk_menu_item_new_with_label(_("Get Away Msg")); 1051 button = gtk_menu_item_new_with_label(_("Get Away Msg"));
827 g_signal_connect(G_OBJECT(button), "activate", 1052 g_signal_connect(G_OBJECT(button), "activate",
828 G_CALLBACK(menu_away_cb), conv); 1053 G_CALLBACK(menu_chat_get_away_cb), conv);
829 g_object_set_data(G_OBJECT(button), "user_data", who); 1054 g_object_set_data(G_OBJECT(button), "user_data", who);
830 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); 1055 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button);
831 gtk_widget_show(button); 1056 gtk_widget_show(button);
832 } 1057 }
833 1058
837 button = gtk_menu_item_new_with_label(_("Remove")); 1062 button = gtk_menu_item_new_with_label(_("Remove"));
838 else 1063 else
839 button = gtk_menu_item_new_with_label(_("Add")); 1064 button = gtk_menu_item_new_with_label(_("Add"));
840 1065
841 g_signal_connect(G_OBJECT(button), "activate", 1066 g_signal_connect(G_OBJECT(button), "activate",
842 G_CALLBACK(menu_add_cb), conv); 1067 G_CALLBACK(menu_chat_add_cb), conv);
843 1068
844 g_object_set_data(G_OBJECT(button), "user_data", who); 1069 g_object_set_data(G_OBJECT(button), "user_data", who);
845 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); 1070 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button);
846 gtk_widget_show(button); 1071 gtk_widget_show(button);
847 } 1072 }
850 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 1075 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
851 event->button, event->time); 1076 event->button, event->time);
852 } 1077 }
853 1078
854 return TRUE; 1079 return TRUE;
855 }
856
857 static void
858 do_invite(GtkWidget *w, int resp, InviteBuddyInfo *info)
859 {
860 const char *buddy, *message;
861 GaimGtkConversation *gtkconv;
862
863 gtkconv = GAIM_GTK_CONVERSATION(info->conv);
864
865 if (resp == GTK_RESPONSE_OK) {
866 buddy = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(info->entry)->entry));
867 message = gtk_entry_get_text(GTK_ENTRY(info->message));
868
869 if (!g_ascii_strcasecmp(buddy, "")) {
870 g_free(info);
871
872 return;
873 }
874
875 serv_chat_invite(gaim_conversation_get_gc(info->conv),
876 gaim_chat_get_id(GAIM_CHAT(info->conv)),
877 message, buddy);
878 }
879
880 gtk_widget_destroy(invite_dialog);
881 invite_dialog = NULL;
882
883 g_free(info);
884 }
885
886 static void
887 invite_cb(GtkWidget *widget, GaimConversation *conv)
888 {
889 InviteBuddyInfo *info = NULL;
890
891 if (invite_dialog == NULL) {
892 GaimConnection *gc;
893 GaimWindow *win;
894 GaimGtkWindow *gtkwin;
895 GtkWidget *label;
896 GtkWidget *vbox, *hbox;
897 GtkWidget *table;
898 GtkWidget *img;
899
900 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
901
902 info = g_new0(InviteBuddyInfo, 1);
903 info->conv = conv;
904
905 gc = gaim_conversation_get_gc(conv);
906 win = gaim_conversation_get_window(conv);
907 gtkwin = GAIM_GTK_WINDOW(win);
908
909 /* Create the new dialog. */
910 invite_dialog = gtk_dialog_new_with_buttons(
911 _("Gaim - Invite Buddy Into Chat Room"),
912 GTK_WINDOW(gtkwin->window),
913 GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
914 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
915
916 gtk_dialog_set_default_response(GTK_DIALOG(invite_dialog),
917 GTK_RESPONSE_OK);
918 gtk_container_set_border_width(GTK_CONTAINER(invite_dialog), 6);
919 gtk_window_set_resizable(GTK_WINDOW(invite_dialog), FALSE);
920 gtk_dialog_set_has_separator(GTK_DIALOG(invite_dialog), FALSE);
921
922 /* Setup the outside spacing. */
923 vbox = GTK_DIALOG(invite_dialog)->vbox;
924
925 gtk_box_set_spacing(GTK_BOX(vbox), 12);
926 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
927
928 /* Setup the inner hbox and put the dialog's icon in it. */
929 hbox = gtk_hbox_new(FALSE, 12);
930 gtk_container_add(GTK_CONTAINER(vbox), hbox);
931 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
932 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
933
934 /* Setup the right vbox. */
935 vbox = gtk_vbox_new(FALSE, 0);
936 gtk_container_add(GTK_CONTAINER(hbox), vbox);
937
938 /* Put our happy label in it. */
939 label = gtk_label_new(_("Please enter the name of the user you wish "
940 "to invite, along with an optional invite "
941 "message."));
942 gtk_widget_set_size_request(label, 350, -1);
943 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
944 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
945 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
946
947 /* hbox for the table, and to give it some spacing on the left. */
948 hbox = gtk_hbox_new(FALSE, 6);
949 gtk_container_add(GTK_CONTAINER(vbox), hbox);
950
951 /* Setup the table we're going to use to lay stuff out. */
952 table = gtk_table_new(2, 2, FALSE);
953 gtk_table_set_row_spacings(GTK_TABLE(table), 6);
954 gtk_table_set_col_spacings(GTK_TABLE(table), 6);
955 gtk_container_set_border_width(GTK_CONTAINER(table), 12);
956 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
957
958 /* Now the Buddy label */
959 label = gtk_label_new(NULL);
960 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Buddy:"));
961 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
962 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
963
964 /* Now the Buddy drop-down entry field. */
965 info->entry = gtk_combo_new();
966 gtk_combo_set_case_sensitive(GTK_COMBO(info->entry), FALSE);
967 gtk_entry_set_activates_default(
968 GTK_ENTRY(GTK_COMBO(info->entry)->entry), TRUE);
969
970 gtk_table_attach_defaults(GTK_TABLE(table), info->entry, 1, 2, 0, 1);
971 gtk_label_set_mnemonic_widget(GTK_LABEL(label), info->entry);
972
973 /* Fill in the names. */
974 gtk_combo_set_popdown_strings(GTK_COMBO(info->entry),
975 generate_invite_user_names(gc));
976
977
978 /* Now the label for "Message" */
979 label = gtk_label_new(NULL);
980 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Message:"));
981 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
982 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
983
984
985 /* And finally, the Message entry field. */
986 info->message = gtk_entry_new();
987 gtk_entry_set_activates_default(GTK_ENTRY(info->message), TRUE);
988
989 gtk_table_attach_defaults(GTK_TABLE(table), info->message, 1, 2, 1, 2);
990 gtk_label_set_mnemonic_widget(GTK_LABEL(label), info->message);
991
992 /* Connect the signals. */
993 g_signal_connect(G_OBJECT(invite_dialog), "response",
994 G_CALLBACK(do_invite), info);
995 }
996
997 gtk_widget_show_all(invite_dialog);
998
999 if (info != NULL)
1000 gtk_widget_grab_focus(GTK_COMBO(info->entry)->entry);
1001 } 1080 }
1002 1081
1003 static gboolean 1082 static gboolean
1004 entry_key_pressed_cb_2(GtkWidget *entry, GdkEventKey *event, gpointer data) 1083 entry_key_pressed_cb_2(GtkWidget *entry, GdkEventKey *event, gpointer data)
1005 { 1084 {
1778 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); 1857 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl);
1779 } 1858 }
1780 1859
1781 /* Update the menubar */ 1860 /* Update the menubar */
1782 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { 1861 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) {
1783 gtk_widget_set_sensitive(gtkwin->menu.view_log, TRUE); 1862 gtk_widget_show(gtkwin->menu.view_log);
1784 gtk_widget_set_sensitive(gtkwin->menu.insert_image, 1863
1785 (gc && prpl_info->options & OPT_PROTO_IM_IMAGE)); 1864 if (gc && prpl_info->options & OPT_PROTO_IM_IMAGE)
1865 gtk_widget_show(gtkwin->menu.insert_image);
1866 else
1867 gtk_widget_hide(gtkwin->menu.insert_image);
1868
1869 gtk_widget_show(gtkwin->menu.add_pounce);
1870 gtk_widget_show(gtkwin->menu.get_info);
1871 gtk_widget_show(gtkwin->menu.warn);
1872 gtk_widget_show(gtkwin->menu.block);
1873
1874 if (gaim_find_buddy(gaim_conversation_get_account(conv),
1875 gaim_conversation_get_name(conv)) == NULL) {
1876
1877 gtk_widget_show(gtkwin->menu.add);
1878 gtk_widget_hide(gtkwin->menu.remove);
1879 }
1880 else {
1881 gtk_widget_show(gtkwin->menu.remove);
1882 gtk_widget_hide(gtkwin->menu.add);
1883 }
1884
1885 gtk_widget_set_sensitive(gtkwin->menu.add, TRUE);
1886 gtk_widget_set_sensitive(gtkwin->menu.remove, TRUE);
1887
1888 gtk_widget_set_sensitive(gtkwin->menu.alias, TRUE);
1889
1890 gtk_widget_hide(gtkwin->menu.invite);
1786 1891
1787 if (gtkwin->menu.send_as != NULL) 1892 if (gtkwin->menu.send_as != NULL)
1788 g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); 1893 g_timeout_add(0, (GSourceFunc)update_send_as_selection, win);
1789 } 1894 }
1790 else { 1895 else {
1791 gtk_widget_set_sensitive(gtkwin->menu.view_log, FALSE); 1896 gtk_widget_show(gtkwin->menu.invite);
1792 gtk_widget_set_sensitive(gtkwin->menu.insert_image, FALSE); 1897
1898 gtk_widget_hide(gtkwin->menu.view_log);
1899 gtk_widget_hide(gtkwin->menu.insert_image);
1900
1901 gtk_widget_set_sensitive(gtkwin->menu.alias, FALSE);
1902
1903 gtk_widget_hide(gtkwin->menu.add_pounce);
1904 gtk_widget_hide(gtkwin->menu.get_info);
1905 gtk_widget_hide(gtkwin->menu.warn);
1906 gtk_widget_hide(gtkwin->menu.block);
1907
1908 if (gaim_find_chat(gaim_conversation_get_gc(conv),
1909 gaim_chat_get_id(GAIM_CHAT(conv))) == NULL) {
1910
1911 gtk_widget_show(gtkwin->menu.add);
1912 gtk_widget_hide(gtkwin->menu.remove);
1913 }
1914 else {
1915 gtk_widget_show(gtkwin->menu.remove);
1916 gtk_widget_hide(gtkwin->menu.add);
1917 }
1918
1919 gtk_widget_set_sensitive(gtkwin->menu.add, FALSE);
1920 gtk_widget_set_sensitive(gtkwin->menu.remove, FALSE);
1793 1921
1794 if (gtkwin->menu.send_as != NULL) 1922 if (gtkwin->menu.send_as != NULL)
1795 gtk_widget_hide(gtkwin->menu.send_as); 1923 gtk_widget_hide(gtkwin->menu.send_as);
1796 } 1924 }
1797 1925
2562 2690
2563 static GtkItemFactoryEntry menu_items[] = 2691 static GtkItemFactoryEntry menu_items[] =
2564 { 2692 {
2565 /* Conversation menu */ 2693 /* Conversation menu */
2566 { N_("/_Conversation"), NULL, NULL, 0, "<Branch>" }, 2694 { N_("/_Conversation"), NULL, NULL, 0, "<Branch>" },
2695
2567 { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0, 2696 { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0,
2568 "<StockItem>", GTK_STOCK_SAVE_AS }, 2697 "<StockItem>", GTK_STOCK_SAVE_AS },
2569 { N_("/Conversation/View _Log..."), NULL, menu_view_log_cb, 0, NULL }, 2698 { N_("/Conversation/View _Log..."), NULL, menu_view_log_cb, 0, NULL },
2699
2570 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>" }, 2700 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>" },
2701
2571 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, 2702 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb,
2572 0, NULL }, 2703 0, NULL },
2704 { N_("/Conversation/A_lias..."), NULL, menu_alias_cb, 0,
2705 "<StockItem>", GAIM_STOCK_EDIT },
2706 { N_("/Conversation/_Get Info..."), NULL, menu_get_info_cb, 0,
2707 "<StockItem>", GAIM_STOCK_INFO },
2708 { N_("/Conversation/In_vite..."), NULL, menu_invite_cb, 0,
2709 "<StockItem>", GAIM_STOCK_INVITE },
2710
2573 { "/Conversation/sep2", NULL, NULL, 0, "<Separator>" }, 2711 { "/Conversation/sep2", NULL, NULL, 0, "<Separator>" },
2712
2574 { N_("/Conversation/Insert _URL..."), NULL, menu_insert_link_cb, 0, 2713 { N_("/Conversation/Insert _URL..."), NULL, menu_insert_link_cb, 0,
2575 "<StockItem>", GAIM_STOCK_LINK }, 2714 "<StockItem>", GAIM_STOCK_LINK },
2576 { N_("/Conversation/Insert _Image..."), NULL, menu_insert_image_cb, 0, 2715 { N_("/Conversation/Insert _Image..."), NULL, menu_insert_image_cb, 0,
2577 "<StockItem>", GAIM_STOCK_IMAGE }, 2716 "<StockItem>", GAIM_STOCK_IMAGE },
2717
2578 { "/Conversation/sep3", NULL, NULL, 0, "<Separator>" }, 2718 { "/Conversation/sep3", NULL, NULL, 0, "<Separator>" },
2719
2720 { N_("/Conversation/_Warn..."), NULL, menu_warn_cb, 0,
2721 "<StockItem>", GAIM_STOCK_WARN },
2722 { N_("/Conversation/_Block..."), NULL, menu_block_cb, 0,
2723 "<StockItem>", GAIM_STOCK_BLOCK },
2724 { N_("/Conversation/_Add..."), NULL, menu_add_remove_cb, 0,
2725 "<StockItem>", GTK_STOCK_ADD },
2726 { N_("/Conversation/_Remove..."), NULL, menu_add_remove_cb, 0,
2727 "<StockItem>", GTK_STOCK_REMOVE },
2728
2729 { "/Conversation/sep4", NULL, NULL, 0, "<Separator>" },
2730
2579 { N_("/Conversation/_Close"), NULL, menu_close_conv_cb, 0, 2731 { N_("/Conversation/_Close"), NULL, menu_close_conv_cb, 0,
2580 "<StockItem>", GTK_STOCK_CLOSE }, 2732 "<StockItem>", GTK_STOCK_CLOSE },
2581 2733
2582 /* Options */ 2734 /* Options */
2583 { N_("/_Options"), NULL, NULL, 0, "<Branch>" }, 2735 { N_("/_Options"), NULL, NULL, 0, "<Branch>" },
2603 2755
2604 accel_group = gtk_accel_group_new (); 2756 accel_group = gtk_accel_group_new ();
2605 gtk_window_add_accel_group (GTK_WINDOW (gtkwin->window), accel_group); 2757 gtk_window_add_accel_group (GTK_WINDOW (gtkwin->window), accel_group);
2606 g_object_unref (accel_group); 2758 g_object_unref (accel_group);
2607 2759
2608 gtkwin->menu.item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, 2760 gtkwin->menu.item_factory =
2609 "<main>", accel_group); 2761 gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group);
2610 2762
2611 gtk_item_factory_set_translate_func (gtkwin->menu.item_factory, 2763 gtk_item_factory_set_translate_func(gtkwin->menu.item_factory,
2612 item_factory_translate_func, 2764 item_factory_translate_func,
2613 NULL, NULL); 2765 NULL, NULL);
2614 2766
2615 gtk_item_factory_create_items(gtkwin->menu.item_factory, menu_item_count, 2767 gtk_item_factory_create_items(gtkwin->menu.item_factory, menu_item_count,
2616 menu_items, win); 2768 menu_items, win);
2617 2769
2618 gtkwin->menu.menubar = gtk_item_factory_get_widget(gtkwin->menu.item_factory, 2770
2619 "<main>"); 2771 gtkwin->menu.menubar =
2620 gtkwin->menu.view_log = gtk_item_factory_get_widget(gtkwin->menu.item_factory, 2772 gtk_item_factory_get_widget(gtkwin->menu.item_factory, "<main>");
2621 N_("/Conversation/View Log...")); 2773
2622 gtkwin->menu.insert_link = gtk_item_factory_get_widget(gtkwin->menu.item_factory, 2774
2623 N_("/Conversation/Insert URL...")); 2775 gtkwin->menu.view_log =
2624 gtkwin->menu.insert_image = gtk_item_factory_get_widget(gtkwin->menu.item_factory, 2776 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2625 N_("/Conversation/Insert Image...")); 2777 N_("/Conversation/View Log..."));
2626 gtkwin->menu.logging = gtk_item_factory_get_widget(gtkwin->menu.item_factory, 2778 /* --- */
2627 N_("/Options/Enable Logging")); 2779
2628 gtkwin->menu.sounds = gtk_item_factory_get_widget(gtkwin->menu.item_factory, 2780 gtkwin->menu.add_pounce =
2629 N_("/Options/Enable Sounds")); 2781 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2782 N_("/Conversation/Add Buddy Pounce..."));
2783
2784 gtkwin->menu.alias =
2785 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2786 N_("/Conversation/Alias..."));
2787
2788 gtkwin->menu.get_info =
2789 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2790 N_("/Conversation/Get Info..."));
2791
2792 gtkwin->menu.invite =
2793 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2794 N_("/Conversation/Invite..."));
2795
2796 /* --- */
2797
2798 gtkwin->menu.insert_link =
2799 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2800 N_("/Conversation/Insert URL..."));
2801
2802 gtkwin->menu.insert_image =
2803 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2804 N_("/Conversation/Insert Image..."));
2805
2806 /* --- */
2807
2808 gtkwin->menu.warn =
2809 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2810 N_("/Conversation/Warn..."));
2811
2812 gtkwin->menu.block =
2813 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2814 N_("/Conversation/Block..."));
2815
2816 gtkwin->menu.add =
2817 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2818 N_("/Conversation/Add..."));
2819
2820 gtkwin->menu.remove =
2821 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2822 N_("/Conversation/Remove..."));
2823
2824 /* --- */
2825
2826 gtkwin->menu.logging =
2827 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2828 N_("/Options/Enable Logging"));
2829 gtkwin->menu.sounds =
2830 gtk_item_factory_get_widget(gtkwin->menu.item_factory,
2831 N_("/Options/Enable Sounds"));
2630 2832
2631 generate_send_as_items(win, NULL); 2833 generate_send_as_items(win, NULL);
2632 2834
2633 gtk_widget_show(gtkwin->menu.menubar); 2835 gtk_widget_show(gtkwin->menu.menubar);
2634 2836
3792 3994
3793 static void 3995 static void
3794 update_convo_add_button(GaimConversation *conv) 3996 update_convo_add_button(GaimConversation *conv)
3795 { 3997 {
3796 GaimPluginProtocolInfo *prpl_info = NULL; 3998 GaimPluginProtocolInfo *prpl_info = NULL;
3999 GaimWindow *win;
4000 GaimGtkWindow *gtkwin;
3797 GaimGtkConversation *gtkconv; 4001 GaimGtkConversation *gtkconv;
3798 GaimConnection *gc; 4002 GaimConnection *gc;
3799 GaimConversationType type; 4003 GaimConversationType type;
3800 GtkWidget *parent; 4004 GtkWidget *parent;
3801 4005
4006 gc = gaim_conversation_get_gc(conv);
4007 win = gaim_conversation_get_window(conv);
3802 type = gaim_conversation_get_type(conv); 4008 type = gaim_conversation_get_type(conv);
3803 gc = gaim_conversation_get_gc(conv);
3804 gtkconv = GAIM_GTK_CONVERSATION(conv); 4009 gtkconv = GAIM_GTK_CONVERSATION(conv);
4010 gtkwin = GAIM_GTK_WINDOW(win);
3805 parent = gtk_widget_get_parent(gtkconv->u.im->add); 4011 parent = gtk_widget_get_parent(gtkconv->u.im->add);
3806 4012
3807 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); 4013 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl);
3808 4014
3809 if (gaim_find_buddy(gc->account, gaim_conversation_get_name(conv))) { 4015 if (gaim_find_buddy(gc->account, gaim_conversation_get_name(conv))) {
3813 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->u.im->add, 4019 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->u.im->add,
3814 _("Remove the user from your buddy list"), NULL); 4020 _("Remove the user from your buddy list"), NULL);
3815 4021
3816 gtk_widget_set_sensitive(gtkconv->u.im->add, 4022 gtk_widget_set_sensitive(gtkconv->u.im->add,
3817 (gc != NULL && prpl_info->remove_buddy != NULL)); 4023 (gc != NULL && prpl_info->remove_buddy != NULL));
3818 } else { 4024
4025 if (gaim_window_get_active_conversation(win) == conv) {
4026 gtk_widget_show(gtkwin->menu.remove);
4027 gtk_widget_hide(gtkwin->menu.add);
4028 }
4029 }
4030 else {
3819 gtkconv->u.im->add = 4031 gtkconv->u.im->add =
3820 gaim_gtk_change_text(_("Add"), gtkconv->u.im->add, 4032 gaim_gtk_change_text(_("Add"), gtkconv->u.im->add,
3821 GTK_STOCK_ADD, type); 4033 GTK_STOCK_ADD, type);
3822 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->u.im->add, 4034 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->u.im->add,
3823 _("Add the user to your buddy list"), NULL); 4035 _("Add the user to your buddy list"), NULL);
3824 4036
3825 gtk_widget_set_sensitive(gtkconv->u.im->add, 4037 gtk_widget_set_sensitive(gtkconv->u.im->add,
3826 (gc != NULL && prpl_info->add_buddy != NULL)); 4038 (gc != NULL && prpl_info->add_buddy != NULL));
4039
4040 if (gaim_window_get_active_conversation(win) == conv) {
4041 gtk_widget_show(gtkwin->menu.add);
4042 gtk_widget_hide(gtkwin->menu.remove);
4043 }
3827 } 4044 }
3828 4045
3829 g_signal_connect(G_OBJECT(gtkconv->u.im->add), "clicked", 4046 g_signal_connect(G_OBJECT(gtkconv->u.im->add), "clicked",
3830 G_CALLBACK(add_cb), conv); 4047 G_CALLBACK(add_cb), conv);
3831 4048