1#include <gtk/gtk.h>
2
3void
4print_attribute (PangoAttribute *attr, GString *string)
5{
6 GEnumClass *class;
7 GEnumValue *value;
8 PangoAttrString *str;
9 PangoAttrLanguage *lang;
10 PangoAttrInt *integer;
11 PangoAttrFloat *flt;
12 PangoAttrFontDesc *font;
13 PangoAttrColor *color;
14 PangoAttrShape *shape;
15
16 g_string_append_printf (string, format: "[%d,%d]", attr->start_index, attr->end_index);
17
18 class = g_type_class_ref (type: pango_attr_type_get_type ());
19 value = g_enum_get_value (enum_class: class, value: attr->klass->type);
20 g_string_append_printf (string, format: "%s=", value->value_nick);
21 g_type_class_unref (g_class: class);
22
23 if ((str = pango_attribute_as_string (attr)) != NULL)
24 g_string_append (string, val: str->value);
25 else if ((lang = pango_attribute_as_language (attr)) != NULL)
26 g_string_append (string, pango_language_to_string (lang->value));
27 else if ((integer = pango_attribute_as_int (attr)) != NULL)
28 g_string_append_printf (string, format: "%d", integer->value);
29 else if ((flt = pango_attribute_as_float (attr)) != NULL)
30 {
31 char val[20];
32
33 g_ascii_formatd (buffer: val, buf_len: 20, format: "%f", d: flt->value);
34 g_string_append (string, val);
35 }
36 else if ((font = pango_attribute_as_font_desc (attr)) != NULL)
37 {
38 char *text = pango_font_description_to_string (desc: font->desc);
39 g_string_append (string, val: text);
40 g_free (mem: text);
41 }
42 else if ((color = pango_attribute_as_color (attr)) != NULL)
43 {
44 char *text = pango_color_to_string (color: &color->color);
45 g_string_append (string, val: text);
46 g_free (mem: text);
47 }
48 else if ((shape = pango_attribute_as_shape (attr)) != NULL)
49 g_string_append_printf (string, format: "shape");
50 else
51 g_assert_not_reached ();
52}
53
54void
55print_attr_list (PangoAttrList *attrs, GString *string)
56{
57 PangoAttrIterator *iter;
58
59 if (!attrs)
60 return;
61
62 iter = pango_attr_list_get_iterator (list: attrs);
63 do {
64 int start, end;
65 GSList *list, *l;
66
67 pango_attr_iterator_range (iterator: iter, start: &start, end: &end);
68 g_string_append_printf (string, format: "range %d %d\n", start, end);
69 list = pango_attr_iterator_get_attrs (iterator: iter);
70 for (l = list; l; l = l->next)
71 {
72 PangoAttribute *attr = l->data;
73 print_attribute (attr, string);
74 g_string_append (string, val: "\n");
75 }
76 g_slist_free_full (list, free_func: (GDestroyNotify)pango_attribute_destroy);
77 } while (pango_attr_iterator_next (iterator: iter));
78
79 pango_attr_iterator_destroy (iterator: iter);
80}
81
82static void
83test_label_markup (void)
84{
85 GtkWidget *window;
86 GtkWidget *label;
87 PangoAttrList *attrs;
88 GString *str;
89 const char *text;
90
91 window = gtk_window_new ();
92 label = gtk_label_new (str: "");
93
94 gtk_window_set_child (GTK_WINDOW (window), child: label);
95 gtk_window_set_mnemonics_visible (GTK_WINDOW (window), TRUE);
96
97 gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
98 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
99 gtk_label_set_label (GTK_LABEL (label), str: "<a href=\"test\"><span font_style=\"italic\">abc</span> _def</a>");
100
101 g_assert_cmpuint (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)), ==, 'd');
102
103 text = pango_layout_get_text (layout: gtk_label_get_layout (GTK_LABEL (label)));
104 g_assert_cmpstr (text, ==, "abc def");
105
106 attrs = pango_layout_get_attributes (layout: gtk_label_get_layout (GTK_LABEL (label)));
107 str = g_string_new (init: "");
108 print_attr_list (attrs, string: str);
109
110 g_assert_cmpstr (str->str, ==,
111 "range 0 3\n"
112 "[0,4]underline=1\n"
113 "[0,8]foreground=#1b1b6a6acbcb\n"
114 "[0,3]style=2\n"
115 "range 3 4\n"
116 "[0,4]underline=1\n"
117 "[0,8]foreground=#1b1b6a6acbcb\n"
118 "range 4 5\n"
119 "[0,8]foreground=#1b1b6a6acbcb\n"
120 "[4,5]underline=3\n"
121 "range 5 8\n"
122 "[0,8]foreground=#1b1b6a6acbcb\n"
123 "[5,8]underline=1\n"
124 "range 8 2147483647\n");
125
126
127 gtk_window_set_mnemonics_visible (GTK_WINDOW (window), FALSE);
128
129 text = pango_layout_get_text (layout: gtk_label_get_layout (GTK_LABEL (label)));
130 g_assert_cmpstr (text, ==, "abc def");
131
132 attrs = pango_layout_get_attributes (layout: gtk_label_get_layout (GTK_LABEL (label)));
133 g_string_set_size (string: str, len: 0);
134 print_attr_list (attrs, string: str);
135
136 g_assert_cmpstr (str->str, ==,
137 "range 0 3\n"
138 "[0,7]underline=1\n"
139 "[0,7]foreground=#1b1b6a6acbcb\n"
140 "[0,3]style=2\n"
141 "range 3 7\n"
142 "[0,7]underline=1\n"
143 "[0,7]foreground=#1b1b6a6acbcb\n"
144 "range 7 2147483647\n");
145
146 gtk_window_set_mnemonics_visible (GTK_WINDOW (window), TRUE);
147 gtk_label_set_use_underline (GTK_LABEL (label), FALSE);
148
149 text = pango_layout_get_text (layout: gtk_label_get_layout (GTK_LABEL (label)));
150 g_assert_cmpstr (text, ==, "abc _def");
151
152 attrs = pango_layout_get_attributes (layout: gtk_label_get_layout (GTK_LABEL (label)));
153 g_string_set_size (string: str, len: 0);
154 print_attr_list (attrs, string: str);
155
156 g_assert_cmpstr (str->str, ==,
157 "range 0 3\n"
158 "[0,8]underline=1\n"
159 "[0,8]foreground=#1b1b6a6acbcb\n"
160 "[0,3]style=2\n"
161 "range 3 8\n"
162 "[0,8]underline=1\n"
163 "[0,8]foreground=#1b1b6a6acbcb\n"
164 "range 8 2147483647\n");
165
166 g_string_free (string: str, TRUE);
167
168 gtk_window_destroy (GTK_WINDOW (window));
169}
170
171static void
172test_label_underline (void)
173{
174 GtkWidget *window;
175 GtkWidget *label;
176
177 window = gtk_window_new ();
178
179 label = gtk_label_new (str: "");
180
181 gtk_window_set_child (GTK_WINDOW (window), child: label);
182 gtk_window_set_mnemonics_visible (GTK_WINDOW (window), TRUE);
183
184 gtk_label_set_use_markup (GTK_LABEL (label), FALSE);
185 gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
186 gtk_label_set_label (GTK_LABEL (label), str: "tes_t & no markup <<");
187
188 g_assert_cmpint (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)), ==, GDK_KEY_t);
189
190 gtk_window_destroy (GTK_WINDOW (window));
191}
192
193static void
194test_label_parse_more (void)
195{
196 struct {
197 const char *input;
198 gboolean use_underline;
199 gboolean use_markup;
200 const char *text;
201 guint accel;
202 } tests[] = {
203 { "tes_t m__e mo_re", TRUE, FALSE, "test m_e more", GDK_KEY_t },
204 { "test m__e mo_re", TRUE, FALSE, "test m_e more", GDK_KEY_r },
205 { "tes_t m__e mo_re", FALSE, FALSE, "tes_t m__e mo_re", GDK_KEY_VoidSymbol },
206 { "<span font='test_font'>test <a href='bla'>w_ith</a> bla</span>", TRUE, TRUE, "test with bla", GDK_KEY_i },
207 { "<span font='test_font'>test <a href='bla'>w_ith</a> bla</span>", FALSE, TRUE, "test w_ith bla", GDK_KEY_VoidSymbol },
208 };
209 GtkWidget *label;
210
211 label = gtk_label_new (str: "");
212
213 for (int i = 0; i < G_N_ELEMENTS (tests); i++)
214 {
215 gtk_label_set_use_underline (GTK_LABEL (label), setting: tests[i].use_underline);
216 gtk_label_set_use_markup (GTK_LABEL (label), setting: tests[i].use_markup);
217 gtk_label_set_label (GTK_LABEL (label), str: tests[i].input);
218
219 g_assert_cmpstr (gtk_label_get_label (GTK_LABEL (label)), ==, tests[i].input);
220 g_assert_cmpstr (gtk_label_get_text (GTK_LABEL (label)), ==, tests[i].text);
221 g_assert_cmpuint (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)), ==, tests[i].accel);
222 }
223
224 g_object_ref_sink (label);
225 g_object_unref (object: label);
226}
227
228int
229main (int argc, char *argv[])
230{
231 gtk_test_init (argcp: &argc, argvp: &argv);
232
233 g_test_add_func (testpath: "/label/markup-parse", test_func: test_label_markup);
234 g_test_add_func (testpath: "/label/underline-parse", test_func: test_label_underline);
235 g_test_add_func (testpath: "/label/parse-more", test_func: test_label_parse_more);
236
237 return g_test_run ();
238}
239

source code of gtk/testsuite/gtk/label.c