tdf#97822 vcl opengl gtk2: fix missing list node widget

OpenGL just sets GtkSalGraphics::bNeedPixmapPaint to true, and the
problem is specific to that flag (can be also enabled via
SAL_GTK_USE_PIXMAPPAINT=1).

Most other widgets are painted correctly in the GL case as they pass
around a drawable explicitly; do the same for ControlType::ListNode as
well in the GL case. The non-GL case still needs to go via the pixmap
render macros to have correct position, leave that unchanged.

Change-Id: Ia82a6772e357b434d706e58664be3a8427e91669
Reviewed-on: https://gerrit.libreoffice.org/70669
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx
index 707b0a2..8187bdb 100644
--- a/vcl/inc/unx/gtk/gtkgdi.hxx
+++ b/vcl/inc/unx/gtk/gtkgdi.hxx
@@ -384,7 +384,7 @@
    bool NWPaintGTKSlider( ControlPart nPart,
                           const tools::Rectangle& rControlRectangle,
                           ControlState nState, const ImplControlValue& aValue );
    bool NWPaintGTKListNode(
    bool NWPaintGTKListNode( GdkDrawable* gdkDrawable,
                            const tools::Rectangle& rControlRectangle,
                            ControlState nState, const ImplControlValue& aValue );
};
diff --git a/vcl/unx/gtk/salnativewidgets-gtk.cxx b/vcl/unx/gtk/salnativewidgets-gtk.cxx
index b0f015a..0ce9904 100644
--- a/vcl/unx/gtk/salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk/salnativewidgets-gtk.cxx
@@ -1020,7 +1020,7 @@
    }
    else if( (nType == ControlType::ListNode) && (nPart == ControlPart::Entire) )
    {
        return NWPaintGTKListNode( aCtrlRect, nState, aValue );
        return NWPaintGTKListNode( pDrawable, aCtrlRect, nState, aValue );
    }
    else if( (nType == ControlType::ListNet) && (nPart == ControlPart::Entire) )
    {
@@ -3347,7 +3347,18 @@
    return true;
}

namespace
{
void NWPaintGTKListNodeReal(SalX11Screen nXScreen, GdkDrawable* gdkDrawable, GtkStateType stateType,
                            gint w, int h, GtkExpanderStyle eStyle)
{
    gtk_paint_expander(gWidgetData[nXScreen].gTreeView->style, gdkDrawable, stateType, nullptr,
                       gWidgetData[nXScreen].gTreeView, "treeview", w / 2, h / 2, eStyle);
}
}

bool GtkSalGraphics::NWPaintGTKListNode(
            GdkDrawable* gdkDrawable,
            const tools::Rectangle& rControlRectangle,
            ControlState nState, const ImplControlValue& rValue )
{
@@ -3377,16 +3388,15 @@
            break;
    }

    if (GtkSalGraphics::bNeedPixmapPaint)
    {
        NWPaintGTKListNodeReal(m_nXScreen, gdkDrawable, stateType, w, h, eStyle);
        return true;
    }

    BEGIN_PIXMAP_RENDER( aRect, pixDrawable )
    {
        gtk_paint_expander( gWidgetData[m_nXScreen].gTreeView->style,
                            pixDrawable,
                            stateType,
                            nullptr,
                            gWidgetData[m_nXScreen].gTreeView,
                            "treeview",
                            w/2, h/2,
                            eStyle );
        NWPaintGTKListNodeReal(m_nXScreen, pixDrawable, stateType, w, h, eStyle);
    }
    END_PIXMAP_RENDER( aRect )