diff options
Diffstat (limited to 'meta-ivi/recipes-graphics/wayland/weston-1.6.0/0013-Reference-implementation-of-input-panel-for-ivi-shel.patch')
-rw-r--r-- | meta-ivi/recipes-graphics/wayland/weston-1.6.0/0013-Reference-implementation-of-input-panel-for-ivi-shel.patch | 563 |
1 files changed, 0 insertions, 563 deletions
diff --git a/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0013-Reference-implementation-of-input-panel-for-ivi-shel.patch b/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0013-Reference-implementation-of-input-panel-for-ivi-shel.patch deleted file mode 100644 index 3e938f5..0000000 --- a/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0013-Reference-implementation-of-input-panel-for-ivi-shel.patch +++ /dev/null @@ -1,563 +0,0 @@ -From 301505d5b731d89e87a81de04d83230cb2de2246 Mon Sep 17 00:00:00 2001 -From: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> -Date: Thu, 6 Nov 2014 13:44:18 +0900 -Subject: [PATCH 13/15] Reference implementation of input panel for ivi-shell. - - introduces ivi-shell/input-panel-ivi.c - -The basement of this code is from input-panel.c of desktop shell. - --------------------------------------------------------- -ivi-shell/input-panel-ivi.c: remove non-availalable header including - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - --------------------------------------------------------- -input-panel-ivi: remove DENSO copyright - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - --------------------------------------------------------- -input-panel-ivi: revert one patch to be separeated - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - --------------------------------------------------------- -input-panel-ivi: remove panel_layer which is not required - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> ---- - Makefile.am | 3 +- - ivi-shell/input-panel-ivi.c | 391 +++++++++++++++++++++++++++++++++++++++++++ - ivi-shell/ivi-shell.c | 30 ++++ - ivi-shell/ivi-shell.h | 28 ++++ - ivi-shell/weston.ini.in | 3 + - 5 files changed, 454 insertions(+), 1 deletion(-) - create mode 100644 ivi-shell/input-panel-ivi.c - -diff --git a/Makefile.am b/Makefile.am -index 081c854..2c9ffde 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -788,7 +788,8 @@ ivi_shell_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS) - ivi_shell_la_SOURCES = \ - ivi-shell/ivi-shell.h \ - ivi-shell/ivi-shell.c \ -- ivi-shell/ivi-layout-private.h -+ ivi-shell/ivi-layout-private.h \ -+ ivi-shell/input-panel-ivi.c - nodist_ivi_shell_la_SOURCES = \ - protocol/ivi-application-protocol.c \ - protocol/ivi-application-server-protocol.h -diff --git a/ivi-shell/input-panel-ivi.c b/ivi-shell/input-panel-ivi.c -new file mode 100644 -index 0000000..01fd329 ---- /dev/null -+++ b/ivi-shell/input-panel-ivi.c -@@ -0,0 +1,391 @@ -+/* -+ * Copyright © 2010-2012 Intel Corporation -+ * Copyright © 2011-2012 Collabora, Ltd. -+ * Copyright © 2013 Raspberry Pi Foundation -+ * -+ * Permission to use, copy, modify, distribute, and sell this software and -+ * its documentation for any purpose is hereby granted without fee, provided -+ * that the above copyright notice appear in all copies and that both that -+ * copyright notice and this permission notice appear in supporting -+ * documentation, and that the name of the copyright holders not be used in -+ * advertising or publicity pertaining to distribution of the software -+ * without specific, written prior permission. The copyright holders make -+ * no representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER -+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF -+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ */ -+ -+#include "config.h" -+ -+#include <stdlib.h> -+#include <stdio.h> -+#include <string.h> -+ -+#include "ivi-shell.h" -+#include "input-method-server-protocol.h" -+#include "ivi-layout-private.h" -+ -+struct input_panel_surface { -+ struct wl_resource *resource; -+ struct wl_signal destroy_signal; -+ -+ struct ivi_shell *shell; -+ -+ struct wl_list link; -+ struct weston_surface *surface; -+ struct weston_view *view; -+ struct wl_listener surface_destroy_listener; -+ -+ struct weston_view_animation *anim; -+ -+ struct weston_output *output; -+ uint32_t panel; -+}; -+ -+static void -+input_panel_slide_done(struct weston_view_animation *animation, void *data) -+{ -+ struct input_panel_surface *ipsurf = data; -+ -+ ipsurf->anim = NULL; -+} -+ -+static void -+show_input_panel_surface(struct input_panel_surface *ipsurf) -+{ -+ struct ivi_shell *shell = ipsurf->shell; -+ struct weston_seat *seat; -+ struct weston_surface *focus; -+ float x, y; -+ -+ wl_list_for_each(seat, &shell->compositor->seat_list, link) { -+ if (!seat->keyboard) -+ continue; -+ focus = weston_surface_get_main_surface(seat->keyboard->focus); -+ ipsurf->output = focus->output; -+ x = ipsurf->output->x + (ipsurf->output->width - ipsurf->surface->width) / 2; -+ y = ipsurf->output->y + ipsurf->output->height - ipsurf->surface->height; -+ weston_view_set_position(ipsurf->view, x, y); -+ } -+ -+ weston_layer_entry_insert(&shell->input_panel_layer.view_list, -+ &ipsurf->view->layer_link); -+ weston_view_geometry_dirty(ipsurf->view); -+ weston_view_update_transform(ipsurf->view); -+ weston_surface_damage(ipsurf->surface); -+ -+ if (ipsurf->anim) -+ weston_view_animation_destroy(ipsurf->anim); -+ -+ ipsurf->anim = -+ weston_slide_run(ipsurf->view, -+ ipsurf->surface->height * 0.9, 0, -+ input_panel_slide_done, ipsurf); -+} -+ -+static void -+show_input_panels(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell *shell = -+ container_of(listener, struct ivi_shell, -+ show_input_panel_listener); -+ struct input_panel_surface *ipsurf, *next; -+ -+ shell->text_input.surface = (struct weston_surface*)data; -+ -+ if (shell->showing_input_panels) -+ return; -+ -+ shell->showing_input_panels = true; -+ -+ if (!shell->locked) -+ wl_list_insert(&shell->compositor->cursor_layer.link, -+ &shell->input_panel_layer.link); -+ -+ wl_list_for_each_safe(ipsurf, next, -+ &shell->input_panel.surfaces, link) { -+ if (ipsurf->surface->width == 0) -+ continue; -+ -+ show_input_panel_surface(ipsurf); -+ } -+} -+ -+static void -+hide_input_panels(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell *shell = -+ container_of(listener, struct ivi_shell, -+ hide_input_panel_listener); -+ struct weston_view *view, *next; -+ -+ if (!shell->showing_input_panels) -+ return; -+ -+ shell->showing_input_panels = false; -+ -+ if (!shell->locked) -+ wl_list_remove(&shell->input_panel_layer.link); -+ -+ wl_list_for_each_safe(view, next, -+ &shell->input_panel_layer.view_list.link, -+ layer_link.link) -+ weston_view_unmap(view); -+} -+ -+static void -+update_input_panels(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell *shell = -+ container_of(listener, struct ivi_shell, -+ update_input_panel_listener); -+ -+ memcpy(&shell->text_input.cursor_rectangle, data, sizeof(pixman_box32_t)); -+} -+ -+static void -+input_panel_configure(struct weston_surface *surface, int32_t sx, int32_t sy) -+{ -+ struct input_panel_surface *ip_surface = surface->configure_private; -+ struct ivi_shell *shell = ip_surface->shell; -+ struct weston_view *view; -+ float x, y; -+ -+ if (surface->width == 0) -+ return; -+ -+ if (ip_surface->panel) { -+ view = get_default_view(shell->text_input.surface); -+ if (view == NULL) -+ return; -+ x = view->geometry.x + shell->text_input.cursor_rectangle.x2; -+ y = view->geometry.y + shell->text_input.cursor_rectangle.y2; -+ } else { -+ x = ip_surface->output->x + (ip_surface->output->width - surface->width) / 2; -+ y = ip_surface->output->y + ip_surface->output->height - surface->height; -+ } -+ -+ weston_view_set_position(ip_surface->view, x, y); -+ -+ if (!weston_surface_is_mapped(surface) && shell->showing_input_panels) -+ show_input_panel_surface(ip_surface); -+} -+ -+static void -+destroy_input_panel_surface(struct input_panel_surface *input_panel_surface) -+{ -+ wl_signal_emit(&input_panel_surface->destroy_signal, input_panel_surface); -+ -+ wl_list_remove(&input_panel_surface->surface_destroy_listener.link); -+ wl_list_remove(&input_panel_surface->link); -+ -+ input_panel_surface->surface->configure = NULL; -+ weston_view_destroy(input_panel_surface->view); -+ -+ free(input_panel_surface); -+} -+ -+static struct input_panel_surface * -+get_input_panel_surface(struct weston_surface *surface) -+{ -+ if (surface->configure == input_panel_configure) { -+ return surface->configure_private; -+ } else { -+ return NULL; -+ } -+} -+ -+static void -+input_panel_handle_surface_destroy(struct wl_listener *listener, void *data) -+{ -+ struct input_panel_surface *ipsurface = container_of(listener, -+ struct input_panel_surface, -+ surface_destroy_listener); -+ -+ if (ipsurface->resource) { -+ wl_resource_destroy(ipsurface->resource); -+ } else { -+ destroy_input_panel_surface(ipsurface); -+ } -+} -+ -+static struct input_panel_surface * -+create_input_panel_surface(struct ivi_shell *shell, -+ struct weston_surface *surface) -+{ -+ struct input_panel_surface *input_panel_surface; -+ -+ input_panel_surface = calloc(1, sizeof *input_panel_surface); -+ if (!input_panel_surface) -+ return NULL; -+ -+ surface->configure = input_panel_configure; -+ surface->configure_private = input_panel_surface; -+ -+ input_panel_surface->shell = shell; -+ -+ input_panel_surface->surface = surface; -+ input_panel_surface->view = weston_view_create(surface); -+ -+ wl_signal_init(&input_panel_surface->destroy_signal); -+ input_panel_surface->surface_destroy_listener.notify = input_panel_handle_surface_destroy; -+ wl_signal_add(&surface->destroy_signal, -+ &input_panel_surface->surface_destroy_listener); -+ -+ wl_list_init(&input_panel_surface->link); -+ -+ return input_panel_surface; -+} -+ -+static void -+input_panel_surface_set_toplevel(struct wl_client *client, -+ struct wl_resource *resource, -+ struct wl_resource *output_resource, -+ uint32_t position) -+{ -+ struct input_panel_surface *input_panel_surface = -+ wl_resource_get_user_data(resource); -+ struct ivi_shell *shell = input_panel_surface->shell; -+ -+ wl_list_insert(&shell->input_panel.surfaces, -+ &input_panel_surface->link); -+ -+ input_panel_surface->output = wl_resource_get_user_data(output_resource); -+ input_panel_surface->panel = 0; -+} -+ -+static void -+input_panel_surface_set_overlay_panel(struct wl_client *client, -+ struct wl_resource *resource) -+{ -+ struct input_panel_surface *input_panel_surface = -+ wl_resource_get_user_data(resource); -+ struct ivi_shell *shell = input_panel_surface->shell; -+ -+ wl_list_insert(&shell->input_panel.surfaces, -+ &input_panel_surface->link); -+ -+ input_panel_surface->panel = 1; -+} -+ -+static const struct wl_input_panel_surface_interface input_panel_surface_implementation = { -+ input_panel_surface_set_toplevel, -+ input_panel_surface_set_overlay_panel -+}; -+ -+static void -+destroy_input_panel_surface_resource(struct wl_resource *resource) -+{ -+ struct input_panel_surface *ipsurf = -+ wl_resource_get_user_data(resource); -+ -+ destroy_input_panel_surface(ipsurf); -+} -+ -+static void -+input_panel_get_input_panel_surface(struct wl_client *client, -+ struct wl_resource *resource, -+ uint32_t id, -+ struct wl_resource *surface_resource) -+{ -+ struct weston_surface *surface = -+ wl_resource_get_user_data(surface_resource); -+ struct ivi_shell *shell = wl_resource_get_user_data(resource); -+ struct input_panel_surface *ipsurf; -+ -+ if (get_input_panel_surface(surface)) { -+ wl_resource_post_error(surface_resource, -+ WL_DISPLAY_ERROR_INVALID_OBJECT, -+ "wl_input_panel::get_input_panel_surface already requested"); -+ return; -+ } -+ -+ ipsurf = create_input_panel_surface(shell, surface); -+ if (!ipsurf) { -+ wl_resource_post_error(surface_resource, -+ WL_DISPLAY_ERROR_INVALID_OBJECT, -+ "surface->configure already set"); -+ return; -+ } -+ -+ ipsurf->resource = -+ wl_resource_create(client, -+ &wl_input_panel_surface_interface, 1, id); -+ wl_resource_set_implementation(ipsurf->resource, -+ &input_panel_surface_implementation, -+ ipsurf, -+ destroy_input_panel_surface_resource); -+} -+ -+static const struct wl_input_panel_interface input_panel_implementation = { -+ input_panel_get_input_panel_surface -+}; -+ -+static void -+unbind_input_panel(struct wl_resource *resource) -+{ -+ struct ivi_shell *shell = wl_resource_get_user_data(resource); -+ -+ shell->input_panel.binding = NULL; -+} -+ -+static void -+bind_input_panel(struct wl_client *client, -+ void *data, uint32_t version, uint32_t id) -+{ -+ struct ivi_shell *shell = data; -+ struct wl_resource *resource; -+ -+ resource = wl_resource_create(client, -+ &wl_input_panel_interface, 1, id); -+ -+ if (shell->input_panel.binding == NULL) { -+ wl_resource_set_implementation(resource, -+ &input_panel_implementation, -+ shell, unbind_input_panel); -+ shell->input_panel.binding = resource; -+ return; -+ } -+ -+ wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT, -+ "interface object already bound"); -+} -+ -+void -+input_panel_destroy(struct ivi_shell *shell) -+{ -+ wl_list_remove(&shell->show_input_panel_listener.link); -+ wl_list_remove(&shell->hide_input_panel_listener.link); -+} -+ -+int -+input_panel_setup(struct ivi_shell *shell) -+{ -+ struct weston_compositor *ec = shell->compositor; -+ -+ shell->show_input_panel_listener.notify = show_input_panels; -+ wl_signal_add(&ec->show_input_panel_signal, -+ &shell->show_input_panel_listener); -+ shell->hide_input_panel_listener.notify = hide_input_panels; -+ wl_signal_add(&ec->hide_input_panel_signal, -+ &shell->hide_input_panel_listener); -+ shell->update_input_panel_listener.notify = update_input_panels; -+ wl_signal_add(&ec->update_input_panel_signal, -+ &shell->update_input_panel_listener); -+ -+ wl_list_init(&shell->input_panel.surfaces); -+ -+ if (wl_global_create(shell->compositor->wl_display, -+ &wl_input_panel_interface, 1, -+ shell, bind_input_panel) == NULL) -+ return -1; -+ -+ return 0; -+} -diff --git a/ivi-shell/ivi-shell.c b/ivi-shell/ivi-shell.c -index 3904402..5723c00 100644 ---- a/ivi-shell/ivi-shell.c -+++ b/ivi-shell/ivi-shell.c -@@ -375,6 +375,31 @@ bind_ivi_application(struct wl_client *client, - shell, NULL); - } - -+struct weston_view * -+get_default_view(struct weston_surface *surface) -+{ -+ struct ivi_shell_surface *shsurf; -+ struct weston_view *view; -+ -+ if (!surface || wl_list_empty(&surface->views)) -+ return NULL; -+ -+ shsurf = get_ivi_shell_surface(surface); -+ if (shsurf && shsurf->layout_surface) { -+ view = shsurf->shell->ivi_layout->get_weston_view(shsurf->layout_surface); -+ if (view) -+ return view; -+ } -+ -+ wl_list_for_each(view, &surface->views, surface_link) { -+ if (weston_view_is_mapped(view)) -+ return view; -+ } -+ -+ return container_of(surface->views.next, -+ struct weston_view, surface_link); -+} -+ - /* - * Called through the compositor's destroy signal. - */ -@@ -385,6 +410,8 @@ shell_destroy(struct wl_listener *listener, void *data) - container_of(listener, struct ivi_shell, destroy_listener); - struct ivi_shell_surface *ivisurf, *next; - -+ input_panel_destroy(shell); -+ - wl_list_for_each_safe(ivisurf, next, &shell->ivi_surface_list, link) { - wl_list_remove(&ivisurf->link); - free(ivisurf); -@@ -400,6 +427,7 @@ init_ivi_shell(struct weston_compositor *compositor, struct ivi_shell *shell) - - wl_list_init(&shell->ivi_surface_list); - -+ weston_layer_init(&shell->input_panel_layer, NULL); - } - - static int -@@ -474,6 +502,8 @@ module_init(struct weston_compositor *compositor, - shell->destroy_listener.notify = shell_destroy; - wl_signal_add(&compositor->destroy_signal, &shell->destroy_listener); - -+ if (input_panel_setup(shell) < 0) -+ return -1; - - if (wl_global_create(compositor->wl_display, - &ivi_application_interface, 1, -diff --git a/ivi-shell/ivi-shell.h b/ivi-shell/ivi-shell.h -index 1283a00..3441119 100644 ---- a/ivi-shell/ivi-shell.h -+++ b/ivi-shell/ivi-shell.h -@@ -34,4 +34,32 @@ struct ivi_shell - struct wl_list ivi_surface_list; /* struct ivi_shell_surface::link */ - - struct ivi_layout_interface *ivi_layout; -+ -+ struct wl_listener show_input_panel_listener; -+ struct wl_listener hide_input_panel_listener; -+ struct wl_listener update_input_panel_listener; -+ -+ struct weston_layer input_panel_layer; -+ -+ bool locked; -+ bool showing_input_panels; -+ -+ struct { -+ struct weston_surface *surface; -+ pixman_box32_t cursor_rectangle; -+ } text_input; -+ -+ struct { -+ struct wl_resource *binding; -+ struct wl_list surfaces; -+ } input_panel; - }; -+ -+struct weston_view * -+get_default_view(struct weston_surface *surface); -+ -+int -+input_panel_setup(struct ivi_shell *shell); -+ -+void -+input_panel_destroy(struct ivi_shell *shell); -diff --git a/ivi-shell/weston.ini.in b/ivi-shell/weston.ini.in -index f8ef12f..050b806 100644 ---- a/ivi-shell/weston.ini.in -+++ b/ivi-shell/weston.ini.in -@@ -32,6 +32,9 @@ home-id=1007 - workspace-background-color=0x99000000 - workspace-background-id=2001 - -+[input-method] -+path=@libexecdir@/weston-keyboard -+ - [ivi-launcher] - workspace-id=0 - icon-id=4001 --- -1.7.9.5 - |