[PATCH 5/5] text: Deactivate text_model on keyboard focus lost
Jan Arne Petersen
jpetersen at openismus.com
Fri Aug 10 07:47:23 PDT 2012
From: Jan Arne Petersen <jpetersen at openismus.com>
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.
---
src/text-backend.c | 43 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/src/text-backend.c b/src/text-backend.c
index c634aec..ddeec20 100644
--- a/src/text-backend.c
+++ b/src/text-backend.c
@@ -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;
}
+
--
1.7.11.2
More information about the wayland-devel
mailing list