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,
}
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)
{
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,
}
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)
{
cairo_text_extents_t extents;
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;
<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
<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"/>
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
}
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)
{
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,