comparison pidgin/gtkutils.c @ 32706:b8a6a07aa5b0

Make code a bit more verbose, and remove some "magic numbers".
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Thu, 29 Dec 2011 04:47:14 +0000
parents b961222cf067
children c7de9dc7c5b3
comparison
equal deleted inserted replaced
32705:ef4ffed09e49 32706:b8a6a07aa5b0
73 #if !GTK_CHECK_VERSION(2,18,0) 73 #if !GTK_CHECK_VERSION(2,18,0)
74 #define gtk_widget_get_visible(x) GTK_WIDGET_VISIBLE(x) 74 #define gtk_widget_get_visible(x) GTK_WIDGET_VISIBLE(x)
75 #define gtk_widget_is_sensitive(x) GTK_WIDGET_IS_SENSITIVE(x) 75 #define gtk_widget_is_sensitive(x) GTK_WIDGET_IS_SENSITIVE(x)
76 #endif 76 #endif
77 77
78 enum {
79 AOP_ICON_COLUMN,
80 AOP_NAME_COLUMN,
81 AOP_DATA_COLUMN,
82 AOP_COLUMN_COUNT
83 };
84
78 typedef struct { 85 typedef struct {
79 GtkTreeModel *model; 86 GtkTreeModel *model;
80 gint default_item; 87 gint default_item;
81 } AopMenu; 88 } AopMenu;
82 89
597 GtkTreeIter iter; 604 GtkTreeIter iter;
598 605
599 g_return_val_if_fail(optmenu != NULL, NULL); 606 g_return_val_if_fail(optmenu != NULL, NULL);
600 607
601 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(optmenu), &iter)) 608 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(optmenu), &iter))
602 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)), &iter, 2, &data, -1); 609 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)),
610 &iter, AOP_DATA_COLUMN, &data, -1);
603 611
604 return data; 612 return data;
605 } 613 }
606 614
607 static void 615 static void
664 GtkCellRenderer *cr = NULL; 672 GtkCellRenderer *cr = NULL;
665 673
666 optmenu = gtk_combo_box_new(); 674 optmenu = gtk_combo_box_new();
667 gtk_widget_show(optmenu); 675 gtk_widget_show(optmenu);
668 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_pixbuf_new(), FALSE); 676 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_pixbuf_new(), FALSE);
669 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "pixbuf", 0); 677 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "pixbuf", AOP_ICON_COLUMN);
670 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_text_new(), TRUE); 678 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_text_new(), TRUE);
671 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "text", 1); 679 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "text", AOP_NAME_COLUMN);
672 680
673 aop_option_menu_replace_menu(optmenu, aop_menu); 681 aop_option_menu_replace_menu(optmenu, aop_menu);
674 if (aop_menu->default_item == -1) 682 if (aop_menu->default_item == -1)
675 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), 0); 683 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), 0);
676 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); 684 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data);
707 GtkTreeIter iter; 715 GtkTreeIter iter;
708 GtkListStore *ls; 716 GtkListStore *ls;
709 GList *p; 717 GList *p;
710 int i; 718 int i;
711 719
712 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); 720 ls = gtk_list_store_new(AOP_COLUMN_COUNT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
713 721
714 aop_menu = g_malloc0(sizeof(AopMenu)); 722 aop_menu = g_malloc0(sizeof(AopMenu));
715 aop_menu->default_item = -1; 723 aop_menu->default_item = -1;
716 aop_menu->model = GTK_TREE_MODEL(ls); 724 aop_menu->model = GTK_TREE_MODEL(ls);
717 725
722 plugin = (PurplePlugin *)p->data; 730 plugin = (PurplePlugin *)p->data;
723 731
724 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); 732 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL);
725 733
726 gtk_list_store_append(ls, &iter); 734 gtk_list_store_append(ls, &iter);
727 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, plugin->info->name, 2, plugin->info->id, -1); 735 gtk_list_store_set(ls, &iter,
736 AOP_ICON_COLUMN, pixbuf,
737 AOP_NAME_COLUMN, plugin->info->name,
738 AOP_DATA_COLUMN, plugin->info->id,
739 -1);
728 740
729 if (pixbuf) 741 if (pixbuf)
730 g_object_unref(pixbuf); 742 g_object_unref(pixbuf);
731 743
732 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) 744 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id))
771 if (show_all) 783 if (show_all)
772 list = purple_accounts_get_all(); 784 list = purple_accounts_get_all();
773 else 785 else
774 list = purple_connections_get_all(); 786 list = purple_connections_get_all();
775 787
776 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); 788 ls = gtk_list_store_new(AOP_COLUMN_COUNT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
777 789
778 aop_menu = g_malloc0(sizeof(AopMenu)); 790 aop_menu = g_malloc0(sizeof(AopMenu));
779 aop_menu->default_item = -1; 791 aop_menu->default_item = -1;
780 aop_menu->model = GTK_TREE_MODEL(ls); 792 aop_menu->model = GTK_TREE_MODEL(ls);
781 793
811 purple_account_get_username(account), 823 purple_account_get_username(account),
812 purple_account_get_protocol_name(account)); 824 purple_account_get_protocol_name(account));
813 } 825 }
814 826
815 gtk_list_store_append(ls, &iter); 827 gtk_list_store_append(ls, &iter);
816 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, buf, 2, account, -1); 828 gtk_list_store_set(ls, &iter,
829 AOP_ICON_COLUMN, pixbuf,
830 AOP_NAME_COLUMN, buf,
831 AOP_DATA_COLUMN, account,
832 -1);
817 833
818 if (pixbuf) 834 if (pixbuf)
819 g_object_unref(pixbuf); 835 g_object_unref(pixbuf);
820 836
821 if (default_account && account == default_account) 837 if (default_account && account == default_account)
1853 } 1869 }
1854 purple_menu_action_free(act); 1870 purple_menu_action_free(act);
1855 return menuitem; 1871 return menuitem;
1856 } 1872 }
1857 1873
1874 enum {
1875 COMPLETION_DISPLAYED_COLUMN, /* displayed completion value */
1876 COMPLETION_BUDDY_COLUMN, /* buddy name */
1877 COMPLETION_NORMALIZED_COLUMN, /* UTF-8 normalized & casefolded buddy name */
1878 COMPLETION_COMPARISON_COLUMN, /* UTF-8 normalized & casefolded value for comparison */
1879 COMPLETION_ACCOUNT_COLUMN, /* account */
1880 COMPLETION_COLUMN_COUNT
1881 };
1882
1858 typedef struct 1883 typedef struct
1859 { 1884 {
1860 GtkWidget *entry; 1885 GtkWidget *entry;
1861 GtkWidget *accountopt; 1886 GtkWidget *accountopt;
1862 1887
1872 GtkTreeModel *model; 1897 GtkTreeModel *model;
1873 GValue val1; 1898 GValue val1;
1874 GValue val2; 1899 GValue val2;
1875 const char *tmp; 1900 const char *tmp;
1876 1901
1877 model = gtk_entry_completion_get_model (completion); 1902 model = gtk_entry_completion_get_model(completion);
1878 1903
1879 val1.g_type = 0; 1904 val1.g_type = 0;
1880 gtk_tree_model_get_value(model, iter, 2, &val1); 1905 gtk_tree_model_get_value(model, iter, COMPLETION_NORMALIZED_COLUMN, &val1);
1881 tmp = g_value_get_string(&val1); 1906 tmp = g_value_get_string(&val1);
1882 if (tmp != NULL && purple_str_has_prefix(tmp, key)) 1907 if (tmp != NULL && purple_str_has_prefix(tmp, key))
1883 { 1908 {
1884 g_value_unset(&val1); 1909 g_value_unset(&val1);
1885 return TRUE; 1910 return TRUE;
1886 } 1911 }
1887 g_value_unset(&val1); 1912 g_value_unset(&val1);
1888 1913
1889 val2.g_type = 0; 1914 val2.g_type = 0;
1890 gtk_tree_model_get_value(model, iter, 3, &val2); 1915 gtk_tree_model_get_value(model, iter, COMPLETION_COMPARISON_COLUMN, &val2);
1891 tmp = g_value_get_string(&val2); 1916 tmp = g_value_get_string(&val2);
1892 if (tmp != NULL && purple_str_has_prefix(tmp, key)) 1917 if (tmp != NULL && purple_str_has_prefix(tmp, key))
1893 { 1918 {
1894 g_value_unset(&val2); 1919 g_value_unset(&val2);
1895 return TRUE; 1920 return TRUE;
1905 GValue val; 1930 GValue val;
1906 GtkWidget *optmenu = data->accountopt; 1931 GtkWidget *optmenu = data->accountopt;
1907 PurpleAccount *account; 1932 PurpleAccount *account;
1908 1933
1909 val.g_type = 0; 1934 val.g_type = 0;
1910 gtk_tree_model_get_value(model, iter, 1, &val); 1935 gtk_tree_model_get_value(model, iter, COMPLETION_BUDDY_COLUMN, &val);
1911 gtk_entry_set_text(GTK_ENTRY(data->entry), g_value_get_string(&val)); 1936 gtk_entry_set_text(GTK_ENTRY(data->entry), g_value_get_string(&val));
1912 g_value_unset(&val); 1937 g_value_unset(&val);
1913 1938
1914 gtk_tree_model_get_value(model, iter, 4, &val); 1939 gtk_tree_model_get_value(model, iter, COMPLETION_ACCOUNT_COLUMN, &val);
1915 account = g_value_get_pointer(&val); 1940 account = g_value_get_pointer(&val);
1916 g_value_unset(&val); 1941 g_value_unset(&val);
1917 1942
1918 if (account == NULL) 1943 if (account == NULL)
1919 return TRUE; 1944 return TRUE;
1946 tmp = g_utf8_casefold(tmp2, -1); 1971 tmp = g_utf8_casefold(tmp2, -1);
1947 g_free(tmp2); 1972 g_free(tmp2);
1948 1973
1949 gtk_list_store_append(store, &iter); 1974 gtk_list_store_append(store, &iter);
1950 gtk_list_store_set(store, &iter, 1975 gtk_list_store_set(store, &iter,
1951 0, completion_entry, 1976 COMPLETION_DISPLAYED_COLUMN, completion_entry,
1952 1, buddyname, 1977 COMPLETION_BUDDY_COLUMN, buddyname,
1953 2, normalized_buddyname, 1978 COMPLETION_NORMALIZED_COLUMN, normalized_buddyname,
1954 3, tmp, 1979 COMPLETION_COMPARISON_COLUMN, tmp,
1955 4, account, 1980 COMPLETION_ACCOUNT_COLUMN, account,
1956 -1); 1981 -1);
1957 g_free(completion_entry); 1982 g_free(completion_entry);
1958 g_free(tmp); 1983 g_free(tmp);
1959 completion_added = TRUE; 1984 completion_added = TRUE;
1960 } 1985 }
1971 tmp = g_utf8_casefold(tmp2, -1); 1996 tmp = g_utf8_casefold(tmp2, -1);
1972 g_free(tmp2); 1997 g_free(tmp2);
1973 1998
1974 gtk_list_store_append(store, &iter); 1999 gtk_list_store_append(store, &iter);
1975 gtk_list_store_set(store, &iter, 2000 gtk_list_store_set(store, &iter,
1976 0, completion_entry, 2001 COMPLETION_DISPLAYED_COLUMN, completion_entry,
1977 1, buddyname, 2002 COMPLETION_BUDDY_COLUMN, buddyname,
1978 2, normalized_buddyname, 2003 COMPLETION_NORMALIZED_COLUMN, normalized_buddyname,
1979 3, tmp, 2004 COMPLETION_COMPARISON_COLUMN, tmp,
1980 4, account, 2005 COMPLETION_ACCOUNT_COLUMN, account,
1981 -1); 2006 -1);
1982 g_free(completion_entry); 2007 g_free(completion_entry);
1983 g_free(tmp); 2008 g_free(tmp);
1984 completion_added = TRUE; 2009 completion_added = TRUE;
1985 } 2010 }
1987 2012
1988 if (completion_added == FALSE) { 2013 if (completion_added == FALSE) {
1989 /* Add the buddy's name. */ 2014 /* Add the buddy's name. */
1990 gtk_list_store_append(store, &iter); 2015 gtk_list_store_append(store, &iter);
1991 gtk_list_store_set(store, &iter, 2016 gtk_list_store_set(store, &iter,
1992 0, buddyname, 2017 COMPLETION_DISPLAYED_COLUMN, buddyname,
1993 1, buddyname, 2018 COMPLETION_BUDDY_COLUMN, buddyname,
1994 2, normalized_buddyname, 2019 COMPLETION_NORMALIZED_COLUMN, normalized_buddyname,
1995 3, NULL, 2020 COMPLETION_COMPARISON_COLUMN, NULL,
1996 4, account, 2021 COMPLETION_ACCOUNT_COLUMN, account,
1997 -1); 2022 -1);
1998 } 2023 }
1999 2024
2000 g_free(normalized_buddyname); 2025 g_free(normalized_buddyname);
2001 } 2026 }
2089 GtkListStore *store; 2114 GtkListStore *store;
2090 2115
2091 GtkEntryCompletion *completion; 2116 GtkEntryCompletion *completion;
2092 2117
2093 data = g_new0(PidginCompletionData, 1); 2118 data = g_new0(PidginCompletionData, 1);
2094 store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); 2119 store = gtk_list_store_new(COMPLETION_COLUMN_COUNT, G_TYPE_STRING,
2120 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
2121 G_TYPE_POINTER);
2095 2122
2096 data->entry = entry; 2123 data->entry = entry;
2097 data->accountopt = accountopt; 2124 data->accountopt = accountopt;
2098 if (filter_func == NULL) { 2125 if (filter_func == NULL) {
2099 data->filter_func = pidgin_screenname_autocomplete_default_filter; 2126 data->filter_func = pidgin_screenname_autocomplete_default_filter;
2106 2133
2107 add_completion_list(data); 2134 add_completion_list(data);
2108 2135
2109 /* Sort the completion list by buddy name */ 2136 /* Sort the completion list by buddy name */
2110 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), 2137 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store),
2111 1, GTK_SORT_ASCENDING); 2138 COMPLETION_BUDDY_COLUMN,
2139 GTK_SORT_ASCENDING);
2112 2140
2113 completion = gtk_entry_completion_new(); 2141 completion = gtk_entry_completion_new();
2114 gtk_entry_completion_set_match_func(completion, buddyname_completion_match_func, NULL, NULL); 2142 gtk_entry_completion_set_match_func(completion, buddyname_completion_match_func, NULL, NULL);
2115 2143
2116 g_signal_connect(G_OBJECT(completion), "match-selected", 2144 g_signal_connect(G_OBJECT(completion), "match-selected",
2120 g_object_unref(completion); 2148 g_object_unref(completion);
2121 2149
2122 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store)); 2150 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store));
2123 g_object_unref(store); 2151 g_object_unref(store);
2124 2152
2125 gtk_entry_completion_set_text_column(completion, 0); 2153 gtk_entry_completion_set_text_column(completion, COMPLETION_DISPLAYED_COLUMN);
2126 2154
2127 purple_signal_connect(purple_connections_get_handle(), "signed-on", entry, 2155 purple_signal_connect(purple_connections_get_handle(), "signed-on", entry,
2128 PURPLE_CALLBACK(repopulate_autocomplete), data); 2156 PURPLE_CALLBACK(repopulate_autocomplete), data);
2129 purple_signal_connect(purple_connections_get_handle(), "signed-off", entry, 2157 purple_signal_connect(purple_connections_get_handle(), "signed-off", entry,
2130 PURPLE_CALLBACK(repopulate_autocomplete), data); 2158 PURPLE_CALLBACK(repopulate_autocomplete), data);