[PATCH weston 1/2] text-backend: Allow client hiding of input panel

Joshua Watt jpewhacker at gmail.com
Sat Jun 24 21:03:41 UTC 2017


Previously, the hide_input_panel and show_input_panel messages for the text
input protocol were limited to specific cases, such as showing the panel on
activation, or making the panel visible after activation. Now, clients are
allowed to toggle the panel visiblity at will as long as they are the currently
active client

Signed-off-by: Joshua Watt <JPEWhacker at gmail.com>
---
 compositor/text-backend.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/compositor/text-backend.c b/compositor/text-backend.c
index bf5c45c..6add101 100644
--- a/compositor/text-backend.c
+++ b/compositor/text-backend.c
@@ -64,7 +64,7 @@ struct text_input_manager {
 	struct wl_global *text_input_manager_global;
 	struct wl_listener destroy_listener;
 
-	struct text_input *current_panel;
+	struct text_input *current_text_input;
 
 	struct weston_compositor *ec;
 };
@@ -140,11 +140,15 @@ deactivate_input_method(struct input_method *input_method)
 	input_method->context = NULL;
 
 	if (wl_list_empty(&text_input->input_methods) &&
-	    text_input->input_panel_visible) {
+	    text_input->input_panel_visible &&
+	    text_input->manager->current_text_input == text_input) {
 		wl_signal_emit(&ec->hide_input_panel_signal, ec);
 		text_input->input_panel_visible = false;
-		text_input->manager->current_panel = NULL;
 	}
+
+	if (text_input->manager->current_text_input == text_input)
+		text_input->manager->current_text_input = NULL;
+
 	zwp_text_input_v1_send_leave(text_input->resource);
 }
 
@@ -206,12 +210,11 @@ text_input_activate(struct wl_client *client,
 
 	input_method_context_create(text_input, input_method);
 
-	current = text_input->manager->current_panel;
+	current = text_input->manager->current_text_input;
 
 	if (current && current != text_input) {
 		current->input_panel_visible = false;
 		wl_signal_emit(&ec->hide_input_panel_signal, ec);
-		text_input->manager->current_panel = NULL;
 	}
 
 	if (text_input->input_panel_visible) {
@@ -219,8 +222,8 @@ text_input_activate(struct wl_client *client,
 			       text_input->surface);
 		wl_signal_emit(&ec->update_input_panel_signal,
 			       &text_input->cursor_rectangle);
-		text_input->manager->current_panel = text_input;
 	}
+	text_input->manager->current_text_input = text_input;
 
 	zwp_text_input_v1_send_enter(text_input->resource,
 				     text_input->surface->resource);
@@ -335,7 +338,8 @@ text_input_show_input_panel(struct wl_client *client,
 
 	text_input->input_panel_visible = true;
 
-	if (!wl_list_empty(&text_input->input_methods)) {
+	if (!wl_list_empty(&text_input->input_methods) &&
+	    text_input == text_input->manager->current_text_input) {
 		wl_signal_emit(&ec->show_input_panel_signal,
 			       text_input->surface);
 		wl_signal_emit(&ec->update_input_panel_signal,
@@ -353,10 +357,8 @@ text_input_hide_input_panel(struct wl_client *client,
 	text_input->input_panel_visible = false;
 
 	if (!wl_list_empty(&text_input->input_methods) &&
-	    text_input == text_input->manager->current_panel) {
-		text_input->manager->current_panel = NULL;
+	    text_input == text_input->manager->current_text_input)
 		wl_signal_emit(&ec->hide_input_panel_signal, ec);
-	}
 }
 
 static void
-- 
2.9.4



More information about the wayland-devel mailing list