diff options
author | Caolán McNamara <caolanm@redhat.com> | 2022-04-12 17:44:57 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-04-12 20:58:47 +0200 |
commit | 01cb63b986d0879e10b58991959e0989b125b577 (patch) | |
tree | ec206363435df9441849ba2c5ac3523a9ca753cf /vcl/unx | |
parent | cbf9f638807736e69a5863a19128ade085b1a187 (diff) |
gtk4: GtkCellRendererPixbuf no longer takes a surface
so use our own replacement when we want to continue to use a cairo_surface
Change-Id: I4a1a0e7f5a86d27a4290cf71c0719ea017be3f0b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132930
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/unx')
-rw-r--r-- | vcl/unx/gtk3/gtkinst.cxx | 11 | ||||
-rw-r--r-- | vcl/unx/gtk4/surfacecellrenderer.cxx | 32 |
2 files changed, 33 insertions, 10 deletions
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index a3449e02c3cb..4d6679a31ef7 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -19189,6 +19189,7 @@ public: SAL_WARN_IF(!m_pMenuWindow, "vcl.gtk", "GtkInstanceComboBox: couldn't find popup menu"); bool bHasEntry = gtk_combo_box_get_has_entry(m_pComboBox); + bool bPixbufUsedSurface = gtk_tree_model_get_n_columns(m_pTreeModel) == 4; bool bFindButtonTextRenderer = !bHasEntry; GtkCellLayout* pCellLayout = GTK_CELL_LAYOUT(m_pComboBox); @@ -19206,6 +19207,16 @@ public: } } + // Seeing as GtkCellRendererPixbuf no longer takes a surface, then insert our own replacement + // to render that instead here + if (bPixbufUsedSurface) + { + GtkCellRenderer* pSurfaceRenderer = surface_cell_renderer_new(); + gtk_cell_layout_pack_start(pCellLayout, pSurfaceRenderer, false); + gtk_cell_layout_reorder(pCellLayout, pSurfaceRenderer, 0); + gtk_cell_layout_set_attributes(pCellLayout, pSurfaceRenderer, "surface", 3, nullptr); + } + if (bHasEntry) { m_bAutoComplete = true; diff --git a/vcl/unx/gtk4/surfacecellrenderer.cxx b/vcl/unx/gtk4/surfacecellrenderer.cxx index f8015bb110b2..2ae0782b984c 100644 --- a/vcl/unx/gtk4/surfacecellrenderer.cxx +++ b/vcl/unx/gtk4/surfacecellrenderer.cxx @@ -165,6 +165,17 @@ GtkCellRenderer* surface_cell_renderer_new() return GTK_CELL_RENDERER(g_object_new(SURFACE_TYPE_CELL_RENDERER, nullptr)); } +static void get_surface_size(cairo_surface_t* pSurface, int& rWidth, int& rHeight) +{ + double x1, x2, y1, y2; + cairo_t* cr = cairo_create(pSurface); + cairo_clip_extents(cr, &x1, &y1, &x2, &y2); + cairo_destroy(cr); + + rWidth = x2 - x1; + rHeight = y2 - y1; +} + bool surface_cell_renderer_get_preferred_size(GtkCellRenderer* cell, GtkOrientation orientation, gint* minimum_size, gint* natural_size) { @@ -174,15 +185,7 @@ bool surface_cell_renderer_get_preferred_size(GtkCellRenderer* cell, GtkOrientat int nHeight = 0; if (cellsurface->surface) - { - double x1, x2, y1, y2; - cairo_t* cr = cairo_create(cellsurface->surface); - cairo_clip_extents(cr, &x1, &y1, &x2, &y2); - cairo_destroy(cr); - - nWidth = x2 - x1; - nHeight = y2 - y1; - } + get_surface_size(cellsurface->surface, nWidth, nHeight); if (orientation == GTK_ORIENTATION_HORIZONTAL) { @@ -209,7 +212,16 @@ void surface_cell_renderer_render(GtkCellRenderer* cell, cairo_t* cr, GtkWidget* const GdkRectangle* cell_area, GtkCellRendererState /*flags*/) { SurfaceCellRenderer* cellsurface = SURFACE_CELL_RENDERER(cell); - cairo_set_source_surface(cr, cellsurface->surface, cell_area->x, cell_area->y); + if (!cellsurface->surface) + return; + + int nWidth, nHeight; + get_surface_size(cellsurface->surface, nWidth, nHeight); + int nXOffset = (cell_area->width - nWidth) / 2; + int nYOffset = (cell_area->height - nHeight) / 2; + + cairo_set_source_surface(cr, cellsurface->surface, cell_area->x + nXOffset, + cell_area->y + nYOffset); cairo_paint(cr); } |