summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..2cabd3f
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,143 @@
+/* vim:set et sts=4: */
+
+/*
+ * Keyman Input Method for IBUS (The Input Bus)
+ *
+ * Copyright (C) 2018 SIL International
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include <ibus.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "keymanutil.h"
+#include "engine.h"
+#include "keyman-service.h"
+
+static IBusBus *bus = NULL;
+static IBusFactory *factory = NULL;
+
+/* options */
+static gboolean xml = FALSE;
+static gboolean ibus = FALSE;
+static gboolean verbose = FALSE;
+
+static const GOptionEntry entries[] =
+{
+ { "xml", 'x', 0, G_OPTION_ARG_NONE, &xml, "generate xml for engines", NULL },
+ { "ibus", 'i', 0, G_OPTION_ARG_NONE, &ibus, "component is executed by ibus", NULL },
+ { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "verbose", NULL },
+ { NULL },
+};
+
+
+static void
+ibus_disconnected_cb (IBusBus *bus,
+ gpointer user_data)
+{
+ g_debug ("bus disconnected");
+ KeymanService *service = km_service_get_default();
+ g_clear_object(&service);
+
+ ibus_quit ();
+}
+
+
+static void
+start_component (void)
+{
+ GList *engines, *p;
+ IBusComponent *component;
+
+ ibus_init ();
+
+ bus = ibus_bus_new ();
+ g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL);
+
+ component = ibus_keyman_get_component ();
+
+ factory = ibus_factory_new (ibus_bus_get_connection (bus));
+
+ engines = ibus_component_get_engines (component);
+ for (p = engines; p != NULL; p = p->next) {
+ IBusEngineDesc *engine = (IBusEngineDesc *)p->data;
+#if IBUS_CHECK_VERSION(1,3,99)
+ const gchar *engine_name = ibus_engine_desc_get_name (engine);
+#else
+ const gchar *engine_name = engine->name;
+#endif /* !IBUS_CHECK_VERSION(1,3,99) */
+ ibus_factory_add_engine (factory, engine_name, IBUS_TYPE_KEYMAN_ENGINE);
+ }
+
+ if (ibus) {
+ ibus_bus_request_name (bus, "org.freedesktop.IBus.Keyman", 0);
+ }
+ else {
+ ibus_bus_register_component (bus, component);
+ }
+
+ g_object_unref (component);
+ km_service_get_default(); // initialise dbus service
+
+ ibus_main ();
+}
+
+static void
+print_engines_xml (void)
+{
+ IBusComponent *component;
+ GString *output;
+
+ ibus_init ();
+
+ component = ibus_keyman_get_component ();
+ output = g_string_new ("");
+
+ ibus_component_output_engines (component, output, 0);
+
+ fprintf (stdout, "%s", output->str);
+
+ g_string_free (output, TRUE);
+
+}
+
+int
+main (gint argc, gchar **argv)
+{
+ GError *error = NULL;
+ GOptionContext *context;
+
+ setlocale (LC_ALL, "");
+
+ context = g_option_context_new ("- ibus Keyman engine component");
+
+ g_option_context_add_main_entries (context, entries, "ibus-keyman");
+
+ if (!g_option_context_parse (context, &argc, &argv, &error)) {
+ g_print ("Option parsing failed: %s\n", error->message);
+ exit (-1);
+ }
+
+ if (xml) {
+ print_engines_xml ();
+ exit (0);
+ }
+
+ start_component ();
+ return 0;
+}