From 07d6e3a0f2f8561f05d691b1f49ceb680cf904e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 17 Jul 2019 16:13:43 +0200 Subject: [PATCH 1/4] ServerContextService: Don't use `gtk_widget_show_all` This gives children more flexibility without using `no_show_all`. --- src/server-context-service.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server-context-service.c b/src/server-context-service.c index 189b8791..f8dd8ae5 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -246,6 +246,7 @@ update_widget (ServerContextService *context) gtk_widget_set_has_tooltip (context->widget, TRUE); gtk_container_add (GTK_CONTAINER(context->window), context->widget); + gtk_widget_show (context->widget); set_geometry (context); } @@ -260,7 +261,7 @@ server_context_service_real_show_keyboard (EekboardContextService *_context) EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)-> show_keyboard (_context); - gtk_widget_show_all (context->window); + gtk_widget_show (context->window); } static void From 3b076e5e64d34684db50326b73fc1e280c3d6dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 17 Jul 2019 16:45:43 +0200 Subject: [PATCH 2/4] EekGtkRenderer: Simplify type declaration It's 2019. --- eek/eek-gtk-renderer.c | 4 ++++ eek/eek-gtk-renderer.h | 25 +------------------------ 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/eek/eek-gtk-renderer.c b/eek/eek-gtk-renderer.c index b16966e9..56a44d91 100644 --- a/eek/eek-gtk-renderer.c +++ b/eek/eek-gtk-renderer.c @@ -28,6 +28,10 @@ #include "eek-gtk-renderer.h" #include "eek-key.h" +struct _EekGtkRenderer { + EekRenderer parent; +}; + G_DEFINE_TYPE (EekGtkRenderer, eek_gtk_renderer, EEK_TYPE_RENDERER); static cairo_surface_t * diff --git a/eek/eek-gtk-renderer.h b/eek/eek-gtk-renderer.h index 5948477a..dc4c27cc 100644 --- a/eek/eek-gtk-renderer.h +++ b/eek/eek-gtk-renderer.h @@ -27,30 +27,7 @@ G_BEGIN_DECLS #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)) -#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]; -}; +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, From 068c325ee29a33bc63049e230efe57e52b093d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 17 Jul 2019 16:59:16 +0200 Subject: [PATCH 3/4] EekGtkRenderer: Use a hash table for icon theme lookups --- eek/eek-gtk-renderer.c | 52 ++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/eek/eek-gtk-renderer.c b/eek/eek-gtk-renderer.c index 56a44d91..8e413978 100644 --- a/eek/eek-gtk-renderer.c +++ b/eek/eek-gtk-renderer.c @@ -30,41 +30,61 @@ 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 = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (), - icon_name, - size, - scale, - NULL, - 0, - &error); - if (surface == NULL) { - g_warning ("can't get icon surface for %s: %s", - icon_name, - error->message); - g_error_free (error); - return NULL; + 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; } @@ -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 * From 373713ba5446d759da23fe4dec433516f1527def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 17 Jul 2019 17:12:23 +0200 Subject: [PATCH 4/4] ServerContextService: Don't destroy widget all the time This avoids icon theme lookups and lots of other stuff down the road. Closes: #60 --- src/server-context-service.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/server-context-service.c b/src/server-context-service.c index f8dd8ae5..c9ed3edf 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -55,7 +55,6 @@ struct _ServerContextServiceClass { 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 @@ -223,16 +222,12 @@ destroy_window (ServerContextService *context) } static void -update_widget (ServerContextService *context) +make_widget (ServerContextService *context) { EekKeyboard *keyboard; EekTheme *theme; - if (context->widget) { - gtk_widget_destroy (context->widget); - context->widget = NULL; - } - + g_return_if_fail (!context->widget); theme = eek_theme_new ("resource:///sm/puri/squeekboard/style.css", NULL, NULL); @@ -257,7 +252,8 @@ server_context_service_real_show_keyboard (EekboardContextService *_context) if (!context->window) make_window (context); - update_widget (context); + if (!context->widget) + make_widget (context); EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)-> show_keyboard (_context); @@ -270,7 +266,6 @@ server_context_service_real_hide_keyboard (EekboardContextService *_context) ServerContextService *context = SERVER_CONTEXT_SERVICE(_context); gtk_widget_hide (context->window); - g_clear_pointer (&context->widget, gtk_widget_destroy); EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)-> hide_keyboard (_context);