From 54b0f599352e6fd8d1ace8bbef488df603d61a68 Mon Sep 17 00:00:00 2001 From: David Boddie Date: Fri, 19 Jul 2019 00:32:58 +0200 Subject: [PATCH] Always create a new widget for a keyboard and update it if already visible --- eekboard/eekboard-context-service.c | 2 +- src/server-context-service.c | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/eekboard/eekboard-context-service.c b/eekboard/eekboard-context-service.c index bfa219d9..3fda97e5 100644 --- a/eekboard/eekboard-context-service.c +++ b/eekboard/eekboard-context-service.c @@ -345,7 +345,6 @@ settings_update_layout(EekboardContextService *context) g_autofree gchar *keyboard_type = NULL; g_autofree gchar *keyboard_layout = NULL; settings_get_layout(context->priv->settings, &keyboard_type, &keyboard_layout); - g_debug("type=%s, layout=%s", keyboard_type, keyboard_layout); if (!keyboard_type) { keyboard_type = g_strdup("us"); @@ -358,6 +357,7 @@ settings_update_layout(EekboardContextService *context) static guint keyboard_id = 0; EekKeyboard *keyboard = g_hash_table_lookup(context->priv->keyboard_hash, GUINT_TO_POINTER(keyboard_id)); + g_debug("type=%s, layout=%s, keyboard=%p", keyboard_type, keyboard_layout, keyboard); // create a keyboard if (!keyboard) { EekboardContextServiceClass *klass = EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context); diff --git a/src/server-context-service.c b/src/server-context-service.c index 1442078e..a749cbdb 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -82,7 +82,7 @@ on_notify_keyboard (GObject *object, GParamSpec *spec, ServerContextService *context) { - const EekKeyboard *keyboard; + EekKeyboard *keyboard; keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context)); @@ -94,6 +94,16 @@ on_notify_keyboard (GObject *object, // but simpler than adding a check in the window showing procedure eekboard_context_service_set_keymap(EEKBOARD_CONTEXT_SERVICE(context), keyboard); + + /* Recreate the keyboard widget to keep in sync with the keymap. */ + EekboardContextService *service = EEKBOARD_CONTEXT_SERVICE(context); + gboolean visible; + g_object_get(service, "visible", &visible, NULL); + + if (visible) { + eekboard_context_service_hide_keyboard (service); + eekboard_context_service_show_keyboard (service); + } } static void @@ -250,8 +260,12 @@ server_context_service_real_show_keyboard (EekboardContextService *_context) if (!context->window) make_window (context); - if (!context->widget) - make_widget (context); + if (context->widget) { + gtk_widget_destroy (GTK_WIDGET (context->widget)); + context->widget = NULL; + } + + make_widget (context); EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)-> show_keyboard (_context);