text: Add example for language/text direction

Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
This commit is contained in:
Jan Arne Petersen 2013-04-18 16:47:16 +02:00 committed by Kristian Høgsberg
parent ece6b5af51
commit 9d41913eff
2 changed files with 121 additions and 4 deletions

View File

@ -65,6 +65,7 @@ struct text_entry {
uint32_t serial;
uint32_t content_purpose;
uint32_t click_to_show;
char *preferred_language;
};
struct editor {
@ -397,6 +398,7 @@ text_model_language(void *data,
uint32_t serial,
const char *language)
{
fprintf(stderr, "input language is %s \n", language);
}
static void
@ -405,6 +407,24 @@ text_model_text_direction(void *data,
uint32_t serial,
uint32_t direction)
{
struct text_entry *entry = data;
PangoContext *context = pango_layout_get_context(entry->layout);
PangoDirection pango_direction;
switch (direction) {
case TEXT_MODEL_TEXT_DIRECTION_LTR:
pango_direction = PANGO_DIRECTION_LTR;
break;
case TEXT_MODEL_TEXT_DIRECTION_RTL:
pango_direction = PANGO_DIRECTION_RTL;
break;
case TEXT_MODEL_TEXT_DIRECTION_AUTO:
default:
pango_direction = PANGO_DIRECTION_NEUTRAL;
}
pango_context_set_base_dir(context, pango_direction);
}
static const struct text_model_listener text_model_listener = {
@ -616,6 +636,10 @@ text_entry_update(struct text_entry *entry)
entry->cursor,
entry->anchor);
if (entry->preferred_language)
text_model_set_preferred_language(entry->model,
entry->preferred_language);
text_model_commit(entry->model);
}
@ -1063,10 +1087,18 @@ main(int argc, char *argv[])
struct editor editor;
int i;
uint32_t click_to_show = 0;
const char *preferred_language = NULL;
for (i = 1; i < argc; i++)
for (i = 1; i < argc; i++) {
if (strcmp("--click-to-show", argv[i]) == 0)
click_to_show = 1;
else if (strcmp("--preferred-language", argv[i]) == 0) {
if (i + 1 < argc) {
preferred_language = argv[i + 1];
i++;
}
}
}
memset(&editor, 0, sizeof editor);
@ -1088,6 +1120,8 @@ main(int argc, char *argv[])
editor.entry = text_entry_create(&editor, "Entry");
editor.entry->click_to_show = click_to_show;
if (preferred_language)
editor.entry->preferred_language = strdup(preferred_language);
editor.editor = text_entry_create(&editor, "Numeric");
editor.editor->content_purpose = TEXT_MODEL_CONTENT_PURPOSE_NUMBER;
editor.editor->click_to_show = click_to_show;

View File

@ -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 = {