summaryrefslogtreecommitdiff
path: root/vcl/unx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-04-12 17:44:57 +0100
committerCaolán McNamara <caolanm@redhat.com>2022-04-12 20:58:47 +0200
commit01cb63b986d0879e10b58991959e0989b125b577 (patch)
treeec206363435df9441849ba2c5ac3523a9ca753cf /vcl/unx
parentcbf9f638807736e69a5863a19128ade085b1a187 (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.cxx11
-rw-r--r--vcl/unx/gtk4/surfacecellrenderer.cxx32
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);
}