text: Add support for control keys to the protocol

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@openismus.com>
dev
Jan Arne Petersen 13 years ago committed by Kristian Høgsberg
parent e202bae9d3
commit ce8a4433f5
  1. 25
      clients/editor.c
  2. 4
      clients/keyboard.c
  3. 4
      protocol/input-method.xml
  4. 5
      protocol/text.xml
  5. 14
      src/text-backend.c
  6. 4
      tests/test-text-client.c

@ -284,8 +284,31 @@ text_model_preedit_styling(void *data,
static void static void
text_model_key(void *data, 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 static void

@ -228,6 +228,8 @@ keyboard_handle_key(struct keyboard *keyboard, const struct key *key)
} }
break; break;
case keytype_enter: case keytype_enter:
input_method_context_key(keyboard->keyboard->context,
XKB_KEY_KP_Enter, WL_KEYBOARD_KEY_STATE_PRESSED);
break; break;
case keytype_space: case keytype_space:
keyboard->keyboard->preedit_string = strcat(keyboard->keyboard->preedit_string, 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: case keytype_symbols:
break; break;
case keytype_tab: case keytype_tab:
input_method_context_key(keyboard->keyboard->context,
XKB_KEY_Tab, WL_KEYBOARD_KEY_STATE_PRESSED);
break; break;
} }
} }

@ -53,6 +53,10 @@
<arg name="index" type="int"/> <arg name="index" type="int"/>
<arg name="length" type="uint"/> <arg name="length" type="uint"/>
</request> </request>
<request name="key">
<arg name="key" type="uint"/>
<arg name="state" type="uint"/>
</request>
<event name="surrounding_text"> <event name="surrounding_text">
<description summary="surrounding text event"> <description summary="surrounding text event">
The plain surrounding text around the input position. Cursor is the The plain surrounding text around the input position. Cursor is the

@ -89,7 +89,10 @@
<arg name="length" type="uint"/> <arg name="length" type="uint"/>
</event> </event>
<event name="preedit_styling"/> <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="selection_replacement"/>
<event name="direction"/> <event name="direction"/>
<event name="locale"/> <event name="locale"/>

@ -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); 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 = { static const struct input_method_context_interface input_method_context_implementation = {
input_method_context_destroy, input_method_context_destroy,
input_method_context_commit_string, input_method_context_commit_string,
input_method_context_preedit_string, input_method_context_preedit_string,
input_method_context_delete_surrounding_text input_method_context_delete_surrounding_text,
input_method_context_key
}; };
static void static void

@ -75,7 +75,9 @@ text_model_preedit_styling(void *data,
static void static void
text_model_key(void *data, text_model_key(void *data,
struct text_model *text_model) struct text_model *text_model,
uint32_t key,
uint32_t state)
{ {
} }

Loading…
Cancel
Save