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)