text: add serial argument to text protocol

The serial argument will allow to ignore outdated events from before a
reset request.

Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
This commit is contained in:
Jan Arne Petersen
2013-01-16 21:26:39 +01:00
committed by Kristian Høgsberg
parent 4653531e7a
commit c7d2a9839b
6 changed files with 83 additions and 16 deletions
+12 -1
View File
@@ -64,6 +64,7 @@ struct text_entry {
struct {
xkb_mod_mask_t shift_mask;
} keysym;
uint32_t serial;
};
struct editor {
@@ -300,6 +301,7 @@ static void text_entry_delete_selected_text(struct text_entry *entry);
static void
text_model_commit_string(void *data,
struct text_model *text_model,
uint32_t serial,
const char *text,
uint32_t index)
{
@@ -317,6 +319,7 @@ text_model_commit_string(void *data,
static void
text_model_preedit_string(void *data,
struct text_model *text_model,
uint32_t serial,
const char *text,
const char *commit)
{
@@ -331,6 +334,7 @@ text_model_preedit_string(void *data,
static void
text_model_delete_surrounding_text(void *data,
struct text_model *text_model,
uint32_t serial,
int32_t index,
uint32_t length)
{
@@ -362,6 +366,7 @@ text_model_delete_surrounding_text(void *data,
static void
text_model_preedit_styling(void *data,
struct text_model *text_model,
uint32_t serial,
uint32_t index,
uint32_t length,
uint32_t style)
@@ -371,6 +376,7 @@ text_model_preedit_styling(void *data,
static void
text_model_preedit_cursor(void *data,
struct text_model *text_model,
uint32_t serial,
int32_t index)
{
struct text_entry *entry = data;
@@ -594,7 +600,10 @@ text_entry_activate(struct text_entry *entry,
{
struct wl_surface *surface = window_get_wl_surface(entry->window);
entry->serial++;
text_model_activate(entry->model,
entry->serial,
seat,
surface);
}
@@ -681,7 +690,9 @@ text_entry_set_cursor_position(struct text_entry *entry,
{
entry->cursor = text_layout_xy_to_index(entry->layout, x, y);
text_model_reset(entry->model);
entry->serial++;
text_model_reset(entry->model, entry->serial);
if (entry->preedit.cursor > 0 &&
entry->cursor >= (uint32_t)entry->preedit.cursor) {
+18 -2
View File
@@ -41,6 +41,7 @@ struct virtual_keyboard {
struct {
xkb_mod_mask_t shift_mask;
} keysym;
uint32_t serial;
};
enum key_type {
@@ -227,11 +228,14 @@ virtual_keyboard_commit_preedit(struct virtual_keyboard *keyboard)
return;
input_method_context_preedit_cursor(keyboard->context,
keyboard->serial,
0);
input_method_context_preedit_string(keyboard->context,
keyboard->serial,
"",
"");
input_method_context_commit_string(keyboard->context,
keyboard->serial,
keyboard->preedit_string,
strlen(keyboard->preedit_string));
free(keyboard->preedit_string);
@@ -253,8 +257,10 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
keyboard->keyboard->preedit_string = strcat(keyboard->keyboard->preedit_string,
label);
input_method_context_preedit_cursor(keyboard->keyboard->context,
keyboard->keyboard->serial,
strlen(keyboard->keyboard->preedit_string));
input_method_context_preedit_string(keyboard->keyboard->context,
keyboard->keyboard->serial,
keyboard->keyboard->preedit_string,
keyboard->keyboard->preedit_string);
break;
@@ -264,12 +270,15 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
if (strlen(keyboard->keyboard->preedit_string) == 0) {
input_method_context_delete_surrounding_text(keyboard->keyboard->context,
keyboard->keyboard->serial,
-1, 1);
} else {
keyboard->keyboard->preedit_string[strlen(keyboard->keyboard->preedit_string) - 1] = '\0';
input_method_context_preedit_cursor(keyboard->keyboard->context,
keyboard->keyboard->serial,
strlen(keyboard->keyboard->preedit_string));
input_method_context_preedit_string(keyboard->keyboard->context,
keyboard->keyboard->serial,
keyboard->keyboard->preedit_string,
keyboard->keyboard->preedit_string);
}
@@ -385,7 +394,8 @@ input_method_context_surrounding_text(void *data,
static void
input_method_context_reset(void *data,
struct input_method_context *context)
struct input_method_context *context,
uint32_t serial)
{
struct virtual_keyboard *keyboard = data;
@@ -393,13 +403,17 @@ input_method_context_reset(void *data,
if (strlen(keyboard->preedit_string)) {
input_method_context_preedit_cursor(context,
serial,
0);
input_method_context_preedit_string(context,
serial,
"",
"");
free(keyboard->preedit_string);
keyboard->preedit_string = strdup("");
}
keyboard->serial = serial;
}
static const struct input_method_context_listener input_method_context_listener = {
@@ -410,7 +424,8 @@ static const struct input_method_context_listener input_method_context_listener
static void
input_method_activate(void *data,
struct input_method *input_method,
struct input_method_context *context)
struct input_method_context *context,
uint32_t serial)
{
struct virtual_keyboard *keyboard = data;
struct wl_array modifiers_map;
@@ -422,6 +437,7 @@ input_method_activate(void *data,
free(keyboard->preedit_string);
keyboard->preedit_string = strdup("");
keyboard->serial = serial;
keyboard->context = context;
input_method_context_add_listener(context,
+19 -2
View File
@@ -70,6 +70,8 @@ struct simple_im {
xkb_mod_mask_t shift_mask;
keyboard_input_key_handler_t key_handler;
uint32_t serial;
};
static const struct compose_seq compose_seqs[] = {
@@ -110,13 +112,16 @@ input_method_context_surrounding_text(void *data,
static void
input_method_context_reset(void *data,
struct input_method_context *context)
struct input_method_context *context,
uint32_t serial)
{
struct simple_im *keyboard = data;
fprintf(stderr, "Reset pre-edit buffer\n");
keyboard->compose_state = state_normal;
keyboard->serial = serial;
}
static const struct input_method_context_listener input_method_context_listener = {
@@ -247,7 +252,8 @@ static const struct wl_keyboard_listener input_method_keyboard_listener = {
static void
input_method_activate(void *data,
struct input_method *input_method,
struct input_method_context *context)
struct input_method_context *context,
uint32_t serial)
{
struct simple_im *keyboard = data;
@@ -256,6 +262,8 @@ input_method_activate(void *data,
keyboard->compose_state = state_normal;
keyboard->serial = serial;
keyboard->context = context;
input_method_context_add_listener(context,
&input_method_context_listener,
@@ -371,10 +379,13 @@ simple_im_key_handler(struct simple_im *keyboard,
if (cs) {
if (cs->keys[i + 1] == 0) {
input_method_context_preedit_cursor(keyboard->context,
keyboard->serial,
0);
input_method_context_preedit_string(keyboard->context,
keyboard->serial,
"", "");
input_method_context_commit_string(keyboard->context,
keyboard->serial,
cs->text,
strlen(cs->text));
keyboard->compose_state = state_normal;
@@ -386,8 +397,10 @@ simple_im_key_handler(struct simple_im *keyboard,
}
input_method_context_preedit_cursor(keyboard->context,
keyboard->serial,
strlen(text));
input_method_context_preedit_string(keyboard->context,
keyboard->serial,
text,
text);
}
@@ -398,10 +411,13 @@ simple_im_key_handler(struct simple_im *keyboard,
idx += xkb_keysym_to_utf8(keyboard->compose_seq.keys[j], text + idx, sizeof(text) - idx);
}
input_method_context_preedit_cursor(keyboard->context,
keyboard->serial,
0);
input_method_context_preedit_string(keyboard->context,
keyboard->serial,
"", "");
input_method_context_commit_string(keyboard->context,
keyboard->serial,
text,
strlen(text));
keyboard->compose_state = state_normal;
@@ -418,6 +434,7 @@ simple_im_key_handler(struct simple_im *keyboard,
return;
input_method_context_commit_string(keyboard->context,
keyboard->serial,
text,
strlen(text));
}