| 671 |
671 |
| 672 #ifdef NEW_STYLE_COMPLETION |
672 #ifdef NEW_STYLE_COMPLETION |
| 673 names = g_list_append(names, ((GaimContact *)cnode)->alias); |
673 names = g_list_append(names, ((GaimContact *)cnode)->alias); |
| 674 names = g_list_append(names, |
674 names = g_list_append(names, |
| 675 (gpointer)gaim_buddy_get_contact_alias(buddy)); |
675 (gpointer)gaim_buddy_get_contact_alias(buddy)); |
| |
676 names = g_list_append(names, buddy->account); |
| 676 #endif /* NEW_STYLE_COMPLETION */ |
677 #endif /* NEW_STYLE_COMPLETION */ |
| 677 |
678 |
| 678 names = g_list_append(names, buddy->name); |
679 names = g_list_append(names, buddy->name); |
| 679 } |
680 } |
| 680 } |
681 } |
| 803 |
804 |
| 804 return ret; |
805 return ret; |
| 805 } |
806 } |
| 806 |
807 |
| 807 static gboolean screenname_completion_match_selected_cb(GtkEntryCompletion *completion, |
808 static gboolean screenname_completion_match_selected_cb(GtkEntryCompletion *completion, |
| 808 GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { |
809 GtkTreeModel *model, GtkTreeIter *iter, gpointer *user_data) { |
| 809 |
810 |
| 810 GValue val = { 0, }; |
811 GValue val = { 0, }; |
| |
812 GaimRequestField *screen_field = user_data[1]; |
| |
813 GList *fields = screen_field->group->fields; |
| 811 |
814 |
| 812 gtk_tree_model_get_value(model, iter, 1, &val); |
815 gtk_tree_model_get_value(model, iter, 1, &val); |
| 813 gtk_entry_set_text(GTK_ENTRY(user_data), g_value_get_string(&val)); |
816 gtk_entry_set_text(GTK_ENTRY(user_data[0]), g_value_get_string(&val)); |
| 814 g_value_unset(&val); |
817 g_value_unset(&val); |
| |
818 |
| |
819 do { |
| |
820 GaimRequestField *field = fields->data; |
| |
821 |
| |
822 if (gaim_request_field_get_type(field) == GAIM_REQUEST_FIELD_ACCOUNT) { |
| |
823 const char *type_hint = gaim_request_field_get_type_hint(field); |
| |
824 |
| |
825 if (type_hint != NULL && !strcmp(type_hint, "account")) { |
| |
826 /* We found the corresponding account field. */ |
| |
827 GaimAccount *account; |
| |
828 GtkOptionMenu *optmenu = GTK_OPTION_MENU(field->ui_data); |
| |
829 |
| |
830 gtk_tree_model_get_value(model, iter, 3, &val); |
| |
831 account = g_value_get_pointer(&val); |
| |
832 g_value_unset(&val); |
| |
833 |
| |
834 /* Set the account in the request API. */ |
| |
835 gaim_request_field_account_set_value(field, account); |
| |
836 |
| |
837 if (optmenu != NULL) { |
| |
838 GList *items = GTK_MENU_SHELL(gtk_option_menu_get_menu(optmenu))->children; |
| |
839 guint index = 0; |
| |
840 |
| |
841 do { |
| |
842 if (account == g_object_get_data(G_OBJECT(items->data), "account")) { |
| |
843 /* Set the account in the GUI. */ |
| |
844 |
| |
845 gtk_option_menu_set_history(GTK_OPTION_MENU(field->ui_data), index); |
| |
846 return TRUE; |
| |
847 } |
| |
848 index++; |
| |
849 } while ((items = items->next) != NULL); |
| |
850 } |
| |
851 |
| |
852 return TRUE; |
| |
853 } |
| |
854 } |
| |
855 |
| |
856 } while ((fields = fields->next) != NULL); |
| 815 |
857 |
| 816 return TRUE; |
858 return TRUE; |
| 817 } |
859 } |
| 818 #endif /* !NEW_STYLE_COMPLETION */ |
860 #endif /* !NEW_STYLE_COMPLETION */ |
| 819 |
861 |
| 822 { |
864 { |
| 823 #ifdef NEW_STYLE_COMPLETION |
865 #ifdef NEW_STYLE_COMPLETION |
| 824 GtkListStore *store; |
866 GtkListStore *store; |
| 825 GtkTreeIter iter; |
867 GtkTreeIter iter; |
| 826 GtkEntryCompletion *completion; |
868 GtkEntryCompletion *completion; |
| 827 GList *aliases_and_screennames, *l; |
869 GList *aliases_and_screennames; |
| |
870 GList *l; |
| |
871 gpointer *data; |
| 828 |
872 |
| 829 /* Store the displayed completion value, the screenname, and the value for comparison. */ |
873 /* Store the displayed completion value, the screenname, and the value for comparison. */ |
| 830 store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); |
874 store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); |
| 831 |
875 |
| 832 aliases_and_screennames = get_online_names(); |
876 aliases_and_screennames = get_online_names(); |
| 833 |
877 |
| 834 /* Loop through the list three elements at a time. */ |
878 /* Loop through the list four elements at a time. */ |
| 835 for (l = aliases_and_screennames; l != NULL; l = l->next->next->next) |
879 for (l = aliases_and_screennames; l != NULL; l = l->next->next->next->next) |
| 836 { |
880 { |
| 837 char *contact_alias = l->data; |
881 char *contact_alias = l->data; |
| 838 char *buddy_alias = l->next->data; |
882 char *buddy_alias = l->next->data; |
| 839 char *screenname = l->next->next->data; |
883 GaimAccount *account = l->next->next->data; |
| |
884 char *screenname = l->next->next->next->data; |
| 840 gboolean completion_added = FALSE; |
885 gboolean completion_added = FALSE; |
| 841 |
886 |
| 842 /* There's no sense listing things like: 'xxx "xxx"' |
887 /* There's no sense listing things like: 'xxx "xxx"' |
| 843 when the screenname and buddy alias match. */ |
888 when the screenname and buddy alias match. */ |
| 844 if (buddy_alias && strcmp(buddy_alias, screenname)) { |
889 if (buddy_alias && strcmp(buddy_alias, screenname)) { |
| 846 gtk_list_store_append(store, &iter); |
891 gtk_list_store_append(store, &iter); |
| 847 gtk_list_store_set(store, &iter, |
892 gtk_list_store_set(store, &iter, |
| 848 0, completion_entry, |
893 0, completion_entry, |
| 849 1, screenname, |
894 1, screenname, |
| 850 2, buddy_alias, |
895 2, buddy_alias, |
| |
896 3, account, |
| 851 -1); |
897 -1); |
| 852 g_free(completion_entry); |
898 g_free(completion_entry); |
| 853 completion_added = TRUE; |
899 completion_added = TRUE; |
| 854 } |
900 } |
| 855 |
901 |
| 863 gtk_list_store_append(store, &iter); |
909 gtk_list_store_append(store, &iter); |
| 864 gtk_list_store_set(store, &iter, |
910 gtk_list_store_set(store, &iter, |
| 865 0, completion_entry, |
911 0, completion_entry, |
| 866 1, screenname, |
912 1, screenname, |
| 867 2, contact_alias, |
913 2, contact_alias, |
| |
914 3, account, |
| 868 -1); |
915 -1); |
| 869 g_free(completion_entry); |
916 g_free(completion_entry); |
| 870 completion_added = TRUE; |
917 completion_added = TRUE; |
| 871 } |
918 } |
| 872 } |
919 } |
| 876 gtk_list_store_append(store, &iter); |
923 gtk_list_store_append(store, &iter); |
| 877 gtk_list_store_set(store, &iter, |
924 gtk_list_store_set(store, &iter, |
| 878 0, screenname, |
925 0, screenname, |
| 879 1, screenname, |
926 1, screenname, |
| 880 2, NULL, |
927 2, NULL, |
| |
928 3, account, |
| 881 -1); |
929 -1); |
| 882 } |
930 } |
| 883 } |
931 } |
| 884 |
932 |
| 885 g_list_free(aliases_and_screennames); |
933 g_list_free(aliases_and_screennames); |
| 886 |
934 |
| 887 completion = gtk_entry_completion_new(); |
935 completion = gtk_entry_completion_new(); |
| 888 gtk_entry_completion_set_match_func(completion, screenname_completion_match_func, NULL, NULL); |
936 gtk_entry_completion_set_match_func(completion, screenname_completion_match_func, NULL, NULL); |
| |
937 |
| |
938 data = g_new0(gpointer, 2); |
| |
939 data[0] = entry; |
| |
940 data[1] = field; |
| 889 g_signal_connect(G_OBJECT(completion), "match-selected", |
941 g_signal_connect(G_OBJECT(completion), "match-selected", |
| 890 G_CALLBACK(screenname_completion_match_selected_cb), entry); |
942 G_CALLBACK(screenname_completion_match_selected_cb), data); |
| |
943 |
| 891 gtk_entry_set_completion(GTK_ENTRY(entry), completion); |
944 gtk_entry_set_completion(GTK_ENTRY(entry), completion); |
| 892 g_object_unref(completion); |
945 g_object_unref(completion); |
| 893 |
946 |
| 894 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store)); |
947 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store)); |
| 895 g_object_unref(store); |
948 g_object_unref(store); |