EekGtkRenderer: Use a hash table for icon theme lookups

This commit is contained in:
Guido Günther
2019-07-17 16:59:16 +02:00
parent 3b076e5e64
commit 068c325ee2

View File

@ -30,41 +30,61 @@
struct _EekGtkRenderer { struct _EekGtkRenderer {
EekRenderer parent; EekRenderer parent;
GHashTable *icons;
}; };
G_DEFINE_TYPE (EekGtkRenderer, eek_gtk_renderer, EEK_TYPE_RENDERER); G_DEFINE_TYPE (EekGtkRenderer, eek_gtk_renderer, EEK_TYPE_RENDERER);
static cairo_surface_t * 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, const gchar *icon_name,
gint size, gint size,
gint scale) gint scale)
{ {
EekGtkRenderer *self = EEK_GTK_RENDERER (renderer);
GError *error = NULL; GError *error = NULL;
cairo_surface_t *surface; cairo_surface_t *surface;
surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (), surface = g_hash_table_lookup (self->icons, icon_name);
icon_name, if (!surface) {
size, surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (),
scale, icon_name,
NULL, size,
0, scale,
&error); NULL,
if (surface == NULL) { 0,
g_warning ("can't get icon surface for %s: %s", &error);
icon_name, g_hash_table_insert (self->icons, g_strdup(icon_name), surface);
error->message); if (surface == NULL) {
g_error_free (error); g_warning ("can't get icon surface for %s: %s",
return NULL; icon_name,
error->message);
g_error_free (error);
return NULL;
}
} }
return surface; 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 static void
eek_gtk_renderer_class_init (EekGtkRendererClass *klass) eek_gtk_renderer_class_init (EekGtkRendererClass *klass)
{ {
GObjectClass *object_class = (GObjectClass *)klass;
EekRendererClass *renderer_class = EEK_RENDERER_CLASS (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; 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 (); GtkIconTheme *theme = gtk_icon_theme_get_default ();
gtk_icon_theme_add_resource_path (theme, "/sm/puri/squeekboard/icons"); 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 * EekRenderer *