diff --git a/clients/editor.c b/clients/editor.c index 0ed217f2..2baf6af0 100644 --- a/clients/editor.c +++ b/clients/editor.c @@ -284,8 +284,31 @@ text_model_preedit_styling(void *data, static void text_model_key(void *data, - struct text_model *text_model) + struct text_model *text_model, + uint32_t key, + uint32_t state) { + const char *state_label; + const char *key_label; + + if (state == WL_KEYBOARD_KEY_STATE_PRESSED) { + state_label = "pressed"; + } else { + state_label = "released"; + } + + switch (key) { + case XKB_KEY_Tab: + key_label = "Tab"; + break; + case XKB_KEY_KP_Enter: + key_label = "Enter"; + break; + default: + key_label = "Unknown"; + } + + fprintf(stderr, "%s key was %s.\n", key_label, state_label); } static void diff --git a/clients/keyboard.c b/clients/keyboard.c index 588ef785..0cbf531c 100644 --- a/clients/keyboard.c +++ b/clients/keyboard.c @@ -228,6 +228,8 @@ keyboard_handle_key(struct keyboard *keyboard, const struct key *key) } break; case keytype_enter: + input_method_context_key(keyboard->keyboard->context, + XKB_KEY_KP_Enter, WL_KEYBOARD_KEY_STATE_PRESSED); break; case keytype_space: keyboard->keyboard->preedit_string = strcat(keyboard->keyboard->preedit_string, @@ -250,6 +252,8 @@ keyboard_handle_key(struct keyboard *keyboard, const struct key *key) case keytype_symbols: break; case keytype_tab: + input_method_context_key(keyboard->keyboard->context, + XKB_KEY_Tab, WL_KEYBOARD_KEY_STATE_PRESSED); break; } } diff --git a/protocol/input-method.xml b/protocol/input-method.xml index 10ca32ab..100fa462 100644 --- a/protocol/input-method.xml +++ b/protocol/input-method.xml @@ -53,6 +53,10 @@ + + + + The plain surrounding text around the input position. Cursor is the diff --git a/protocol/text.xml b/protocol/text.xml index 3d7d8f5d..62746d3f 100644 --- a/protocol/text.xml +++ b/protocol/text.xml @@ -89,7 +89,10 @@ - + + + + diff --git a/src/text-backend.c b/src/text-backend.c index b2f90947..0a93b6b8 100644 --- a/src/text-backend.c +++ b/src/text-backend.c @@ -316,11 +316,23 @@ input_method_context_delete_surrounding_text(struct wl_client *client, text_model_send_delete_surrounding_text(&context->model->resource, index, length); } +static void +input_method_context_key(struct wl_client *client, + struct wl_resource *resource, + uint32_t key, + uint32_t state) +{ + struct input_method_context *context = resource->data; + + text_model_send_key(&context->model->resource, key, state); +} + static const struct input_method_context_interface input_method_context_implementation = { input_method_context_destroy, input_method_context_commit_string, input_method_context_preedit_string, - input_method_context_delete_surrounding_text + input_method_context_delete_surrounding_text, + input_method_context_key }; static void diff --git a/tests/test-text-client.c b/tests/test-text-client.c index 3b390f6c..897909af 100644 --- a/tests/test-text-client.c +++ b/tests/test-text-client.c @@ -75,10 +75,12 @@ text_model_preedit_styling(void *data, static void text_model_key(void *data, - struct text_model *text_model) + struct text_model *text_model, + uint32_t key, + uint32_t state) { } - + static void text_model_selection_replacement(void *data, struct text_model *text_model)