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:
Jan Arne Petersen
2012-09-09 23:08:44 +02:00
committed by Kristian Høgsberg
parent 43f4aa8cab
commit e202bae9d3
6 changed files with 76 additions and 0 deletions
+43
View File
@@ -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)
{
+4
View File
@@ -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;