[PATCH 04/18] keyboard: Add support for pre-edit styling
Jan Arne Petersen
jpetersen at openismus.com
Wed Jan 16 12:26:41 PST 2013
From: Jan Arne Petersen <jpetersen at openismus.com>
Adds a button to the keyboard to support different styles of pre-edit
styling.
Signed-off-by: Jan Arne Petersen <jpetersen at openismus.com>
---
clients/keyboard.c | 85 +++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 61 insertions(+), 24 deletions(-)
diff --git a/clients/keyboard.c b/clients/keyboard.c
index c1f2a7f..a5abacf 100644
--- a/clients/keyboard.c
+++ b/clients/keyboard.c
@@ -38,6 +38,7 @@ struct virtual_keyboard {
struct input_method_context *context;
struct display *display;
char *preedit_string;
+ uint32_t preedit_style;
struct {
xkb_mod_mask_t shift_mask;
} keysym;
@@ -55,7 +56,8 @@ enum key_type {
keytype_arrow_up,
keytype_arrow_left,
keytype_arrow_right,
- keytype_arrow_down
+ keytype_arrow_down,
+ keytype_style
};
struct key {
@@ -105,12 +107,23 @@ static const struct key keys[] = {
{ keytype_switch, "ABC", "abc", 1},
{ keytype_symbols, "?123", "?123", 1},
- { keytype_space, "", "", 6},
+ { keytype_space, "", "", 5},
{ keytype_arrow_up, "/\\", "/\\", 1},
{ keytype_arrow_left, "<", "<", 1},
{ keytype_arrow_right, ">", ">", 1},
{ keytype_arrow_down, "\\/", "\\/", 1},
- { keytype_symbols, "?123", "?123", 1}
+ { keytype_style, "", "", 2}
+};
+
+static const char *style_labels[] = {
+ "none",
+ "default",
+ "active",
+ "inactive",
+ "highlight",
+ "underline",
+ "selection",
+ "incorrect"
};
static const unsigned int columns = 12;
@@ -132,10 +145,23 @@ struct keyboard {
enum keyboard_state state;
};
+static const char *
+label_from_key(struct keyboard *keyboard,
+ const struct key *key)
+{
+ if (key->key_type == keytype_style)
+ return style_labels[keyboard->keyboard->preedit_style];
+
+ if (keyboard->state == keyboardstate_default)
+ return key->label;
+ else
+ return key->alt;
+}
+
static void
-draw_key(const struct key *key,
+draw_key(struct keyboard *keyboard,
+ const struct key *key,
cairo_t *cr,
- enum keyboard_state state,
unsigned int row,
unsigned int col)
{
@@ -156,7 +182,7 @@ draw_key(const struct key *key,
cairo_stroke(cr);
/* Paint text */
- label = state == keyboardstate_default ? key->label : key->alt;
+ label = label_from_key(keyboard, key);
cairo_text_extents(cr, label, &extents);
cairo_translate(cr,
@@ -201,7 +227,7 @@ redraw_handler(struct widget *widget, void *data)
for (i = 0; i < sizeof(keys) / sizeof(*keys); ++i) {
cairo_set_source_rgb(cr, 0, 0, 0);
- draw_key(&keys[i], cr, keyboard->state, row, col);
+ draw_key(keyboard, &keys[i], cr, row, col);
col += keys[i].width;
if (col >= columns) {
row += 1;
@@ -243,6 +269,24 @@ virtual_keyboard_commit_preedit(struct virtual_keyboard *keyboard)
}
static void
+virtual_keyboard_send_preedit(struct virtual_keyboard *keyboard)
+{
+ if (keyboard->preedit_style)
+ input_method_context_preedit_styling(keyboard->context,
+ keyboard->serial,
+ 0,
+ strlen(keyboard->preedit_string),
+ keyboard->preedit_style);
+ input_method_context_preedit_cursor(keyboard->context,
+ keyboard->serial,
+ strlen(keyboard->preedit_string));
+ input_method_context_preedit_string(keyboard->context,
+ keyboard->serial,
+ keyboard->preedit_string,
+ keyboard->preedit_string);
+}
+
+static void
keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *key, struct input *input, enum wl_pointer_button_state state)
{
const char *label = keyboard->state == keyboardstate_default ? key->label : key->alt;
@@ -256,13 +300,7 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
keyboard->keyboard->preedit_string = strcat(keyboard->keyboard->preedit_string,
label);
- input_method_context_preedit_cursor(keyboard->keyboard->context,
- keyboard->keyboard->serial,
- strlen(keyboard->keyboard->preedit_string));
- input_method_context_preedit_string(keyboard->keyboard->context,
- keyboard->keyboard->serial,
- keyboard->keyboard->preedit_string,
- keyboard->keyboard->preedit_string);
+ virtual_keyboard_send_preedit(keyboard->keyboard);
break;
case keytype_backspace:
if (state != WL_POINTER_BUTTON_STATE_PRESSED)
@@ -274,13 +312,7 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
-1, 1);
} else {
keyboard->keyboard->preedit_string[strlen(keyboard->keyboard->preedit_string) - 1] = '\0';
- input_method_context_preedit_cursor(keyboard->keyboard->context,
- keyboard->keyboard->serial,
- strlen(keyboard->keyboard->preedit_string));
- input_method_context_preedit_string(keyboard->keyboard->context,
- keyboard->keyboard->serial,
- keyboard->keyboard->preedit_string,
- keyboard->keyboard->preedit_string);
+ virtual_keyboard_send_preedit(keyboard->keyboard);
}
break;
case keytype_enter:
@@ -344,6 +376,12 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
time,
XKB_KEY_Down, key_state, mod_mask);
break;
+ case keytype_style:
+ if (state != WL_POINTER_BUTTON_STATE_PRESSED)
+ break;
+ keyboard->keyboard->preedit_style = (keyboard->keyboard->preedit_style + 1) % 8; /* TODO */
+ virtual_keyboard_send_preedit(keyboard->keyboard);
+ break;
}
}
@@ -536,15 +574,14 @@ main(int argc, char *argv[])
{
struct virtual_keyboard virtual_keyboard;
+ memset(&virtual_keyboard, 0, sizeof virtual_keyboard);
+
virtual_keyboard.display = display_create(argc, argv);
if (virtual_keyboard.display == NULL) {
fprintf(stderr, "failed to create display: %m\n");
return -1;
}
- virtual_keyboard.context = NULL;
- virtual_keyboard.preedit_string = NULL;
-
display_set_user_data(virtual_keyboard.display, &virtual_keyboard);
display_set_global_handler(virtual_keyboard.display, global_handler);
display_set_output_configure_handler(virtual_keyboard.display, handle_output_configure);
--
1.8.1
More information about the wayland-devel
mailing list