From d04872ad221b56f80ff20503816fde4dd10636c6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 7 Jan 2022 21:26:14 -0500 Subject: Reinstate previous behavior or pango_attr_list_splice If gap is zero, don't limit the inserted attributes; that does not make sense. Spell out the different use cases in the docs. Testcase included. Fixes: #653 --- pango/pango-attributes.c | 20 +++++++++++++++++--- tests/testattributes.c | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/pango/pango-attributes.c b/pango/pango-attributes.c index c9b58b07..696f9ba1 100644 --- a/pango/pango-attributes.c +++ b/pango/pango-attributes.c @@ -2289,10 +2289,16 @@ pango_attr_list_update (PangoAttrList *list, * that applies at position @pos in @list by an amount @len, * and then calling [method@Pango.AttrList.change] with a copy * of each attribute in @other in sequence (offset in position - * by @pos, and limited in lengh to @len). + * by @pos, and limited in length to @len). * * This operation proves useful for, for instance, inserting * a pre-edit string in the middle of an edit buffer. + * + * For backwards compatibility, the function behaves differently + * when @len is 0. In this case, the attributes from @other are + * not imited to @len, and are just overlayed on top of @list. + * + * This mode is useful for merging two lists of attributes together. */ void pango_attr_list_splice (PangoAttrList *list, @@ -2347,8 +2353,16 @@ pango_attr_list_splice (PangoAttrList *list, for (i = 0, p = other->attributes->len; i < p; i++) { PangoAttribute *attr = pango_attribute_copy (g_ptr_array_index (other->attributes, i)); - attr->start_index = MIN (CLAMP_ADD (attr->start_index, upos), end); - attr->end_index = MIN (CLAMP_ADD (attr->end_index, upos), end); + if (ulen > 0) + { + attr->start_index = MIN (CLAMP_ADD (attr->start_index, upos), end); + attr->end_index = MIN (CLAMP_ADD (attr->end_index, upos), end); + } + else + { + attr->start_index = CLAMP_ADD (attr->start_index, upos); + attr->end_index = CLAMP_ADD (attr->end_index, upos); + } /* Same as above, the attribute could be squashed to zero-length; here * pango_attr_list_change() will take care of deleting it. diff --git a/tests/testattributes.c b/tests/testattributes.c index cd70edc8..d396269f 100644 --- a/tests/testattributes.c +++ b/tests/testattributes.c @@ -1338,6 +1338,23 @@ test_iter_epsilon_zero (void) g_string_free (s, TRUE); } +static void +test_gnumeric_splice (void) +{ + PangoAttrList *list, *list2; + + list = pango_attr_list_from_string ("0 -1 font-desc \"Sans 10\"\n"); + list2 = pango_attr_list_from_string ("1 2 weight bold\n"); + + pango_attr_list_splice (list, list2, 0, 0); + + assert_attr_list (list, "0 4294967295 font-desc \"Sans 10\"\n" + "1 2 weight bold\n"); + + pango_attr_list_unref (list); + pango_attr_list_unref (list2); +} + int main (int argc, char *argv[]) { @@ -1377,6 +1394,7 @@ main (int argc, char *argv[]) g_test_add_func ("/attributes/iter/get_font", test_iter_get_font); g_test_add_func ("/attributes/iter/get_attrs", test_iter_get_attrs); g_test_add_func ("/attributes/iter/epsilon_zero", test_iter_epsilon_zero); + g_test_add_func ("/attributes/gnumeric-splice", test_gnumeric_splice); return g_test_run (); } -- cgit v1.2.1