From 068c325ee29a33bc63049e230efe57e52b093d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 17 Jul 2019 16:59:16 +0200 Subject: [PATCH] EekGtkRenderer: Use a hash table for icon theme lookups --- eek/eek-gtk-renderer.c | 52 ++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/eek/eek-gtk-renderer.c b/eek/eek-gtk-renderer.c index 56a44d91..8e413978 100644 --- a/eek/eek-gtk-renderer.c +++ b/eek/eek-gtk-renderer.c @@ -30,41 +30,61 @@ struct _EekGtkRenderer { EekRenderer parent; + + GHashTable *icons; }; G_DEFINE_TYPE (EekGtkRenderer, eek_gtk_renderer, EEK_TYPE_RENDERER); static cairo_surface_t * -eek_gtk_renderer_real_get_icon_surface (EekRenderer *self, +eek_gtk_renderer_real_get_icon_surface (EekRenderer *renderer, const gchar *icon_name, gint size, gint scale) { + EekGtkRenderer *self = EEK_GTK_RENDERER (renderer); GError *error = NULL; cairo_surface_t *surface; - surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (), - icon_name, - size, - scale, - NULL, - 0, - &error); - if (surface == NULL) { - g_warning ("can't get icon surface for %s: %s", - icon_name, - error->message); - g_error_free (error); - return NULL; + surface = g_hash_table_lookup (self->icons, icon_name); + if (!surface) { + surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (), + icon_name, + size, + scale, + NULL, + 0, + &error); + g_hash_table_insert (self->icons, g_strdup(icon_name), surface); + if (surface == NULL) { + g_warning ("can't get icon surface for %s: %s", + icon_name, + error->message); + g_error_free (error); + return NULL; + } } return surface; } +static void +eek_gtk_renderer_dispose (GObject *object) +{ + EekGtkRenderer *self = EEK_GTK_RENDERER (object); + + g_clear_pointer (&self->icons, g_hash_table_destroy); + + G_OBJECT_CLASS (eek_gtk_renderer_parent_class)->dispose (object); +} + static void eek_gtk_renderer_class_init (EekGtkRendererClass *klass) { + GObjectClass *object_class = (GObjectClass *)klass; EekRendererClass *renderer_class = EEK_RENDERER_CLASS (klass); + object_class->dispose = eek_gtk_renderer_dispose; + renderer_class->get_icon_surface = eek_gtk_renderer_real_get_icon_surface; } @@ -74,6 +94,10 @@ eek_gtk_renderer_init (EekGtkRenderer *self) GtkIconTheme *theme = gtk_icon_theme_get_default (); gtk_icon_theme_add_resource_path (theme, "/sm/puri/squeekboard/icons"); + self->icons = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify)cairo_surface_destroy); } EekRenderer *