[PATCH v2 16/17] text: Add support for control keys to the protocol
Jan Arne Petersen
jpetersen at openismus.com
Sun Sep 9 14:08:45 PDT 2012
From: Jan Arne Petersen <jpetersen at openismus.com>
Add key event to the text_model interface and a key request to the
input_method_context interface. Implement it in the example editor
client and the example keyboard.
Signed-off-by: Jan Arne Petersen <jpetersen at openismus.com>
---
clients/editor.c | 25 ++++++++++++++++++++++++-
clients/keyboard.c | 4 ++++
protocol/input-method.xml | 4 ++++
protocol/text.xml | 5 ++++-
src/text-backend.c | 14 +++++++++++++-
tests/test-text-client.c | 6 ++++--
6 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/clients/editor.c b/clients/editor.c
index 0ed217f..2baf6af 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 588ef78..0cbf531 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 10ca32a..100fa46 100644
--- a/protocol/input-method.xml
+++ b/protocol/input-method.xml
@@ -53,6 +53,10 @@
<arg name="index" type="int"/>
<arg name="length" type="uint"/>
</request>
+ <request name="key">
+ <arg name="key" type="uint"/>
+ <arg name="state" type="uint"/>
+ </request>
<event name="surrounding_text">
<description summary="surrounding text event">
The plain surrounding text around the input position. Cursor is the
diff --git a/protocol/text.xml b/protocol/text.xml
index 3d7d8f5..62746d3 100644
--- a/protocol/text.xml
+++ b/protocol/text.xml
@@ -89,7 +89,10 @@
<arg name="length" type="uint"/>
</event>
<event name="preedit_styling"/>
- <event name="key"/>
+ <event name="key">
+ <arg name="key" type="uint"/>
+ <arg name="state" type="uint"/>
+ </event>
<event name="selection_replacement"/>
<event name="direction"/>
<event name="locale"/>
diff --git a/src/text-backend.c b/src/text-backend.c
index b2f9094..0a93b6b 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 3b390f6..897909a 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)
--
1.7.11.4
More information about the wayland-devel
mailing list