summaryrefslogtreecommitdiffstats
path: root/bus/ibusimpl.c
diff options
context:
space:
mode:
Diffstat (limited to 'bus/ibusimpl.c')
-rw-r--r--bus/ibusimpl.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
index c52907e..91db048 100644
--- a/bus/ibusimpl.c
+++ b/bus/ibusimpl.c
@@ -23,6 +23,8 @@
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>
+#include <locale.h>
+#include <strings.h>
#include "ibusimpl.h"
#include "dbusimpl.h"
#include "server.h"
@@ -228,6 +230,60 @@ bus_ibus_impl_set_preload_engines (BusIBusImpl *ibus,
}
static void
+bus_ibus_impl_set_default_preload_engines (BusIBusImpl *ibus)
+{
+ g_assert (BUS_IS_IBUS_IMPL (ibus));
+
+ static gboolean done = FALSE;
+ GValue value = { 0 };
+ GList *engines, *l;
+ gchar *lang, *p;
+ GValueArray *array;
+
+ if (done || ibus->config == NULL) {
+ return;
+ }
+
+ if (ibus_config_get_value (ibus->config, "general", "preload_engines", &value)) {
+ done = TRUE;
+ g_value_unset (&value);
+ return;
+ }
+
+ done = TRUE;
+ lang = g_strdup (setlocale (LC_ALL, NULL));
+ p = index (lang, '.');
+ if (p) {
+ *p = '\0';
+ }
+
+ engines = bus_registry_get_engines_by_language (ibus->registry, lang);
+ if (engines == NULL) {
+ p = index (lang, '_');
+ if (p) {
+ *p = '\0';
+ engines = bus_registry_get_engines_by_language (ibus->registry, lang);
+ }
+ }
+ g_free (lang);
+
+ g_value_init (&value, G_TYPE_VALUE_ARRAY);
+ array = g_value_array_new (5);
+ for (l = engines; l != NULL; l = l->next) {
+ IBusEngineDesc *desc;
+ GValue name = { 0 };
+ desc = (IBusEngineDesc *)l->data;
+ g_value_init (&name, G_TYPE_STRING);
+ g_value_set_string (&name, desc->name);
+ g_value_array_append (array, &name);
+ }
+ g_value_take_boxed (&value, array);
+ ibus_config_set_value (ibus->config, "general", "preload_engines", &value);
+ g_value_unset (&value);
+ g_list_free (engines);
+}
+
+static void
bus_ibus_impl_reload_config (BusIBusImpl *ibus)
{
g_assert (BUS_IS_IBUS_IMPL (ibus));
@@ -378,6 +434,7 @@ _dbus_name_owner_changed_cb (BusDBusImpl *dbus,
G_CALLBACK (_config_destroy_cb),
ibus);
+ bus_ibus_impl_set_default_preload_engines (ibus);
bus_ibus_impl_reload_config (ibus);
}
}