pidgin/gtkrequest.c

branch
soc.2013.gobjectification
changeset 35050
9182e2960023
parent 35049
ba239f756f56
parent 34502
433382371e89
child 35052
af1e4a48e628
child 36940
865a746c9a6f
equal deleted inserted replaced
35049:ba239f756f56 35050:9182e2960023
33 #include "gtkwebview.h" 33 #include "gtkwebview.h"
34 #include "gtkrequest.h" 34 #include "gtkrequest.h"
35 #include "gtkutils.h" 35 #include "gtkutils.h"
36 #include "pidginstock.h" 36 #include "pidginstock.h"
37 #include "gtkblist.h" 37 #include "gtkblist.h"
38 #include "gtkinternal.h"
38 39
39 #include <gdk/gdkkeysyms.h> 40 #include <gdk/gdkkeysyms.h>
40 41
41 #ifdef ENABLE_GCR 42 #ifdef ENABLE_GCR
42 #define GCR_API_SUBJECT_TO_CHANGE 43 #define GCR_API_SUBJECT_TO_CHANGE
46 #endif 47 #endif
47 #endif 48 #endif
48 49
49 #include "gtk3compat.h" 50 #include "gtk3compat.h"
50 51
51 static GtkWidget * create_account_field(PurpleRequestField *field);
52
53 typedef struct 52 typedef struct
54 { 53 {
55 PurpleRequestType type; 54 PurpleRequestType type;
56 55
57 void *user_data; 56 void *user_data;
92 } file; 91 } file;
93 92
94 } u; 93 } u;
95 94
96 } PidginRequestData; 95 } PidginRequestData;
96
97 static GHashTable *datasheet_stock = NULL;
98
99 static GtkWidget * create_account_field(PurpleRequestField *field);
97 100
98 static void 101 static void
99 pidgin_widget_decorate_account(GtkWidget *cont, PurpleAccount *account) 102 pidgin_widget_decorate_account(GtkWidget *cont, PurpleAccount *account)
100 { 103 {
101 GtkWidget *image; 104 GtkWidget *image;
1567 1570
1568 return cert_label; 1571 return cert_label;
1569 #endif 1572 #endif
1570 } 1573 }
1571 1574
1575 static GdkPixbuf*
1576 _pidgin_datasheet_stock_icon_get(const gchar *stock_name)
1577 {
1578 GdkPixbuf *image = NULL;
1579 gchar *domain, *id;
1580
1581 if (stock_name == NULL)
1582 return NULL;
1583
1584 /* core is quitting */
1585 if (datasheet_stock == NULL)
1586 return NULL;
1587
1588 if (g_hash_table_lookup_extended(datasheet_stock, stock_name,
1589 NULL, (gpointer*)&image))
1590 {
1591 return image;
1592 }
1593
1594 domain = g_strdup(stock_name);
1595 id = strchr(domain, '/');
1596 if (!id) {
1597 g_free(domain);
1598 return NULL;
1599 }
1600 id[0] = '\0';
1601 id++;
1602
1603 if (g_strcmp0(domain, "prpl") == 0) {
1604 PurpleAccount *account;
1605 gchar *prpl, *accountname;
1606
1607 prpl = id;
1608 accountname = strchr(id, ':');
1609
1610 if (!accountname) {
1611 g_free(domain);
1612 return NULL;
1613 }
1614
1615 accountname[0] = '\0';
1616 accountname++;
1617
1618 account = purple_accounts_find(accountname, prpl);
1619 if (account) {
1620 image = pidgin_create_prpl_icon(account,
1621 PIDGIN_PRPL_ICON_SMALL);
1622 }
1623 } else if (g_strcmp0(domain, "e2ee") == 0) {
1624 image = pidgin_pixbuf_from_imgstore(
1625 _pidgin_e2ee_stock_icon_get(id));
1626 } else {
1627 purple_debug_error("gtkrequest", "Unknown domain: %s", domain);
1628 g_free(domain);
1629 return NULL;
1630 }
1631
1632 g_hash_table_insert(datasheet_stock, g_strdup(stock_name), image);
1633 return image;
1634 }
1635
1636 static void
1637 datasheet_update_rec(PurpleRequestDatasheetRecord *rec, GtkListStore *model,
1638 GtkTreeIter *iter)
1639 {
1640 guint i, col_count;
1641 PurpleRequestDatasheet *sheet;
1642
1643 g_return_if_fail(rec != NULL);
1644 g_return_if_fail(model != NULL);
1645 g_return_if_fail(iter != NULL);
1646
1647 sheet = purple_request_datasheet_record_get_datasheet(rec);
1648
1649 g_return_if_fail(sheet != NULL);
1650
1651 col_count = purple_request_datasheet_get_column_count(sheet);
1652
1653 for (i = 0; i < col_count; i++) {
1654 PurpleRequestDatasheetColumnType type;
1655
1656 type = purple_request_datasheet_get_column_type(
1657 sheet, i);
1658 if (type == PURPLE_REQUEST_DATASHEET_COLUMN_STRING) {
1659 GValue val;
1660
1661 val.g_type = 0;
1662 g_value_init(&val, G_TYPE_STRING);
1663 g_value_set_string(&val,
1664 purple_request_datasheet_record_get_string_data(
1665 rec, i));
1666 gtk_list_store_set_value(model, iter,
1667 i + 1, &val);
1668 } else if (type ==
1669 PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE)
1670 {
1671 GdkPixbuf *pixbuf;
1672
1673 pixbuf = _pidgin_datasheet_stock_icon_get(
1674 purple_request_datasheet_record_get_image_data(
1675 rec, i));
1676 gtk_list_store_set(model, iter, i + 1,
1677 pixbuf, -1);
1678 } else
1679 g_warn_if_reached();
1680 }
1681 }
1682
1683 static void
1684 datasheet_fill(PurpleRequestDatasheet *sheet, GtkListStore *model)
1685 {
1686 const GList *it;
1687
1688 gtk_list_store_clear(model);
1689
1690 it = purple_request_datasheet_get_records(sheet);
1691 for (; it != NULL; it = g_list_next(it)) {
1692 PurpleRequestDatasheetRecord *rec = it->data;
1693 GtkTreeIter iter;
1694
1695 gtk_list_store_append(model, &iter);
1696 gtk_list_store_set(model, &iter, 0,
1697 purple_request_datasheet_record_get_key(rec), -1);
1698
1699 datasheet_update_rec(rec, model, &iter);
1700 }
1701 }
1702
1703 static void
1704 datasheet_update(PurpleRequestDatasheet *sheet, gpointer key,
1705 GtkListStore *model)
1706 {
1707 PurpleRequestDatasheetRecord *rec;
1708 GtkTreeIter iter;
1709 GtkTreeModel *tmodel = GTK_TREE_MODEL(model);
1710 gboolean found = FALSE;
1711
1712 g_return_if_fail(tmodel != NULL);
1713
1714 if (key == NULL) {
1715 datasheet_fill(sheet, model);
1716 return;
1717 }
1718
1719 rec = purple_request_datasheet_record_find(sheet, key);
1720
1721 if (gtk_tree_model_get_iter_first(tmodel, &iter)) {
1722 do {
1723 gpointer ikey;
1724
1725 gtk_tree_model_get(tmodel, &iter, 0, &ikey, -1);
1726
1727 if (key == ikey) {
1728 found = TRUE;
1729 break;
1730 }
1731 } while (gtk_tree_model_iter_next(tmodel, &iter));
1732 }
1733
1734 if (rec == NULL && !found) {
1735 return;
1736 }
1737
1738 if (rec == NULL) {
1739 gtk_list_store_remove(model, &iter);
1740 return;
1741 }
1742
1743 if (!found) {
1744 gtk_list_store_append(model, &iter);
1745 gtk_list_store_set(model, &iter, 0, key, -1);
1746 }
1747
1748 datasheet_update_rec(rec, model, &iter);
1749 }
1750
1751 static GtkWidget *
1752 create_datasheet_field(PurpleRequestField *field)
1753 {
1754 PurpleRequestDatasheet *sheet;
1755 guint i, col_count;
1756 GType *col_types;
1757 GtkListStore *model;
1758 GtkTreeView *view;
1759 GtkWidget *scrollable;
1760 GtkCellRenderer *renderer_image = NULL, *renderer_text = NULL;
1761 GtkTreeViewColumn *id_column;
1762
1763 sheet = purple_request_field_datasheet_get_sheet(field);
1764
1765 col_count = purple_request_datasheet_get_column_count(sheet);
1766
1767 col_types = g_new0(GType, col_count + 1);
1768 col_types[0] = G_TYPE_POINTER;
1769 for (i = 0; i < col_count; i++) {
1770 PurpleRequestDatasheetColumnType type;
1771 type = purple_request_datasheet_get_column_type(sheet, i);
1772 if (type == PURPLE_REQUEST_DATASHEET_COLUMN_STRING)
1773 col_types[i + 1] = G_TYPE_STRING;
1774 else if (type == PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE)
1775 col_types[i + 1] = GDK_TYPE_PIXBUF;
1776 else
1777 g_warn_if_reached();
1778 }
1779 model = gtk_list_store_newv(col_count + 1, col_types);
1780 g_free(col_types);
1781
1782 view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(
1783 GTK_TREE_MODEL(model)));
1784 g_object_unref(G_OBJECT(model));
1785
1786 id_column = gtk_tree_view_column_new();
1787 gtk_tree_view_column_set_visible(id_column, FALSE);
1788 gtk_tree_view_append_column(view, id_column);
1789
1790 for (i = 0; i < col_count; i++) {
1791 PurpleRequestDatasheetColumnType type;
1792 const gchar *title;
1793 GtkCellRenderer *renderer;
1794 const gchar *type_str = "";
1795
1796 type = purple_request_datasheet_get_column_type(sheet, i);
1797 title = purple_request_datasheet_get_column_title(sheet, i);
1798
1799 if (type == PURPLE_REQUEST_DATASHEET_COLUMN_STRING) {
1800 type_str = "text";
1801 if (!renderer_text)
1802 renderer_text = gtk_cell_renderer_text_new();
1803 renderer = renderer_text;
1804 }
1805 else if (type == PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE) {
1806 type_str = "pixbuf";
1807 if (!renderer_image)
1808 renderer_image = gtk_cell_renderer_pixbuf_new();
1809 renderer = renderer_image;
1810 } else
1811 g_warn_if_reached();
1812
1813 if (title == NULL)
1814 title = "";
1815 gtk_tree_view_insert_column_with_attributes(
1816 view, -1, title, renderer, type_str,
1817 i + 1, NULL);
1818 }
1819
1820 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE);
1821
1822 datasheet_fill(sheet, model);
1823 purple_signal_connect(sheet, "record-changed",
1824 pidgin_request_get_handle(),
1825 PURPLE_CALLBACK(datasheet_update), model);
1826
1827 gtk_widget_set_size_request(GTK_WIDGET(view), 400, 250);
1828
1829 scrollable = pidgin_make_scrollable(GTK_WIDGET(view),
1830 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1);
1831 gtk_widget_show(GTK_WIDGET(view));
1832 return scrollable;
1833 }
1834
1572 static void * 1835 static void *
1573 pidgin_request_fields(const char *title, const char *primary, 1836 pidgin_request_fields(const char *title, const char *primary,
1574 const char *secondary, PurpleRequestFields *fields, const char *ok_text, 1837 const char *secondary, PurpleRequestFields *fields, const char *ok_text,
1575 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, 1838 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb,
1576 PurpleRequestCommonParameters *cpar, void *user_data) 1839 PurpleRequestCommonParameters *cpar, void *user_data)
1777 size_t cols = 1; 2040 size_t cols = 1;
1778 size_t rows; 2041 size_t rows;
1779 size_t col_num; 2042 size_t col_num;
1780 size_t row_num = 0; 2043 size_t row_num = 0;
1781 guint tab_no; 2044 guint tab_no;
2045 gboolean contains_resizable = FALSE, frame_fill;
1782 2046
1783 group = gl->data; 2047 group = gl->data;
1784 field_list = purple_request_field_group_get_fields(group); 2048 field_list = purple_request_field_group_get_fields(group);
1785 tab_no = purple_request_field_group_get_tab(group); 2049 tab_no = purple_request_field_group_get_tab(group);
1786 if (tab_no >= tab_count) { 2050 if (tab_no >= tab_count) {
1816 2080
1817 field = (PurpleRequestField *)fl->data; 2081 field = (PurpleRequestField *)fl->data;
1818 2082
1819 type = purple_request_field_get_type(field); 2083 type = purple_request_field_get_type(field);
1820 2084
2085 if (type == PURPLE_REQUEST_FIELD_DATASHEET)
2086 contains_resizable = TRUE;
2087
1821 if (type == PURPLE_REQUEST_FIELD_LABEL) 2088 if (type == PURPLE_REQUEST_FIELD_LABEL)
1822 { 2089 {
1823 if (col_num > 0) 2090 if (col_num > 0)
1824 rows++; 2091 rows++;
1825 2092
1847 else 2114 else
1848 table = gtk_table_new(rows, 2 * cols, FALSE); 2115 table = gtk_table_new(rows, 2 * cols, FALSE);
1849 gtk_table_set_row_spacings(GTK_TABLE(table), PIDGIN_HIG_BOX_SPACE); 2116 gtk_table_set_row_spacings(GTK_TABLE(table), PIDGIN_HIG_BOX_SPACE);
1850 gtk_table_set_col_spacings(GTK_TABLE(table), PIDGIN_HIG_BOX_SPACE); 2117 gtk_table_set_col_spacings(GTK_TABLE(table), PIDGIN_HIG_BOX_SPACE);
1851 2118
1852 gtk_box_pack_start(GTK_BOX(frame), table, 2119 frame_fill = (notebook == NULL || contains_resizable);
1853 (notebook == NULL), (notebook == NULL), 0); 2120 gtk_box_pack_start(GTK_BOX(frame), table, frame_fill, frame_fill, 0);
1854 gtk_widget_show(table); 2121 gtk_widget_show(table);
1855 2122
1856 for (row_num = 0, fl = field_list; 2123 for (row_num = 0, fl = field_list;
1857 row_num < rows && fl != NULL; 2124 row_num < rows && fl != NULL;
1858 row_num++) 2125 row_num++)
1940 widget = create_image_field(field); 2207 widget = create_image_field(field);
1941 else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) 2208 else if (type == PURPLE_REQUEST_FIELD_ACCOUNT)
1942 widget = create_account_field(field); 2209 widget = create_account_field(field);
1943 else if (type == PURPLE_REQUEST_FIELD_CERTIFICATE) 2210 else if (type == PURPLE_REQUEST_FIELD_CERTIFICATE)
1944 widget = create_certificate_field(field); 2211 widget = create_certificate_field(field);
2212 else if (type == PURPLE_REQUEST_FIELD_DATASHEET)
2213 widget = create_datasheet_field(field);
1945 else 2214 else
1946 continue; 2215 continue;
1947 } 2216 }
1948 2217
1949 gtk_widget_set_sensitive(widget, 2218 gtk_widget_set_sensitive(widget,
2272 PurpleRequestUiOps * 2541 PurpleRequestUiOps *
2273 pidgin_request_get_ui_ops(void) 2542 pidgin_request_get_ui_ops(void)
2274 { 2543 {
2275 return &ops; 2544 return &ops;
2276 } 2545 }
2546
2547 void *
2548 pidgin_request_get_handle(void)
2549 {
2550 static int handle;
2551
2552 return &handle;
2553 }
2554
2555 void
2556 pidgin_request_init(void)
2557 {
2558 datasheet_stock = g_hash_table_new_full(g_str_hash, g_str_equal,
2559 g_free, g_object_unref);
2560 }
2561
2562 void
2563 pidgin_request_uninit(void)
2564 {
2565 purple_signals_disconnect_by_handle(pidgin_request_get_handle());
2566 g_hash_table_destroy(datasheet_stock);
2567 datasheet_stock = NULL;
2568 }

mercurial