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