| 524 |
524 |
| 525 return vbox; |
525 return vbox; |
| 526 } |
526 } |
| 527 |
527 |
| 528 static gpointer |
528 static gpointer |
| 529 aop_option_menu_get_selected(GtkWidget *optmenu) |
529 aop_option_menu_get_selected(GtkWidget *optmenu, GtkWidget **p_item) |
| 530 { |
530 { |
| 531 gpointer data = NULL; |
531 GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); |
| 532 GtkTreeIter iter; |
532 GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu)); |
| 533 |
533 if (p_item) |
| 534 g_return_val_if_fail(optmenu != NULL, NULL); |
534 (*p_item) = item; |
| 535 |
535 return item ? g_object_get_data(G_OBJECT(item), "aop_per_item_data") : NULL; |
| 536 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(optmenu), &iter)) |
|
| 537 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)), &iter, 2, &data, -1); |
|
| 538 |
|
| 539 return data; |
|
| 540 } |
536 } |
| 541 |
537 |
| 542 static void |
538 static void |
| 543 aop_menu_cb(GtkWidget *optmenu, GCallback cb) |
539 aop_menu_cb(GtkWidget *optmenu, GCallback cb) |
| 544 { |
540 { |
| |
541 GtkWidget *item; |
| |
542 gpointer per_item_data; |
| |
543 |
| |
544 per_item_data = aop_option_menu_get_selected(optmenu, &item); |
| |
545 |
| 545 if (cb != NULL) { |
546 if (cb != NULL) { |
| 546 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(optmenu, |
547 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data")); |
| 547 aop_option_menu_get_selected(optmenu), |
548 } |
| 548 g_object_get_data(G_OBJECT(optmenu), "user_data")); |
549 } |
| 549 } |
550 |
| 550 } |
551 static GtkWidget * |
| 551 |
552 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data, const char *data) |
| 552 static void |
553 { |
| 553 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu) |
554 GtkWidget *item; |
| 554 { |
555 GtkWidget *hbox; |
| 555 gtk_combo_box_set_model(GTK_COMBO_BOX(optmenu), new_aop_menu->model); |
556 GtkWidget *image; |
| 556 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), new_aop_menu->default_item); |
557 GtkWidget *label; |
| 557 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free); |
558 |
| |
559 item = gtk_menu_item_new(); |
| |
560 gtk_widget_show(item); |
| |
561 |
| |
562 hbox = gtk_hbox_new(FALSE, 4); |
| |
563 gtk_widget_show(hbox); |
| |
564 |
| |
565 /* Create the image */ |
| |
566 if (pixbuf == NULL) |
| |
567 image = gtk_image_new(); |
| |
568 else |
| |
569 image = gtk_image_new_from_pixbuf(pixbuf); |
| |
570 gtk_widget_show(image); |
| |
571 |
| |
572 if (sg) |
| |
573 gtk_size_group_add_widget(sg, image); |
| |
574 |
| |
575 /* Create the label */ |
| |
576 label = gtk_label_new (lbl); |
| |
577 gtk_widget_show (label); |
| |
578 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); |
| |
579 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); |
| |
580 |
| |
581 gtk_container_add(GTK_CONTAINER(item), hbox); |
| |
582 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); |
| |
583 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); |
| |
584 |
| |
585 g_object_set_data(G_OBJECT (item), data, per_item_data); |
| |
586 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data); |
| |
587 |
| |
588 pidgin_set_accessible_label(item, label); |
| |
589 |
| |
590 return item; |
| 558 } |
591 } |
| 559 |
592 |
| 560 static GdkPixbuf * |
593 static GdkPixbuf * |
| 561 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account) |
594 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account) |
| 562 { |
595 { |
| 593 } |
626 } |
| 594 |
627 |
| 595 static GtkWidget * |
628 static GtkWidget * |
| 596 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) |
629 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) |
| 597 { |
630 { |
| 598 GtkWidget *optmenu = NULL; |
631 GtkWidget *optmenu; |
| 599 GtkCellRenderer *cr = NULL; |
632 |
| 600 |
633 optmenu = gtk_option_menu_new(); |
| 601 optmenu = gtk_combo_box_new(); |
|
| 602 gtk_widget_show(optmenu); |
634 gtk_widget_show(optmenu); |
| 603 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_pixbuf_new(), FALSE); |
635 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), aop_menu->menu); |
| 604 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "pixbuf", 0); |
636 |
| 605 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_text_new(), TRUE); |
637 if (aop_menu->default_item != -1) |
| 606 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "text", 1); |
638 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), aop_menu->default_item); |
| 607 |
639 |
| 608 aop_option_menu_replace_menu(optmenu, aop_menu); |
640 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", aop_menu, (GDestroyNotify)g_free); |
| 609 if (aop_menu->default_item == -1) |
|
| 610 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), 0); |
|
| 611 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); |
641 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); |
| 612 |
642 |
| 613 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb); |
643 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb); |
| 614 |
644 |
| 615 return optmenu; |
645 return optmenu; |
| |
646 } |
| |
647 |
| |
648 static void |
| |
649 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu) |
| |
650 { |
| |
651 if (gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu))) |
| |
652 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu)); |
| |
653 |
| |
654 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), new_aop_menu->menu); |
| |
655 |
| |
656 if (new_aop_menu->default_item != -1) |
| |
657 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), new_aop_menu->default_item); |
| |
658 |
| |
659 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free); |
| 616 } |
660 } |
| 617 |
661 |
| 618 static void |
662 static void |
| 619 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data) |
663 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data) |
| 620 { |
664 { |
| 621 GtkTreeModel *model; |
665 guint idx; |
| 622 GtkTreeIter iter; |
666 GList *llItr = NULL; |
| 623 gpointer iter_data; |
667 |
| 624 model = gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)); |
668 for (idx = 0, llItr = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))->children; |
| 625 if (gtk_tree_model_get_iter_first(model, &iter)) { |
669 llItr != NULL; |
| 626 do { |
670 llItr = llItr->next, idx++) { |
| 627 gtk_tree_model_get(model, &iter, 2, &iter_data, -1); |
671 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) { |
| 628 if (iter_data == data) { |
672 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); |
| 629 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(optmenu), &iter); |
673 break; |
| 630 return; |
674 } |
| 631 } |
|
| 632 } while (gtk_tree_model_iter_next(model, &iter)); |
|
| 633 } |
675 } |
| 634 } |
676 } |
| 635 |
677 |
| 636 static AopMenu * |
678 static AopMenu * |
| 637 create_protocols_menu(const char *default_proto_id) |
679 create_protocols_menu(const char *default_proto_id) |
| 638 { |
680 { |
| 639 AopMenu *aop_menu = NULL; |
681 AopMenu *aop_menu = NULL; |
| 640 PurplePlugin *plugin; |
682 PurplePlugin *plugin; |
| 641 GdkPixbuf *pixbuf = NULL; |
683 GdkPixbuf *pixbuf = NULL; |
| 642 GtkTreeIter iter; |
684 GtkSizeGroup *sg; |
| 643 GtkListStore *ls; |
|
| 644 GList *p; |
685 GList *p; |
| 645 const char *gtalk_name = NULL, *facebook_name = NULL; |
686 const char *gtalk_name = NULL, *facebook_name = NULL; |
| 646 int i; |
687 int i; |
| 647 |
688 |
| 648 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); |
|
| 649 |
|
| 650 aop_menu = g_malloc0(sizeof(AopMenu)); |
689 aop_menu = g_malloc0(sizeof(AopMenu)); |
| 651 aop_menu->default_item = -1; |
690 aop_menu->default_item = -1; |
| 652 aop_menu->model = GTK_TREE_MODEL(ls); |
691 aop_menu->menu = gtk_menu_new(); |
| |
692 gtk_widget_show(aop_menu->menu); |
| |
693 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
| 653 |
694 |
| 654 if (purple_find_prpl("prpl-jabber")) { |
695 if (purple_find_prpl("prpl-jabber")) { |
| 655 gtalk_name = _("Google Talk"); |
696 gtalk_name = _("Google Talk"); |
| 656 facebook_name = _("Facebook (XMPP)"); |
697 facebook_name = _("Facebook (XMPP)"); |
| 657 } |
698 } |
| 663 plugin = (PurplePlugin *)p->data; |
704 plugin = (PurplePlugin *)p->data; |
| 664 |
705 |
| 665 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { |
706 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { |
| 666 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
707 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
| 667 "16", "google-talk.png", NULL); |
708 "16", "google-talk.png", NULL); |
| |
709 GtkWidget *item; |
| |
710 |
| 668 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
711 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
| 669 g_free(filename); |
712 g_free(filename); |
| 670 |
713 |
| 671 gtk_list_store_append(ls, &iter); |
714 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
| 672 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, gtalk_name, 2, "prpl-jabber", -1); |
715 item = aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber", "protocol")); |
| |
716 g_object_set_data(G_OBJECT(item), "fakegoogle", GINT_TO_POINTER(1)); |
| 673 |
717 |
| 674 if (pixbuf) |
718 if (pixbuf) |
| 675 g_object_unref(pixbuf); |
719 g_object_unref(pixbuf); |
| 676 |
720 |
| 677 gtalk_name = NULL; |
721 gtalk_name = NULL; |
| 684 GtkWidget *item; |
728 GtkWidget *item; |
| 685 |
729 |
| 686 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
730 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
| 687 g_free(filename); |
731 g_free(filename); |
| 688 |
732 |
| 689 gtk_list_store_append(ls, &iter); |
733 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
| 690 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, facebook_name, 2, "prpl-jabber", -1); |
734 item = aop_menu_item_new(sg, pixbuf, facebook_name, "prpl-jabber", "protocol")); |
| |
735 g_object_set_data(G_OBJECT(item), "fakefacebook", GINT_TO_POINTER(1)); |
| 691 |
736 |
| 692 if (pixbuf) |
737 if (pixbuf) |
| 693 g_object_unref(pixbuf); |
738 g_object_unref(pixbuf); |
| 694 |
739 |
| 695 facebook_name = NULL; |
740 facebook_name = NULL; |
| 696 i++; |
741 i++; |
| 697 } |
742 } |
| 698 |
743 |
| 699 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); |
744 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); |
| 700 |
745 |
| 701 gtk_list_store_append(ls, &iter); |
746 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
| 702 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, plugin->info->name, 2, plugin->info->id, -1); |
747 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id, "protocol")); |
| 703 |
748 |
| 704 if (pixbuf) |
749 if (pixbuf) |
| 705 g_object_unref(pixbuf); |
750 g_object_unref(pixbuf); |
| 706 |
751 |
| 707 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) |
752 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) |
| 708 aop_menu->default_item = i; |
753 aop_menu->default_item = i; |
| 709 } |
754 } |
| |
755 |
| |
756 g_object_unref(sg); |
| |
757 |
| 710 return aop_menu; |
758 return aop_menu; |
| 711 } |
759 } |
| 712 |
760 |
| 713 GtkWidget * |
761 GtkWidget * |
| 714 pidgin_protocol_option_menu_new(const char *id, GCallback cb, |
762 pidgin_protocol_option_menu_new(const char *id, GCallback cb, |
| 736 AopMenu *aop_menu = NULL; |
784 AopMenu *aop_menu = NULL; |
| 737 PurpleAccount *account; |
785 PurpleAccount *account; |
| 738 GdkPixbuf *pixbuf = NULL; |
786 GdkPixbuf *pixbuf = NULL; |
| 739 GList *list; |
787 GList *list; |
| 740 GList *p; |
788 GList *p; |
| 741 GtkListStore *ls; |
789 GtkSizeGroup *sg; |
| 742 GtkTreeIter iter; |
|
| 743 int i; |
790 int i; |
| 744 char buf[256]; |
791 char buf[256]; |
| 745 |
792 |
| 746 if (show_all) |
793 if (show_all) |
| 747 list = purple_accounts_get_all(); |
794 list = purple_accounts_get_all(); |
| 748 else |
795 else |
| 749 list = purple_connections_get_all(); |
796 list = purple_connections_get_all(); |
| 750 |
797 |
| 751 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); |
|
| 752 |
|
| 753 aop_menu = g_malloc0(sizeof(AopMenu)); |
798 aop_menu = g_malloc0(sizeof(AopMenu)); |
| 754 aop_menu->default_item = -1; |
799 aop_menu->default_item = -1; |
| 755 aop_menu->model = GTK_TREE_MODEL(ls); |
800 aop_menu->menu = gtk_menu_new(); |
| |
801 gtk_widget_show(aop_menu->menu); |
| |
802 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
| 756 |
803 |
| 757 for (p = list, i = 0; p != NULL; p = p->next, i++) { |
804 for (p = list, i = 0; p != NULL; p = p->next, i++) { |
| 758 if (show_all) |
805 if (show_all) |
| 759 account = (PurpleAccount *)p->data; |
806 account = (PurpleAccount *)p->data; |
| 760 else { |
807 else { |
| 785 g_snprintf(buf, sizeof(buf), "%s (%s)", |
832 g_snprintf(buf, sizeof(buf), "%s (%s)", |
| 786 purple_account_get_username(account), |
833 purple_account_get_username(account), |
| 787 purple_account_get_protocol_name(account)); |
834 purple_account_get_protocol_name(account)); |
| 788 } |
835 } |
| 789 |
836 |
| 790 gtk_list_store_append(ls, &iter); |
837 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
| 791 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, buf, 2, account, -1); |
838 aop_menu_item_new(sg, pixbuf, buf, account, "account")); |
| 792 |
839 |
| 793 if (pixbuf) |
840 if (pixbuf) |
| 794 g_object_unref(pixbuf); |
841 g_object_unref(pixbuf); |
| 795 |
842 |
| 796 if (default_account && account == default_account) |
843 if (default_account && account == default_account) |
| 797 aop_menu->default_item = i; |
844 aop_menu->default_item = i; |
| 798 } |
845 } |
| |
846 |
| |
847 g_object_unref(sg); |
| |
848 |
| 799 return aop_menu; |
849 return aop_menu; |
| 800 } |
850 } |
| 801 |
851 |
| 802 static void |
852 static void |
| 803 regenerate_account_menu(GtkWidget *optmenu) |
853 regenerate_account_menu(GtkWidget *optmenu) |
| 804 { |
854 { |
| 805 gboolean show_all; |
855 gboolean show_all; |
| 806 PurpleAccount *account; |
856 PurpleAccount *account; |
| 807 PurpleFilterAccountFunc filter_func; |
857 PurpleFilterAccountFunc filter_func; |
| 808 |
858 |
| 809 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu); |
859 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); |
| 810 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all")); |
860 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all")); |
| 811 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func"); |
861 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func"); |
| 812 |
862 |
| 813 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all)); |
863 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all)); |
| 814 } |
864 } |
| 872 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); |
922 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); |
| 873 g_object_set_data(G_OBJECT(optmenu), "show_all", GINT_TO_POINTER(show_all)); |
923 g_object_set_data(G_OBJECT(optmenu), "show_all", GINT_TO_POINTER(show_all)); |
| 874 g_object_set_data(G_OBJECT(optmenu), "filter_func", filter_func); |
924 g_object_set_data(G_OBJECT(optmenu), "filter_func", filter_func); |
| 875 |
925 |
| 876 return optmenu; |
926 return optmenu; |
| |
927 } |
| |
928 |
| |
929 gboolean |
| |
930 pidgin_check_if_dir(const char *path, GtkFileSelection *filesel) |
| |
931 { |
| |
932 char *dirname = NULL; |
| |
933 |
| |
934 if (g_file_test(path, G_FILE_TEST_IS_DIR)) { |
| |
935 /* append a / if needed */ |
| |
936 if (path[strlen(path) - 1] != G_DIR_SEPARATOR) { |
| |
937 dirname = g_strconcat(path, G_DIR_SEPARATOR_S, NULL); |
| |
938 } |
| |
939 gtk_file_selection_set_filename(filesel, (dirname != NULL) ? dirname : path); |
| |
940 g_free(dirname); |
| |
941 return TRUE; |
| |
942 } |
| |
943 |
| |
944 return FALSE; |
| 877 } |
945 } |
| 878 |
946 |
| 879 void |
947 void |
| 880 pidgin_setup_gtkspell(GtkTextView *textview) |
948 pidgin_setup_gtkspell(GtkTextView *textview) |
| 881 { |
949 { |