text: Add delete_surrounding_text to protocol
Add delete_surrounding_text event in the text_model interface and the request in the input_method_context interface. Implement it in the example editor client and in the example keyboard so that the backspace key works with it. Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
This commit is contained in:
parent
43f4aa8cab
commit
e202bae9d3
|
@ -212,6 +212,8 @@ static void text_entry_insert_at_cursor(struct text_entry *entry, const char *te
|
|||
static void text_entry_set_preedit(struct text_entry *entry,
|
||||
const char *preedit_text,
|
||||
int preedit_cursor);
|
||||
static void text_entry_delete_text(struct text_entry *entry,
|
||||
uint32_t index, uint32_t length);
|
||||
|
||||
static void
|
||||
text_model_commit_string(void *data,
|
||||
|
@ -249,6 +251,31 @@ text_model_preedit_string(void *data,
|
|||
widget_schedule_redraw(entry->widget);
|
||||
}
|
||||
|
||||
static void
|
||||
text_model_delete_surrounding_text(void *data,
|
||||
struct text_model *text_model,
|
||||
int32_t index,
|
||||
uint32_t length)
|
||||
{
|
||||
struct text_entry *entry = data;
|
||||
uint32_t cursor_index = index + entry->cursor;
|
||||
|
||||
if (cursor_index > strlen(entry->text)) {
|
||||
fprintf(stderr, "Invalid cursor index %d\n", index);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cursor_index + length > strlen(entry->text)) {
|
||||
fprintf(stderr, "Invalid length %d\n", length);
|
||||
return;
|
||||
}
|
||||
|
||||
if (length == 0)
|
||||
return;
|
||||
|
||||
text_entry_delete_text(entry, cursor_index, length);
|
||||
}
|
||||
|
||||
static void
|
||||
text_model_preedit_styling(void *data,
|
||||
struct text_model *text_model)
|
||||
|
@ -304,6 +331,7 @@ text_model_deactivated(void *data,
|
|||
static const struct text_model_listener text_model_listener = {
|
||||
text_model_commit_string,
|
||||
text_model_preedit_string,
|
||||
text_model_delete_surrounding_text,
|
||||
text_model_preedit_styling,
|
||||
text_model_key,
|
||||
text_model_selection_replacement,
|
||||
|
@ -515,6 +543,21 @@ text_entry_set_anchor_position(struct text_entry *entry,
|
|||
widget_schedule_redraw(entry->widget);
|
||||
}
|
||||
|
||||
static void
|
||||
text_entry_delete_text(struct text_entry *entry,
|
||||
uint32_t index, uint32_t length)
|
||||
{
|
||||
if (entry->cursor > index)
|
||||
entry->cursor -= length;
|
||||
|
||||
entry->text[index] = '\0';
|
||||
strcat(entry->text, entry->text + index + length);
|
||||
|
||||
text_entry_update_layout(entry);
|
||||
|
||||
widget_schedule_redraw(entry->widget);
|
||||
}
|
||||
|
||||
static void
|
||||
text_entry_draw_selection(struct text_entry *entry, cairo_t *cr)
|
||||
{
|
||||
|
|
|
@ -222,6 +222,10 @@ keyboard_handle_key(struct keyboard *keyboard, const struct key *key)
|
|||
strlen(keyboard->keyboard->preedit_string));
|
||||
break;
|
||||
case keytype_backspace:
|
||||
if (strlen(keyboard->keyboard->preedit_string) == 0) {
|
||||
input_method_context_delete_surrounding_text(keyboard->keyboard->context,
|
||||
-1, 1);
|
||||
}
|
||||
break;
|
||||
case keytype_enter:
|
||||
break;
|
||||
|
|
|
@ -49,6 +49,10 @@
|
|||
<arg name="text" type="string"/>
|
||||
<arg name="index" type="uint"/>
|
||||
</request>
|
||||
<request name="delete_surrounding_text">
|
||||
<arg name="index" type="int"/>
|
||||
<arg name="length" type="uint"/>
|
||||
</request>
|
||||
<event name="surrounding_text">
|
||||
<description summary="surrounding text event">
|
||||
The plain surrounding text around the input position. Cursor is the
|
||||
|
|
|
@ -84,6 +84,10 @@
|
|||
<arg name="text" type="string"/>
|
||||
<arg name="index" type="uint"/>
|
||||
</event>
|
||||
<event name="delete_surrounding_text">
|
||||
<arg name="index" type="int"/>
|
||||
<arg name="length" type="uint"/>
|
||||
</event>
|
||||
<event name="preedit_styling"/>
|
||||
<event name="key"/>
|
||||
<event name="selection_replacement"/>
|
||||
|
|
|
@ -305,10 +305,22 @@ input_method_context_preedit_string(struct wl_client *client,
|
|||
text_model_send_preedit_string(&context->model->resource, text, index);
|
||||
}
|
||||
|
||||
static void
|
||||
input_method_context_delete_surrounding_text(struct wl_client *client,
|
||||
struct wl_resource *resource,
|
||||
int32_t index,
|
||||
uint32_t length)
|
||||
{
|
||||
struct input_method_context *context = resource->data;
|
||||
|
||||
text_model_send_delete_surrounding_text(&context->model->resource, index, length);
|
||||
}
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
static void
|
||||
|
|
|
@ -59,6 +59,14 @@ text_model_preedit_string(void *data,
|
|||
{
|
||||
}
|
||||
|
||||
static void
|
||||
text_model_delete_surrounding_text(void *data,
|
||||
struct text_model *text_model,
|
||||
int32_t index,
|
||||
uint32_t length)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
text_model_preedit_styling(void *data,
|
||||
struct text_model *text_model)
|
||||
|
@ -112,6 +120,7 @@ text_model_deactivated(void *data,
|
|||
static const struct text_model_listener text_model_listener = {
|
||||
text_model_commit_string,
|
||||
text_model_preedit_string,
|
||||
text_model_delete_surrounding_text,
|
||||
text_model_preedit_styling,
|
||||
text_model_key,
|
||||
text_model_selection_replacement,
|
||||
|
|
Loading…
Reference in New Issue