Merge branch 'less-flicker' into 'master'

Make redisplaying the keyboard faster

Closes #60

See merge request Librem5/squeekboard!82
This commit is contained in:
David Boddie
2019-07-17 16:32:29 +00:00
3 changed files with 49 additions and 48 deletions

View File

@ -28,39 +28,63 @@
#include "eek-gtk-renderer.h" #include "eek-gtk-renderer.h"
#include "eek-key.h" #include "eek-key.h"
struct _EekGtkRenderer {
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;
} }
@ -70,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 *

View File

@ -27,30 +27,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define EEK_TYPE_GTK_RENDERER (eek_gtk_renderer_get_type()) #define EEK_TYPE_GTK_RENDERER (eek_gtk_renderer_get_type())
#define EEK_GTK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_GTK_RENDERER, EekGtkRenderer)) G_DECLARE_FINAL_TYPE (EekGtkRenderer, eek_gtk_renderer, EEK, GTK_RENDERER, EekRenderer)
#define EEK_GTK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_GTK_RENDERER, EekGtkRendererClass))
#define EEK_IS_GTK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_GTK_RENDERER))
#define EEK_IS_GTK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_GTK_RENDERER))
#define EEK_GTK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_GTK_RENDERER, EekGtkRendererClass))
typedef struct _EekGtkRenderer EekGtkRenderer;
typedef struct _EekGtkRendererClass EekGtkRendererClass;
typedef struct _EekGtkRendererPrivate EekGtkRendererPrivate;
struct _EekGtkRenderer {
EekRenderer parent;
EekGtkRendererPrivate *priv;
};
struct _EekGtkRendererClass
{
EekRendererClass parent_class;
/*< private >*/
/* padding */
gpointer pdummy[24];
};
GType eek_gtk_renderer_get_type (void) G_GNUC_CONST; GType eek_gtk_renderer_get_type (void) G_GNUC_CONST;
EekRenderer *eek_gtk_renderer_new (EekKeyboard *keyboard, EekRenderer *eek_gtk_renderer_new (EekKeyboard *keyboard,

View File

@ -55,7 +55,6 @@ struct _ServerContextServiceClass {
G_DEFINE_TYPE (ServerContextService, server_context_service, EEKBOARD_TYPE_CONTEXT_SERVICE); G_DEFINE_TYPE (ServerContextService, server_context_service, EEKBOARD_TYPE_CONTEXT_SERVICE);
static void update_widget (ServerContextService *context);
static void set_geometry (ServerContextService *context); static void set_geometry (ServerContextService *context);
static void static void
@ -223,16 +222,12 @@ destroy_window (ServerContextService *context)
} }
static void static void
update_widget (ServerContextService *context) make_widget (ServerContextService *context)
{ {
EekKeyboard *keyboard; EekKeyboard *keyboard;
EekTheme *theme; EekTheme *theme;
if (context->widget) { g_return_if_fail (!context->widget);
gtk_widget_destroy (context->widget);
context->widget = NULL;
}
theme = eek_theme_new ("resource:///sm/puri/squeekboard/style.css", theme = eek_theme_new ("resource:///sm/puri/squeekboard/style.css",
NULL, NULL,
NULL); NULL);
@ -246,6 +241,7 @@ update_widget (ServerContextService *context)
gtk_widget_set_has_tooltip (context->widget, TRUE); gtk_widget_set_has_tooltip (context->widget, TRUE);
gtk_container_add (GTK_CONTAINER(context->window), context->widget); gtk_container_add (GTK_CONTAINER(context->window), context->widget);
gtk_widget_show (context->widget);
set_geometry (context); set_geometry (context);
} }
@ -256,11 +252,12 @@ server_context_service_real_show_keyboard (EekboardContextService *_context)
if (!context->window) if (!context->window)
make_window (context); make_window (context);
update_widget (context); if (!context->widget)
make_widget (context);
EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)-> EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)->
show_keyboard (_context); show_keyboard (_context);
gtk_widget_show_all (context->window); gtk_widget_show (context->window);
} }
static void static void
@ -269,7 +266,6 @@ server_context_service_real_hide_keyboard (EekboardContextService *_context)
ServerContextService *context = SERVER_CONTEXT_SERVICE(_context); ServerContextService *context = SERVER_CONTEXT_SERVICE(_context);
gtk_widget_hide (context->window); gtk_widget_hide (context->window);
g_clear_pointer (&context->widget, gtk_widget_destroy);
EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)-> EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)->
hide_keyboard (_context); hide_keyboard (_context);