From e6d17fa4cb81a7275974a762383b1e3cc4bb8994 Mon Sep 17 00:00:00 2001
From: Daiki Ueno <ueno@unixuser.org>
Date: Fri, 11 Mar 2011 17:39:23 +0900
Subject: [PATCH] Fix the last commit.

---
 .gitignore                             |   2 +
 configure.ac                           |   2 +-
 data/eekboard.desktop.in               |   9 ++
 eek/eek-container.c                    |   2 +-
 eek/eek-container.h                    |   8 ++
 examples/eekboard-inscript/inscript.py |  33 ++++++-
 examples/eekboard-inscript/main.py     |  13 ++-
 src/client-main.c                      |  22 ++++-
 src/client.c                           | 116 +++++++++++++++++--------
 src/client.h                           |   3 +
 10 files changed, 166 insertions(+), 44 deletions(-)
 create mode 100644 data/eekboard.desktop.in

diff --git a/.gitignore b/.gitignore
index 21d33221..197a96ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -72,3 +72,5 @@ po/Makefile.in.in
 po/POTFILES
 po/stamp-it
 bindings/vala/*.vapi
+py-compile
+
diff --git a/configure.ac b/configure.ac
index 83499bf0..3c732bac 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,7 +20,7 @@ AC_PREREQ(2.63)
 dnl AC_CONFIG_SRCDIR([configure.ac])
 AC_CONFIG_MACRO_DIR([m4])
 
-AC_INIT([eekboard], [0.90.4], [ueno@unixuser.org])
+AC_INIT([eekboard], [0.90.5], [ueno@unixuser.org])
 
 dnl Init automake
 AM_INIT_AUTOMAKE
diff --git a/data/eekboard.desktop.in b/data/eekboard.desktop.in
new file mode 100644
index 00000000..3424fda4
--- /dev/null
+++ b/data/eekboard.desktop.in
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=Eekboard
+GenericName=Eekboard Virtual Keyboard
+Comment=Virtual Keyboard
+Exec=eekboard-desktop-client
+Icon=eekboard
+Terminal=false
+Type=Application
+Categories=GTK;Utility;
diff --git a/eek/eek-container.c b/eek/eek-container.c
index ee644174..9e8c56d4 100644
--- a/eek/eek-container.c
+++ b/eek/eek-container.c
@@ -249,7 +249,7 @@ eek_container_init (EekContainer *self)
 /**
  * eek_container_foreach_child:
  * @container: an #EekContainer
- * @callback: an #EekCallback
+ * @callback: (scope call): an #EekCallback
  * @user_data: additional data passed to @callback
  *
  * Enumerate children of @container and run @callback with each child.
diff --git a/eek/eek-container.h b/eek/eek-container.h
index 4d83dfd0..40f683ee 100644
--- a/eek/eek-container.h
+++ b/eek/eek-container.h
@@ -34,6 +34,14 @@ G_BEGIN_DECLS
 typedef struct _EekContainerClass EekContainerClass;
 typedef struct _EekContainerPrivate EekContainerPrivate;
 
+/**
+ * EekCallback:
+ * @element: an #EekElement
+ * @user_data: user-supplied data
+ *
+ * The type of the callback function used for iterating over the
+ * children of a container, see eek_container_foreach_child().
+ */
 typedef void (*EekCallback) (EekElement *element, gpointer user_data);
 typedef gint (*EekCompareFunc) (EekElement *element, gpointer user_data);
 
diff --git a/examples/eekboard-inscript/inscript.py b/examples/eekboard-inscript/inscript.py
index 47a26d9b..f0d5a778 100644
--- a/examples/eekboard-inscript/inscript.py
+++ b/examples/eekboard-inscript/inscript.py
@@ -18,7 +18,8 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 # 02110-1301 USA
 
-import gobject, gtk, eekboard, virtkey
+import eekboard
+import gobject, gtk, virtkey
 import sys, os.path, re
 
 KEYCODE_TABLE = {
@@ -33,6 +34,36 @@ KEYCODE_TABLE = {
 MARK_UPPER = '~!@#$%^&*()_+{}|:"<>?'
 MARK_LOWER = '`1234567890-=[]\\;\',./'
 
+INSCRIPT_MAPS = (
+    "as-inscript",
+    "bn-inscript",
+    "gu-inscript",
+    "hi-inscript",
+    "kn-inscript",
+    "ml-inscript",
+    "mr-inscript",
+    "or-inscript",
+    "pa-inscript",
+    "sd-inscript",
+    "ta-inscript",
+    "te-inscript",
+    "kn-inscript2",
+    "kok-inscript2-deva",
+    "mai-inscript2",
+    "ml-inscript2",
+    "mni-inscript2-beng",
+    "mni-inscript2-mtei",
+    "mr-inscript2",
+    "ne-inscript2-deva",
+    "or-inscript2",
+    "pa-inscript2-guru",
+    "sa-inscript2",
+    "sat-inscript2-deva",
+    "sat-inscript2-olck",
+    "sd-inscript2-deva",
+    "ta-inscript2",
+    "te-inscript2")
+
 class MapFile(object):
     MAPENTRY_PATTERN = re.compile(r'\A\s*\((?:\((.*?)\)|"(.*?)")\s*"(.*?)"\)')
 
diff --git a/examples/eekboard-inscript/main.py b/examples/eekboard-inscript/main.py
index 6353267e..b96f6dea 100644
--- a/examples/eekboard-inscript/main.py
+++ b/examples/eekboard-inscript/main.py
@@ -19,14 +19,25 @@
 import inscript
 import gtk
 from optparse import OptionParser
-import sys, os
+import sys, os, os.path, glob
 
 parser = OptionParser()
 parser.add_option("-n", "--name=LANGCODE", dest="langcode",
                   help="Specify language code to LANGCODE",
                   metavar="LANGCODE")
+parser.add_option("-l", "--list", dest="list", default=False,
+                  action="store_true",
+                  help="List available language codes")
 (options, args) = parser.parse_args()
 
+if options.list:
+    pat = os.path.join(os.getenv("M17N_DIR"), "*.mim")
+    for fname in sorted(glob.glob(pat)):
+        mname = os.path.basename(fname[:-4])
+        if mname in inscript.INSCRIPT_MAPS:
+            print mname
+    exit(0)
+
 if options.langcode is None:
     print >> sys.stderr, "Specify language code with -n"
     exit(1)
diff --git a/src/client-main.c b/src/client-main.c
index cd6e4dab..121de9e8 100644
--- a/src/client-main.c
+++ b/src/client-main.c
@@ -36,6 +36,8 @@ static gboolean opt_focus = FALSE;
 static gboolean opt_keystroke = FALSE;
 #endif  /* HAVE_CSPI */
 
+static gchar *opt_keyboard = NULL;
+
 static gchar *opt_model = NULL;
 static gchar *opt_layouts = NULL;
 static gchar *opt_options = NULL;
@@ -55,6 +57,8 @@ static const GOptionEntry options[] = {
     {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
      N_("Listen keystroke events with AT-SPI")},
 #endif  /* HAVE_CSPI */
+    {"keyboard", 'k', 0, G_OPTION_ARG_STRING, &opt_keyboard,
+     N_("Specify keyboard file")},
     {"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model,
      N_("Specify model")},
     {"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts,
@@ -198,11 +202,21 @@ main (int argc, char **argv)
     }
 #endif  /* HAVE_CSPI */
 
-    if (opt_model || opt_layouts || opt_options) {
+    if (opt_keyboard && (opt_model || opt_layouts || opt_options)) {
+        g_printerr ("Can't use --keyboard option with xklavier options\n");
+        exit (1);
+    }
+
+    if (opt_keyboard) {
+        if (!eekboard_client_load_keyboard_from_file (client, opt_keyboard)) {
+            g_printerr ("Can't load keyboard\n");
+            exit (1);
+        }
+    } else if (opt_model || opt_layouts || opt_options) {
         if (!eekboard_client_set_xkl_config (client,
-                                                     opt_model,
-                                                     opt_layouts,
-                                                     opt_options)) {
+                                             opt_model,
+                                             opt_layouts,
+                                             opt_options)) {
             g_printerr ("Can't set xklavier config\n");
             exit (1);
         }
diff --git a/src/client.c b/src/client.c
index a2cf64c4..7c166d22 100644
--- a/src/client.c
+++ b/src/client.c
@@ -106,7 +106,10 @@ static SPIBoolean      keystroke_listener_cb
                                          (const AccessibleKeystroke *stroke,
                                           void                      *user_data);
 #endif  /* HAVE_CSPI */
-static gboolean        set_keyboard      (EekboardClient     *client,
+static gboolean        set_keyboard      (EekboardClient            *client,
+                                          gboolean                   show,
+                                          EekLayout                 *layout);
+static gboolean        set_xkl_keyboard  (EekboardClient            *client,
                                           gboolean                   show,
                                           const gchar               *model,
                                           const gchar               *layouts,
@@ -287,17 +290,17 @@ eekboard_client_set_xkl_config (EekboardClient *client,
                                         const gchar *options)
 {
 #ifdef HAVE_CSPI
-    return set_keyboard (client,
-                         client->focus_listener ? FALSE : TRUE,
-                         model,
-                         layouts,
-                         options);
+    return set_xkl_keyboard (client,
+                             client->focus_listener ? FALSE : TRUE,
+                             model,
+                             layouts,
+                             options);
 #else
-    return set_keyboard (client,
-                         TRUE,
-                         model,
-                         layouts,
-                         options);
+    return set_xkl_keyboard (client,
+                             TRUE,
+                             model,
+                             layouts,
+                             options);
 #endif
 }
 
@@ -338,10 +341,13 @@ eekboard_client_enable_xkl (EekboardClient *client)
     xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
 
 #ifdef HAVE_CSPI
-    return set_keyboard (client, client->focus_listener ? FALSE : TRUE,
-                         NULL, NULL, NULL);
+    return set_xkl_keyboard (client,
+                             client->focus_listener ? FALSE : TRUE,
+                             NULL,
+                             NULL,
+                             NULL);
 #else
-    return set_keyboard (client, TRUE, NULL, NULL, NULL);
+    return set_xkl_keyboard (client, TRUE, NULL, NULL, NULL);
 #endif
 }
 
@@ -519,7 +525,7 @@ on_xkl_config_changed (XklEngine *xklengine,
     EekboardClient *client = user_data;
     gboolean retval;
 
-    retval = set_keyboard (client, FALSE, NULL, NULL, NULL);
+    retval = set_xkl_keyboard (client, FALSE, NULL, NULL, NULL);
     g_return_if_fail (retval);
 
 #ifdef HAVE_FAKEKEY
@@ -530,16 +536,40 @@ on_xkl_config_changed (XklEngine *xklengine,
 
 static gboolean
 set_keyboard (EekboardClient *client,
-              gboolean               show,
-              const gchar           *model,
-              const gchar           *layouts,
-              const gchar           *options)
+              gboolean        show,
+              EekLayout      *layout)
 {
-    EekLayout *layout;
     gchar *keyboard_name;
     static gint keyboard_serial = 0;
     guint keyboard_id;
 
+    client->keyboard = eek_keyboard_new (layout, CSW, CSH);
+    eek_keyboard_set_modifier_behavior (client->keyboard,
+                                        EEK_MODIFIER_BEHAVIOR_LATCH);
+
+    keyboard_name = g_strdup_printf ("keyboard%d", keyboard_serial++);
+    eek_element_set_name (EEK_ELEMENT(client->keyboard), keyboard_name);
+    g_free (keyboard_name);
+
+    keyboard_id = eekboard_context_add_keyboard (client->context,
+                                                 client->keyboard,
+                                                 NULL);
+    eekboard_context_set_keyboard (client->context, keyboard_id, NULL);
+    if (show)
+        eekboard_context_show_keyboard (client->context, NULL);
+    return TRUE;
+}
+
+static gboolean
+set_xkl_keyboard (EekboardClient *client,
+                  gboolean        show,
+                  const gchar    *model,
+                  const gchar    *layouts,
+                  const gchar    *options)
+{
+    EekLayout *layout;
+    gboolean retval;
+
     if (client->keyboard)
         g_object_unref (client->keyboard);
     layout = eek_xkl_layout_new ();
@@ -583,22 +613,9 @@ set_keyboard (EekboardClient *client,
         }
     }
 
-    client->keyboard = eek_keyboard_new (layout, CSW, CSH);
-    eek_keyboard_set_modifier_behavior (client->keyboard,
-                                        EEK_MODIFIER_BEHAVIOR_LATCH);
-
-    keyboard_name = g_strdup_printf ("keyboard%d", keyboard_serial++);
-    eek_element_set_name (EEK_ELEMENT(client->keyboard), keyboard_name);
-    g_free (keyboard_name);
-
-    keyboard_id = eekboard_context_add_keyboard (client->context,
-                                                 client->keyboard,
-                                                 NULL);
-    eekboard_context_set_keyboard (client->context, keyboard_id, NULL);
-    if (show)
-        eekboard_context_show_keyboard (client->context, NULL);
-
-    return TRUE;
+    retval = set_keyboard (client, show, layout);
+    g_object_unref (layout);
+    return retval;
 }
 
 static void
@@ -715,4 +732,31 @@ eekboard_client_disable_fakekey (EekboardClient *client)
         g_signal_handler_disconnect (client->keyboard,
                                      client->key_released_handler);
 }
+
+gboolean
+eekboard_client_load_keyboard_from_file (EekboardClient *client,
+                                         const gchar    *keyboard_file)
+{
+    GFile *file;
+    GFileInputStream *input;
+    GError *error;
+    EekLayout *layout;
+    EekKeyboard *keyboard;
+    guint keyboard_id;
+    gboolean retval;
+
+    file = g_file_new_for_path (keyboard_file);
+
+    error = NULL;
+    input = g_file_read (file, NULL, &error);
+    if (input == NULL)
+        return FALSE;
+
+    layout = eek_xml_layout_new (G_INPUT_STREAM(input));
+    g_object_unref (input);
+    retval = set_keyboard (client, TRUE, layout);
+    g_object_unref (layout);
+    return retval;
+}
+
 #endif  /* HAVE_FAKEKEY */
diff --git a/src/client.h b/src/client.h
index 492f6b4d..09215320 100644
--- a/src/client.h
+++ b/src/client.h
@@ -33,6 +33,9 @@ typedef struct _EekboardClient EekboardClient;
 
 EekboardClient * eekboard_client_new             (GDBusConnection *connection);
 
+gboolean         eekboard_client_load_keyboard_from_file
+                                                 (EekboardClient  *client,
+                                                  const gchar     *file);
 gboolean         eekboard_client_set_xkl_config  (EekboardClient  *client,
                                                   const gchar     *model,
                                                   const gchar     *layouts,
-- 
GitLab