From 39900bd987e566a9773c2a9d7dd2e86dcfaf04eb Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Thu, 18 Aug 2011 17:02:39 +0900 Subject: [PATCH] Allow non-keysym symbols in XML. --- data/keyboards/th.xml | 2 +- data/keyboards/us.xml | 2 +- eek/eek-symbol.c | 2 +- eek/eek-xml-layout.c | 39 +++++++++++-------- eek/special-keysym-entries.txt | 6 +-- eekboard/eekboard-context.c | 13 ++++--- eekboard/eekboard-context.h | 2 +- eekboard/eekboard-marshalers.list | 2 +- src/client.c | 63 +++++++++++++++++++++++-------- src/server-context.c | 8 ++-- 10 files changed, 91 insertions(+), 48 deletions(-) diff --git a/data/keyboards/th.xml b/data/keyboards/th.xml index ac983c73..f52a7bd0 100644 --- a/data/keyboards/th.xml +++ b/data/keyboards/th.xml @@ -554,7 +554,7 @@ 3.121951,162.341463,56.195122,37.463415 outline10 - Control_L + cycle-keyboard diff --git a/data/keyboards/us.xml b/data/keyboards/us.xml index b1bd5742..863a6a69 100644 --- a/data/keyboards/us.xml +++ b/data/keyboards/us.xml @@ -554,7 +554,7 @@ 3.121951,162.341463,56.195122,37.463415 outline10 - Control_L + cycle-keyboard diff --git a/eek/eek-symbol.c b/eek/eek-symbol.c index b77b4242..fbf09eaf 100644 --- a/eek/eek-symbol.c +++ b/eek/eek-symbol.c @@ -240,7 +240,7 @@ eek_symbol_init (EekSymbol *self) EekSymbol * eek_symbol_new (const gchar *name) { - return g_object_new (EEK_TYPE_SYMBOL, "name", name); + return g_object_new (EEK_TYPE_SYMBOL, "name", name, NULL); } /** diff --git a/eek/eek-xml-layout.c b/eek/eek-xml-layout.c index a5d1078e..1f37b9b3 100644 --- a/eek/eek-xml-layout.c +++ b/eek/eek-xml-layout.c @@ -94,9 +94,7 @@ static const gchar *valid_path_list[] = { "groups/symbols/key/section/keyboard", "levels/symbols/key/section/keyboard", "keysym/symbols/key/section/keyboard", - "custom/symbols/key/section/keyboard", - "text/symbols/key/section/keyboard", - "icon/symbols/key/section/keyboard", + "symbol/symbols/key/section/keyboard", "invalid/symbols/key/section/keyboard", "index/key/section/keyboard", "point/outline/keyboard", @@ -229,10 +227,12 @@ start_element_callback (GMarkupParseContext *pcontext, goto out; } - if (g_strcmp0 (element_name, "keysym") == 0) { + if (g_strcmp0 (element_name, "symbol") == 0 || + g_strcmp0 (element_name, "keysym") == 0) { data->label = g_strdup (label); data->icon = g_strdup (icon); - data->keyval = keyval; + if (g_strcmp0 (element_name, "keysym") == 0) + data->keyval = keyval; } if (g_strcmp0 (element_name, "outline") == 0) { @@ -410,23 +410,32 @@ end_element_callback (GMarkupParseContext *pcontext, goto out; } - if (g_strcmp0 (element_name, "keysym") == 0) { - EekKeysym *keysym; + if (g_strcmp0 (element_name, "symbol") == 0 || + g_strcmp0 (element_name, "keysym") == 0) { + EekSymbol *symbol; + + if (g_strcmp0 (element_name, "keysym") == 0) { + EekKeysym *keysym; + if (data->keyval != EEK_INVALID_KEYSYM) + keysym = eek_keysym_new (data->keyval); + else + keysym = eek_keysym_new_from_name (text); + symbol = EEK_SYMBOL(keysym); + } else { + symbol = eek_symbol_new (text); + eek_symbol_set_category (symbol, EEK_SYMBOL_CATEGORY_KEYNAME); + } - if (data->keyval != EEK_INVALID_KEYSYM) { - keysym = eek_keysym_new (data->keyval); - //g_debug ("%u %s", data->keyval, eek_symbol_get_label (EEK_SYMBOL(keysym))); - } else - keysym = eek_keysym_new_from_name (text); if (data->label) { - eek_symbol_set_label (EEK_SYMBOL(keysym), data->label); + eek_symbol_set_label (symbol, data->label); g_free (data->label); } if (data->icon) { - eek_symbol_set_icon_name (EEK_SYMBOL(keysym), data->icon); + eek_symbol_set_icon_name (symbol, data->icon); g_free (data->icon); } - data->symbols = g_slist_prepend (data->symbols, keysym); + + data->symbols = g_slist_prepend (data->symbols, symbol); goto out; } diff --git a/eek/special-keysym-entries.txt b/eek/special-keysym-entries.txt index 4376e23c..81f21eab 100644 --- a/eek/special-keysym-entries.txt +++ b/eek/special-keysym-entries.txt @@ -30,9 +30,9 @@ 0xFF9E "Ins" EEK_SYMBOL_CATEGORY_FUNCTION 0xFF9F "Del" EEK_SYMBOL_CATEGORY_FUNCTION # aliases -0xFE03 "AltGr" EEK_SYMBOL_CATEGORY_KEYNAME -0xFE04 "AltGr" EEK_SYMBOL_CATEGORY_KEYNAME -0xFE05 "AltGr" EEK_SYMBOL_CATEGORY_KEYNAME +0xFE03 "⇮" EEK_SYMBOL_CATEGORY_KEYNAME +0xFE04 "⇮" EEK_SYMBOL_CATEGORY_KEYNAME +0xFE05 "⇮" EEK_SYMBOL_CATEGORY_KEYNAME 0xFE08 "Next" EEK_SYMBOL_CATEGORY_KEYNAME 0xFE0A "Prev" EEK_SYMBOL_CATEGORY_KEYNAME 0xFF08 "←" EEK_SYMBOL_CATEGORY_KEYNAME diff --git a/eekboard/eekboard-context.c b/eekboard/eekboard-context.c index ed400dd4..c9570ec8 100644 --- a/eekboard/eekboard-context.c +++ b/eekboard/eekboard-context.c @@ -82,19 +82,20 @@ eekboard_context_real_g_signal (GDBusProxy *self, } if (g_strcmp0 (signal_name, "KeyPressed") == 0) { - guint keycode = 0; + const gchar *keyname; GVariant *variant = NULL; guint modifiers = 0; EekSerializable *serializable; - g_variant_get (parameters, "(uvu)", &keycode, &variant, &modifiers); + g_variant_get (parameters, "(&svu)", &keyname, &variant, &modifiers); g_return_if_fail (variant != NULL); serializable = eek_serializable_deserialize (variant); g_return_if_fail (EEK_IS_SYMBOL(serializable)); g_signal_emit_by_name (context, "key-pressed", - keycode, EEK_SYMBOL(serializable), modifiers); + keyname, EEK_SYMBOL(serializable), modifiers); + return; } @@ -139,7 +140,7 @@ eekboard_context_real_disabled (EekboardContext *self) static void eekboard_context_real_key_pressed (EekboardContext *self, - guint keycode, + const gchar *keyname, EekSymbol *symbol, guint modifiers) { @@ -253,10 +254,10 @@ eekboard_context_class_init (EekboardContextClass *klass) G_STRUCT_OFFSET(EekboardContextClass, key_pressed), NULL, NULL, - _eekboard_marshal_VOID__UINT_OBJECT_UINT, + _eekboard_marshal_VOID__STRING_OBJECT_UINT, G_TYPE_NONE, 3, - G_TYPE_UINT, + G_TYPE_STRING, G_TYPE_OBJECT, G_TYPE_UINT); diff --git a/eekboard/eekboard-context.h b/eekboard/eekboard-context.h index 88fba292..934718a9 100644 --- a/eekboard/eekboard-context.h +++ b/eekboard/eekboard-context.h @@ -67,7 +67,7 @@ struct _EekboardContextClass { void (*enabled) (EekboardContext *self); void (*disabled) (EekboardContext *self); void (*key_pressed) (EekboardContext *self, - guint keycode, + const gchar *keyname, EekSymbol *symbol, guint modifiers); void (*destroyed) (EekboardContext *self); diff --git a/eekboard/eekboard-marshalers.list b/eekboard/eekboard-marshalers.list index b4bcf03d..00e8dfb6 100644 --- a/eekboard/eekboard-marshalers.list +++ b/eekboard/eekboard-marshalers.list @@ -1 +1 @@ -VOID:UINT,OBJECT,UINT +VOID:STRING,OBJECT,UINT diff --git a/src/client.c b/src/client.c index 166c3710..2869aa7d 100644 --- a/src/client.c +++ b/src/client.c @@ -64,7 +64,7 @@ struct _EekboardClient { EekboardEekboard *eekboard; EekboardContext *context; - EekKeyboard *keyboard; + GSList *keyboards; XklEngine *xkl_engine; XklConfigRegistry *xkl_config_registry; @@ -288,7 +288,6 @@ eekboard_client_set_keyboard (EekboardClient *client, const gchar *keyboard) { gboolean retval; - retval = set_keyboard (client, keyboard); if (retval && IS_KEYBOARD_VISIBLE (client)) eekboard_context_show_keyboard (client->context, NULL); @@ -695,17 +694,37 @@ on_xkl_config_changed (XklEngine *xklengine, static gboolean set_keyboard (EekboardClient *client, - const gchar *keyboard) + const gchar *keyboard) { - guint keyboard_id; + GSList *keyboards = NULL; + gchar **strv, **p; - keyboard_id = eekboard_context_add_keyboard (client->context, - keyboard, - NULL); - if (keyboard_id == 0) - return FALSE; + if (client->keyboards) + g_slist_free (client->keyboards); - eekboard_context_set_keyboard (client->context, keyboard_id, NULL); + strv = g_strsplit (keyboard, ",", -1); + for (p = strv; *p != NULL; p++) { + guint keyboard_id; + + keyboard_id = eekboard_context_add_keyboard (client->context, + *p, + NULL); + if (keyboard_id == 0) + return FALSE; + keyboards = g_slist_prepend (keyboards, + GUINT_TO_POINTER(keyboard_id)); + } + g_strfreev (strv); + + /* make a cycle */ + keyboards = g_slist_reverse (keyboards); + g_slist_last (keyboards)->next = keyboards; + client->keyboards = keyboards; + + /* select the first keyboard */ + eekboard_context_set_keyboard (client->context, + GPOINTER_TO_UINT(keyboards->data), + NULL); return TRUE; } @@ -714,7 +733,7 @@ set_keyboard_from_xkl (EekboardClient *client) { XklConfigRec *rec; gchar *layout, *keyboard; - gboolean retval; + guint keyboard_id; rec = xkl_config_rec_new (); xkl_config_rec_get_from_server (rec, client->xkl_engine); @@ -723,10 +742,16 @@ set_keyboard_from_xkl (EekboardClient *client) keyboard = g_strdup_printf ("xkb:%s", layout); g_free (layout); - retval = set_keyboard (client, keyboard); - g_free (keyboard); - return retval; + keyboard_id = eekboard_context_add_keyboard (client->context, + keyboard, + NULL); + g_free (keyboard); + if (keyboard_id == 0) + return FALSE; + eekboard_context_set_keyboard (client->context, keyboard_id, NULL); + + return TRUE; } static void @@ -909,12 +934,20 @@ send_fake_key_event (EekboardClient *client, static void on_key_pressed (EekboardContext *context, - guint keycode, + const gchar *keyname, EekSymbol *symbol, guint modifiers, gpointer user_data) { EekboardClient *client = user_data; + + if (g_strcmp0 (eek_symbol_get_name (symbol), "cycle-keyboard") == 0) { + client->keyboards = g_slist_next (client->keyboards); + eekboard_context_set_keyboard (client->context, + GPOINTER_TO_UINT(client->keyboards->data), + NULL); + } + send_fake_key_event (client, symbol, modifiers, TRUE); send_fake_key_event (client, symbol, modifiers, FALSE); } diff --git a/src/server-context.c b/src/server-context.c index dcd50ada..02277f28 100644 --- a/src/server-context.c +++ b/src/server-context.c @@ -80,7 +80,7 @@ static const gchar introspection_xml[] = " " " " " " - " " + " " " " " " " " @@ -593,7 +593,7 @@ static void emit_key_pressed_dbus_signal (ServerContext *context, EekKey *key) { if (context->connection && context->enabled) { - guint keycode = eek_key_get_keycode (key); + const gchar *keyname = eek_element_get_name (EEK_ELEMENT(key)); EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0); guint modifiers = eek_keyboard_get_modifiers (context->keyboard); GVariant *variant; @@ -607,8 +607,8 @@ emit_key_pressed_dbus_signal (ServerContext *context, EekKey *key) context->object_path, SERVER_CONTEXT_INTERFACE, "KeyPressed", - g_variant_new ("(uvu)", - keycode, + g_variant_new ("(svu)", + keyname, variant, modifiers), &error);