[PATCH] ivi-shell: activate weston surface with a seat when left click or touch.

Nobuhiko Tanibata nobuhiko_tanibata at xddp.denso.co.jp
Tue Dec 8 22:03:47 PST 2015


From: Nobuhiko Tanibata <NOBUHIKO_TANIBATA at xddp.denso.co.jp>

Similar with Desktop shell, set activate to weston surface which is
left-clicked by pointer or touched. This is needed to focus it with a seat.
Without this, a feature who gets activated weston surface by using
weston_surface_get_main_surface doesn't work correctly because it can
not get correct focused weston surface. For example, input-panel uses
weston_surface_get_main_surface to get a weston surface. With this
weston surface, it get a member: output to decide which output shall
show a input-panel, software keyboard. Without activation,
input-panel-ivi can not find a correct output which shows e.g.
weston-editor who uses input-method.

Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA at xddp.denso.co.jp>
---
 ivi-shell/ivi-shell.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/ivi-shell/ivi-shell.c b/ivi-shell/ivi-shell.c
index 1720705..a767ccf 100644
--- a/ivi-shell/ivi-shell.c
+++ b/ivi-shell/ivi-shell.c
@@ -414,6 +414,59 @@ ivi_shell_setting_create(struct ivi_shell_setting *dest,
 	return result;
 }
 
+static void
+activate_binding(struct weston_seat *seat,
+		 struct weston_view *focus_view)
+{
+	struct weston_surface *focus = focus_view->surface;
+	struct weston_surface *main_surface =
+		weston_surface_get_main_surface(focus);
+
+	if (get_ivi_shell_surface(main_surface) == NULL)
+		return;
+
+	weston_surface_activate(focus, seat);
+}
+
+static void
+click_to_activate_binding(struct weston_pointer *pointer, uint32_t time,
+			  uint32_t button, void *data)
+{
+	if (pointer->grab != &pointer->default_grab)
+		return;
+	if (pointer->focus == NULL)
+		return;
+
+	activate_binding(pointer->seat, pointer->focus);
+}
+
+static void
+touch_to_activate_binding(struct weston_touch *touch, uint32_t time,
+			  void *data)
+{
+	if (touch->grab != &touch->default_grab)
+		return;
+	if (touch->focus == NULL)
+		return;
+
+	activate_binding(touch->seat, touch->focus);
+}
+
+static void
+shell_add_bindings(struct weston_compositor *compositor,
+		   struct ivi_shell *shell)
+{
+	weston_compositor_add_button_binding(compositor, BTN_LEFT, 0,
+					     click_to_activate_binding,
+					     shell);
+	weston_compositor_add_button_binding(compositor, BTN_RIGHT, 0,
+					     click_to_activate_binding,
+					     shell);
+	weston_compositor_add_touch_binding(compositor, 0,
+					    touch_to_activate_binding,
+					    shell);
+}
+
 /*
  * Initialization of ivi-shell.
  */
@@ -450,6 +503,7 @@ module_init(struct weston_compositor *compositor,
 		goto out_settings;
 
 	ivi_layout_init_with_compositor(compositor);
+	shell_add_bindings(compositor, shell);
 
 	/* Call module_init of ivi-modules which are defined in weston.ini */
 	if (load_controller_modules(compositor, setting.ivi_module,
-- 
1.8.3.1



More information about the wayland-devel mailing list