text: Add example for language/text direction
Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
This commit is contained in:
committed by
Kristian Høgsberg
parent
ece6b5af51
commit
9d41913eff
+35
-1
@@ -65,6 +65,7 @@ struct text_entry {
|
|||||||
uint32_t serial;
|
uint32_t serial;
|
||||||
uint32_t content_purpose;
|
uint32_t content_purpose;
|
||||||
uint32_t click_to_show;
|
uint32_t click_to_show;
|
||||||
|
char *preferred_language;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct editor {
|
struct editor {
|
||||||
@@ -397,6 +398,7 @@ text_model_language(void *data,
|
|||||||
uint32_t serial,
|
uint32_t serial,
|
||||||
const char *language)
|
const char *language)
|
||||||
{
|
{
|
||||||
|
fprintf(stderr, "input language is %s \n", language);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -405,6 +407,24 @@ text_model_text_direction(void *data,
|
|||||||
uint32_t serial,
|
uint32_t serial,
|
||||||
uint32_t direction)
|
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 = {
|
static const struct text_model_listener text_model_listener = {
|
||||||
@@ -616,6 +636,10 @@ text_entry_update(struct text_entry *entry)
|
|||||||
entry->cursor,
|
entry->cursor,
|
||||||
entry->anchor);
|
entry->anchor);
|
||||||
|
|
||||||
|
if (entry->preferred_language)
|
||||||
|
text_model_set_preferred_language(entry->model,
|
||||||
|
entry->preferred_language);
|
||||||
|
|
||||||
text_model_commit(entry->model);
|
text_model_commit(entry->model);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1063,10 +1087,18 @@ main(int argc, char *argv[])
|
|||||||
struct editor editor;
|
struct editor editor;
|
||||||
int i;
|
int i;
|
||||||
uint32_t click_to_show = 0;
|
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)
|
if (strcmp("--click-to-show", argv[i]) == 0)
|
||||||
click_to_show = 1;
|
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);
|
memset(&editor, 0, sizeof editor);
|
||||||
|
|
||||||
@@ -1088,6 +1120,8 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
editor.entry = text_entry_create(&editor, "Entry");
|
editor.entry = text_entry_create(&editor, "Entry");
|
||||||
editor.entry->click_to_show = click_to_show;
|
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 = text_entry_create(&editor, "Numeric");
|
||||||
editor.editor->content_purpose = TEXT_MODEL_CONTENT_PURPOSE_NUMBER;
|
editor.editor->content_purpose = TEXT_MODEL_CONTENT_PURPOSE_NUMBER;
|
||||||
editor.editor->click_to_show = click_to_show;
|
editor.editor->click_to_show = click_to_show;
|
||||||
|
|||||||
+86
-3
@@ -45,6 +45,7 @@ struct virtual_keyboard {
|
|||||||
uint32_t serial;
|
uint32_t serial;
|
||||||
uint32_t content_hint;
|
uint32_t content_hint;
|
||||||
uint32_t content_purpose;
|
uint32_t content_purpose;
|
||||||
|
char *preferred_language;
|
||||||
char *surrounding_text;
|
char *surrounding_text;
|
||||||
struct window *window;
|
struct window *window;
|
||||||
struct widget *widget;
|
struct widget *widget;
|
||||||
@@ -80,6 +81,9 @@ struct layout {
|
|||||||
|
|
||||||
uint32_t columns;
|
uint32_t columns;
|
||||||
uint32_t rows;
|
uint32_t rows;
|
||||||
|
|
||||||
|
const char *language;
|
||||||
|
uint32_t text_direction;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct key normal_keys[] = {
|
static const struct key normal_keys[] = {
|
||||||
@@ -150,18 +154,81 @@ static const struct key numeric_keys[] = {
|
|||||||
{ keytype_style, "", "", 2}
|
{ 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 = {
|
static const struct layout normal_layout = {
|
||||||
normal_keys,
|
normal_keys,
|
||||||
sizeof(normal_keys) / sizeof(*normal_keys),
|
sizeof(normal_keys) / sizeof(*normal_keys),
|
||||||
12,
|
12,
|
||||||
4
|
4,
|
||||||
|
"en",
|
||||||
|
TEXT_MODEL_TEXT_DIRECTION_LTR
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct layout numeric_layout = {
|
static const struct layout numeric_layout = {
|
||||||
numeric_keys,
|
numeric_keys,
|
||||||
sizeof(numeric_keys) / sizeof(*numeric_keys),
|
sizeof(numeric_keys) / sizeof(*numeric_keys),
|
||||||
12,
|
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[] = {
|
static const char *style_labels[] = {
|
||||||
@@ -250,7 +317,11 @@ get_current_layout(struct virtual_keyboard *keyboard)
|
|||||||
case TEXT_MODEL_CONTENT_PURPOSE_NUMBER:
|
case TEXT_MODEL_CONTENT_PURPOSE_NUMBER:
|
||||||
return &numeric_layout;
|
return &numeric_layout;
|
||||||
default:
|
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->columns * key_width,
|
||||||
layout->rows * key_height);
|
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);
|
widget_schedule_redraw(keyboard->widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -578,6 +652,15 @@ handle_preferred_language(void *data,
|
|||||||
struct input_method_context *context,
|
struct input_method_context *context,
|
||||||
const char *language)
|
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 = {
|
static const struct input_method_context_listener input_method_context_listener = {
|
||||||
|
|||||||
Reference in New Issue
Block a user