From a5875402efca8faf4c26d0b707a56dfbdf2cf84f Mon Sep 17 00:00:00 2001 From: David Boddie Date: Thu, 18 Jul 2019 15:42:27 +0200 Subject: [PATCH] Move EekGtkRenderer features into EekRenderer --- eek/eek-gtk-keyboard.c | 4 +- eek/eek-gtk-renderer.c | 110 ----------------------------------------- eek/eek-gtk-renderer.h | 38 -------------- eek/eek-renderer.c | 41 +++++++++++++-- src/meson.build | 1 - 5 files changed, 38 insertions(+), 156 deletions(-) delete mode 100644 eek/eek-gtk-renderer.c delete mode 100644 eek/eek-gtk-renderer.h diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index dfe9a968..317f1b60 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -33,7 +33,7 @@ #include #include "eek-gtk-keyboard.h" -#include "eek-gtk-renderer.h" +#include "eek-renderer.h" #include "eek-keyboard.h" #include "eek-section.h" #include "eek-key.h" @@ -112,7 +112,7 @@ eek_gtk_keyboard_real_draw (GtkWidget *self, PangoContext *pcontext; pcontext = gtk_widget_get_pango_context (self); - priv->renderer = eek_gtk_renderer_new (priv->keyboard, pcontext, self); + priv->renderer = eek_renderer_new (priv->keyboard, pcontext); if (priv->theme) eek_renderer_set_theme (priv->renderer, priv->theme); diff --git a/eek/eek-gtk-renderer.c b/eek/eek-gtk-renderer.c deleted file mode 100644 index 9763d9da..00000000 --- a/eek/eek-gtk-renderer.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2011 Daiki Ueno - * Copyright (C) 2011 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301 USA - */ - -#include "config.h" - -#include -#include - -#include "eek-gtk-renderer.h" -#include "eek-key.h" - -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 *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, - 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; -} - -static void -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 * -eek_gtk_renderer_new (EekKeyboard *keyboard, - PangoContext *pcontext, - GtkWidget *widget) -{ - return g_object_new (EEK_TYPE_GTK_RENDERER, - "keyboard", keyboard, - "pango-context", pcontext, - NULL); -} diff --git a/eek/eek-gtk-renderer.h b/eek/eek-gtk-renderer.h deleted file mode 100644 index dc4c27cc..00000000 --- a/eek/eek-gtk-renderer.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2010-2011 Daiki Ueno - * Copyright (C) 2010-2011 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301 USA - */ - -#ifndef EEK_GTK_RENDERER_H -#define EEK_GTK_RENDERER_H 1 - -#include -#include "eek-renderer.h" - -G_BEGIN_DECLS - -#define EEK_TYPE_GTK_RENDERER (eek_gtk_renderer_get_type()) -G_DECLARE_FINAL_TYPE (EekGtkRenderer, eek_gtk_renderer, EEK, GTK_RENDERER, EekRenderer) - -GType eek_gtk_renderer_get_type (void) G_GNUC_CONST; -EekRenderer *eek_gtk_renderer_new (EekKeyboard *keyboard, - PangoContext *pcontext, - GtkWidget *widget); - -G_END_DECLS -#endif /* EEK_GTK_RENDERER_H */ diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index c9b15083..212536ed 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -22,6 +22,8 @@ #include #include +#include +#include #include "eek-key.h" #include "eek-section.h" @@ -52,6 +54,7 @@ typedef struct _EekRendererPrivate PangoFontDescription *font; GHashTable *outline_surface_cache; GHashTable *active_outline_surface_cache; + GHashTable *icons; cairo_surface_t *keyboard_surface; gulong symbol_index_changed_handler; @@ -776,6 +779,8 @@ eek_renderer_dispose (GObject *object) priv->pcontext = NULL; } + g_clear_pointer (&priv->icons, g_hash_table_destroy); + /* this will release all allocated surfaces and font if any */ invalidate (EEK_RENDERER(object)); @@ -857,6 +862,14 @@ eek_renderer_init (EekRenderer *self) (GDestroyNotify)cairo_surface_destroy); priv->keyboard_surface = NULL; priv->symbol_index_changed_handler = 0; + + GtkIconTheme *theme = gtk_icon_theme_get_default (); + + gtk_icon_theme_add_resource_path (theme, "/sm/puri/squeekboard/icons"); + priv->icons = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify)cairo_surface_destroy); } static void @@ -1083,14 +1096,32 @@ eek_renderer_get_icon_surface (EekRenderer *renderer, gint size, gint scale) { - EekRendererClass *klass; + GError *error = NULL; + cairo_surface_t *surface; g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL); - klass = EEK_RENDERER_GET_CLASS(renderer); - if (klass->get_icon_surface) - return klass->get_icon_surface (renderer, icon_name, size, scale); - return NULL; + EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); + + surface = g_hash_table_lookup (priv->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 (priv->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; } void diff --git a/src/meson.build b/src/meson.build index 1a8dad20..fefe5a80 100644 --- a/src/meson.build +++ b/src/meson.build @@ -16,7 +16,6 @@ sources = [ '../eek/eek-container.c', '../eek/eek-element.c', '../eek/eek-gtk-keyboard.c', - '../eek/eek-gtk-renderer.c', '../eek/eek-key.c', '../eek/eek-keyboard.c', '../eek/eek-keyboard-drawing.c',