Provide AGL extension, wl_shell support for Wayland-IVI-Extension. 21/4121/1
authorNobuhiko Tanibata <NOBUHIKO_TANIBATA@denso.co.jp>
Wed, 7 Oct 2015 08:57:19 +0000 (17:57 +0900)
committerNobuhiko Tanibata <ntanibata@jp.adit-jv.com>
Thu, 8 Oct 2015 02:12:27 +0000 (11:12 +0900)
This components is merged in meta-agl/meta-ivi-common. Additionally, AGL
demo, Home screen, requires, wh_shell support as well. This patch enable
wl_shell_emulator to support wl_shell. This patch also provide README
how to enable this feature in weston.ini and try it out. In details,
please visit AGL wiki,

https://wiki.automotivelinux.org/agl-distro/demo-apps/home-screen

Change-Id: Ieff9ed030eedbdeab285c5e75e2f6dddb765352a
Signed-off-by: Nobuhiko Tanibata <ntanibata@jp.adit-jv.com>
recipes-graphics/wayland/wayland-ivi-extension/0001-wayland-ivi-extension-patch-for-wl-shell-emulator.patch [new file with mode: 0644]
recipes-graphics/wayland/wayland-ivi-extension_1.5.0.bbappend [new file with mode: 0644]

diff --git a/recipes-graphics/wayland/wayland-ivi-extension/0001-wayland-ivi-extension-patch-for-wl-shell-emulator.patch b/recipes-graphics/wayland/wayland-ivi-extension/0001-wayland-ivi-extension-patch-for-wl-shell-emulator.patch
new file mode 100644 (file)
index 0000000..cfcd1e4
--- /dev/null
@@ -0,0 +1,576 @@
+---
+ CMakeLists.txt                                     |   1 +
+ .../EGLWLMockNavigation/src/OpenGLES2App.cpp       |   7 +-
+ weston-ivi-shell/src/ivi-controller-interface.h    |  19 +
+ wl-shell-emulator/CMakeLists.txt                   |  69 ++++
+ wl-shell-emulator/README                           |  21 ++
+ wl-shell-emulator/src/wl-shell-emulator.c          | 394 +++++++++++++++++++++
+ 6 files changed, 509 insertions(+), 2 deletions(-)
+ create mode 100644 wl-shell-emulator/CMakeLists.txt
+ create mode 100644 wl-shell-emulator/README
+ create mode 100644 wl-shell-emulator/src/wl-shell-emulator.c
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index a75390f..3610fa9 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -42,6 +42,7 @@ if(WITH_ILM_INPUT)
+     add_subdirectory(ivi-input-controller)
+ endif()
+
++add_subdirectory(wl-shell-emulator)
+
+ #=============================================================================================
+ # generate all documents
+diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/src/OpenGLES2App.cpp b/ivi-layermanagement-examples/EGLWLMockNavigation/src/OpenGLES2App.cpp
+index 2e65864..8b7e0d1 100644
+--- a/ivi-layermanagement-examples/EGLWLMockNavigation/src/OpenGLES2App.cpp
++++ b/ivi-layermanagement-examples/EGLWLMockNavigation/src/OpenGLES2App.cpp
+@@ -126,8 +126,11 @@ OpenGLES2App::OpenGLES2App(float fps, float animationSpeed, SurfaceConfiguration
+     createWLContext(config);
+     createEGLContext();
+
+-    ilmClient_init((t_ilm_nativedisplay)m_wlContextStruct.wlDisplay);
+-    setupLayerMangement(config);
++    if (m_wlContextStruct.wlShell == NULL)
++    {
++        ilmClient_init((t_ilm_nativedisplay)m_wlContextStruct.wlDisplay);
++        setupLayerMangement(config);
++    }
+
+     if (config->nosky)
+     {
+diff --git a/weston-ivi-shell/src/ivi-controller-interface.h b/weston-ivi-shell/src/ivi-controller-interface.h
+index cdafcc9..fd18009 100644
+--- a/weston-ivi-shell/src/ivi-controller-interface.h
++++ b/weston-ivi-shell/src/ivi-controller-interface.h
+@@ -66,6 +66,25 @@ struct ivi_controller_interface {
+       int32_t (*commit_changes)(void);
+
+       /**
++      * \brief Creates an ivi_layout_surface.
++      *
++      * \return IVI_SUCCEEDED if the method call was successful
++      * \return IVI_FAILED if the method call was failed
++      */
++      struct ivi_layout_surface* (*surface_create)(
++                              struct weston_surface *wl_surface,
++                              uint32_t id_surface);
++
++      /**
++       * \brief Configure an ivi_layout_surface
++       *
++       * \return IVI_SUCCEEDED if the method call was successful
++       * \return IVI_FAILED if the method call was failed
++       */
++      void (*surface_configure)(struct ivi_layout_surface *ivisurf,
++                                int32_t width, int32_t height);
++
++      /**
+        * surface controller interface
+        */
+
+diff --git a/wl-shell-emulator/CMakeLists.txt b/wl-shell-emulator/CMakeLists.txt
+new file mode 100644
+index 0000000..2678098
+--- /dev/null
++++ b/wl-shell-emulator/CMakeLists.txt
+@@ -0,0 +1,69 @@
++############################################################################
++#
++# Copyright (C) 2015 Advanced Driver Information Technology Joint Venture GmbH
++#
++#
++# Licensed under the Apache License, Version 2.0 (the "License");
++# you may not use this file except in compliance with the License.
++# You may obtain a copy of the License at
++#
++#       http://www.apache.org/licenses/LICENSE-2.0
++#
++# Unless required by applicable law or agreed to in writing, software
++# distributed under the License is distributed on an "AS IS" BASIS,
++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++# See the License for the specific language governing permissions and
++# limitations under the License.
++#
++############################################################################
++
++cmake_minimum_required (VERSION 2.6)
++
++project(wl-shell-emulator)
++
++find_package(PkgConfig REQUIRED)
++pkg_check_modules(WAYLAND_SERVER wayland-server REQUIRED)
++pkg_check_modules(WESTON weston REQUIRED)
++
++GET_TARGET_PROPERTY(IVI_EXTENSION_INCLUDE_DIRS ivi-extension-protocol INCLUDE_DIRECTORIES)
++GET_TARGET_PROPERTY(IVI_CONTROLLER_INCLUDE_DIRS ivi-controller INCLUDE_DIRECTORIES)
++
++include_directories(
++    include
++    ${IVI_EXTENSION_INCLUDE_DIRS}
++    ${IVI_CONTROLLER_INCLUDE_DIRS}
++    ${WAYLAND_SERVER_INCLUDE_DIRS}
++    ${WESTON_INCLUDE_DIRS}
++    ${WESTON_INCLUDE_DIRS}/weston
++)
++
++link_directories(
++    ${WAYLAND_SERVER_LIBRARY_DIRS}
++)
++
++
++add_library(${PROJECT_NAME} MODULE
++    src/wl-shell-emulator.c
++)
++
++set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "")
++
++add_dependencies(${PROJECT_NAME}
++    ivi-extension-protocol
++    ${WAYLAND_SERVER_LIBRARIES}
++)
++
++set(LIBS
++    ${LIBS}
++    ivi-extension-protocol
++    ${WAYLAND_SERVER_LIBRARIES}
++)
++
++set(CMAKE_C_LDFLAGS "-module -avoid-version")
++
++target_link_libraries(${PROJECT_NAME} ${LIBS})
++
++install (
++    TARGETS             ${PROJECT_NAME}
++    LIBRARY DESTINATION lib/weston
++)
+diff --git a/wl-shell-emulator/README b/wl-shell-emulator/README
+new file mode 100644
+index 0000000..6eebc04
+--- /dev/null
++++ b/wl-shell-emulator/README
+@@ -0,0 +1,21 @@
++This directory contains the wl-shell-emulator module.
++To use this, add it to the "ivi-module" entry in your weston.ini.
++Multiple modules may be specified in the same entry by separating
++the modules with commas.
++Additionally, the basement of surface-id is indentified by weston.ini
++at "surface-id-for-wl-shell" entry. wl-shell-emulator will increment
++surface-id per wl-shell-surface creation.
++
++- Sample of weston.ini
++[core]
++shell=ivi-shell.so
++
++[ivi-shell]
++ivi-module=ivi-controller.so,wl-shell-emulator.so
++surface-id-for-wl-shell-app=0x30000000
++
++- How to
++ivi-layermanagement-examples/layer-add-surfaces is easy
++for you to try wl-shell-emulator. When you invoke wl_shell
++application. layer-add-surfaces can add the ivi-surface to a layer
++and set visibility for it.
+diff --git a/wl-shell-emulator/src/wl-shell-emulator.c b/wl-shell-emulator/src/wl-shell-emulator.c
+new file mode 100644
+index 0000000..274b192
+--- /dev/null
++++ b/wl-shell-emulator/src/wl-shell-emulator.c
+@@ -0,0 +1,394 @@
++ /*
++ * Copyright (C) 2015 Advanced Driver Information Technology Joint Venture GmbH
++ *
++ * 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 <stdlib.h>
++#include <string.h>
++#include <assert.h>
++
++#include <weston/compositor.h>
++
++#include "ivi-layout-export.h"
++#include "ivi-controller-interface.h"
++
++#ifndef container_of
++#define container_of(ptr, type, member) ({                              \
++        const __typeof__( ((type *)0)->member ) *__mptr = (ptr);        \
++        (type *)( (char *)__mptr - offsetof(type,member) );})
++#endif
++
++#define DEFAULT_SURFACE_ID_FOR_WL_SHELL_APP 0x80000000
++
++struct emulator_surface {
++    struct wl_resource* resource;
++    struct emulator_context *context;
++    struct ivi_layout_surface *layout_surface;
++
++    struct weston_surface *surface;
++    struct wl_listener surface_destroy_listener;
++
++    uint32_t id_surface;
++    int32_t last_width;
++    int32_t last_height;
++
++    struct wl_list link;
++};
++
++struct emulator_controller {
++    struct wl_list link;
++    struct wl_resource *resource;
++    struct wl_client *client;
++    uint32_t id;
++    struct emulator_context *emulator_context;
++};
++
++struct emulator_context {
++    struct wl_list controller_list;
++    struct wl_list surface_list;
++    struct weston_compositor *compositor;
++    const struct ivi_controller_interface *ivi_controller_interface;
++
++    uint32_t id_surface_base;
++};
++
++static void
++emulator_surface_pong(struct wl_client *client,
++           struct wl_resource *resource, uint32_t serial)
++{
++
++}
++
++static void
++emulator_surface_move(struct wl_client *client, struct wl_resource *resource,
++           struct wl_resource *seat_resource, uint32_t serial)
++{
++/*Use ivi_controller_interface to implement*/
++}
++
++static void
++emulator_surface_resize(struct wl_client *client, struct wl_resource *resource,
++           struct wl_resource *seat_resource, uint32_t serial,
++           uint32_t edges)
++{
++/*Use ivi_controller_interface to implement*/
++}
++
++static void
++emulator_surface_set_toplevel(struct wl_client *client,
++           struct wl_resource *resource)
++{
++/*Use ivi_controller_interface to implement*/
++}
++
++static void
++emulator_surface_set_transient(struct wl_client *client,
++        struct wl_resource *resource,
++        struct wl_resource *parent_resource,
++        int x, int y, uint32_t flags)
++{
++/*Use ivi_controller_interface to implement*/
++}
++
++static void
++emulator_surface_set_fullscreen(struct wl_client *client,
++           struct wl_resource *resource,
++           uint32_t method,
++           uint32_t framerate,
++           struct wl_resource *output_resource)
++{
++/*Use ivi_controller_interface to implement*/
++}
++
++static void
++emulator_surface_set_popup(struct wl_client *client,
++        struct wl_resource *resource,
++        struct wl_resource *seat_resource,
++        uint32_t serial,
++        struct wl_resource *parent_resource,
++        int32_t x, int32_t y, uint32_t flags)
++{
++
++}
++
++static void
++emulator_surface_set_maximized(struct wl_client *client,
++        struct wl_resource *resource,
++        struct wl_resource *output_resource)
++{
++
++}
++
++static void
++emulator_surface_set_title(struct wl_client *client,
++        struct wl_resource *resource, const char *title)
++{
++
++}
++
++static void
++emulator_surface_set_class(struct wl_client *client,
++        struct wl_resource *resource, const char *class)
++{
++
++}
++
++static const struct wl_shell_surface_interface shell_surface_implementation = {
++        emulator_surface_pong,
++        emulator_surface_move,
++        emulator_surface_resize,
++        emulator_surface_set_toplevel,
++        emulator_surface_set_transient,
++        emulator_surface_set_fullscreen,
++        emulator_surface_set_popup,
++        emulator_surface_set_maximized,
++        emulator_surface_set_title,
++        emulator_surface_set_class
++};
++
++/* Gets called through the weston_surface destroy signal. */
++static void
++emulator_handle_surface_destroy(struct wl_listener *listener, void *data)
++{
++    struct emulator_surface *emulator_surface =
++            container_of(listener, struct emulator_surface,
++                surface_destroy_listener);
++
++    assert(emulator_surface != NULL);
++
++    if (emulator_surface->surface!=NULL) {
++        emulator_surface->surface->configure = NULL;
++        emulator_surface->surface->configure_private = NULL;
++        emulator_surface->surface = NULL;
++    }
++
++    wl_list_remove(&emulator_surface->surface_destroy_listener.link);
++    wl_list_remove(&emulator_surface->link);
++
++    if (emulator_surface->resource != NULL) {
++        wl_resource_set_user_data(emulator_surface->resource, NULL);
++        emulator_surface->resource = NULL;
++    }
++    free(emulator_surface);
++}
++
++static void
++emulator_surface_configure(struct weston_surface *surface,
++                           int32_t sx, int32_t sy)
++{
++    struct emulator_surface *surf = surface->configure_private;
++    struct emulator_context *ctx;
++
++    if ((surf == NULL) ||
++        (surf->layout_surface == NULL)) {
++        return;
++    }
++
++    if ((surf->last_width != surface->width) ||
++        (surf->last_height != surface->height)) {
++
++        surf->last_width = surface->width;
++        surf->last_height = surface->height;
++
++        ctx = surf->context;
++        ctx->ivi_controller_interface->surface_configure(surf->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)
++{
++    struct emulator_surface *surf = wl_resource_get_user_data(resource);
++    if (surf != NULL) {
++        surf->resource = NULL;
++    }
++}
++
++static void
++emulator_get_shell_surface(struct wl_client *client, struct wl_resource *resource,
++                           uint32_t id, struct wl_resource *surface_resource)
++{
++    struct emulator_controller *controller = wl_resource_get_user_data(resource);
++    struct emulator_context * context = controller->emulator_context;
++    struct emulator_surface *emulator_surface;
++    struct weston_surface *surface;
++    struct ivi_layout_surface *layout_surface;
++    struct wl_resource *res;
++    const struct ivi_controller_interface *interface =
++                            context->ivi_controller_interface;
++
++    surface = wl_resource_get_user_data(surface_resource);
++
++    layout_surface = interface->surface_create(surface, context->id_surface_base);
++
++    if (!layout_surface) {
++        wl_resource_post_no_memory(surface_resource);
++        return;
++    }
++
++    emulator_surface = zalloc(sizeof *emulator_surface);
++    if (emulator_surface == NULL) {
++        wl_resource_post_no_memory(resource);
++        return;
++    }
++
++    emulator_surface->layout_surface = layout_surface;
++    emulator_surface->id_surface = context->id_surface_base;
++    emulator_surface->last_width = 0;
++    emulator_surface->last_height = 0;
++
++    wl_list_init(&emulator_surface->link);
++    wl_list_insert(&context->surface_list, &emulator_surface->link);
++
++    emulator_surface->context = context;
++    ++(context->id_surface_base);
++
++    /** The following code relies on wl_surface destruction triggering
++    * immediateweston_surface destruction
++    */
++    emulator_surface->surface_destroy_listener.notify = emulator_handle_surface_destroy;
++    wl_signal_add(&surface->destroy_signal,
++                  &emulator_surface->surface_destroy_listener);
++
++    emulator_surface->surface = surface;
++    surface->configure = emulator_surface_configure;
++    surface->configure_private = emulator_surface;
++
++    res = wl_resource_create(client, &wl_shell_surface_interface, 1, id);
++    if (res == NULL) {
++        wl_client_post_no_memory(client);
++        return;
++    }
++
++    emulator_surface->resource = res;
++
++    wl_resource_set_implementation(res, &shell_surface_implementation,
++                                  emulator_surface, shell_destroy_shell_surface);
++}
++static const struct wl_shell_interface shell_implementation = {
++    emulator_get_shell_surface
++};
++
++static void
++unbind_resource_controller(struct wl_resource *resource)
++{
++    struct emulator_controller *controller = wl_resource_get_user_data(resource);
++
++    wl_list_remove(&controller->link);
++
++    free(controller);
++}
++
++static void
++bind_shell_implementation(struct wl_client *client, void *data,
++               uint32_t version, uint32_t id)
++{
++    struct emulator_context *ctx = data;
++    struct emulator_controller *controller;
++    controller = calloc(1, sizeof *controller);
++    if (controller == NULL) {
++        weston_log("%s: Failed to allocate memory for controller\n",
++                   __FUNCTION__);
++        return;
++    }
++
++    controller->emulator_context = ctx;
++    controller->resource =
++        wl_resource_create(client, &wl_shell_interface, 1, id);
++    wl_resource_set_implementation(controller->resource, &shell_implementation,
++                                   controller, unbind_resource_controller);
++
++    controller->client = client;
++    controller->id = id;
++
++    wl_list_insert(&ctx->controller_list, &controller->link);
++}
++
++static struct emulator_context *
++create_emulator_context(struct weston_compositor *ec,
++                     const struct ivi_controller_interface *interface)
++{
++    struct emulator_context *ctx = NULL;
++    ctx = calloc(1, sizeof *ctx);
++    if (ctx == NULL) {
++        weston_log("%s: Failed to allocate memory for input context\n",
++                   __FUNCTION__);
++        return NULL;
++    }
++
++    memset(ctx, 0, sizeof *ctx);
++
++    ctx->compositor = ec;
++    ctx->ivi_controller_interface = interface;
++    wl_list_init(&ctx->controller_list);
++    wl_list_init(&ctx->surface_list);
++
++    return ctx;
++}
++
++static int
++setup_emulator_config(struct emulator_context *ctx, int *argc, char *argv[])
++{
++    struct weston_config_section *section;
++
++    section = weston_config_get_section(ctx->compositor->config, "ivi-shell",
++                                        NULL, NULL);
++
++    if (section) {
++        weston_config_section_get_uint(section, "surface-id-for-wl-shell-app",
++                                       &ctx->id_surface_base,
++                                       DEFAULT_SURFACE_ID_FOR_WL_SHELL_APP);
++
++        weston_log("Based surface ID for wl_shell application: %u (0x%x)\n",
++                   ctx->id_surface_base, ctx->id_surface_base);
++    }
++
++    return 0;
++}
++
++WL_EXPORT int
++controller_module_init(struct weston_compositor *ec, int* argc, char *argv[],
++                       const struct ivi_controller_interface *interface,
++                       size_t interface_version)
++{
++    struct emulator_context *ctx = create_emulator_context(ec, interface);
++    if (ctx == NULL) {
++        weston_log("%s: Failed to create input context\n", __FUNCTION__);
++        return -1;
++    }
++
++    if (setup_emulator_config(ctx, argc, argv)) {
++        return -1;
++    }
++
++    if (wl_global_create(ec->wl_display, &wl_shell_interface, 1,
++                         ctx, bind_shell_implementation) == NULL) {
++        return -1;
++    }
++    weston_log("wl-shell-emulator module loaded successfully!\n");
++    return 0;
++}
+--
+1.8.3.1
diff --git a/recipes-graphics/wayland/wayland-ivi-extension_1.5.0.bbappend b/recipes-graphics/wayland/wayland-ivi-extension_1.5.0.bbappend
new file mode 100644 (file)
index 0000000..f30bf7f
--- /dev/null
@@ -0,0 +1,5 @@
+FILESEXTRAPATHS_append := ":${THISDIR}/${PN}"
+
+SRC_URI_append = "\
+    file://0001-wayland-ivi-extension-patch-for-wl-shell-emulator.patch \
+    "