[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