Merge branch 'less-flicker' into 'master'
Make redisplaying the keyboard faster Closes #60 See merge request Librem5/squeekboard!82
This commit is contained in:
@ -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 *
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user