1 | #include <gtk/gtk.h> |
2 | |
3 | void |
4 | print_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 | |
54 | void |
55 | print_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 | |
82 | static void |
83 | test_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 | |
171 | static void |
172 | test_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 | |
193 | static void |
194 | test_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 | |
228 | int |
229 | main (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 | |