mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-05 01:48:00 +02:00
text: Deactivate text_model on keyboard focus lost
Assign a surface to a text_model on the text_model_activate request and deactivate the text_model when the surface looses the keyboard focus.
This commit is contained in:
parent
e829adc514
commit
cd8cdccdd3
1 changed files with 43 additions and 0 deletions
|
|
@ -33,6 +33,8 @@ struct text_model {
|
|||
struct weston_compositor *ec;
|
||||
|
||||
struct wl_list input_methods;
|
||||
|
||||
struct wl_surface *surface;
|
||||
};
|
||||
|
||||
struct input_method {
|
||||
|
|
@ -45,8 +47,14 @@ struct input_method {
|
|||
struct text_model *model;
|
||||
|
||||
struct wl_list link;
|
||||
|
||||
struct wl_listener keyboard_focus_listener;
|
||||
|
||||
int focus_listener_initialized;
|
||||
};
|
||||
|
||||
static void input_method_init_seat(struct weston_seat *seat);
|
||||
|
||||
static void
|
||||
deactivate_text_model(struct text_model *text_model,
|
||||
struct input_method *input_method)
|
||||
|
|
@ -109,6 +117,9 @@ text_model_activate(struct wl_client *client,
|
|||
|
||||
weston_seat->input_method->model = text_model;
|
||||
wl_list_insert(&text_model->input_methods, &weston_seat->input_method->link);
|
||||
input_method_init_seat(weston_seat);
|
||||
|
||||
text_model->surface = surface->data;
|
||||
|
||||
wl_signal_emit(&ec->show_input_panel_signal, ec);
|
||||
|
||||
|
|
@ -275,6 +286,36 @@ input_method_notifier_destroy(struct wl_listener *listener, void *data)
|
|||
free(input_method);
|
||||
}
|
||||
|
||||
static void
|
||||
handle_keyboard_focus(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct wl_keyboard *keyboard = data;
|
||||
struct input_method *input_method =
|
||||
container_of(listener, struct input_method, keyboard_focus_listener);
|
||||
struct wl_surface *surface = keyboard->focus;
|
||||
|
||||
if (!input_method->model)
|
||||
return;
|
||||
|
||||
if (!surface || input_method->model->surface != surface)
|
||||
deactivate_text_model(input_method->model,
|
||||
input_method);
|
||||
}
|
||||
|
||||
static void
|
||||
input_method_init_seat(struct weston_seat *seat)
|
||||
{
|
||||
if (seat->input_method->focus_listener_initialized)
|
||||
return;
|
||||
|
||||
if (seat->has_keyboard) {
|
||||
seat->input_method->keyboard_focus_listener.notify = handle_keyboard_focus;
|
||||
wl_signal_add(&seat->seat.keyboard->focus_signal, &seat->input_method->keyboard_focus_listener);
|
||||
}
|
||||
|
||||
seat->input_method->focus_listener_initialized = 1;
|
||||
}
|
||||
|
||||
void
|
||||
input_method_create(struct weston_compositor *ec,
|
||||
struct weston_seat *seat)
|
||||
|
|
@ -285,6 +326,7 @@ input_method_create(struct weston_compositor *ec,
|
|||
|
||||
input_method->ec = ec;
|
||||
input_method->model = NULL;
|
||||
input_method->focus_listener_initialized = 0;
|
||||
|
||||
input_method->input_method_global =
|
||||
wl_display_add_global(ec->wl_display,
|
||||
|
|
@ -301,3 +343,4 @@ input_method_create(struct weston_compositor *ec,
|
|||
|
||||
seat->input_method = input_method;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue