EekGtkRenderer: Use a hash table for icon theme lookups
This commit is contained in:
@ -30,19 +30,24 @@
|
||||
|
||||
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 = g_hash_table_lookup (self->icons, icon_name);
|
||||
if (!surface) {
|
||||
surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (),
|
||||
icon_name,
|
||||
size,
|
||||
@ -50,6 +55,7 @@ eek_gtk_renderer_real_get_icon_surface (EekRenderer *self,
|
||||
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,
|
||||
@ -57,14 +63,28 @@ eek_gtk_renderer_real_get_icon_surface (EekRenderer *self,
|
||||
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 *
|
||||
|
||||
Reference in New Issue
Block a user