From 2622e4eb593b78df72aba5ec2a28ea429c5daa98 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Fri, 11 Mar 2011 15:07:40 +0900 Subject: [PATCH] Add --keyboard option to eekboard. --- src/client-main.c | 22 +++++++-- src/client.c | 116 ++++++++++++++++++++++++++++++++-------------- src/client.h | 3 ++ 3 files changed, 101 insertions(+), 40 deletions(-) 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,