diff options
Diffstat (limited to 'meta-ivi/recipes-graphics/wayland/weston-1.6.0/0004-ivi-shell-add-the-shell-plugin-for-In-Vehicle-Infota.patch')
-rw-r--r-- | meta-ivi/recipes-graphics/wayland/weston-1.6.0/0004-ivi-shell-add-the-shell-plugin-for-In-Vehicle-Infota.patch | 1027 |
1 files changed, 0 insertions, 1027 deletions
diff --git a/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0004-ivi-shell-add-the-shell-plugin-for-In-Vehicle-Infota.patch b/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0004-ivi-shell-add-the-shell-plugin-for-In-Vehicle-Infota.patch deleted file mode 100644 index 9320abb..0000000 --- a/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0004-ivi-shell-add-the-shell-plugin-for-In-Vehicle-Infota.patch +++ /dev/null @@ -1,1027 +0,0 @@ -From 6b3f32ba6541b27062ab87aeb88665986c67e31d Mon Sep 17 00:00:00 2001 -From: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> -Date: Wed, 15 Oct 2014 11:26:29 +0900 -Subject: [PATCH 04/15] ivi-shell: add the shell plugin for In-Vehicle - Infotainment system - -- ivi-shell.so -- introduces ivi-shell/ivi-shell.[ch] - -In-Vehicle Infotainment system traditionally manages surfaces with -global identification. A protocol, ivi_application, supports such a -feature by implementing a request, ivi_application::surface_creation -defined in ivi_application.xml. - -The ivi-shell explicitly loads ivi-layout.so and a module to add -business logic like how to layout surfaces by using ivi-layout APIs. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -ivi-shell: send ivi_surface configure event when ivi_layout_surface configured signal emitted. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell: Release module when initialzing failed. - -> f9839a9 ivi-shell: add the shell plugin for In-Vehicle Infotainment system -> -> New title: "ivi-shell: add ivi-shell.so shell module" -> Destructors and few minor things need fixing. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell: Fix ivi_layout_surfaceSetPosition. Change int type from array type - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell: Change quoted_printable_encode form camelcase - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell: add comment why it doesn't use weston_load_module - -The reason why the following code is written newly without using -weston_load_module is it doesn't open library with RTLD_GLOBAL option. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- - ivi-shell: Replace list_thing with thing_list. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell/ivi-shell.c: remove non-availalable header including - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell: ivi-shell.[ch] clean-up code - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell: Remove call wl_resource_set_implementation - -> This call in not needed, AFAIK. -> [ntanibata] I will remove it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell: Move surface_configure_notify() definition - -> Move surface_configure_notify() definition above the line where it is -> needed, and remove the declaration from the beginning of the file. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell: Add shell-surface destructor. - ->> No destructor function? So what happens, if the client unexpectedly ->> disconnects, and libwayland-server destroys all wl_resources in a ->> random order? I think you'd be leaking everything you allocated in ->> this function. - -> [ntanibata] I will check and fix it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------------------- -ivi-shell: Fix wl_resource_create form application_surface_create - -> 'res' is wrong, you need to use 'resource' which is the object whose -> method you are executing. -> [ntanibata] I will fix it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Fix resource leak. - -I think there is a bug. -surface_destroy() needs to call wl_resource_destroy(resource). -wl_resource_destroy() will internally as the last thing call the -destructor function you set with wl_resource_set_implementation(), which -means that shell_destroy_shell_surface() will get called when you call -wl_resource_destroy(). - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Use error-code defined in ivi-application-protocol. -> > You also need to add the two error codes into ivi-application -> > interface and use those instead of WL_DISPLAY_ERROR_INVALID_OBJECT. -> [ntanibata] I will fix this according to two error codes. -> <enum name="error"> -> <entry name="role" value="0" summary="given wl_surface has -> another role"/> -> <entry name="ivi_id" value="1" summary="given ivi_id is assigned -> to another wl_surface"/> -> </enum> - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Throw error-code when ivi-surface already created in application_surface_create - -> [ntanibata] I will fix it. [ntanibata] This is the first clarification. -> This is required for, - If application_surface_create is called as -> duplicate - id_surface is duplicate To avoid ivi_surface creation with the same id_surface. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Fix destinations of error when resource error occurred. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Remove an unnecessary call of weston_config_parse() - -> Do not call weston_config_parse, but use weston_compositor::config instead. -> [ntanibata] I will fix it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Throw error-code when ivi-surface already created in application_surface_create - -> [ntanibata] I will fix it. [ntanibata] This is the first clarification. -> This is required for, - If application_surface_create is called as -> duplicate - id_surface is duplicate To avoid ivi_surface creation with the same id_surface. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Fix destinations of error when resource error occurred. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell, > wl_resource_post_error uses printf-format -arguments, and passing a -> non-constant string as the format string (here 'msg' argument) is -> considered -> a security hazard, which is why compilers warn about it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Register a ivi-surface destroy handler to weston-surface destroy signal. - -> Even if you wanted that, you still need a destroy listener to reset the -> pointer to NULL. Otherwise you will have a dangling pointer to a freed -> struct weston_surface, if the weston_surface (wl_surface) gets -> destroyed. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: clean-up Makefile.am FR3. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Remove redundant cast - -> if (weston_config_section_get_string( + section, "ivi-module", (char **)&dest->ivi_module, NULL ) != 0) -> Why the cast? - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c +ivi_shell_setting_create(struct ivi_shell_setting *dest, struct > > +weston_compositor *compositor) > > Too long line. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, You could get rid of one level of indenting - - wl_resource_post_error(resource, - IVI_APPLICATION_ERROR_ROLE, - "wl_surface is invalid"); - return; - } - - That's nice and clear: one can immediately read from each branch -what went wrong if execution ends up there. - - You could get rid of one level of indenting but moving the if -(!weston_surface) check to the top, since it ends in return. No need for -an else block then. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, assert() would likely be enough here. Removes one level of indenting too. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Remove unnecessary check for application_surface_create() - -> Didn't you already check for this condition above? Can it pass the -> earlier check and then fail here? How could this inconsistency happen? -> Or is this a paranoid check, that if we get here, there is an -> implementation bug somewhere server-side? If so, you should probably -> highlight it more, and at least make it distinguishable from the earlier check. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Fix memory leaks by shell_destroy_shell_surface() - -> I believe you are missing free(ivisurf) here. The lifetime of ivisurf is -> tied to the lifetime of the ivi_surface protocol object (wl_resource). - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell:ivi-shell.c add null check of ivisurf->surface - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell:ivi-shell.c remove unused method, is_surf_in_surfaces - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, remove surface_set_native_content. - -There are two use case to -- create ivi_surface without wl_surface to set property in advanced -- keep property per ID during deletion of ivi_surface. - -This is supported later. For the time being, remove this function. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, Fix surface destructor. - -> You cannot do this. The client is destroying the wl_surface, not the -> ivi_surface. Calling wl_resource_destroy() here creates a disagreement -> between the server and the client on what protocol objects exist. It -> inevitably leads to a protocol error if the client attempts to destroy -> the ivi_surface after the wl_surface. -> Instead, you need to detach all listeners etc. from the weston_surface -> here, and set ivisurf->surface = NULL. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: Fix invalid memory read/write. correct destruction methods - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -ivi-shell: ivi-shell, revert commit of - ------------------------------------------------------------------- -https://github.com/ntanibata/weston-ivi-shell/commit/f78b50f31f6ade37de2d00845ae70872707d9fd8 -Distruction method shall be reorganized. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, revert of fix of destruction to be re-organized. - -https://github.com/ntanibata/weston-ivi-shell/commit/0395a7ecc72ef4f4767c996473cccbbd121a34af - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, remove wl_resource_destroy - -> vi_shell_surface, - -> + surface_destroy_listener); + + if (ivisurf->resource) { + -> wl_resource_destroy(ivisurf->resource); - -You cannot do this. The client is destroying the wl_surface, not the -ivi_surface. Calling wl_resource_destroy() here creates a disagreement -between the server and the client on what protocol objects exist. It -inevitably leads to a protocol error if the client attempts to destroy -the ivi_surface after the wl_surface. - -Instead, you need to detach all listeners etc. from the weston_surface -here, and set ivisurf->surface = NULL. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, add comment FIXMEs to improve creation and -destruction process. - -When I compare this code with desktop-shell/shell.c, there are several -differences in process. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, move destruction process from -shell_destroy_shell_surface to shell_handle_surface_destroy. - -This follows the same way in desktop-shell. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, fix simple bug of assert - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell, remove unnecessary code. - -This removeing code for listener of ivi_layout_surface is already called -in ivi_layout.c. Additonally, ivisurf.ivi_layout_surface is already -cleaned up before this distroy destruction. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shekk, Remove a link from surface-list of shell. - -Forget to remove it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell.c: add comments about the destruction sequence - -Also move surface_destroy_listener together with the weston_surface -pointer it watches. - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, Set NULL to resource of ivisurface when shell_destroy_shell_surface called - -> /* FIXME: Need to set ivisurf->resource = NULL. */ - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, Remove unnecessary check for weston_surface of application_surface_create() - -> FIXME: This is not checked in desktop_shell, required to check? -> - Not required to check this, because libwayland-server will raise -> a protocol error automatically, if the passed in object is null -> but the protocol XML does not specify allow-null="true" for the argument. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, Add NULL check of ivisurf->resource - -> FIXME: shell_surf->resource might be NULL, -> if controller decides to reconfigure a surface after a client -> has destroyed it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c, Move down function call for wl_resource creation - -> FIXME: this shall be done below:TAG_1, if I use the same order of -> calling in create_common_surface -> FIXME: not required if move res to below:TAG_1 -> FIXME: Move below:TAG_1 - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------------- -ivi-shell: ivi-shell.c,Move ivi_layout_interface into struct ivi_shell - -> FIXME: move this static variable into struct ivi_shell. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> ---- - Makefile.am | 17 +- - ivi-shell/ivi-shell.c | 529 +++++++++++++++++++++++++++++++++++++++++++++++++ - ivi-shell/ivi-shell.h | 37 ++++ - 3 files changed, 582 insertions(+), 1 deletion(-) - create mode 100644 ivi-shell/ivi-shell.c - create mode 100644 ivi-shell/ivi-shell.h - -diff --git a/Makefile.am b/Makefile.am -index 812b4bd..b16cfaa 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -723,7 +723,8 @@ endif - if ENABLE_IVI_SHELL - - module_LTLIBRARIES += \ -- $(ivi_layout) -+ $(ivi_layout) \ -+ $(ivi_shell) - - ivi_layout = ivi-layout.la - ivi_layout_la_LDFLAGS = -module -avoid-version -@@ -737,6 +738,20 @@ ivi_layout_la_SOURCES = \ - - BUILT_SOURCES += $(nodist_ivi_layout_la_SOURCES) - -+ivi_shell = ivi-shell.la -+ivi_shell_la_LDFLAGS = -module -avoid-version -+ivi_shell_la_LIBADD = $(COMPOSITOR_LIBS) libshared.la -+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 -+nodist_ivi_shell_la_SOURCES = \ -+ protocol/ivi-application-protocol.c \ -+ protocol/ivi-application-server-protocol.h -+ -+BUILT_SOURCES += $(nodist_ivi_shell_la_SOURCES) -+ - endif - - -diff --git a/ivi-shell/ivi-shell.c b/ivi-shell/ivi-shell.c -new file mode 100644 -index 0000000..3904402 ---- /dev/null -+++ b/ivi-shell/ivi-shell.c -@@ -0,0 +1,529 @@ -+/* -+ * Copyright (C) 2013 DENSO CORPORATION -+ * -+ * 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. -+ */ -+ -+/* -+ * ivi-shell supports a type of shell for In-Vehicle Infotainment system. -+ * In-Vehicle Infotainment system traditionally manages surfaces with global -+ * identification. A protocol, ivi_application, supports such a feature -+ * by implementing a request, ivi_application::surface_creation defined in -+ * ivi_application.xml. -+ * -+ * The ivi-shell explicitly loads a module to add business logic like how to -+ * layout surfaces by using internal ivi-layout APIs. -+ */ -+#include "config.h" -+ -+#include <sys/wait.h> -+#include <unistd.h> -+#include <stdlib.h> -+#include <stdio.h> -+#include <string.h> -+#include <linux/input.h> -+#include <dlfcn.h> -+#include <limits.h> -+#include <assert.h> -+ -+#include "ivi-shell.h" -+#include "ivi-application-server-protocol.h" -+#include "ivi-layout-private.h" -+ -+#include "../shared/os-compatibility.h" -+ -+/* Representation of ivi_surface protocol object. */ -+struct ivi_shell_surface -+{ -+ struct wl_resource* resource; -+ struct ivi_shell *shell; -+ struct ivi_layout_surface *layout_surface; -+ -+ struct weston_surface *surface; -+ struct wl_listener surface_destroy_listener; -+ -+ uint32_t id_surface; -+ -+ int32_t width; -+ int32_t height; -+ -+ struct wl_list link; -+ -+ struct wl_listener configured_listener; -+}; -+ -+struct ivi_shell_setting -+{ -+ char *ivi_module; -+}; -+ -+/* FIXME: move this static variable into struct ivi_shell. -+ * FIXED: Moved -+ */ -+ -+/* -+ * Implementation of ivi_surface -+ */ -+ -+static void -+surface_configure_notify(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_surface *layout_surf = -+ (struct ivi_layout_surface *)data; -+ -+ struct ivi_shell_surface *shell_surf = -+ container_of(listener, -+ struct ivi_shell_surface, -+ configured_listener); -+ -+ int32_t dest_width = 0; -+ int32_t dest_height = 0; -+ shell_surf->shell->ivi_layout->get_surface_dimension(layout_surf, -+ &dest_width, &dest_height); -+ -+ /* FIXME: shell_surf->resource might be NULL, -+ * if controller decides to reconfigure a surface after a client -+ * has destroyed it. -+ * FIXED: Add NULL Check -+ */ -+ if (shell_surf->resource) -+ ivi_surface_send_configure(shell_surf->resource, -+ dest_width, dest_height); -+} -+ -+static void -+ivi_shell_surface_configure(struct weston_surface *, int32_t, int32_t); -+ -+static struct ivi_shell_surface * -+get_ivi_shell_surface(struct weston_surface *surface) -+{ -+ if (surface->configure == ivi_shell_surface_configure) -+ return surface->configure_private; -+ -+ return NULL; -+} -+ -+static void -+ivi_shell_surface_configure(struct weston_surface *surface, -+ int32_t sx, int32_t sy) -+{ -+ struct ivi_shell_surface *ivisurf = get_ivi_shell_surface(surface); -+ struct weston_view *view; -+ float from_x; -+ float from_y; -+ float to_x; -+ float to_y; -+ -+ if (surface->width == 0 || surface->height == 0 || ivisurf == NULL) -+ return; -+ -+ view = ivisurf->shell->ivi_layout->get_weston_view(ivisurf->layout_surface); -+ if (view == NULL) -+ return; -+ -+ if (ivisurf->width != surface->width || -+ ivisurf->height != surface->height) { -+ ivisurf->width = surface->width; -+ ivisurf->height = surface->height; -+ -+ weston_view_to_global_float(view, 0, 0, &from_x, &from_y); -+ weston_view_to_global_float(view, sx, sy, &to_x, &to_y); -+ -+ weston_view_set_position(view, -+ view->geometry.x + to_x - from_x, -+ view->geometry.y + to_y - from_y); -+ weston_view_update_transform(view); -+ -+ ivisurf->shell->ivi_layout->surface_configure(ivisurf->layout_surface, -+ surface->width, surface->height); -+ } -+} -+ -+/* -+ * The ivi_surface wl_resource destructor. -+ * -+ * Gets called via ivi_surface.destroy request or automatic wl_client clean-up. -+ */ -+static void -+shell_destroy_shell_surface(struct wl_resource *resource) -+{ -+/* FIXME: When I compare destruction logic of desktop-shell, -+ this part shall be done in shell_handle_surface_destroy, not here? -+FIXED: moved. -+*/ -+ /* FIXME: Need to set ivisurf->resource = NULL. -+ * FIXED: ivisurf->resource = NULL -+ */ -+ struct ivi_shell_surface *ivisurf = wl_resource_get_user_data(resource); -+ ivisurf->resource = NULL; -+} -+ -+/* Gets called through the weston_surface destroy signal. */ -+static void -+shell_handle_surface_destroy(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell_surface *ivisurf = -+ container_of(listener, struct ivi_shell_surface, -+ surface_destroy_listener); -+ -+ assert(ivisurf != NULL); -+ -+ /* FIXME: When I see desktop-shell, the following part is divided as -+ subfuction, destroy_shell_surface. -+ * - Looking at shell.c, looks like destroy_shell_surface() would -+ * not need to be a separate function. It could be done in -+ * shell_handle_surface_destroy() too. -+ */ -+ if (ivisurf->surface!=NULL) { -+ ivisurf->surface->configure = NULL; -+ ivisurf->surface->configure_private = NULL; -+ ivisurf->surface = NULL; -+ } -+ -+ wl_list_remove(&ivisurf->surface_destroy_listener.link); -+ wl_list_remove(&ivisurf->link); -+ ivisurf->resource = NULL; -+ free(ivisurf); -+ -+} -+ -+/* Gets called, when a client sends ivi_surface.destroy request. */ -+static void -+surface_destroy(struct wl_client *client, struct wl_resource *resource) -+{ -+ /* -+ * Fires the wl_resource destroy signal, and then calls -+ * ivi_surface wl_resource destructor: shell_destroy_shell_surface() -+ */ -+ wl_resource_destroy(resource); -+} -+ -+static const struct ivi_surface_interface surface_implementation = { -+ surface_destroy, -+}; -+ -+/** -+ * Request handler for ivi_application.surface_create. -+ * -+ * Creates an ivi_surface protocol object associated with the given wl_surface. -+ * ivi_surface protocol object is represented by struct ivi_shell_surface. -+ * -+ * \param client The client. -+ * \param resource The ivi_application protocol object. -+ * \param id_surface The IVI surface ID. -+ * \param surface_resource The wl_surface protocol object. -+ * \param id The protocol object id for the new ivi_surface protocol object. -+ * -+ * The wl_surface is given the ivi_surface role and associated with a unique -+ * IVI ID which is used to identify the surface in a controller -+ * (window manager). -+ */ -+static void -+application_surface_create(struct wl_client *client, -+ struct wl_resource *resource, -+ uint32_t id_surface, -+ struct wl_resource *surface_resource, -+ uint32_t id) -+{ -+ struct ivi_shell *shell = wl_resource_get_user_data(resource); -+ struct ivi_shell_surface *ivisurf; -+ struct ivi_layout_surface *layout_surface; -+ struct weston_surface *weston_surface = -+ wl_resource_get_user_data(surface_resource); -+ struct wl_resource *res; -+ -+ -+ /* FIXME: This is not checked in desktop_shell, required to check? -+ * - Not required to check this, because libwayland-server will raise -+ * a protocol error automatically, if the passed in object is null -+ * but the protocol XML does not specify allow-null="true" for the -+ * argument. -+ * FIXED: Delete NULL check -+ */ -+ -+ /* FIXME: This is the similar check with -+ desktop-shell::get_shell_surface -+ * - Yes. To be changed into a weston_surface_set_role() call, -+ * rebasing on top of upstream master branch. -+ */ -+ /* check if a wl_surface already has another role*/ -+ if (weston_surface->configure) { -+ wl_resource_post_error(resource, -+ IVI_APPLICATION_ERROR_ROLE, -+ "surface->configure already " -+ "set"); -+ return; -+ } -+ -+ -+ /* FIXME: from here, it is the similar functionality -+ with desktop-shell::create_common_surface */ -+ layout_surface = shell->ivi_layout->surface_create(weston_surface, -+ id_surface); -+ -+ /* check if id_ivi is already used for wl_surface*/ -+ if (layout_surface == NULL){ -+ wl_resource_post_error(resource, -+ IVI_APPLICATION_ERROR_IVI_ID, -+ "surface_id is already assigned " -+ "by another app"); -+ return; -+ } -+ -+ /* FIXME: this shall be done below:TAG_1, if I use the same order of calling in -+ create_common_surface -+ * FIXED: Moved -+ */ -+ -+ ivisurf = zalloc(sizeof *ivisurf); -+ if (ivisurf == NULL) { -+ wl_resource_post_no_memory(resource); -+ /*FIXME: not required if move res to below:TAG_1 -+ *FIXED: Delete -+ */ -+ return; -+ } -+ -+ wl_list_init(&ivisurf->link); -+ wl_list_insert(&shell->ivi_surface_list, &ivisurf->link); -+ -+ ivisurf->shell = shell; -+ ivisurf->id_surface = id_surface; -+ -+ /*FIXME: Move below:TAG_1 -+ *FIXED: Moved -+ */ -+ ivisurf->width = 0; -+ ivisurf->height = 0; -+ ivisurf->layout_surface = layout_surface; -+ ivisurf->configured_listener.notify = surface_configure_notify; -+ ivisurf->shell->ivi_layout->add_surface_configured_listener(layout_surface, -+ &ivisurf->configured_listener); -+ -+ /*FIXME: when I compare this logic with desktop shell: create_common_surface -+ -+shsurf->resource_destroy_listener.notify = handle_resource_destroy; -+wl_resource_add_destroy_listener(surface->resource, -+&shsurf->resource_destroy_listener); -+ -+ to be add the above lisnter?? -+ * - That is linking to the wl_resource destroy signal, this below -+ * here is linking to the weston_surface destroy signal. They have -+ * a different purpose, and you need to choose which suits the -+ * semantics you want, or if might need both. So, figure out what -+ * semantics you want first. -+ */ -+ -+ ivisurf->surface_destroy_listener.notify = shell_handle_surface_destroy; -+ wl_signal_add(&weston_surface->destroy_signal, -+ &ivisurf->surface_destroy_listener); -+ -+ ivisurf->surface = weston_surface; -+ -+ weston_surface->configure = ivi_shell_surface_configure; -+ weston_surface->configure_private = ivisurf; -+ -+ /* FIXME: End of desktop-shell::create_common_surface */ -+ /* FIXME: TAG_1 */ -+ res = wl_resource_create(client, &ivi_surface_interface, 1, id); -+ if (res == NULL) { -+ wl_client_post_no_memory(client); -+ return; -+ } -+ -+ ivisurf->resource = res; -+ -+ wl_resource_set_implementation(res, &surface_implementation, -+ ivisurf, shell_destroy_shell_surface); -+} -+ -+static const struct ivi_application_interface application_implementation = { -+ application_surface_create -+}; -+ -+/* -+ * Handle wl_registry.bind of ivi_application global singleton. -+ */ -+static void -+bind_ivi_application(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, &ivi_application_interface, -+ 1, id); -+ -+ wl_resource_set_implementation(resource, -+ &application_implementation, -+ shell, NULL); -+} -+ -+/* -+ * Called through the compositor's destroy signal. -+ */ -+static void -+shell_destroy(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell *shell = -+ container_of(listener, struct ivi_shell, destroy_listener); -+ struct ivi_shell_surface *ivisurf, *next; -+ -+ wl_list_for_each_safe(ivisurf, next, &shell->ivi_surface_list, link) { -+ wl_list_remove(&ivisurf->link); -+ free(ivisurf); -+ } -+ -+ free(shell); -+} -+ -+static void -+init_ivi_shell(struct weston_compositor *compositor, struct ivi_shell *shell) -+{ -+ shell->compositor = compositor; -+ -+ wl_list_init(&shell->ivi_surface_list); -+ -+} -+ -+static int -+ivi_shell_setting_create(struct ivi_shell_setting *dest, -+ struct weston_compositor *compositor) -+{ -+ int result = 0; -+ struct weston_config *config = compositor->config; -+ struct weston_config_section *section; -+ -+ if (NULL == dest) -+ return -1; -+ -+ section = weston_config_get_section(config, "ivi-shell", NULL, NULL); -+ -+ if (weston_config_section_get_string( -+ section, "ivi-module", &dest->ivi_module, NULL) != 0) -+ { -+ result = -1; -+ } -+ -+ return result; -+} -+ -+/* -+ * Initialization of ivi-shell. -+ */ -+static int -+ivi_load_modules(struct weston_compositor *compositor, const char *modules, -+ int *argc, char *argv[]) -+{ -+ const char *p, *end; -+ char buffer[256]; -+ int (*module_init)(struct weston_compositor *compositor, -+ int *argc, char *argv[]); -+ -+ if (modules == NULL) -+ return 0; -+ -+ p = modules; -+ while (*p) { -+ end = strchrnul(p, ','); -+ snprintf(buffer, sizeof buffer, "%.*s", (int)(end - p), p); -+ -+ module_init = weston_load_module(buffer, "module_init"); -+ if (module_init) -+ module_init(compositor, argc, argv); -+ -+ p = end; -+ while (*p == ',') -+ p++; -+ } -+ -+ return 0; -+} -+ -+WL_EXPORT int -+module_init(struct weston_compositor *compositor, -+ int *argc, char *argv[]) -+{ -+ struct ivi_shell *shell; -+ char ivi_layout_path[PATH_MAX]; -+ void *module; -+ struct ivi_shell_setting setting = { }; -+ -+ shell = zalloc(sizeof *shell); -+ if (shell == NULL) -+ return -1; -+ -+ init_ivi_shell(compositor, shell); -+ -+ shell->destroy_listener.notify = shell_destroy; -+ wl_signal_add(&compositor->destroy_signal, &shell->destroy_listener); -+ -+ -+ if (wl_global_create(compositor->wl_display, -+ &ivi_application_interface, 1, -+ shell, bind_ivi_application) == NULL) -+ return -1; -+ -+ if (ivi_shell_setting_create(&setting, compositor) != 0) -+ return -1; -+ -+ /* -+ * load module:ivi-layout -+ * ivi_layout_interface is referred by ivi-shell to use ivi-layout. -+ * The reason why the following code is written newly without -+ * using weston_load_module is it doesn't open library with -+ * RTLD_GLOBAL option. -+ */ -+ snprintf(ivi_layout_path, sizeof ivi_layout_path, -+ "%s/%s", MODULEDIR, "ivi-layout.so"); -+ module = dlopen(ivi_layout_path, RTLD_NOW | RTLD_NOLOAD); -+ if (module) { -+ weston_log("ivi-shell: Module '%s' already loaded\n", -+ ivi_layout_path); -+ dlclose(module); -+ return -1; -+ } -+ -+ weston_log("ivi-shell: Loading module '%s'\n", ivi_layout_path); -+ module = dlopen(ivi_layout_path, RTLD_NOW | RTLD_GLOBAL); -+ if (!module) { -+ weston_log("ivi-shell: Failed to load module: %s\n", dlerror()); -+ return -1; -+ } -+ -+ shell->ivi_layout = dlsym(module,"ivi_layout_interface"); -+ if (!shell->ivi_layout){ -+ weston_log("ivi-shell: couldn't find ivi_layout_interface in '%s'\n", ivi_layout_path); -+ free(setting.ivi_module); -+ dlclose(module); -+ return -1; -+ } -+ -+ shell->ivi_layout->init_with_compositor(compositor); -+ -+ /* Call module_init of ivi-modules which are defined in weston.ini */ -+ if (ivi_load_modules(compositor, setting.ivi_module, argc, argv) < 0) { -+ free(setting.ivi_module); -+ dlclose(module); -+ return -1; -+ } -+ -+ free(setting.ivi_module); -+ return 0; -+} -diff --git a/ivi-shell/ivi-shell.h b/ivi-shell/ivi-shell.h -new file mode 100644 -index 0000000..1283a00 ---- /dev/null -+++ b/ivi-shell/ivi-shell.h -@@ -0,0 +1,37 @@ -+/* -+ * Copyright (C) 2013 DENSO CORPORATION -+ * -+ * 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 <stdbool.h> -+ -+#include "compositor.h" -+ -+struct ivi_shell -+{ -+ struct wl_resource *resource; -+ struct wl_listener destroy_listener; -+ -+ struct weston_compositor *compositor; -+ -+ struct wl_list ivi_surface_list; /* struct ivi_shell_surface::link */ -+ -+ struct ivi_layout_interface *ivi_layout; -+}; --- -1.7.9.5 - |