Merge branch 'merge-renderers' into 'master'

Move EekGtkRenderer features into EekRenderer

Closes #61

See merge request Librem5/squeekboard!84
This commit is contained in:
David Boddie
2019-07-19 14:56:54 +00:00
5 changed files with 38 additions and 156 deletions

View File

@ -33,7 +33,7 @@
#include <string.h> #include <string.h>
#include "eek-gtk-keyboard.h" #include "eek-gtk-keyboard.h"
#include "eek-gtk-renderer.h" #include "eek-renderer.h"
#include "eek-keyboard.h" #include "eek-keyboard.h"
#include "eek-section.h" #include "eek-section.h"
#include "eek-key.h" #include "eek-key.h"
@ -112,7 +112,7 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
PangoContext *pcontext; PangoContext *pcontext;
pcontext = gtk_widget_get_pango_context (self); 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) if (priv->theme)
eek_renderer_set_theme (priv->renderer, priv->theme); eek_renderer_set_theme (priv->renderer, priv->theme);

View File

@ -1,110 +0,0 @@
/*
* Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
* 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 <string.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#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);
}

View File

@ -1,38 +0,0 @@
/*
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
* 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 <gtk/gtk.h>
#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 */

View File

@ -22,6 +22,8 @@
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h>
#include "eek-key.h" #include "eek-key.h"
#include "eek-section.h" #include "eek-section.h"
@ -52,6 +54,7 @@ typedef struct _EekRendererPrivate
PangoFontDescription *font; PangoFontDescription *font;
GHashTable *outline_surface_cache; GHashTable *outline_surface_cache;
GHashTable *active_outline_surface_cache; GHashTable *active_outline_surface_cache;
GHashTable *icons;
cairo_surface_t *keyboard_surface; cairo_surface_t *keyboard_surface;
gulong symbol_index_changed_handler; gulong symbol_index_changed_handler;
@ -776,6 +779,8 @@ eek_renderer_dispose (GObject *object)
priv->pcontext = NULL; priv->pcontext = NULL;
} }
g_clear_pointer (&priv->icons, g_hash_table_destroy);
/* this will release all allocated surfaces and font if any */ /* this will release all allocated surfaces and font if any */
invalidate (EEK_RENDERER(object)); invalidate (EEK_RENDERER(object));
@ -857,6 +862,14 @@ eek_renderer_init (EekRenderer *self)
(GDestroyNotify)cairo_surface_destroy); (GDestroyNotify)cairo_surface_destroy);
priv->keyboard_surface = NULL; priv->keyboard_surface = NULL;
priv->symbol_index_changed_handler = 0; 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 static void
@ -1083,15 +1096,33 @@ eek_renderer_get_icon_surface (EekRenderer *renderer,
gint size, gint size,
gint scale) gint scale)
{ {
EekRendererClass *klass; GError *error = NULL;
cairo_surface_t *surface;
g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL); g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
klass = EEK_RENDERER_GET_CLASS(renderer); EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
if (klass->get_icon_surface)
return klass->get_icon_surface (renderer, icon_name, size, scale); 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 NULL;
} }
}
return surface;
}
void void
eek_renderer_render_key (EekRenderer *renderer, eek_renderer_render_key (EekRenderer *renderer,

View File

@ -16,7 +16,6 @@ sources = [
'../eek/eek-container.c', '../eek/eek-container.c',
'../eek/eek-element.c', '../eek/eek-element.c',
'../eek/eek-gtk-keyboard.c', '../eek/eek-gtk-keyboard.c',
'../eek/eek-gtk-renderer.c',
'../eek/eek-key.c', '../eek/eek-key.c',
'../eek/eek-keyboard.c', '../eek/eek-keyboard.c',
'../eek/eek-keyboard-drawing.c', '../eek/eek-keyboard-drawing.c',