Related: tdf#143443 remove PANGO_ATTR_ABSOLUTE_SIZE and PANGO_ATTR_SIZE

when setting a new size because an absolute size set by gtk itself seems
to be not overwritten by pango_attr_size_new so sometimes the size of
the font in the annotation window label is too large

Change-Id: Ib69eec2111336cc27d1571babcc891f16cae2f01
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124641
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 30fda52..b98dc7f 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -9002,6 +9002,7 @@ void update_attr_list(PangoAttrList* pAttrList, const vcl::Font& rFont)
{
    pango_attr_list_change(pAttrList, pango_attr_family_new(OUStringToOString(rFont.GetFamilyName(), RTL_TEXTENCODING_UTF8).getStr()));
    pango_attr_list_change(pAttrList, pango_attr_size_new(rFont.GetFontSize().Height() * PANGO_SCALE));

    switch (rFont.GetItalic())
    {
        case ITALIC_NONE:
@@ -9070,10 +9071,33 @@ void update_attr_list(PangoAttrList* pAttrList, const vcl::Font& rFont)
    }
}

gboolean filter_pango_attrs(PangoAttribute *attr, gpointer data)
{
    PangoAttrType* pFilterAttrs = static_cast<PangoAttrType*>(data);
    while (*pFilterAttrs)
    {
        if (attr->klass->type == *pFilterAttrs)
            return true;
        ++pFilterAttrs;
    }
    return false;
}

void set_font(GtkLabel* pLabel, const vcl::Font& rFont)
{
    PangoAttrList* pOrigList = gtk_label_get_attributes(pLabel);
    PangoAttrList* pAttrList = pOrigList ? pango_attr_list_copy(pOrigList) : pango_attr_list_new();

    if (pOrigList)
    {
        // tdf#143443 remove both PANGO_ATTR_ABSOLUTE_SIZE and PANGO_ATTR_SIZE
        // because pango_attr_list_change(..., pango_attr_size_new...) isn't
        // sufficient on its own to ensure a new size sticks.
        PangoAttrType aFilterAttrs[] = {PANGO_ATTR_ABSOLUTE_SIZE, PANGO_ATTR_SIZE, PANGO_ATTR_INVALID};
        PangoAttrList* pRemovedAttrs = pOrigList ? pango_attr_list_filter(pAttrList, filter_pango_attrs, &aFilterAttrs) : nullptr;
        pango_attr_list_unref(pRemovedAttrs);
    }

    update_attr_list(pAttrList, rFont);
    gtk_label_set_attributes(pLabel, pAttrList);
    pango_attr_list_unref(pAttrList);
@@ -12274,21 +12298,6 @@ namespace

namespace
{
    gboolean filter_pango_attrs(PangoAttribute *attr, gpointer data)
    {
        PangoAttrType* pFilterAttrs = static_cast<PangoAttrType*>(data);
        while (*pFilterAttrs)
        {
            if (attr->klass->type == *pFilterAttrs)
                return true;
            ++pFilterAttrs;
        }
        return false;
    }
}

namespace
{

class GtkInstanceEditable : public GtkInstanceWidget, public virtual weld::Entry
{