diff options
author | Jan Arne Petersen <jpetersen@openismus.com> | 2013-04-18 16:47:16 +0200 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-05-02 16:21:34 -0400 |
commit | 9d41913effffc0307b5250f9e316ca856cc8a3c5 (patch) | |
tree | 061b5fef1f26accd9d466cd36f026e547cb02b30 /clients/keyboard.c | |
parent | ece6b5af51460c21f5bdd1fae4e7c2ea9f707e2f (diff) | |
download | weston-9d41913effffc0307b5250f9e316ca856cc8a3c5.tar.gz |
text: Add example for language/text direction
Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
Diffstat (limited to 'clients/keyboard.c')
-rw-r--r-- | clients/keyboard.c | 89 |
1 files changed, 86 insertions, 3 deletions
diff --git a/clients/keyboard.c b/clients/keyboard.c index b23de42a..e792ebac 100644 --- a/clients/keyboard.c +++ b/clients/keyboard.c @@ -45,6 +45,7 @@ struct virtual_keyboard { uint32_t serial; uint32_t content_hint; uint32_t content_purpose; + char *preferred_language; char *surrounding_text; struct window *window; struct widget *widget; @@ -80,6 +81,9 @@ struct layout { uint32_t columns; uint32_t rows; + + const char *language; + uint32_t text_direction; }; static const struct key normal_keys[] = { @@ -150,18 +154,81 @@ static const struct key numeric_keys[] = { { keytype_style, "", "", 2} }; +static const struct key arabic_keys[] = { + { keytype_default, "ض", "ض", 1}, + { keytype_default, "ص", "ص", 1}, + { keytype_default, "ث", "ث", 1}, + { keytype_default, "ق", "ق", 1}, + { keytype_default, "ف", "ف", 1}, + { keytype_default, "غ", "إ", 1}, + { keytype_default, "ع", "ع", 1}, + { keytype_default, "ه", "ه", 1}, + { keytype_default, "خ", "خ", 1}, + { keytype_default, "ح", "ح", 1}, + { keytype_default, "ج", "ج", 1}, + { keytype_backspace, "-->", "-->", 2}, + + { keytype_tab, "->|", "->|", 1}, + { keytype_default, "ش", "ش", 1}, + { keytype_default, "س", "س", 1}, + { keytype_default, "ي", "ي", 1}, + { keytype_default, "ب", "ب", 1}, + { keytype_default, "ل", "ل", 1}, + { keytype_default, "ا", "أ", 1}, + { keytype_default, "ت", "ت", 1}, + { keytype_default, "ن", "ن", 1}, + { keytype_default, "م", "م", 1}, + { keytype_default, "ك", "ك", 1}, + { keytype_default, "د", "د", 1}, + { keytype_enter, "Enter", "Enter", 2}, + + { keytype_switch, "ABC", "abc", 2}, + { keytype_default, "ئ", "ئ", 1}, + { keytype_default, "ء", "ء", 1}, + { keytype_default, "ؤ", "ؤ", 1}, + { keytype_default, "ر", "ر", 1}, + { keytype_default, "ى", "آ", 1}, + { keytype_default, "ة", "ة", 1}, + { keytype_default, "و", "و", 1}, + { keytype_default, "ز", "ز", 1}, + { keytype_default, "ظ", "ظ", 1}, + { keytype_switch, "ABC", "abc", 2}, + + { keytype_symbols, "؟٣٢١", "؟٣٢١", 1}, + { keytype_default, "ذ", "ذ", 1}, + { keytype_default, "،", "،", 1}, + { keytype_space, "", "", 6}, + { keytype_default, ".", ".", 1}, + { keytype_default, "ط", "ط", 1}, + { keytype_style, "", "", 2} +}; + + static const struct layout normal_layout = { normal_keys, sizeof(normal_keys) / sizeof(*normal_keys), 12, - 4 + 4, + "en", + TEXT_MODEL_TEXT_DIRECTION_LTR }; static const struct layout numeric_layout = { numeric_keys, sizeof(numeric_keys) / sizeof(*numeric_keys), 12, - 2 + 2, + "en", + TEXT_MODEL_TEXT_DIRECTION_LTR +}; + +static const struct layout arabic_layout = { + arabic_keys, + sizeof(arabic_keys) / sizeof(*arabic_keys), + 13, + 4, + "ar", + TEXT_MODEL_TEXT_DIRECTION_RTL }; static const char *style_labels[] = { @@ -250,7 +317,11 @@ get_current_layout(struct virtual_keyboard *keyboard) case TEXT_MODEL_CONTENT_PURPOSE_NUMBER: return &numeric_layout; default: - return &normal_layout; + if (keyboard->preferred_language && + strcmp(keyboard->preferred_language, "ar") == 0) + return &arabic_layout; + else + return &normal_layout; } } @@ -570,6 +641,9 @@ handle_commit(void *data, layout->columns * key_width, layout->rows * key_height); + input_method_context_language(context, keyboard->serial, layout->language); + input_method_context_text_direction(context, keyboard->serial, layout->text_direction); + widget_schedule_redraw(keyboard->widget); } @@ -578,6 +652,15 @@ handle_preferred_language(void *data, struct input_method_context *context, const char *language) { + struct virtual_keyboard *keyboard = data; + + if (keyboard->preferred_language) + free(keyboard->preferred_language); + + keyboard->preferred_language = NULL; + + if (language) + keyboard->preferred_language = strdup(language); } static const struct input_method_context_listener input_method_context_listener = { |