mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-04-23 07:30:36 +02:00
text: Set context->model to NULL when we deactivate text input
There's a small window between the input method (eg the on-sreen keyboard) receiving the deactivate and destroying the context, where the keyboard may send requests, which we forward to the destroyed input method. Fix this by setting the contexts model to NULL right away and then avoid sending events if context->model is NULL. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=69490
This commit is contained in:
parent
211b517e8c
commit
c180977e7c
1 changed files with 30 additions and 11 deletions
|
|
@ -121,6 +121,7 @@ deactivate_text_input(struct text_input *text_input,
|
|||
input_method_context_end_keyboard_grab(input_method->context);
|
||||
wl_input_method_send_deactivate(input_method->input_method_binding,
|
||||
input_method->context->resource);
|
||||
input_method->context->model = NULL;
|
||||
}
|
||||
|
||||
wl_list_remove(&input_method->link);
|
||||
|
|
@ -437,7 +438,9 @@ input_method_context_commit_string(struct wl_client *client,
|
|||
struct input_method_context *context =
|
||||
wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_commit_string(context->model->resource, serial, text);
|
||||
if (context->model)
|
||||
wl_text_input_send_commit_string(context->model->resource,
|
||||
serial, text);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -450,7 +453,9 @@ input_method_context_preedit_string(struct wl_client *client,
|
|||
struct input_method_context *context =
|
||||
wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_preedit_string(context->model->resource, serial, text, commit);
|
||||
if (context->model)
|
||||
wl_text_input_send_preedit_string(context->model->resource,
|
||||
serial, text, commit);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -463,7 +468,9 @@ input_method_context_preedit_styling(struct wl_client *client,
|
|||
struct input_method_context *context =
|
||||
wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_preedit_styling(context->model->resource, index, length, style);
|
||||
if (context->model)
|
||||
wl_text_input_send_preedit_styling(context->model->resource,
|
||||
index, length, style);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -474,7 +481,9 @@ input_method_context_preedit_cursor(struct wl_client *client,
|
|||
struct input_method_context *context =
|
||||
wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_preedit_cursor(context->model->resource, cursor);
|
||||
if (context->model)
|
||||
wl_text_input_send_preedit_cursor(context->model->resource,
|
||||
cursor);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -486,7 +495,9 @@ input_method_context_delete_surrounding_text(struct wl_client *client,
|
|||
struct input_method_context *context =
|
||||
wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_delete_surrounding_text(context->model->resource, index, length);
|
||||
if (context->model)
|
||||
wl_text_input_send_delete_surrounding_text(context->model->resource,
|
||||
index, length);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -498,7 +509,9 @@ input_method_context_cursor_position(struct wl_client *client,
|
|||
struct input_method_context *context =
|
||||
wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_cursor_position(context->model->resource, index, anchor);
|
||||
if (context->model)
|
||||
wl_text_input_send_cursor_position(context->model->resource,
|
||||
index, anchor);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -509,7 +522,8 @@ input_method_context_modifiers_map(struct wl_client *client,
|
|||
struct input_method_context *context =
|
||||
wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_modifiers_map(context->model->resource, map);
|
||||
if (context->model)
|
||||
wl_text_input_send_modifiers_map(context->model->resource, map);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -524,8 +538,9 @@ input_method_context_keysym(struct wl_client *client,
|
|||
struct input_method_context *context =
|
||||
wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_keysym(context->model->resource, serial, time,
|
||||
sym, state, modifiers);
|
||||
if (context->model)
|
||||
wl_text_input_send_keysym(context->model->resource,
|
||||
serial, time, sym, state, modifiers);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -653,7 +668,9 @@ input_method_context_language(struct wl_client *client,
|
|||
{
|
||||
struct input_method_context *context = wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_language(context->model->resource, serial, language);
|
||||
if (context->model)
|
||||
wl_text_input_send_language(context->model->resource,
|
||||
serial, language);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -664,7 +681,9 @@ input_method_context_text_direction(struct wl_client *client,
|
|||
{
|
||||
struct input_method_context *context = wl_resource_get_user_data(resource);
|
||||
|
||||
wl_text_input_send_text_direction(context->model->resource, serial, direction);
|
||||
if (context->model)
|
||||
wl_text_input_send_text_direction(context->model->resource,
|
||||
serial, direction);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue