Upgrade to Wayland/Weston 1.9.0 23/5423/2
authorManuel Bachmann <mbc@iot.bzh>
Mon, 14 Mar 2016 09:03:31 +0000 (09:03 +0000)
committerGerrit Code Review <gerrit@172.30.200.200>
Mon, 14 Mar 2016 14:48:56 +0000 (14:48 +0000)
Yocto 2.0 ("Jethro") provides Wayland and Weston 1.8.0;
manually upgrading to 1.9.0 does not break compatibility
with existing frameworks (Qt..), while at the same time
allowing easier integration of mandatory components such
as Weston IVI-Shell and Wayland IVI Extension.

We can thus in the same pass remove backport patches for
these 2 components.

Here is the related discussion on the mailing list :

http://lists.linuxfoundation.org/pipermail/
automotive-discussions/2016-March/001623.html

Change-Id: I874eac50ff64d8b93e32910b6f1297002faa06a5
Signed-off-by: Manuel Bachmann <mbc@iot.bzh>
12 files changed:
meta-agl/recipes-graphics/wayland/wayland_1.9.0.bb [new file with mode: 0644]
meta-agl/recipes-graphics/wayland/weston/0001-make-error-portable.patch [new file with mode: 0644]
meta-agl/recipes-graphics/wayland/weston/make-lcms-explicitly-configurable.patch [new file with mode: 0644]
meta-agl/recipes-graphics/wayland/weston/make-libwebp-explicitly-configurable.patch [new file with mode: 0644]
meta-agl/recipes-graphics/wayland/weston/weston.desktop [new file with mode: 0644]
meta-agl/recipes-graphics/wayland/weston/weston.png [new file with mode: 0644]
meta-agl/recipes-graphics/wayland/weston_1.9.0.bb [new file with mode: 0644]
meta-ivi-common/recipes-graphics/wayland/wayland-ivi-extension/apply_weston-1.5.x.patch [deleted file]
meta-ivi-common/recipes-graphics/wayland/wayland-ivi-extension_1.5.0.bb
meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.8.0.patch [deleted file]
meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-use-primary-screen-for-resolution.patch [moved from meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0002-IVI-Shell-use-primary-screen-for-resolution.patch with 100% similarity]
meta-ivi-common/recipes-graphics/wayland/weston_1.9.0.bbappend [moved from meta-ivi-common/recipes-graphics/wayland/weston_1.8.0.bbappend with 52% similarity]

diff --git a/meta-agl/recipes-graphics/wayland/wayland_1.9.0.bb b/meta-agl/recipes-graphics/wayland/wayland_1.9.0.bb
new file mode 100644 (file)
index 0000000..00d2a56
--- /dev/null
@@ -0,0 +1,41 @@
+SUMMARY = "Wayland, a protocol between a compositor and clients"
+DESCRIPTION = "Wayland is a protocol for a compositor to talk to its clients \
+as well as a C library implementation of that protocol. The compositor can be \
+a standalone display server running on Linux kernel modesetting and evdev \
+input devices, an X application, or a wayland client itself. The clients can \
+be traditional applications, X servers (rootless or fullscreen) or other \
+display servers."
+HOMEPAGE = "http://wayland.freedesktop.org"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://COPYING;md5=b31d8f53b6aaf2b4985d7dd7810a70d1 \
+                    file://src/wayland-server.c;endline=24;md5=b8e046164a766bb1ede8ba38e9dcd7ce"
+
+SRC_URI = "http://wayland.freedesktop.org/releases/${BPN}-${PV}.tar.xz"
+SRC_URI[md5sum] = "5e141b3f2a7005d6c89d6f233c87c317"
+SRC_URI[sha256sum] = "9c8770720aa0034479735f58a4dc4ca9b172ecfede28f5134312e135b7301efa"
+
+EXTRA_OECONF_class-native = "--disable-documentation"
+
+inherit autotools pkgconfig
+
+BBCLASSEXTEND = "native nativesdk"
+
+DEPENDS = "expat libffi wayland-native"
+
+EXTRA_OECONF = "--disable-documentation --with-host-scanner"
+
+# Wayland installs a M4 macro for other projects to use, which uses the target
+# pkg-config to find files.  Replace pkg-config with pkg-config-native.
+do_install_append_class-native() {
+  sed -e 's,PKG_CHECK_MODULES(.*),,g' \
+      -e 's,$PKG_CONFIG,pkg-config-native,g' \
+      -i ${D}/${datadir}/aclocal/wayland-scanner.m4
+}
+
+sysroot_stage_all_append_class-target () {
+       rm ${SYSROOT_DESTDIR}/${datadir}/aclocal/wayland-scanner.m4
+       cp ${STAGING_DATADIR_NATIVE}/aclocal/wayland-scanner.m4 ${SYSROOT_DESTDIR}/${datadir}/aclocal/
+}
+
+FILES_${PN} = "${libdir}/*${SOLIBS}"
+FILES_${PN}-dev += "${bindir} ${datadir}/wayland"
diff --git a/meta-agl/recipes-graphics/wayland/weston/0001-make-error-portable.patch b/meta-agl/recipes-graphics/wayland/weston/0001-make-error-portable.patch
new file mode 100644 (file)
index 0000000..148848d
--- /dev/null
@@ -0,0 +1,80 @@
+From c22e90365d89346258394833cbcad03ff32b2e27 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Fri, 29 May 2015 20:56:00 -0700
+Subject: [PATCH weston] make error() portable
+
+error() is not posix but gnu extension so may not be available on all
+kind of systemsi e.g. musl.
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+Upstream-Status: Submitted
+
+ configure.ac        |  2 ++
+ src/weston-error.h  | 20 ++++++++++++++++++++
+ src/weston-launch.c |  2 +-
+ 3 files changed, 23 insertions(+), 1 deletion(-)
+ create mode 100644 src/weston-error.h
+
+diff --git a/configure.ac b/configure.ac
+index 263fc22..f52cd62 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -57,6 +57,8 @@ AC_CHECK_DECL(CLOCK_MONOTONIC,[],
+             [[#include <time.h>]])
+ AC_CHECK_HEADERS([execinfo.h])
++AC_CHECK_HEADERS([error.h])
++
+ AC_CHECK_FUNCS([mkostemp strchrnul initgroups posix_fallocate])
+ COMPOSITOR_MODULES="wayland-server >= 1.7.93 pixman-1 >= 0.25.2"
+diff --git a/src/weston-error.h b/src/weston-error.h
+new file mode 100644
+index 0000000..2089d02
+--- /dev/null
++++ b/src/weston-error.h
+@@ -0,0 +1,20 @@
++#ifndef _WESTON_ERROR_H
++#define _WESTON_ERROR_H
++
++#if defined(HAVE_ERROR_H)
++#include <error.h>
++#else
++#include <err.h>
++#include <string.h>
++#define _weston_error(S, E, F, ...) do { \
++      if (E) \
++              err(S, F ": %s", ##__VA_ARGS__, strerror(E)); \
++      else \
++              err(S, F, ##__VA_ARGS__); \
++} while(0)
++
++#define error _weston_error
++#endif
++
++#endif
++
+diff --git a/src/weston-launch.c b/src/weston-launch.c
+index 10c66de..3e6d30a 100644
+--- a/src/weston-launch.c
++++ b/src/weston-launch.c
+@@ -30,7 +30,6 @@
+ #include <poll.h>
+ #include <errno.h>
+-#include <error.h>
+ #include <getopt.h>
+ #include <sys/types.h>
+@@ -56,6 +55,7 @@
+ #endif
+ #include "weston-launch.h"
++#include "weston-error.h"
+ #define DRM_MAJOR 226
+-- 
+2.1.4
+
diff --git a/meta-agl/recipes-graphics/wayland/weston/make-lcms-explicitly-configurable.patch b/meta-agl/recipes-graphics/wayland/weston/make-lcms-explicitly-configurable.patch
new file mode 100644 (file)
index 0000000..35e6d6f
--- /dev/null
@@ -0,0 +1,43 @@
+weston-1.5.0/configure.ac: make lcms explicitly configurable
+
+The lcms package is outside of openembedded-core, so make it
+explicitly configurable. Make it deterministic, so that if lcms
+dependencies are missing, autoconf throws a fatal error. Follow
+upstream style to make it more likely to be merged.
+
+Upstream-Status: Pending
+
+Index: weston-1.5.0/configure.ac
+===================================================================
+--- weston-1.5.0.orig/configure.ac
++++ weston-1.5.0/configure.ac
+@@ -491,12 +491,24 @@ AC_ARG_ENABLE(demo-clients-install,
+                            enable_demo_clients_install=no)
+ AM_CONDITIONAL(INSTALL_DEMO_CLIENTS, [test "x$enable_demo_clients_install" = "xyes"])
+-PKG_CHECK_MODULES(LCMS, lcms2,
+-                  [have_lcms=yes], [have_lcms=no])
+-if test "x$have_lcms" = xyes; then
+-       AC_DEFINE(HAVE_LCMS, 1, [Have lcms support])
++AC_ARG_ENABLE(lcms,
++              AS_HELP_STRING([--disable-lcms],
++                             [Disable lcms support]),,
++              enable_lcms=auto)
++AM_CONDITIONAL(HAVE_LCMS, [test "x$enable_lcms" = xyes])
++if test "x$enable_lcms" != "xno"; then
++        PKG_CHECK_MODULES(LCMS, 
++                         lcms2,
++                         [have_lcms=yes],
++                         [have_lcms=no])
++        if test "x$have_lcms" = "xno" -a "x$enable_lcms" = "xyes"; then
++          AC_MSG_ERROR([lcms support explicitly requested, but lcms couldn't be found])
++        fi
++        if test "x$have_lcms" = "xyes"; then
++                enable_lcms=yes
++                AC_DEFINE(HAVE_LCMS, 1, [Have lcms support])
++        fi
+ fi
+-AM_CONDITIONAL(HAVE_LCMS, [test "x$have_lcms" = xyes])
+ AC_PATH_PROG([wayland_scanner], [wayland-scanner])
+ if test x$wayland_scanner = x; then
diff --git a/meta-agl/recipes-graphics/wayland/weston/make-libwebp-explicitly-configurable.patch b/meta-agl/recipes-graphics/wayland/weston/make-libwebp-explicitly-configurable.patch
new file mode 100644 (file)
index 0000000..ad07d4f
--- /dev/null
@@ -0,0 +1,37 @@
+
+The libwebp package is outside of openembedded-core, so make it
+explicitly configurable. Make it deterministic, so that if libwebp 
+dependencies are missing, autoconf throws a fatal error.
+
+Upstream-Status: Pending
+
+Index: weston-1.5.0/configure.ac
+===================================================================
+--- weston-1.5.0.orig/configure.ac
++++ weston-1.5.0/configure.ac
+@@ -268,9 +268,22 @@ fi
+ PKG_CHECK_MODULES(PIXMAN, [pixman-1])
+ PKG_CHECK_MODULES(PNG, [libpng])
+-PKG_CHECK_MODULES(WEBP, [libwebp], [have_webp=yes], [have_webp=no])
+-AS_IF([test "x$have_webp" = "xyes"],
+-      [AC_DEFINE([HAVE_WEBP], [1], [Have webp])])
++AC_ARG_ENABLE(webp,
++              AS_HELP_STRING([--disable-webp],
++                             [Disable libwebp support]),,
++              enable_webp=auto)
++AM_CONDITIONAL(HAVE_WEBP, [test "x$enable_webp" = xyes])
++AS_IF([test "x$enable_webp" != "xno"],
++    PKG_CHECK_MODULES(WEBP,
++                     [libwebp],
++                     [have_webp=yes],
++                     [have_webp=no])
++    AS_IF([test "x$have_webp" = "xno" -a "x$enable_webp" = "xyes"],
++        AC_MSG_ERROR([libwebp support explicitly request, but lipwebp could not be found]))
++    AS_IF([test "x$have_webp" = "xyes"],
++        [enable_webp=yes]
++        [AC_DEFINE([HAVE_WEBP], [1], [Have webp])])
++)
+ AC_ARG_ENABLE(vaapi-recorder, [  --enable-vaapi-recorder],,
+             enable_vaapi_recorder=auto)
diff --git a/meta-agl/recipes-graphics/wayland/weston/weston.desktop b/meta-agl/recipes-graphics/wayland/weston/weston.desktop
new file mode 100644 (file)
index 0000000..1086ae8
--- /dev/null
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Application
+Name=Weston
+Comment=Wayland Compostitor
+Exec=weston
+Icon=weston
+Terminal=false
+Categories=Utility;
diff --git a/meta-agl/recipes-graphics/wayland/weston/weston.png b/meta-agl/recipes-graphics/wayland/weston/weston.png
new file mode 100644 (file)
index 0000000..ea8b7e0
Binary files /dev/null and b/meta-agl/recipes-graphics/wayland/weston/weston.png differ
diff --git a/meta-agl/recipes-graphics/wayland/weston_1.9.0.bb b/meta-agl/recipes-graphics/wayland/weston_1.9.0.bb
new file mode 100644 (file)
index 0000000..5d51992
--- /dev/null
@@ -0,0 +1,93 @@
+SUMMARY = "Weston, a Wayland compositor"
+DESCRIPTION = "Weston is the reference implementation of a Wayland compositor"
+HOMEPAGE = "http://wayland.freedesktop.org"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://COPYING;md5=d79ee9e66bb0f95d3386a7acae780b70 \
+                    file://src/compositor.c;endline=26;md5=e342df749174a8ee11065583157c7a38"
+
+SRC_URI = "http://wayland.freedesktop.org/releases/${BPN}-${PV}.tar.xz \
+           file://weston.png \
+           file://weston.desktop \
+           file://make-lcms-explicitly-configurable.patch \
+           file://make-libwebp-explicitly-configurable.patch \
+           file://0001-make-error-portable.patch \
+"
+SRC_URI[md5sum] = "66bbba12f546570b4d97f676bc79a28e"
+SRC_URI[sha256sum] = "9c1b03f3184fa0b0dfdf67e215048085156e1a2ca344af6613fed36794ac48cf"
+
+inherit autotools pkgconfig useradd
+
+DEPENDS = "libxkbcommon gdk-pixbuf pixman cairo glib-2.0 jpeg"
+DEPENDS += "wayland libinput virtual/egl pango"
+
+EXTRA_OECONF = "--enable-setuid-install \
+                --disable-xwayland \
+                --enable-simple-clients \
+                --enable-clients \
+                --enable-demo-clients-install \
+                --disable-rpi-compositor \
+                --disable-rdp-compositor \
+                "
+
+EXTRA_OECONF_append_qemux86 = "\
+               WESTON_NATIVE_BACKEND=fbdev-backend.so \
+               "
+EXTRA_OECONF_append_qemux86-64 = "\
+               WESTON_NATIVE_BACKEND=fbdev-backend.so \
+               "
+PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'kms fbdev wayland egl', '', d)} \
+                   ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)} \
+                   ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'launch', '', d)} \
+                  "
+#
+# Compositor choices
+#
+# Weston on KMS
+PACKAGECONFIG[kms] = "--enable-drm-compositor,--disable-drm-compositor,drm udev virtual/mesa mtdev"
+# Weston on Wayland (nested Weston)
+PACKAGECONFIG[wayland] = "--enable-wayland-compositor,--disable-wayland-compositor,virtual/mesa"
+# Weston on X11
+PACKAGECONFIG[x11] = "--enable-x11-compositor,--disable-x11-compositor,virtual/libx11 libxcb libxcb libxcursor cairo"
+# Headless Weston
+PACKAGECONFIG[headless] = "--enable-headless-compositor,--disable-headless-compositor"
+# Weston on framebuffer
+PACKAGECONFIG[fbdev] = "--enable-fbdev-compositor,--disable-fbdev-compositor,udev mtdev"
+# weston-launch
+PACKAGECONFIG[launch] = "--enable-weston-launch,--disable-weston-launch,libpam drm"
+# VA-API desktop recorder
+PACKAGECONFIG[vaapi] = "--enable-vaapi-recorder,--disable-vaapi-recorder,libva"
+# Weston with EGL support
+PACKAGECONFIG[egl] = "--enable-egl --enable-simple-egl-clients,--disable-egl --disable-simple-egl-clients,virtual/egl"
+# Weston with cairo glesv2 support
+PACKAGECONFIG[cairo-glesv2] = "--with-cairo-glesv2,--with-cairo=image,cairo"
+# Weston with lcms support
+PACKAGECONFIG[lcms] = "--enable-lcms,--disable-lcms,lcms"
+# Weston with webp support
+PACKAGECONFIG[webp] = "--enable-webp,--disable-webp,libwebp"
+# Weston with unwinding support
+PACKAGECONFIG[libunwind] = "--enable-libunwind,--disable-libunwind,libunwind"
+
+do_install_append() {
+       # Weston doesn't need the .la files to load modules, so wipe them
+       rm -f ${D}/${libdir}/weston/*.la
+
+       # If X11, ship a desktop file to launch it
+       if [ "${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)}" = "x11" ]; then
+               install -d ${D}${datadir}/applications
+               install ${WORKDIR}/weston.desktop ${D}${datadir}/applications
+
+               install -d ${D}${datadir}/icons/hicolor/48x48/apps
+               install ${WORKDIR}/weston.png ${D}${datadir}/icons/hicolor/48x48/apps
+        fi
+}
+
+PACKAGES += "${PN}-examples"
+
+FILES_${PN} = "${bindir}/weston ${bindir}/weston-terminal ${bindir}/weston-info ${bindir}/weston-launch ${bindir}/wcap-decode ${libexecdir} ${libdir}/${BPN}/*.so ${datadir}"
+FILES_${PN}-examples = "${bindir}/*"
+
+RDEPENDS_${PN} += "xkeyboard-config"
+RRECOMMENDS_${PN} = "liberation-fonts"
+
+USERADD_PACKAGES = "${PN}"
+GROUPADD_PARAM_${PN} = "--system weston-launch"
diff --git a/meta-ivi-common/recipes-graphics/wayland/wayland-ivi-extension/apply_weston-1.5.x.patch b/meta-ivi-common/recipes-graphics/wayland/wayland-ivi-extension/apply_weston-1.5.x.patch
deleted file mode 100644 (file)
index 7239f1f..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-From fb66405f4f8ee200a443e22d3b4f56a0e917f785 Mon Sep 17 00:00:00 2001
-From: Manuel Bachmann <mbc@iot.bzh>
-Date: Wed, 30 Sep 2015 05:22:25 +0200
-Subject: [PATCH] Backport to Wayland/Weston 1.9.0 > 1.5.0.
-
-Downgrade requirements to Wayland/Weston 1.9.0 > 1.5.0.
-
-"wl_display_roundtrip_queue()" did not exist at the time,
-so just use the wrapper functions instead.
-
-Signed-off-by: Manuel Bachmann <manuel.bachmann@iot.bzh>
----
- .../ilmClient/src/ilm_client_wayland_platform.c    | 15 ++-----
- .../ilmControl/src/ilm_control_wayland_platform.c  | 52 +++++++++++++++++++---
- protocol/CMakeLists.txt                            |  4 +-
- weston-ivi-shell/CMakeLists.txt                    |  4 +-
- 4 files changed, 53 insertions(+), 22 deletions(-)
-
-diff --git a/ivi-layermanagement-api/ilmClient/src/ilm_client_wayland_platform.c b/ivi-layermanagement-api/ilmClient/src/ilm_client_wayland_platform.c
-index 55b1621..8730616 100644
---- a/ivi-layermanagement-api/ilmClient/src/ilm_client_wayland_platform.c
-+++ b/ivi-layermanagement-api/ilmClient/src/ilm_client_wayland_platform.c
-@@ -61,7 +61,6 @@ struct ilm_client_context {
-     struct wl_registry *registry;
-     struct wl_compositor *compositor;
-     struct ivi_application *ivi_application;
--    struct wl_event_queue *queue;
-     struct wl_list list_surface;
-@@ -167,12 +166,6 @@ destroy_client_resouses(void)
-         ctx->ivi_application = NULL;
-     }
--    if (ctx->queue)
--    {
--        wl_event_queue_destroy(ctx->queue);
--        ctx->queue = NULL;
--    }
--
-     if (ctx->registry)
-     {
-         wl_registry_destroy(ctx->registry);
-@@ -203,21 +196,19 @@ init_client(void)
-     wl_list_init(&ctx->list_surface);
--    ctx->queue = wl_display_create_queue(ctx->display);
-     ctx->registry = wl_display_get_registry(ctx->display);
-     if (ctx->registry == NULL) {
--        wl_event_queue_destroy(ctx->queue);
-         fprintf(stderr, "Failed to get registry\n");
-         return;
-     }
--    wl_proxy_set_queue((void*)ctx->registry, ctx->queue);
-     if (wl_registry_add_listener(ctx->registry,
-                              &registry_client_listener, ctx)) {
-         fprintf(stderr, "Failed to add registry listener\n");
-         return;
-     }
--    wl_display_roundtrip_queue(ctx->display, ctx->queue);
-+    wl_display_dispatch(ctx->display);
-+    wl_display_roundtrip(ctx->display);
-     if ((ctx->display == NULL) || (ctx->ivi_application == NULL)) {
-         fprintf(stderr, "Failed to connect display at ilm_client\n");
-@@ -239,7 +230,7 @@ get_client_instance(void)
-         exit(0);
-     }
--    wl_display_roundtrip_queue(ctx->display, ctx->queue);
-+    wl_display_roundtrip(ctx->display);
-     return ctx;
- }
-diff --git a/ivi-layermanagement-api/ilmControl/src/ilm_control_wayland_platform.c b/ivi-layermanagement-api/ilmControl/src/ilm_control_wayland_platform.c
-index 8910df5..61bdfc5 100644
---- a/ivi-layermanagement-api/ilmControl/src/ilm_control_wayland_platform.c
-+++ b/ivi-layermanagement-api/ilmControl/src/ilm_control_wayland_platform.c
-@@ -76,6 +76,46 @@ struct screen_context {
-     struct ilm_control_context *ctx;
- };
-+static void roundtrip_done(void *data, struct wl_callback *callback,
-+                           uint32_t serial)
-+{
-+    (void) serial;
-+
-+    *(int *)data = 1;
-+
-+    wl_callback_destroy(callback);
-+}
-+
-+static struct wl_callback_listener roundtrip_listener = {roundtrip_done};
-+
-+int display_roundtrip_queue(struct wl_display *display,
-+                            struct wl_event_queue *queue)
-+{
-+    int done = 0;
-+    int ret = 0;
-+    struct wl_callback *callback = wl_display_sync(display);
-+
-+    if (! callback)
-+    {
-+        return -1;
-+    }
-+
-+    wl_proxy_set_queue((void *)callback, queue);
-+    wl_callback_add_listener(callback, &roundtrip_listener, &done);
-+
-+    while (ret != -1 && !done)
-+    {
-+        ret = wl_display_dispatch_queue(display, queue);
-+    }
-+
-+    if (ret == -1 && !done)
-+    {
-+        wl_callback_destroy(callback);
-+    }
-+
-+    return ret;
-+}
-+
- static inline void lock_context(struct ilm_control_context *ctx)
- {
-    pthread_mutex_lock(&ctx->mutex);
-@@ -1304,11 +1344,11 @@ init_control(void)
-     if (
-        // first level objects; ivi_controller
--       wl_display_roundtrip_queue(wl->display, wl->queue) == -1 ||
-+       display_roundtrip_queue(wl->display, wl->queue) == -1 ||
-        // second level object: ivi_controller_surfaces/layers
--       wl_display_roundtrip_queue(wl->display, wl->queue) == -1 ||
-+       display_roundtrip_queue(wl->display, wl->queue) == -1 ||
-        // third level objects: ivi_controller_surfaces/layers properties
--       wl_display_roundtrip_queue(wl->display, wl->queue) == -1)
-+       display_roundtrip_queue(wl->display, wl->queue) == -1)
-     {
-         fprintf(stderr, "Failed to initialize wayland connection: %s\n", strerror(errno));
-         return -1;
-@@ -1349,7 +1389,7 @@ ilmErrorTypes impl_sync_and_acquire_instance(struct ilm_control_context *ctx)
-     lock_context(ctx);
--    if (wl_display_roundtrip_queue(ctx->wl.display, ctx->wl.queue) == -1) {
-+    if (display_roundtrip_queue(ctx->wl.display, ctx->wl.queue) == -1) {
-         int err = wl_display_get_error(ctx->wl.display);
-         fprintf(stderr, "Error communicating with wayland: %s\n", strerror(err));
-         unlock_context(ctx);
-@@ -2454,7 +2494,7 @@ ilm_getPropertiesOfSurface(t_ilm_uint surfaceID,
-             // request statistics for surface
-             ivi_controller_surface_send_stats(ctx_surf->controller);
-             // force submission
--            int ret = wl_display_roundtrip_queue(ctx->wl.display, ctx->wl.queue);
-+            int ret = display_roundtrip_queue(ctx->wl.display, ctx->wl.queue);
-             // If we got an error here, there is really no sense
-             // in returning the properties as something is fundamentally
-@@ -2567,7 +2607,7 @@ ilm_commitChanges(void)
-     if (ctx->wl.controller != NULL) {
-         ivi_controller_commit_changes(ctx->wl.controller);
--        if (wl_display_roundtrip_queue(ctx->wl.display, ctx->wl.queue) != -1)
-+        if (display_roundtrip_queue(ctx->wl.display, ctx->wl.queue) != -1)
-         {
-             returnValue = ILM_SUCCESS;
-         }
-diff --git a/protocol/CMakeLists.txt b/protocol/CMakeLists.txt
-index 6842131..207b8f1 100644
---- a/protocol/CMakeLists.txt
-+++ b/protocol/CMakeLists.txt
-@@ -22,8 +22,8 @@ cmake_minimum_required (VERSION 2.6)
- project(ivi-extension-protocol)
- find_package(PkgConfig REQUIRED)
--pkg_check_modules(WAYLAND_CLIENT wayland-client>=1.9.0 REQUIRED)
--pkg_check_modules(WAYLAND_SERVER wayland-server>=1.9.0 REQUIRED)
-+pkg_check_modules(WAYLAND_CLIENT wayland-client>=1.5.0 REQUIRED)
-+pkg_check_modules(WAYLAND_SERVER wayland-server>=1.5.0 REQUIRED)
- find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
-diff --git a/weston-ivi-shell/CMakeLists.txt b/weston-ivi-shell/CMakeLists.txt
-index c2664df..927e3f5 100644
---- a/weston-ivi-shell/CMakeLists.txt
-+++ b/weston-ivi-shell/CMakeLists.txt
-@@ -23,8 +23,8 @@ cmake_minimum_required (VERSION 2.6)
- project(ivi-controller)
- find_package(PkgConfig REQUIRED)
--pkg_check_modules(WAYLAND_SERVER wayland-server>=1.9.0 REQUIRED)
--pkg_check_modules(WESTON weston>=1.9.0 REQUIRED)
-+pkg_check_modules(WAYLAND_SERVER wayland-server>=1.5.0 REQUIRED)
-+pkg_check_modules(WESTON weston>=1.5.0 REQUIRED)
- pkg_check_modules(PIXMAN pixman-1 REQUIRED)
- GET_TARGET_PROPERTY(IVI_EXTENSION_INCLUDE_DIRS ivi-extension-protocol INCLUDE_DIRECTORIES)
--- 
-1.8.3.1
-
index 7bc6190..9582a5a 100644 (file)
@@ -8,7 +8,6 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=176cedb32f48dd58f07e0c1c717b3ea4"
 DEPENDS = "weston"
 
 SRC_URI = "git://git.projects.genivi.org/${PN}.git \
-           file://apply_weston-1.5.x.patch \
           "
 SRC_URI_append_wandboard = "file://wandboard_fix_build.patch"
 
diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.8.0.patch b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.8.0.patch
deleted file mode 100644 (file)
index 33476a8..0000000
+++ /dev/null
@@ -1,2392 +0,0 @@
-From fb20221f0c0068a4a75fe62f2873d9d3c5566e73 Mon Sep 17 00:00:00 2001
-From: Manuel Bachmann <manuel.bachmann@iot.bzh>
-Date: Wed, 13 Jan 2016 18:42:26 +0100
-Subject: [PATCH] [PATCH] Backport IVI-Shell from Weston 1.9.0 to 1.8.0
-
-IVI-Shell is the alternative Weston shell implementing the
-eponymous protocol, and supported in client toolkits such
-as EFL, Qt...
-
-We backport only what is necessary, without modifying core
-compositor code.
-
-Signed-off-by: Manuel Bachmann <manuel.bachmann@iot.bzh>
----
- ivi-shell/hmi-controller.c        | 140 +++---
- ivi-shell/input-panel-ivi.c       |  41 +-
- ivi-shell/ivi-layout-export.h     |  58 ++-
- ivi-shell/ivi-layout-private.h    |  47 +-
- ivi-shell/ivi-layout-transition.c |  39 +-
- ivi-shell/ivi-layout.c            | 983 +++++++++++++++++++-------------------
- ivi-shell/ivi-shell.c             |  91 ++--
- ivi-shell/ivi-shell.h             |  37 +-
- 8 files changed, 758 insertions(+), 678 deletions(-)
-
-diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c
-index 88e9333..2f18217 100644
---- a/ivi-shell/hmi-controller.c
-+++ b/ivi-shell/hmi-controller.c
-@@ -1,23 +1,26 @@
- /*
-  * Copyright (C) 2014 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.
-+ * Permission is hereby granted, free of charge, to any person obtaining
-+ * a copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sublicense, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-  *
-- * 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.
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial
-+ * portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ * SOFTWARE.
-  */
- /**
-@@ -721,27 +724,9 @@ hmi_controller_create(struct weston_compositor *ec)
-       ivi_controller_interface->layer_set_visibility(
-               hmi_ctrl->workspace_background_layer.ivilayer, false);
--      /* init workspace ivi_layer */
--      hmi_ctrl->workspace_layer.x = hmi_ctrl->workspace_background_layer.x;
--      hmi_ctrl->workspace_layer.y = hmi_ctrl->workspace_background_layer.y;
--      hmi_ctrl->workspace_layer.width =
--              hmi_ctrl->workspace_background_layer.width;
--      hmi_ctrl->workspace_layer.height =
--              hmi_ctrl->workspace_background_layer.height;
--      hmi_ctrl->workspace_layer.id_layer =
--              hmi_ctrl->hmi_setting->workspace_layer_id;
--
--      create_layer(iviscrn, &hmi_ctrl->workspace_layer);
--      ivi_controller_interface->layer_set_opacity(hmi_ctrl->workspace_layer.ivilayer, 0);
--      ivi_controller_interface->layer_set_visibility(hmi_ctrl->workspace_layer.ivilayer,
--                                      false);
-       wl_list_init(&hmi_ctrl->workspace_fade.layer_list);
-       tmp_link_layer = MEM_ALLOC(sizeof(*tmp_link_layer));
--      tmp_link_layer->layout_layer = hmi_ctrl->workspace_layer.ivilayer;
--      wl_list_insert(&hmi_ctrl->workspace_fade.layer_list,
--                     &tmp_link_layer->link);
--      tmp_link_layer = MEM_ALLOC(sizeof(*tmp_link_layer));
-       tmp_link_layer->layout_layer =
-               hmi_ctrl->workspace_background_layer.ivilayer;
-       wl_list_insert(&hmi_ctrl->workspace_fade.layer_list,
-@@ -976,12 +961,11 @@ static void
- ivi_hmi_controller_add_launchers(struct hmi_controller *hmi_ctrl,
-                                int32_t icon_size)
- {
--      struct ivi_layout_layer *layer = hmi_ctrl->workspace_layer.ivilayer;
-       int32_t minspace_x = 10;
-       int32_t minspace_y = minspace_x;
--      int32_t width  = hmi_ctrl->workspace_layer.width;
--      int32_t height = hmi_ctrl->workspace_layer.height;
-+      int32_t width  = hmi_ctrl->workspace_background_layer.width;
-+      int32_t height = hmi_ctrl->workspace_background_layer.height;
-       int32_t x_count = (width - minspace_x) / (minspace_x + icon_size);
-       int32_t space_x = (int32_t)((width - x_count * icon_size) / (1.0 + x_count));
-@@ -1011,6 +995,11 @@ ivi_hmi_controller_add_launchers(struct hmi_controller *hmi_ctrl,
-       struct ivi_layout_surface* layout_surface = NULL;
-       uint32_t *add_surface_id = NULL;
-+      struct ivi_layout_screen *iviscrn = NULL;
-+      struct link_layer *tmp_link_layer = NULL;
-+      struct ivi_layout_screen **pp_screen = NULL;
-+      int32_t screen_length  = 0;
-+
-       if (0 == x_count)
-               x_count = 1;
-@@ -1087,16 +1076,10 @@ ivi_hmi_controller_add_launchers(struct hmi_controller *hmi_ctrl,
-                       ivi_controller_interface->get_surface_from_id(data->surface_id);
-               assert(layout_surface);
--              ret = ivi_controller_interface->layer_add_surface(layer, layout_surface);
--              assert(!ret);
--
-               ret = ivi_controller_interface->surface_set_destination_rectangle(
-                               layout_surface, x, y, icon_size, icon_size);
-               assert(!ret);
--              ret = ivi_controller_interface->surface_set_visibility(layout_surface, true);
--              assert(!ret);
--
-               nx++;
-               if (x_count == nx) {
-@@ -1105,6 +1088,43 @@ ivi_hmi_controller_add_launchers(struct hmi_controller *hmi_ctrl,
-               }
-       }
-+      /* init workspace ivi_layer */
-+      hmi_ctrl->workspace_layer.x = hmi_ctrl->workspace_background_layer.x;
-+      hmi_ctrl->workspace_layer.y = hmi_ctrl->workspace_background_layer.y;
-+      hmi_ctrl->workspace_layer.width =
-+              hmi_ctrl->workspace_background_layer.width * hmi_ctrl->workspace_count;
-+      hmi_ctrl->workspace_layer.height =
-+              hmi_ctrl->workspace_background_layer.height;
-+      hmi_ctrl->workspace_layer.id_layer =
-+              hmi_ctrl->hmi_setting->workspace_layer_id;
-+
-+      ivi_controller_interface->get_screens(&screen_length, &pp_screen);
-+      iviscrn = pp_screen[0];
-+      free(pp_screen);
-+      create_layer(iviscrn, &hmi_ctrl->workspace_layer);
-+      ivi_controller_interface->layer_set_opacity(hmi_ctrl->workspace_layer.ivilayer, 0);
-+      ivi_controller_interface->layer_set_visibility(hmi_ctrl->workspace_layer.ivilayer,
-+                                      false);
-+
-+      tmp_link_layer = MEM_ALLOC(sizeof(*tmp_link_layer));
-+      tmp_link_layer->layout_layer = hmi_ctrl->workspace_layer.ivilayer;
-+      wl_list_insert(&hmi_ctrl->workspace_fade.layer_list,
-+                     &tmp_link_layer->link);
-+
-+      /* Add surface to layer */
-+      wl_array_for_each(data, &launchers) {
-+              layout_surface =
-+                      ivi_controller_interface->get_surface_from_id(data->surface_id);
-+              assert(layout_surface);
-+
-+              ret = ivi_controller_interface->layer_add_surface(hmi_ctrl->workspace_layer.ivilayer,
-+                                                                layout_surface);
-+              assert(!ret);
-+
-+              ret = ivi_controller_interface->surface_set_visibility(layout_surface, true);
-+              assert(!ret);
-+      }
-+
-       wl_array_release(&launchers);
-       ivi_controller_interface->commit_changes();
- }
-@@ -1266,8 +1286,8 @@ move_workspace_grab_end(struct move_grab *move, struct wl_resource* resource,
-                                       duration);
-       ivi_controller_interface->layer_set_destination_rectangle(layer,
-                               end_pos, pos_y,
--                              hmi_ctrl->workspace_background_layer.width,
--                              hmi_ctrl->workspace_background_layer.height);
-+                              hmi_ctrl->workspace_layer.width,
-+                              hmi_ctrl->workspace_layer.height);
-       ivi_controller_interface->commit_changes();
- }
-@@ -1465,15 +1485,18 @@ enum HMI_GRAB_DEVICE {
- static enum HMI_GRAB_DEVICE
- get_hmi_grab_device(struct weston_seat *seat, uint32_t serial)
- {
--      if (seat->pointer &&
--          seat->pointer->focus &&
--          seat->pointer->button_count &&
--          seat->pointer->grab_serial == serial)
-+      struct weston_pointer *pointer = seat->pointer;
-+      struct weston_touch *touch = seat->touch;
-+
-+      if (pointer &&
-+          pointer->focus &&
-+          pointer->button_count &&
-+          pointer->grab_serial == serial)
-               return HMI_GRAB_DEVICE_POINTER;
--      if (seat->touch &&
--          seat->touch->focus &&
--          seat->touch->grab_serial == serial)
-+      if (touch &&
-+          touch->focus &&
-+          touch->grab_serial == serial)
-               return HMI_GRAB_DEVICE_TOUCH;
-       return HMI_GRAB_DEVICE_NONE;
-@@ -1564,6 +1587,9 @@ ivi_hmi_controller_workspace_control(struct wl_client *client,
-       struct pointer_move_grab *pnt_move_grab = NULL;
-       struct touch_move_grab *tch_move_grab = NULL;
-       struct weston_seat *seat = NULL;
-+      struct weston_pointer *pointer;
-+      struct weston_touch *touch;
-+
-       enum HMI_GRAB_DEVICE device;
-       if (hmi_ctrl->workspace_count < 2)
-@@ -1582,21 +1608,23 @@ ivi_hmi_controller_workspace_control(struct wl_client *client,
-       switch (device) {
-       case HMI_GRAB_DEVICE_POINTER:
--              pnt_move_grab = create_workspace_pointer_move(seat->pointer,
-+              pointer = seat->pointer;
-+              pnt_move_grab = create_workspace_pointer_move(pointer,
-                                                             resource);
-               pointer_grab_start(&pnt_move_grab->base, layer,
-                                  &pointer_move_grab_workspace_interface,
--                                 seat->pointer);
-+                                 pointer);
-               break;
-       case HMI_GRAB_DEVICE_TOUCH:
--              tch_move_grab = create_workspace_touch_move(seat->touch,
-+              touch = seat->touch;
-+              tch_move_grab = create_workspace_touch_move(touch,
-                                                           resource);
-               touch_grab_start(&tch_move_grab->base, layer,
-                                &touch_move_grab_workspace_interface,
--                               seat->touch);
-+                               touch);
-               break;
-       default:
-diff --git a/ivi-shell/input-panel-ivi.c b/ivi-shell/input-panel-ivi.c
-index 6b89177..3eefb68 100644
---- a/ivi-shell/input-panel-ivi.c
-+++ b/ivi-shell/input-panel-ivi.c
-@@ -3,23 +3,26 @@
-  * 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.
-+ * Permission is hereby granted, free of charge, to any person obtaining
-+ * a copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sublicense, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-  *
-- * 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.
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial
-+ * portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ * SOFTWARE.
-  */
- #include "config.h"
-@@ -66,9 +69,11 @@ show_input_panel_surface(struct input_panel_surface *ipsurf)
-       float x, y;
-       wl_list_for_each(seat, &shell->compositor->seat_list, link) {
--              if (!seat->keyboard || !seat->keyboard->focus)
-+              struct weston_keyboard *keyboard = seat->keyboard;
-+
-+              if (!keyboard || !keyboard->focus)
-                       continue;
--              focus = weston_surface_get_main_surface(seat->keyboard->focus);
-+              focus = weston_surface_get_main_surface(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;
-diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h
-index 4b4328c..8a92009 100644
---- a/ivi-shell/ivi-layout-export.h
-+++ b/ivi-shell/ivi-layout-export.h
-@@ -1,23 +1,26 @@
- /*
-  * 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.
-+ * Permission is hereby granted, free of charge, to any person obtaining
-+ * a copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sublicense, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-  *
-- * 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.
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial
-+ * portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ * SOFTWARE.
-  */
- /**
-@@ -467,7 +470,7 @@ struct ivi_controller_interface {
-       /**
-        * \brief Removes a ivi_layer which is currently managed by the service
-        */
--      void (*layer_remove)(struct ivi_layout_layer *ivilayer);
-+      void (*layer_destroy)(struct ivi_layout_layer *ivilayer);
-       /**
-        * \brief Get all ivi_layers which are currently registered and managed
-@@ -780,6 +783,27 @@ struct ivi_controller_interface {
-                               int32_t x, int32_t y,
-                               int32_t width, int32_t height);
-+      /**
-+       * remove notification by callback on property changes of ivi_surface
-+       */
-+      void (*surface_remove_notification_by_callback)(struct ivi_layout_surface *ivisurf,
-+                                                      surface_property_notification_func callback,
-+                                                      void *userdata);
-+
-+      /**
-+       * \brief remove notification by callback on property changes of ivi_layer
-+       */
-+      void (*layer_remove_notification_by_callback)(struct ivi_layout_layer *ivilayer,
-+                                                    layer_property_notification_func callback,
-+                                                    void *userdata);
-+
-+      /**
-+       * \brief get id of ivi_screen from ivi_layout_screen
-+       *
-+       *
-+       * \return id of ivi_screen
-+       */
-+      uint32_t (*get_id_of_screen)(struct ivi_layout_screen *iviscrn);
- };
- #ifdef __cplusplus
-diff --git a/ivi-shell/ivi-layout-private.h b/ivi-shell/ivi-layout-private.h
-index 4531748..074d598 100644
---- a/ivi-shell/ivi-layout-private.h
-+++ b/ivi-shell/ivi-layout-private.h
-@@ -1,23 +1,26 @@
- /*
-  * Copyright (C) 2014 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.
-+ * Permission is hereby granted, free of charge, to any person obtaining
-+ * a copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sublicense, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-  *
-- * 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.
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial
-+ * portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ * SOFTWARE.
-  */
- #ifndef _ivi_layout_PRIVATE_H_
-@@ -36,12 +39,7 @@ struct ivi_layout_surface {
-       struct ivi_layout *layout;
-       struct weston_surface *surface;
--      struct wl_listener surface_destroy_listener;
--      struct weston_transform surface_rotation;
--      struct weston_transform layer_rotation;
--      struct weston_transform surface_pos;
--      struct weston_transform layer_pos;
--      struct weston_transform scaling;
-+      struct weston_transform transform;
-       struct ivi_layout_surface_properties prop;
-       uint32_t event_mask;
-@@ -83,9 +81,12 @@ struct ivi_layout_layer {
-       } pending;
-       struct {
-+              int dirty;
-               struct wl_list surface_list;
-               struct wl_list link;
-       } order;
-+
-+      int32_t ref_count;
- };
- struct ivi_layout {
-@@ -223,4 +224,6 @@ ivi_layout_transition_move_layer_cancel(struct ivi_layout_layer *layer);
- int
- load_controller_modules(struct weston_compositor *compositor, const char *modules,
-                       int *argc, char *argv[]);
-+void
-+ivi_layout_surface_destroy(struct ivi_layout_surface *ivisurf);
- #endif
-diff --git a/ivi-shell/ivi-layout-transition.c b/ivi-shell/ivi-layout-transition.c
-index f691d35..d12a8f4 100644
---- a/ivi-shell/ivi-layout-transition.c
-+++ b/ivi-shell/ivi-layout-transition.c
-@@ -1,23 +1,26 @@
- /*
-  * Copyright (C) 2014 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.
-+ * Permission is hereby granted, free of charge, to any person obtaining
-+ * a copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sublicense, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-  *
-- * 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.
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial
-+ * portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ * SOFTWARE.
-  */
- #include <time.h>
-@@ -226,7 +229,7 @@ layout_transition_destroy(struct ivi_layout_transition *transition)
-       struct ivi_layout *layout = get_instance();
-       remove_transition(layout, transition);
--      if(transition->destroy_func)
-+      if (transition->destroy_func)
-               transition->destroy_func(transition);
-       free(transition);
- }
-@@ -660,7 +663,7 @@ transition_move_layer_destroy(struct ivi_layout_transition *transition)
- {
-       struct move_layer_data *data = transition->private_data;
--      if(data->destroy_func)
-+      if (data->destroy_func)
-               data->destroy_func(transition->user_data);
-       free(data);
-diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
-index abfba70..c153884 100644
---- a/ivi-shell/ivi-layout.c
-+++ b/ivi-shell/ivi-layout.c
-@@ -1,23 +1,26 @@
- /*
-  * 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.
-+ * Permission is hereby granted, free of charge, to any person obtaining
-+ * a copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sublicense, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-  *
-- * 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.
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial
-+ * portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ * SOFTWARE.
-  */
- /**
-@@ -55,12 +58,15 @@
- #include "config.h"
- #include <string.h>
-+#include <assert.h>
- #include "compositor.h"
- #include "ivi-layout-export.h"
- #include "ivi-layout-private.h"
--#include "../shared/os-compatibility.h"
-+#include "shared/os-compatibility.h"
-+
-+#define max(a, b) ((a) > (b) ? (a) : (b))
- struct link_layer {
-       struct ivi_layout_layer *ivilayer;
-@@ -89,14 +95,13 @@ struct ivi_layout_screen {
-       struct ivi_layout *layout;
-       struct weston_output *output;
--      uint32_t event_mask;
--
-       struct {
-               struct wl_list layer_list;
-               struct wl_list link;
-       } pending;
-       struct {
-+              int dirty;
-               struct wl_list layer_list;
-               struct wl_list link;
-       } order;
-@@ -107,6 +112,17 @@ struct ivi_layout_notification_callback {
-       void *data;
- };
-+struct ivi_rectangle
-+{
-+      int32_t x;
-+      int32_t y;
-+      int32_t width;
-+      int32_t height;
-+};
-+
-+static void
-+remove_notification(struct wl_list *listener_list, void *callback, void *userdata);
-+
- static struct ivi_layout ivilayout = {0};
- struct ivi_layout *
-@@ -139,12 +155,8 @@ remove_link_to_surface(struct ivi_layout_layer *ivilayer)
-       struct link_layer *next = NULL;
-       wl_list_for_each_safe(link, next, &ivilayer->link_to_surface, link_to_layer) {
--              if (!wl_list_empty(&link->link_to_layer)) {
--                      wl_list_remove(&link->link_to_layer);
--              }
--              if (!wl_list_empty(&link->link)) {
--                      wl_list_remove(&link->link);
--              }
-+              wl_list_remove(&link->link_to_layer);
-+              wl_list_remove(&link->link);
-               free(link);
-       }
-@@ -158,7 +170,6 @@ static void
- add_link_to_layer(struct ivi_layout_screen *iviscrn,
-                 struct link_screen *link_screen)
- {
--      wl_list_init(&link_screen->link_to_screen);
-       wl_list_insert(&iviscrn->link_to_layer, &link_screen->link_to_screen);
- }
-@@ -178,7 +189,6 @@ add_ordersurface_to_layer(struct ivi_layout_surface *ivisurf,
-       }
-       link_layer->ivilayer = ivilayer;
--      wl_list_init(&link_layer->link);
-       wl_list_insert(&ivisurf->layer_list, &link_layer->link);
-       add_link_to_surface(ivilayer, link_layer);
- }
-@@ -190,12 +200,8 @@ remove_ordersurface_from_layer(struct ivi_layout_surface *ivisurf)
-       struct link_layer *next = NULL;
-       wl_list_for_each_safe(link_layer, next, &ivisurf->layer_list, link) {
--              if (!wl_list_empty(&link_layer->link)) {
--                      wl_list_remove(&link_layer->link);
--              }
--              if (!wl_list_empty(&link_layer->link_to_layer)) {
--                      wl_list_remove(&link_layer->link_to_layer);
--              }
-+              wl_list_remove(&link_layer->link);
-+              wl_list_remove(&link_layer->link_to_layer);
-               free(link_layer);
-       }
-       wl_list_init(&ivisurf->layer_list);
-@@ -217,7 +223,6 @@ add_orderlayer_to_screen(struct ivi_layout_layer *ivilayer,
-       }
-       link_scrn->iviscrn = iviscrn;
--      wl_list_init(&link_scrn->link);
-       wl_list_insert(&ivilayer->screen_list, &link_scrn->link);
-       add_link_to_layer(iviscrn, link_scrn);
- }
-@@ -229,12 +234,8 @@ remove_orderlayer_from_screen(struct ivi_layout_layer *ivilayer)
-       struct link_screen *next = NULL;
-       wl_list_for_each_safe(link_scrn, next, &ivilayer->screen_list, link) {
--              if (!wl_list_empty(&link_scrn->link)) {
--                      wl_list_remove(&link_scrn->link);
--              }
--              if (!wl_list_empty(&link_scrn->link_to_screen)) {
--                      wl_list_remove(&link_scrn->link_to_screen);
--              }
-+              wl_list_remove(&link_scrn->link);
-+              wl_list_remove(&link_scrn->link_to_screen);
-               free(link_scrn);
-       }
-       wl_list_init(&ivilayer->screen_list);
-@@ -290,9 +291,7 @@ remove_all_notification(struct wl_list *listener_list)
-       wl_list_for_each_safe(listener, next, listener_list, link) {
-               struct listener_layout_notification *notification = NULL;
--              if (!wl_list_empty(&listener->link)) {
--                      wl_list_remove(&listener->link);
--              }
-+              wl_list_remove(&listener->link);
-               notification =
-                       container_of(listener,
-@@ -315,29 +314,36 @@ ivi_layout_surface_remove_notification(struct ivi_layout_surface *ivisurf)
-       remove_all_notification(&ivisurf->property_changed.listener_list);
- }
-+static void
-+ivi_layout_surface_remove_notification_by_callback(struct ivi_layout_surface *ivisurf,
-+                                                 surface_property_notification_func callback,
-+                                                 void *userdata)
-+{
-+      if (ivisurf == NULL) {
-+              weston_log("ivi_layout_surface_remove_notification_by_callback: invalid argument\n");
-+              return;
-+      }
-+
-+      remove_notification(&ivisurf->property_changed.listener_list, callback, userdata);
-+}
-+
- /**
-- * this shall not be called from controller because this is triggered by ivi_surface.destroy
-- * This means that this is called from westonsurface_destroy_from_ivisurface.
-+ * Called at destruction of wl_surface/ivi_surface
-  */
--static void
--ivi_layout_surface_remove(struct ivi_layout_surface *ivisurf)
-+void
-+ivi_layout_surface_destroy(struct ivi_layout_surface *ivisurf)
- {
-       struct ivi_layout *layout = get_instance();
-       if (ivisurf == NULL) {
--              weston_log("ivi_layout_surface_remove: invalid argument\n");
-+              weston_log("%s: invalid argument\n", __func__);
-               return;
-       }
--      if (!wl_list_empty(&ivisurf->pending.link)) {
--              wl_list_remove(&ivisurf->pending.link);
--      }
--      if (!wl_list_empty(&ivisurf->order.link)) {
--              wl_list_remove(&ivisurf->order.link);
--      }
--      if (!wl_list_empty(&ivisurf->link)) {
--              wl_list_remove(&ivisurf->link);
--      }
-+      wl_list_remove(&ivisurf->transform.link);
-+      wl_list_remove(&ivisurf->pending.link);
-+      wl_list_remove(&ivisurf->order.link);
-+      wl_list_remove(&ivisurf->link);
-       remove_ordersurface_from_layer(ivisurf);
-       wl_signal_emit(&layout->surface_notification.removed, ivisurf);
-@@ -350,27 +356,6 @@ ivi_layout_surface_remove(struct ivi_layout_surface *ivisurf)
- }
- /**
-- * Called at destruction of ivi_surface
-- */
--static void
--westonsurface_destroy_from_ivisurface(struct wl_listener *listener, void *data)
--{
--      struct ivi_layout_surface *ivisurf = NULL;
--
--      ivisurf = container_of(listener, struct ivi_layout_surface,
--                             surface_destroy_listener);
--
--      wl_list_remove(&ivisurf->surface_rotation.link);
--      wl_list_remove(&ivisurf->layer_rotation.link);
--      wl_list_remove(&ivisurf->surface_pos.link);
--      wl_list_remove(&ivisurf->layer_pos.link);
--      wl_list_remove(&ivisurf->scaling.link);
--
--      ivisurf->surface = NULL;
--      ivi_layout_surface_remove(ivisurf);
--}
--
--/**
-  * Internal API to check ivi_layer/ivi_surface already added in ivi_layer/ivi_screen.
-  * Called by ivi_layout_layer_add_surface/ivi_layout_screenAddLayer
-  */
-@@ -423,14 +408,12 @@ create_screen(struct weston_compositor *ec)
-                       continue;
-               }
--              wl_list_init(&iviscrn->link);
-               iviscrn->layout = layout;
-               iviscrn->id_screen = count;
-               count++;
-               iviscrn->output = output;
--              iviscrn->event_mask = 0;
-               wl_list_init(&iviscrn->pending.layer_list);
-               wl_list_init(&iviscrn->pending.link);
-@@ -494,293 +477,319 @@ update_opacity(struct ivi_layout_layer *ivilayer,
- }
- static void
--update_surface_orientation(struct ivi_layout_layer *ivilayer,
--                         struct ivi_layout_surface *ivisurf)
--{
--      struct weston_view *view;
--      struct weston_matrix  *matrix = &ivisurf->surface_rotation.matrix;
--      float width  = 0.0f;
--      float height = 0.0f;
--      float v_sin  = 0.0f;
--      float v_cos  = 0.0f;
--      float cx = 0.0f;
--      float cy = 0.0f;
--      float sx = 1.0f;
--      float sy = 1.0f;
--
--      wl_list_for_each(view, &ivisurf->surface->views, surface_link) {
--              if (view != NULL) {
--                      break;
--              }
--      }
--
--      if (view == NULL) {
--              return;
--      }
--
--      if ((ivilayer->prop.dest_width == 0) ||
--          (ivilayer->prop.dest_height == 0)) {
--              return;
--      }
--      width  = (float)ivilayer->prop.dest_width;
--      height = (float)ivilayer->prop.dest_height;
--
--      switch (ivisurf->prop.orientation) {
--      case WL_OUTPUT_TRANSFORM_NORMAL:
--              v_sin = 0.0f;
--              v_cos = 1.0f;
--              break;
-+get_rotate_values(enum wl_output_transform orientation,
-+                float *v_sin,
-+                float *v_cos)
-+{
-+      switch (orientation) {
-       case WL_OUTPUT_TRANSFORM_90:
--              v_sin = 1.0f;
--              v_cos = 0.0f;
--              sx = width / height;
--              sy = height / width;
-+              *v_sin = 1.0f;
-+              *v_cos = 0.0f;
-               break;
-       case WL_OUTPUT_TRANSFORM_180:
--              v_sin = 0.0f;
--              v_cos = -1.0f;
-+              *v_sin = 0.0f;
-+              *v_cos = -1.0f;
-               break;
-       case WL_OUTPUT_TRANSFORM_270:
-+              *v_sin = -1.0f;
-+              *v_cos = 0.0f;
-+              break;
-+      case WL_OUTPUT_TRANSFORM_NORMAL:
-       default:
--              v_sin = -1.0f;
--              v_cos = 0.0f;
--              sx = width / height;
--              sy = height / width;
-+              *v_sin = 0.0f;
-+              *v_cos = 1.0f;
-               break;
-       }
--      wl_list_remove(&ivisurf->surface_rotation.link);
--      weston_view_geometry_dirty(view);
--
--      weston_matrix_init(matrix);
--      cx = 0.5f * width;
--      cy = 0.5f * height;
--      weston_matrix_translate(matrix, -cx, -cy, 0.0f);
--      weston_matrix_rotate_xy(matrix, v_cos, v_sin);
--      weston_matrix_scale(matrix, sx, sy, 1.0);
--      weston_matrix_translate(matrix, cx, cy, 0.0f);
--      wl_list_insert(&view->geometry.transformation_list,
--                     &ivisurf->surface_rotation.link);
--
--      weston_view_set_transform_parent(view, NULL);
--      weston_view_update_transform(view);
- }
- static void
--update_layer_orientation(struct ivi_layout_layer *ivilayer,
--                       struct ivi_layout_surface *ivisurf)
--{
--      struct weston_surface *es = ivisurf->surface;
--      struct weston_view    *view;
--      struct weston_matrix  *matrix = &ivisurf->layer_rotation.matrix;
--      struct weston_output  *output = NULL;
--      float width  = 0.0f;
--      float height = 0.0f;
--      float v_sin  = 0.0f;
--      float v_cos  = 0.0f;
--      float cx = 0.0f;
--      float cy = 0.0f;
--      float sx = 1.0f;
--      float sy = 1.0f;
--
--      wl_list_for_each(view, &ivisurf->surface->views, surface_link) {
--              if (view != NULL) {
--                      break;
--              }
--      }
--
--      if (es == NULL || view == NULL) {
--              return;
--      }
--
--      output = es->output;
--      if (output == NULL) {
--              return;
--      }
--      if ((output->width == 0) || (output->height == 0)) {
--              return;
--      }
--      width = (float)output->width;
--      height = (float)output->height;
--
--      switch (ivilayer->prop.orientation) {
--      case WL_OUTPUT_TRANSFORM_NORMAL:
--              v_sin = 0.0f;
--              v_cos = 1.0f;
--              break;
-+get_scale(enum wl_output_transform orientation,
-+        float dest_width,
-+        float dest_height,
-+        float source_width,
-+        float source_height,
-+        float *scale_x,
-+        float *scale_y)
-+{
-+      switch (orientation) {
-       case WL_OUTPUT_TRANSFORM_90:
--              v_sin = 1.0f;
--              v_cos = 0.0f;
--              sx = width / height;
--              sy = height / width;
-+              *scale_x = dest_width / source_height;
-+              *scale_y = dest_height / source_width;
-               break;
-       case WL_OUTPUT_TRANSFORM_180:
--              v_sin = 0.0f;
--              v_cos = -1.0f;
-+              *scale_x = dest_width / source_width;
-+              *scale_y = dest_height / source_height;
-               break;
-       case WL_OUTPUT_TRANSFORM_270:
-+              *scale_x = dest_width / source_height;
-+              *scale_y = dest_height / source_width;
-+              break;
-+      case WL_OUTPUT_TRANSFORM_NORMAL:
-       default:
--              v_sin = -1.0f;
--              v_cos = 0.0f;
--              sx = width / height;
--              sy = height / width;
-+              *scale_x = dest_width / source_width;
-+              *scale_y = dest_height / source_height;
-               break;
-       }
--      wl_list_remove(&ivisurf->layer_rotation.link);
--      weston_view_geometry_dirty(view);
--
--      weston_matrix_init(matrix);
--      cx = 0.5f * width;
--      cy = 0.5f * height;
--      weston_matrix_translate(matrix, -cx, -cy, 0.0f);
--      weston_matrix_rotate_xy(matrix, v_cos, v_sin);
--      weston_matrix_scale(matrix, sx, sy, 1.0);
--      weston_matrix_translate(matrix, cx, cy, 0.0f);
--      wl_list_insert(&view->geometry.transformation_list,
--                     &ivisurf->layer_rotation.link);
-+}
--      weston_view_set_transform_parent(view, NULL);
--      weston_view_update_transform(view);
-+static void
-+calc_transformation_matrix(struct ivi_rectangle *source_rect,
-+                         struct ivi_rectangle *dest_rect,
-+                         enum wl_output_transform orientation,
-+                         struct weston_matrix *m)
-+{
-+      float source_center_x;
-+      float source_center_y;
-+      float vsin;
-+      float vcos;
-+      float scale_x;
-+      float scale_y;
-+      float translate_x;
-+      float translate_y;
-+
-+      source_center_x = source_rect->x + source_rect->width * 0.5f;
-+      source_center_y = source_rect->y + source_rect->height * 0.5f;
-+      weston_matrix_translate(m, -source_center_x, -source_center_y, 0.0f);
-+
-+      get_rotate_values(orientation, &vsin, &vcos);
-+      weston_matrix_rotate_xy(m, vcos, vsin);
-+
-+      get_scale(orientation,
-+                dest_rect->width,
-+                dest_rect->height,
-+                source_rect->width,
-+                source_rect->height,
-+                &scale_x,
-+                &scale_y);
-+      weston_matrix_scale(m, scale_x, scale_y, 1.0f);
-+
-+      translate_x = dest_rect->width * 0.5f + dest_rect->x;
-+      translate_y = dest_rect->height * 0.5f + dest_rect->y;
-+      weston_matrix_translate(m, translate_x, translate_y, 0.0f);
- }
-+/*
-+ * This computes intersected rect_output from two ivi_rectangles
-+ */
- static void
--update_surface_position(struct ivi_layout_surface *ivisurf)
-+ivi_rectangle_intersect(const struct ivi_rectangle *rect1,
-+                      const struct ivi_rectangle *rect2,
-+                      struct ivi_rectangle *rect_output)
- {
--      struct weston_view *view;
--      float tx  = (float)ivisurf->prop.dest_x;
--      float ty  = (float)ivisurf->prop.dest_y;
--      struct weston_matrix *matrix = &ivisurf->surface_pos.matrix;
-+      int32_t rect1_right = rect1->x + rect1->width;
-+      int32_t rect1_bottom = rect1->y + rect1->height;
-+      int32_t rect2_right = rect2->x + rect2->width;
-+      int32_t rect2_bottom = rect2->y + rect2->height;
--      wl_list_for_each(view, &ivisurf->surface->views, surface_link) {
--              if (view != NULL) {
--                      break;
--              }
--      }
-+      rect_output->x = max(rect1->x, rect2->x);
-+      rect_output->y = max(rect1->y, rect2->y);
-+      rect_output->width = rect1_right < rect2_right ?
-+                           rect1_right - rect_output->x :
-+                           rect2_right - rect_output->x;
-+      rect_output->height = rect1_bottom < rect2_bottom ?
-+                            rect1_bottom - rect_output->y :
-+                            rect2_bottom - rect_output->y;
--      if (view == NULL) {
--              return;
-+      if (rect_output->width < 0 || rect_output->height < 0) {
-+              rect_output->width = 0;
-+              rect_output->height = 0;
-       }
--
--      wl_list_remove(&ivisurf->surface_pos.link);
--
--      weston_matrix_init(matrix);
--      weston_matrix_translate(matrix, tx, ty, 0.0f);
--      wl_list_insert(&view->geometry.transformation_list,
--                     &ivisurf->surface_pos.link);
--
--      weston_view_set_transform_parent(view, NULL);
--      weston_view_update_transform(view);
- }
-+/*
-+ * Transform rect_input by the inverse of matrix, intersect with boundingbox,
-+ * and store the result in rect_output.
-+ * The boundingbox must be given in the same coordinate space as rect_output.
-+ * Additionally, there are the following restrictions on the matrix:
-+ * - no projective transformations
-+ * - no skew
-+ * - only multiples of 90-degree rotations supported
-+ *
-+ * In failure case of weston_matrix_invert, rect_output is set to boundingbox
-+ * as a fail-safe with log.
-+ */
- static void
--update_layer_position(struct ivi_layout_layer *ivilayer,
--                    struct ivi_layout_surface *ivisurf)
-+calc_inverse_matrix_transform(const struct weston_matrix *matrix,
-+                            const struct ivi_rectangle *rect_input,
-+                            const struct ivi_rectangle *boundingbox,
-+                            struct ivi_rectangle *rect_output)
- {
--      struct weston_view *view;
--      struct weston_matrix *matrix = &ivisurf->layer_pos.matrix;
--      float tx  = (float)ivilayer->prop.dest_x;
--      float ty  = (float)ivilayer->prop.dest_y;
-+      struct weston_matrix m;
-+      struct weston_vector top_left;
-+      struct weston_vector bottom_right;
--      wl_list_for_each(view, &ivisurf->surface->views, surface_link) {
--              if (view != NULL) {
--                      break;
--              }
--      }
-+      assert(boundingbox != rect_output);
--      if (view == NULL) {
--              return;
-+      if (weston_matrix_invert(&m, matrix) < 0) {
-+              weston_log("ivi-shell: calc_inverse_matrix_transform fails to invert a matrix.\n");
-+              weston_log("ivi-shell: boundingbox is set to the rect_output.\n");
-+              rect_output->x = boundingbox->x;
-+              rect_output->y = boundingbox->y;
-+              rect_output->width = boundingbox->width;
-+              rect_output->height = boundingbox->height;
-       }
--      wl_list_remove(&ivisurf->layer_pos.link);
-+      /* The vectors and matrices involved will always produce f[3] == 1.0. */
-+      top_left.f[0] = rect_input->x;
-+      top_left.f[1] = rect_input->y;
-+      top_left.f[2] = 0.0f;
-+      top_left.f[3] = 1.0f;
--      weston_matrix_init(matrix);
--      weston_matrix_translate(matrix, tx, ty, 0.0f);
--      wl_list_insert(&view->geometry.transformation_list,
--                     &ivisurf->layer_pos.link);
-+      bottom_right.f[0] = rect_input->x + rect_input->width;
-+      bottom_right.f[1] = rect_input->y + rect_input->height;
-+      bottom_right.f[2] = 0.0f;
-+      bottom_right.f[3] = 1.0f;
--      weston_view_set_transform_parent(view, NULL);
--      weston_view_update_transform(view);
--}
-+      weston_matrix_transform(&m, &top_left);
-+      weston_matrix_transform(&m, &bottom_right);
--static void
--update_scale(struct ivi_layout_layer *ivilayer,
--           struct ivi_layout_surface *ivisurf)
--{
--      struct weston_view *view;
--      struct weston_matrix *matrix = &ivisurf->scaling.matrix;
--      float sx = 0.0f;
--      float sy = 0.0f;
--      float lw = 0.0f;
--      float sw = 0.0f;
--      float lh = 0.0f;
--      float sh = 0.0f;
--
--      wl_list_for_each(view, &ivisurf->surface->views, surface_link) {
--              if (view != NULL) {
--                      break;
--              }
-+      if (top_left.f[0] < bottom_right.f[0]) {
-+              rect_output->x = top_left.f[0];
-+              rect_output->width = bottom_right.f[0] - rect_output->x;
-+      } else {
-+              rect_output->x = bottom_right.f[0];
-+              rect_output->width = top_left.f[0] - rect_output->x;
-       }
--      if (view == NULL) {
--              return;
-+      if (top_left.f[1] < bottom_right.f[1]) {
-+              rect_output->y = top_left.f[1];
-+              rect_output->height = bottom_right.f[1] - rect_output->y;
-+      } else {
-+              rect_output->y = bottom_right.f[1];
-+              rect_output->height = top_left.f[1] - rect_output->y;
-       }
--      if (ivisurf->prop.source_width == 0 || ivisurf->prop.source_height == 0) {
--              weston_log("ivi-shell: source rectangle is not yet set by ivi_layout_surface_set_source_rectangle\n");
--              return;
--      }
-+      ivi_rectangle_intersect(rect_output, boundingbox, rect_output);
-+}
--      if (ivisurf->prop.dest_width == 0 || ivisurf->prop.dest_height == 0) {
--              weston_log("ivi-shell: destination rectangle is not yet set by ivi_layout_surface_set_destination_rectangle\n");
--              return;
--      }
-+/**
-+ * This computes the whole transformation matrix:m from surface-local
-+ * coordinates to global coordinates. It is assumed that
-+ * weston_view::geometry.{x,y} are zero.
-+ *
-+ * Additionally, this computes the mask on surface-local coordinates as a
-+ * ivi_rectangle. This can be set to weston_view_set_mask.
-+ *
-+ * The mask is computed by following steps
-+ * - destination rectangle of layer is inversed to surface-local cooodinates
-+ *   by inversed matrix:m.
-+ * - the area is intersected by intersected area between weston_surface and
-+ *   source rectangle of ivi_surface.
-+ */
-+static void
-+calc_surface_to_global_matrix_and_mask_to_weston_surface(
-+      struct ivi_layout_layer *ivilayer,
-+      struct ivi_layout_surface *ivisurf,
-+      struct weston_matrix *m,
-+      struct ivi_rectangle *result)
-+{
-+      const struct ivi_layout_surface_properties *sp = &ivisurf->prop;
-+      const struct ivi_layout_layer_properties *lp = &ivilayer->prop;
-+      struct ivi_rectangle weston_surface_rect = { 0,
-+                                                   0,
-+                                                   ivisurf->surface->width,
-+                                                   ivisurf->surface->height };
-+      struct ivi_rectangle surface_source_rect = { sp->source_x,
-+                                                   sp->source_y,
-+                                                   sp->source_width,
-+                                                   sp->source_height };
-+      struct ivi_rectangle surface_dest_rect =   { sp->dest_x,
-+                                                   sp->dest_y,
-+                                                   sp->dest_width,
-+                                                   sp->dest_height };
-+      struct ivi_rectangle layer_source_rect =   { lp->source_x,
-+                                                   lp->source_y,
-+                                                   lp->source_width,
-+                                                   lp->source_height };
-+      struct ivi_rectangle layer_dest_rect =     { lp->dest_x,
-+                                                   lp->dest_y,
-+                                                   lp->dest_width,
-+                                                   lp->dest_height };
-+      struct ivi_rectangle surface_result;
--      lw = ((float)ivilayer->prop.dest_width  / (float)ivilayer->prop.source_width );
--      sw = ((float)ivisurf->prop.dest_width   / (float)ivisurf->prop.source_width  );
--      lh = ((float)ivilayer->prop.dest_height / (float)ivilayer->prop.source_height);
--      sh = ((float)ivisurf->prop.dest_height  / (float)ivisurf->prop.source_height );
--      sx = sw * lw;
--      sy = sh * lh;
-+      /*
-+       * the whole transformation matrix:m from surface-local
-+       * coordinates to global coordinates, which is computed by
-+       * two steps,
-+       * - surface-local coordinates to layer-local coordinates
-+       * - layer-local coordinates to global coordinates
-+       */
-+      calc_transformation_matrix(&surface_source_rect,
-+                                 &surface_dest_rect,
-+                                 sp->orientation, m);
--      wl_list_remove(&ivisurf->scaling.link);
--      weston_matrix_init(matrix);
--      weston_matrix_scale(matrix, sx, sy, 1.0f);
-+      calc_transformation_matrix(&layer_source_rect,
-+                                 &layer_dest_rect,
-+                                 lp->orientation, m);
--      wl_list_insert(&view->geometry.transformation_list,
--                     &ivisurf->scaling.link);
-+      /* this intersected ivi_rectangle would be used for masking
-+       * weston_surface
-+       */
-+      ivi_rectangle_intersect(&surface_source_rect, &weston_surface_rect,
-+                              &surface_result);
--      weston_view_set_transform_parent(view, NULL);
--      weston_view_update_transform(view);
-+      /* calc masking area of weston_surface from m */
-+      calc_inverse_matrix_transform(m,
-+                                    &layer_dest_rect,
-+                                    &surface_result,
-+                                    result);
- }
- static void
- update_prop(struct ivi_layout_layer *ivilayer,
-           struct ivi_layout_surface *ivisurf)
- {
--      if (ivilayer->event_mask | ivisurf->event_mask) {
--              struct weston_view *tmpview;
--              update_opacity(ivilayer, ivisurf);
--              update_layer_orientation(ivilayer, ivisurf);
--              update_layer_position(ivilayer, ivisurf);
--              update_surface_position(ivisurf);
--              update_surface_orientation(ivilayer, ivisurf);
--              update_scale(ivilayer, ivisurf);
-+      struct weston_view *tmpview;
-+      struct ivi_rectangle r;
-+      bool can_calc = true;
--              ivisurf->update_count++;
-+      if (!ivilayer->event_mask && !ivisurf->event_mask) {
-+              return;
-+      }
--              wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) {
--                      if (tmpview != NULL) {
--                              break;
--                      }
--              }
-+      update_opacity(ivilayer, ivisurf);
-+      wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) {
-               if (tmpview != NULL) {
--                      weston_view_geometry_dirty(tmpview);
-+                      break;
-               }
-+      }
--              if (ivisurf->surface != NULL) {
--                      weston_surface_damage(ivisurf->surface);
-+      if (ivisurf->prop.source_width == 0 || ivisurf->prop.source_height == 0) {
-+              weston_log("ivi-shell: source rectangle is not yet set by ivi_layout_surface_set_source_rectangle\n");
-+              can_calc = false;
-+      }
-+
-+      if (ivisurf->prop.dest_width == 0 || ivisurf->prop.dest_height == 0) {
-+              weston_log("ivi-shell: destination rectangle is not yet set by ivi_layout_surface_set_destination_rectangle\n");
-+              can_calc = false;
-+      }
-+
-+      if (can_calc) {
-+              wl_list_remove(&ivisurf->transform.link);
-+              weston_matrix_init(&ivisurf->transform.matrix);
-+
-+              calc_surface_to_global_matrix_and_mask_to_weston_surface(
-+                      ivilayer, ivisurf, &ivisurf->transform.matrix, &r);
-+
-+              if (tmpview != NULL) {
-+                      weston_view_set_mask(tmpview, r.x, r.y, r.width, r.height);
-+                      wl_list_insert(&tmpview->geometry.transformation_list,
-+                                     &ivisurf->transform.link);
-+
-+                      weston_view_set_transform_parent(tmpview, NULL);
-               }
-       }
-+
-+      ivisurf->update_count++;
-+
-+      if (tmpview != NULL) {
-+              weston_view_geometry_dirty(tmpview);
-+      }
-+
-+      if (ivisurf->surface != NULL) {
-+              weston_surface_damage(ivisurf->surface);
-+      }
- }
- static void
-@@ -810,7 +819,7 @@ commit_surface_list(struct ivi_layout *layout)
-       int32_t configured = 0;
-       wl_list_for_each(ivisurf, &layout->surface_list, link) {
--              if(ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEFAULT) {
-+              if (ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEFAULT) {
-                       dest_x = ivisurf->prop.dest_x;
-                       dest_y = ivisurf->prop.dest_y;
-                       dest_width = ivisurf->prop.dest_width;
-@@ -823,7 +832,7 @@ commit_surface_list(struct ivi_layout *layout)
-                                                              ivisurf->pending.prop.dest_height,
-                                                              ivisurf->pending.prop.transition_duration);
--                      if(ivisurf->pending.prop.visibility) {
-+                      if (ivisurf->pending.prop.visibility) {
-                               ivi_layout_transition_visibility_on(ivisurf, ivisurf->pending.prop.transition_duration);
-                       } else {
-                               ivi_layout_transition_visibility_off(ivisurf, ivisurf->pending.prop.transition_duration);
-@@ -837,7 +846,7 @@ commit_surface_list(struct ivi_layout *layout)
-                       ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE;
-                       ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE;
--              } else if(ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEST_RECT_ONLY){
-+              } else if (ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEST_RECT_ONLY) {
-                       dest_x = ivisurf->prop.dest_x;
-                       dest_y = ivisurf->prop.dest_y;
-                       dest_width = ivisurf->prop.dest_width;
-@@ -859,9 +868,9 @@ commit_surface_list(struct ivi_layout *layout)
-                       ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE;
-                       ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE;
--              } else if(ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY){
-+              } else if (ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY) {
-                       configured = 0;
--                      if(ivisurf->pending.prop.visibility) {
-+                      if (ivisurf->pending.prop.visibility) {
-                               ivi_layout_transition_visibility_on(ivisurf, ivisurf->pending.prop.transition_duration);
-                       } else {
-                               ivi_layout_transition_visibility_off(ivisurf, ivisurf->pending.prop.transition_duration);
-@@ -903,9 +912,9 @@ commit_layer_list(struct ivi_layout *layout)
-       struct ivi_layout_surface *next     = NULL;
-       wl_list_for_each(ivilayer, &layout->layer_list, link) {
--              if(ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_MOVE) {
-+              if (ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_MOVE) {
-                       ivi_layout_transition_move_layer(ivilayer, ivilayer->pending.prop.dest_x, ivilayer->pending.prop.dest_y, ivilayer->pending.prop.transition_duration);
--              } else if(ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_FADE) {
-+              } else if (ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_FADE) {
-                       ivi_layout_transition_fade_layer(ivilayer,ivilayer->pending.prop.is_fade_in,
-                                                        ivilayer->pending.prop.start_alpha,ivilayer->pending.prop.end_alpha,
-                                                        NULL, NULL,
-@@ -915,53 +924,30 @@ commit_layer_list(struct ivi_layout *layout)
-               ivilayer->prop = ivilayer->pending.prop;
--              if (!(ivilayer->event_mask &
--                    (IVI_NOTIFICATION_ADD | IVI_NOTIFICATION_REMOVE)) ) {
-+              if (!ivilayer->order.dirty) {
-                       continue;
-               }
--              if (ivilayer->event_mask & IVI_NOTIFICATION_REMOVE) {
--                      wl_list_for_each_safe(ivisurf, next,
--                              &ivilayer->order.surface_list, order.link) {
--                              remove_ordersurface_from_layer(ivisurf);
--
--                              if (!wl_list_empty(&ivisurf->order.link)) {
--                                      wl_list_remove(&ivisurf->order.link);
--                              }
--
--                              wl_list_init(&ivisurf->order.link);
--                              ivisurf->event_mask |= IVI_NOTIFICATION_REMOVE;
--                      }
--
--                      wl_list_init(&ivilayer->order.surface_list);
-+              wl_list_for_each_safe(ivisurf, next, &ivilayer->order.surface_list,
-+                                       order.link) {
-+                      remove_ordersurface_from_layer(ivisurf);
-+                      wl_list_remove(&ivisurf->order.link);
-+                      wl_list_init(&ivisurf->order.link);
-+                      ivisurf->event_mask |= IVI_NOTIFICATION_REMOVE;
-               }
--              if (ivilayer->event_mask & IVI_NOTIFICATION_ADD) {
--                      wl_list_for_each_safe(ivisurf, next,
--                                            &ivilayer->order.surface_list, order.link) {
--                              remove_ordersurface_from_layer(ivisurf);
--
--                              if (!wl_list_empty(&ivisurf->order.link)) {
--                                      wl_list_remove(&ivisurf->order.link);
--                              }
--
--                              wl_list_init(&ivisurf->order.link);
--                      }
-+              assert(wl_list_empty(&ivilayer->order.surface_list));
--                      wl_list_init(&ivilayer->order.surface_list);
--                      wl_list_for_each(ivisurf, &ivilayer->pending.surface_list,
-+              wl_list_for_each(ivisurf, &ivilayer->pending.surface_list,
-                                        pending.link) {
--                              if(!wl_list_empty(&ivisurf->order.link)){
--                                      wl_list_remove(&ivisurf->order.link);
--                                      wl_list_init(&ivisurf->order.link);
--                              }
--
--                              wl_list_insert(&ivilayer->order.surface_list,
--                                             &ivisurf->order.link);
--                              add_ordersurface_to_layer(ivisurf, ivilayer);
--                              ivisurf->event_mask |= IVI_NOTIFICATION_ADD;
--                      }
-+                      wl_list_remove(&ivisurf->order.link);
-+                      wl_list_insert(&ivilayer->order.surface_list,
-+                                     &ivisurf->order.link);
-+                      add_ordersurface_to_layer(ivisurf, ivilayer);
-+                      ivisurf->event_mask |= IVI_NOTIFICATION_ADD;
-               }
-+
-+              ivilayer->order.dirty = 0;
-       }
- }
-@@ -974,33 +960,17 @@ commit_screen_list(struct ivi_layout *layout)
-       struct ivi_layout_surface *ivisurf  = NULL;
-       wl_list_for_each(iviscrn, &layout->screen_list, link) {
--              if (iviscrn->event_mask & IVI_NOTIFICATION_REMOVE) {
-+              if (iviscrn->order.dirty) {
-                       wl_list_for_each_safe(ivilayer, next,
-                                             &iviscrn->order.layer_list, order.link) {
-                               remove_orderlayer_from_screen(ivilayer);
--
--                              if (!wl_list_empty(&ivilayer->order.link)) {
--                                  wl_list_remove(&ivilayer->order.link);
--                              }
--
-+                              wl_list_remove(&ivilayer->order.link);
-                               wl_list_init(&ivilayer->order.link);
-                               ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE;
-                       }
--              }
--              if (iviscrn->event_mask & IVI_NOTIFICATION_ADD) {
--                      wl_list_for_each_safe(ivilayer, next,
--                                            &iviscrn->order.layer_list, order.link) {
--                              remove_orderlayer_from_screen(ivilayer);
-+                      assert(wl_list_empty(&iviscrn->order.layer_list));
--                              if (!wl_list_empty(&ivilayer->order.link)) {
--                                      wl_list_remove(&ivilayer->order.link);
--                              }
--
--                              wl_list_init(&ivilayer->order.link);
--                      }
--
--                      wl_list_init(&iviscrn->order.layer_list);
-                       wl_list_for_each(ivilayer, &iviscrn->pending.layer_list,
-                                        pending.link) {
-                               wl_list_insert(&iviscrn->order.layer_list,
-@@ -1008,9 +978,9 @@ commit_screen_list(struct ivi_layout *layout)
-                               add_orderlayer_to_screen(ivilayer, iviscrn);
-                               ivilayer->event_mask |= IVI_NOTIFICATION_ADD;
-                       }
--              }
--              iviscrn->event_mask = 0;
-+                      iviscrn->order.dirty = 0;
-+              }
-               /* Clear view list of layout ivi_layer */
-               wl_list_init(&layout->layout_layer.view_list.link);
-@@ -1046,7 +1016,7 @@ commit_screen_list(struct ivi_layout *layout)
- static void
- commit_transition(struct ivi_layout* layout)
- {
--      if(wl_list_empty(&layout->pending_transition_list)){
-+      if (wl_list_empty(&layout->pending_transition_list)) {
-               return;
-       }
-@@ -1079,11 +1049,13 @@ send_prop(struct ivi_layout *layout)
-       struct ivi_layout_surface *ivisurf  = NULL;
-       wl_list_for_each_reverse(ivilayer, &layout->layer_list, link) {
--              send_layer_prop(ivilayer);
-+              if (ivilayer->event_mask)
-+                      send_layer_prop(ivilayer);
-       }
-       wl_list_for_each_reverse(ivisurf, &layout->surface_list, link) {
--              send_surface_prop(ivisurf);
-+              if (ivisurf->event_mask)
-+                      send_surface_prop(ivisurf);
-       }
- }
-@@ -1095,14 +1067,9 @@ clear_surface_pending_list(struct ivi_layout_layer *ivilayer)
-       wl_list_for_each_safe(surface_link, surface_next,
-                             &ivilayer->pending.surface_list, pending.link) {
--              if (!wl_list_empty(&surface_link->pending.link)) {
--                      wl_list_remove(&surface_link->pending.link);
--              }
--
-+              wl_list_remove(&surface_link->pending.link);
-               wl_list_init(&surface_link->pending.link);
-       }
--
--      ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE;
- }
- static void
-@@ -1113,14 +1080,9 @@ clear_surface_order_list(struct ivi_layout_layer *ivilayer)
-       wl_list_for_each_safe(surface_link, surface_next,
-                             &ivilayer->order.surface_list, order.link) {
--              if (!wl_list_empty(&surface_link->order.link)) {
--                      wl_list_remove(&surface_link->order.link);
--              }
--
-+              wl_list_remove(&surface_link->order.link);
-               wl_list_init(&surface_link->order.link);
-       }
--
--      ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE;
- }
- static void
-@@ -1287,9 +1249,7 @@ remove_notification(struct wl_list *listener_list, void *callback, void *userdat
-                       continue;
-               }
--              if (!wl_list_empty(&listener->link)) {
--                      wl_list_remove(&listener->link);
--              }
-+              wl_list_remove(&listener->link);
-               free(notification->userdata);
-               free(notification);
-@@ -1480,6 +1440,12 @@ ivi_layout_get_id_of_layer(struct ivi_layout_layer *ivilayer)
-       return ivilayer->id_layer;
- }
-+static uint32_t
-+ivi_layout_get_id_of_screen(struct ivi_layout_screen *iviscrn)
-+{
-+      return iviscrn->id_screen;
-+}
-+
- static struct ivi_layout_layer *
- ivi_layout_get_layer_from_id(uint32_t id_layer)
- {
-@@ -1531,7 +1497,7 @@ ivi_layout_get_screen_resolution(struct ivi_layout_screen *iviscrn,
- {
-       struct weston_output *output = NULL;
--      if (pWidth == NULL || pHeight == NULL) {
-+      if (iviscrn == NULL || pWidth == NULL || pHeight == NULL) {
-               weston_log("ivi_layout_get_screen_resolution: invalid argument\n");
-               return IVI_FAILED;
-       }
-@@ -1605,7 +1571,7 @@ ivi_layout_get_screens(int32_t *pLength, struct ivi_layout_screen ***ppArray)
-       length = wl_list_length(&layout->screen_list);
--      if (length != 0){
-+      if (length != 0) {
-               /* the Array must be free by module which called this function */
-               *ppArray = calloc(length, sizeof(struct ivi_layout_screen *));
-               if (*ppArray == NULL) {
-@@ -1639,7 +1605,7 @@ ivi_layout_get_screens_under_layer(struct ivi_layout_layer *ivilayer,
-       length = wl_list_length(&ivilayer->screen_list);
--      if (length != 0){
-+      if (length != 0) {
-               /* the Array must be free by module which called this function */
-               *ppArray = calloc(length, sizeof(struct ivi_layout_screen *));
-               if (*ppArray == NULL) {
-@@ -1672,7 +1638,7 @@ ivi_layout_get_layers(int32_t *pLength, struct ivi_layout_layer ***ppArray)
-       length = wl_list_length(&layout->layer_list);
--      if (length != 0){
-+      if (length != 0) {
-               /* the Array must be free by module which called this function */
-               *ppArray = calloc(length, sizeof(struct ivi_layout_layer *));
-               if (*ppArray == NULL) {
-@@ -1706,7 +1672,7 @@ ivi_layout_get_layers_on_screen(struct ivi_layout_screen *iviscrn,
-       length = wl_list_length(&iviscrn->order.layer_list);
--      if (length != 0){
-+      if (length != 0) {
-               /* the Array must be free by module which called this function */
-               *ppArray = calloc(length, sizeof(struct ivi_layout_layer *));
-               if (*ppArray == NULL) {
-@@ -1714,7 +1680,7 @@ ivi_layout_get_layers_on_screen(struct ivi_layout_screen *iviscrn,
-                       return IVI_FAILED;
-               }
--              wl_list_for_each(ivilayer, &iviscrn->order.layer_list, link) {
-+              wl_list_for_each(ivilayer, &iviscrn->order.layer_list, order.link) {
-                       (*ppArray)[n++] = ivilayer;
-               }
-       }
-@@ -1740,7 +1706,7 @@ ivi_layout_get_layers_under_surface(struct ivi_layout_surface *ivisurf,
-       length = wl_list_length(&ivisurf->layer_list);
--      if (length != 0){
-+      if (length != 0) {
-               /* the Array must be free by module which called this function */
-               *ppArray = calloc(length, sizeof(struct ivi_layout_layer *));
-               if (*ppArray == NULL) {
-@@ -1774,7 +1740,7 @@ ivi_layout_get_surfaces(int32_t *pLength, struct ivi_layout_surface ***ppArray)
-       length = wl_list_length(&layout->surface_list);
--      if (length != 0){
-+      if (length != 0) {
-               /* the Array must be free by module which called this function */
-               *ppArray = calloc(length, sizeof(struct ivi_layout_surface *));
-               if (*ppArray == NULL) {
-@@ -1836,6 +1802,7 @@ ivi_layout_layer_create_with_dimension(uint32_t id_layer,
-       ivilayer = get_layer(&layout->layer_list, id_layer);
-       if (ivilayer != NULL) {
-               weston_log("id_layer is already created\n");
-+              ++ivilayer->ref_count;
-               return ivilayer;
-       }
-@@ -1845,7 +1812,7 @@ ivi_layout_layer_create_with_dimension(uint32_t id_layer,
-               return NULL;
-       }
--      wl_list_init(&ivilayer->link);
-+      ivilayer->ref_count = 1;
-       wl_signal_init(&ivilayer->property_changed);
-       wl_list_init(&ivilayer->screen_list);
-       wl_list_init(&ivilayer->link_to_surface);
-@@ -1881,7 +1848,20 @@ ivi_layout_layer_remove_notification(struct ivi_layout_layer *ivilayer)
- }
- static void
--ivi_layout_layer_remove(struct ivi_layout_layer *ivilayer)
-+ivi_layout_layer_remove_notification_by_callback(struct ivi_layout_layer *ivilayer,
-+                                               layer_property_notification_func callback,
-+                                               void *userdata)
-+{
-+      if (ivilayer == NULL) {
-+              weston_log("ivi_layout_layer_remove_notification_by_callback: invalid argument\n");
-+              return;
-+      }
-+
-+      remove_notification(&ivilayer->property_changed.listener_list, callback, userdata);
-+}
-+
-+static void
-+ivi_layout_layer_destroy(struct ivi_layout_layer *ivilayer)
- {
-       struct ivi_layout *layout = get_instance();
-@@ -1890,20 +1870,18 @@ ivi_layout_layer_remove(struct ivi_layout_layer *ivilayer)
-               return;
-       }
-+      if (--ivilayer->ref_count > 0)
-+              return;
-+
-       wl_signal_emit(&layout->layer_notification.removed, ivilayer);
-       clear_surface_pending_list(ivilayer);
-       clear_surface_order_list(ivilayer);
--      if (!wl_list_empty(&ivilayer->pending.link)) {
--              wl_list_remove(&ivilayer->pending.link);
--      }
--      if (!wl_list_empty(&ivilayer->order.link)) {
--              wl_list_remove(&ivilayer->order.link);
--      }
--      if (!wl_list_empty(&ivilayer->link)) {
--              wl_list_remove(&ivilayer->link);
--      }
-+      wl_list_remove(&ivilayer->pending.link);
-+      wl_list_remove(&ivilayer->order.link);
-+      wl_list_remove(&ivilayer->link);
-+
-       remove_orderlayer_from_screen(ivilayer);
-       remove_link_to_surface(ivilayer);
-       ivi_layout_layer_remove_notification(ivilayer);
-@@ -1925,7 +1903,10 @@ ivi_layout_layer_set_visibility(struct ivi_layout_layer *ivilayer,
-       prop = &ivilayer->pending.prop;
-       prop->visibility = newVisibility;
--      ivilayer->event_mask |= IVI_NOTIFICATION_VISIBILITY;
-+      if (ivilayer->prop.visibility != newVisibility)
-+              ivilayer->event_mask |= IVI_NOTIFICATION_VISIBILITY;
-+      else
-+              ivilayer->event_mask &= ~IVI_NOTIFICATION_VISIBILITY;
-       return IVI_SUCCEEDED;
- }
-@@ -1947,7 +1928,9 @@ ivi_layout_layer_set_opacity(struct ivi_layout_layer *ivilayer,
- {
-       struct ivi_layout_layer_properties *prop = NULL;
--      if (ivilayer == NULL) {
-+      if (ivilayer == NULL ||
-+          opacity < wl_fixed_from_double(0.0) ||
-+          wl_fixed_from_double(1.0) < opacity) {
-               weston_log("ivi_layout_layer_set_opacity: invalid argument\n");
-               return IVI_FAILED;
-       }
-@@ -1955,7 +1938,10 @@ ivi_layout_layer_set_opacity(struct ivi_layout_layer *ivilayer,
-       prop = &ivilayer->pending.prop;
-       prop->opacity = opacity;
--      ivilayer->event_mask |= IVI_NOTIFICATION_OPACITY;
-+      if (ivilayer->prop.opacity != opacity)
-+              ivilayer->event_mask |= IVI_NOTIFICATION_OPACITY;
-+      else
-+              ivilayer->event_mask &= ~IVI_NOTIFICATION_OPACITY;
-       return IVI_SUCCEEDED;
- }
-@@ -1989,7 +1975,12 @@ ivi_layout_layer_set_source_rectangle(struct ivi_layout_layer *ivilayer,
-       prop->source_width = width;
-       prop->source_height = height;
--      ivilayer->event_mask |= IVI_NOTIFICATION_SOURCE_RECT;
-+      if (ivilayer->prop.source_x != x || ivilayer->prop.source_y != y ||
-+          ivilayer->prop.source_width != width ||
-+          ivilayer->prop.source_height != height)
-+              ivilayer->event_mask |= IVI_NOTIFICATION_SOURCE_RECT;
-+      else
-+              ivilayer->event_mask &= ~IVI_NOTIFICATION_SOURCE_RECT;
-       return IVI_SUCCEEDED;
- }
-@@ -2012,7 +2003,12 @@ ivi_layout_layer_set_destination_rectangle(struct ivi_layout_layer *ivilayer,
-       prop->dest_width = width;
-       prop->dest_height = height;
--      ivilayer->event_mask |= IVI_NOTIFICATION_DEST_RECT;
-+      if (ivilayer->prop.dest_x != x || ivilayer->prop.dest_y != y ||
-+          ivilayer->prop.dest_width != width ||
-+          ivilayer->prop.dest_height != height)
-+              ivilayer->event_mask |= IVI_NOTIFICATION_DEST_RECT;
-+      else
-+              ivilayer->event_mask &= ~IVI_NOTIFICATION_DEST_RECT;
-       return IVI_SUCCEEDED;
- }
-@@ -2048,7 +2044,11 @@ ivi_layout_layer_set_dimension(struct ivi_layout_layer *ivilayer,
-       prop->dest_width  = dest_width;
-       prop->dest_height = dest_height;
--      ivilayer->event_mask |= IVI_NOTIFICATION_DIMENSION;
-+      if (ivilayer->prop.dest_width != dest_width ||
-+          ivilayer->prop.dest_height != dest_height)
-+              ivilayer->event_mask |= IVI_NOTIFICATION_DIMENSION;
-+      else
-+              ivilayer->event_mask &= ~IVI_NOTIFICATION_DIMENSION;
-       return IVI_SUCCEEDED;
- }
-@@ -2083,7 +2083,10 @@ ivi_layout_layer_set_position(struct ivi_layout_layer *ivilayer,
-       prop->dest_x = dest_x;
-       prop->dest_y = dest_y;
--      ivilayer->event_mask |= IVI_NOTIFICATION_POSITION;
-+      if (ivilayer->prop.dest_x != dest_x || ivilayer->prop.dest_y != dest_y)
-+              ivilayer->event_mask |= IVI_NOTIFICATION_POSITION;
-+      else
-+              ivilayer->event_mask &= ~IVI_NOTIFICATION_POSITION;
-       return IVI_SUCCEEDED;
- }
-@@ -2102,7 +2105,10 @@ ivi_layout_layer_set_orientation(struct ivi_layout_layer *ivilayer,
-       prop = &ivilayer->pending.prop;
-       prop->orientation = orientation;
--      ivilayer->event_mask |= IVI_NOTIFICATION_ORIENTATION;
-+      if (ivilayer->prop.orientation != orientation)
-+              ivilayer->event_mask |= IVI_NOTIFICATION_ORIENTATION;
-+      else
-+              ivilayer->event_mask &= ~IVI_NOTIFICATION_ORIENTATION;
-       return IVI_SUCCEEDED;
- }
-@@ -2134,17 +2140,7 @@ ivi_layout_layer_set_render_order(struct ivi_layout_layer *ivilayer,
-               return IVI_FAILED;
-       }
--      if (pSurface == NULL) {
--              wl_list_for_each_safe(ivisurf, next, &ivilayer->pending.surface_list, pending.link) {
--                      if (!wl_list_empty(&ivisurf->pending.link)) {
--                              wl_list_remove(&ivisurf->pending.link);
--                      }
--
--                      wl_list_init(&ivisurf->pending.link);
--              }
--              ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE;
--              return IVI_SUCCEEDED;
--      }
-+      clear_surface_pending_list(ivilayer);
-       for (i = 0; i < number; i++) {
-               id_surface = &pSurface[i]->id_surface;
-@@ -2154,17 +2150,14 @@ ivi_layout_layer_set_render_order(struct ivi_layout_layer *ivilayer,
-                               continue;
-                       }
--                      if (!wl_list_empty(&ivisurf->pending.link)) {
--                              wl_list_remove(&ivisurf->pending.link);
--                      }
--                      wl_list_init(&ivisurf->pending.link);
-+                      wl_list_remove(&ivisurf->pending.link);
-                       wl_list_insert(&ivilayer->pending.surface_list,
-                                      &ivisurf->pending.link);
-                       break;
-               }
-       }
--      ivilayer->event_mask |= IVI_NOTIFICATION_ADD;
-+      ivilayer->order.dirty = 1;
-       return IVI_SUCCEEDED;
- }
-@@ -2183,7 +2176,10 @@ ivi_layout_surface_set_visibility(struct ivi_layout_surface *ivisurf,
-       prop = &ivisurf->pending.prop;
-       prop->visibility = newVisibility;
--      ivisurf->event_mask |= IVI_NOTIFICATION_VISIBILITY;
-+      if (ivisurf->prop.visibility != newVisibility)
-+              ivisurf->event_mask |= IVI_NOTIFICATION_VISIBILITY;
-+      else
-+              ivisurf->event_mask &= ~IVI_NOTIFICATION_VISIBILITY;
-       return IVI_SUCCEEDED;
- }
-@@ -2205,7 +2201,9 @@ ivi_layout_surface_set_opacity(struct ivi_layout_surface *ivisurf,
- {
-       struct ivi_layout_surface_properties *prop = NULL;
--      if (ivisurf == NULL) {
-+      if (ivisurf == NULL ||
-+          opacity < wl_fixed_from_double(0.0) ||
-+          wl_fixed_from_double(1.0) < opacity) {
-               weston_log("ivi_layout_surface_set_opacity: invalid argument\n");
-               return IVI_FAILED;
-       }
-@@ -2213,7 +2211,10 @@ ivi_layout_surface_set_opacity(struct ivi_layout_surface *ivisurf,
-       prop = &ivisurf->pending.prop;
-       prop->opacity = opacity;
--      ivisurf->event_mask |= IVI_NOTIFICATION_OPACITY;
-+      if (ivisurf->prop.opacity != opacity)
-+              ivisurf->event_mask |= IVI_NOTIFICATION_OPACITY;
-+      else
-+              ivisurf->event_mask &= ~IVI_NOTIFICATION_OPACITY;
-       return IVI_SUCCEEDED;
- }
-@@ -2251,7 +2252,12 @@ ivi_layout_surface_set_destination_rectangle(struct ivi_layout_surface *ivisurf,
-       prop->dest_width = width;
-       prop->dest_height = height;
--      ivisurf->event_mask |= IVI_NOTIFICATION_DEST_RECT;
-+      if (ivisurf->prop.dest_x != x || ivisurf->prop.dest_y != y ||
-+          ivisurf->prop.dest_width != width ||
-+          ivisurf->prop.dest_height != height)
-+              ivisurf->event_mask |= IVI_NOTIFICATION_DEST_RECT;
-+      else
-+              ivisurf->event_mask &= ~IVI_NOTIFICATION_DEST_RECT;
-       return IVI_SUCCEEDED;
- }
-@@ -2271,7 +2277,11 @@ ivi_layout_surface_set_dimension(struct ivi_layout_surface *ivisurf,
-       prop->dest_width  = dest_width;
-       prop->dest_height = dest_height;
--      ivisurf->event_mask |= IVI_NOTIFICATION_DIMENSION;
-+      if (ivisurf->prop.dest_width != dest_width ||
-+          ivisurf->prop.dest_height != dest_height)
-+              ivisurf->event_mask |= IVI_NOTIFICATION_DIMENSION;
-+      else
-+              ivisurf->event_mask &= ~IVI_NOTIFICATION_DIMENSION;
-       return IVI_SUCCEEDED;
- }
-@@ -2306,7 +2316,10 @@ ivi_layout_surface_set_position(struct ivi_layout_surface *ivisurf,
-       prop->dest_x = dest_x;
-       prop->dest_y = dest_y;
--      ivisurf->event_mask |= IVI_NOTIFICATION_POSITION;
-+      if (ivisurf->prop.dest_x != dest_x || ivisurf->prop.dest_y != dest_y)
-+              ivisurf->event_mask |= IVI_NOTIFICATION_POSITION;
-+      else
-+              ivisurf->event_mask &= ~IVI_NOTIFICATION_POSITION;
-       return IVI_SUCCEEDED;
- }
-@@ -2340,7 +2353,10 @@ ivi_layout_surface_set_orientation(struct ivi_layout_surface *ivisurf,
-       prop = &ivisurf->pending.prop;
-       prop->orientation = orientation;
--      ivisurf->event_mask |= IVI_NOTIFICATION_ORIENTATION;
-+      if (ivisurf->prop.orientation != orientation)
-+              ivisurf->event_mask |= IVI_NOTIFICATION_ORIENTATION;
-+      else
-+              ivisurf->event_mask &= ~IVI_NOTIFICATION_ORIENTATION;
-       return IVI_SUCCEEDED;
- }
-@@ -2378,17 +2394,14 @@ ivi_layout_screen_add_layer(struct ivi_layout_screen *iviscrn,
-       wl_list_for_each_safe(ivilayer, next, &layout->layer_list, link) {
-               if (ivilayer->id_layer == addlayer->id_layer) {
--                      if (!wl_list_empty(&ivilayer->pending.link)) {
--                              wl_list_remove(&ivilayer->pending.link);
--                      }
--                      wl_list_init(&ivilayer->pending.link);
-+                      wl_list_remove(&ivilayer->pending.link);
-                       wl_list_insert(&iviscrn->pending.layer_list,
-                                      &ivilayer->pending.link);
-                       break;
-               }
-       }
--      iviscrn->event_mask |= IVI_NOTIFICATION_ADD;
-+      iviscrn->order.dirty = 1;
-       return IVI_SUCCEEDED;
- }
-@@ -2411,23 +2424,11 @@ ivi_layout_screen_set_render_order(struct ivi_layout_screen *iviscrn,
-       wl_list_for_each_safe(ivilayer, next,
-                             &iviscrn->pending.layer_list, pending.link) {
-+              wl_list_remove(&ivilayer->pending.link);
-               wl_list_init(&ivilayer->pending.link);
-       }
--      wl_list_init(&iviscrn->pending.layer_list);
--
--      if (pLayer == NULL) {
--              wl_list_for_each_safe(ivilayer, next, &iviscrn->pending.layer_list, pending.link) {
--                      if (!wl_list_empty(&ivilayer->pending.link)) {
--                              wl_list_remove(&ivilayer->pending.link);
--                      }
--
--                      wl_list_init(&ivilayer->pending.link);
--              }
--
--              iviscrn->event_mask |= IVI_NOTIFICATION_REMOVE;
--              return IVI_SUCCEEDED;
--      }
-+      assert(wl_list_empty(&iviscrn->pending.layer_list));
-       for (i = 0; i < number; i++) {
-               id_layer = &pLayer[i]->id_layer;
-@@ -2436,17 +2437,14 @@ ivi_layout_screen_set_render_order(struct ivi_layout_screen *iviscrn,
-                               continue;
-                       }
--                      if (!wl_list_empty(&ivilayer->pending.link)) {
--                              wl_list_remove(&ivilayer->pending.link);
--                      }
--                      wl_list_init(&ivilayer->pending.link);
-+                      wl_list_remove(&ivilayer->pending.link);
-                       wl_list_insert(&iviscrn->pending.layer_list,
-                                      &ivilayer->pending.link);
-                       break;
-               }
-       }
--      iviscrn->event_mask |= IVI_NOTIFICATION_ADD;
-+      iviscrn->order.dirty = 1;
-       return IVI_SUCCEEDED;
- }
-@@ -2555,17 +2553,14 @@ ivi_layout_layer_add_surface(struct ivi_layout_layer *ivilayer,
-       wl_list_for_each_safe(ivisurf, next, &layout->surface_list, link) {
-               if (ivisurf->id_surface == addsurf->id_surface) {
--                      if (!wl_list_empty(&ivisurf->pending.link)) {
--                              wl_list_remove(&ivisurf->pending.link);
--                      }
--                      wl_list_init(&ivisurf->pending.link);
-+                      wl_list_remove(&ivisurf->pending.link);
-                       wl_list_insert(&ivilayer->pending.surface_list,
-                                      &ivisurf->pending.link);
-                       break;
-               }
-       }
--      ivilayer->event_mask |= IVI_NOTIFICATION_ADD;
-+      ivilayer->order.dirty = 1;
-       return IVI_SUCCEEDED;
- }
-@@ -2585,15 +2580,13 @@ ivi_layout_layer_remove_surface(struct ivi_layout_layer *ivilayer,
-       wl_list_for_each_safe(ivisurf, next,
-                             &ivilayer->pending.surface_list, pending.link) {
-               if (ivisurf->id_surface == remsurf->id_surface) {
--                      if (!wl_list_empty(&ivisurf->pending.link)) {
--                              wl_list_remove(&ivisurf->pending.link);
--                      }
-+                      wl_list_remove(&ivisurf->pending.link);
-                       wl_list_init(&ivisurf->pending.link);
-                       break;
-               }
-       }
--      remsurf->event_mask |= IVI_NOTIFICATION_REMOVE;
-+      ivilayer->order.dirty = 1;
- }
- static int32_t
-@@ -2614,7 +2607,12 @@ ivi_layout_surface_set_source_rectangle(struct ivi_layout_surface *ivisurf,
-       prop->source_width = width;
-       prop->source_height = height;
--      ivisurf->event_mask |= IVI_NOTIFICATION_SOURCE_RECT;
-+      if (ivisurf->prop.source_x != x || ivisurf->prop.source_y != y ||
-+          ivisurf->prop.source_width != width ||
-+          ivisurf->prop.source_height != height)
-+              ivisurf->event_mask |= IVI_NOTIFICATION_SOURCE_RECT;
-+      else
-+              ivisurf->event_mask &= ~IVI_NOTIFICATION_SOURCE_RECT;
-       return IVI_SUCCEEDED;
- }
-@@ -2731,7 +2729,7 @@ ivi_layout_get_weston_view(struct ivi_layout_surface *surface)
- {
-       struct weston_view *tmpview = NULL;
--      if(surface == NULL)
-+      if (surface == NULL)
-               return NULL;
-       wl_list_for_each(tmpview, &surface->surface->views, surface_link)
-@@ -2796,7 +2794,6 @@ ivi_layout_surface_create(struct weston_surface *wl_surface,
-               return NULL;
-       }
--      wl_list_init(&ivisurf->link);
-       wl_signal_init(&ivisurf->property_changed);
-       wl_signal_init(&ivisurf->configured);
-       wl_list_init(&ivisurf->layer_list);
-@@ -2804,10 +2801,6 @@ ivi_layout_surface_create(struct weston_surface *wl_surface,
-       ivisurf->layout = layout;
-       ivisurf->surface = wl_surface;
--      ivisurf->surface_destroy_listener.notify =
--              westonsurface_destroy_from_ivisurface;
--      wl_resource_add_destroy_listener(wl_surface->resource,
--                                       &ivisurf->surface_destroy_listener);
-       tmpview = weston_view_create(wl_surface);
-       if (tmpview == NULL) {
-@@ -2817,17 +2810,8 @@ ivi_layout_surface_create(struct weston_surface *wl_surface,
-       ivisurf->surface->width_from_buffer  = 0;
-       ivisurf->surface->height_from_buffer = 0;
--      weston_matrix_init(&ivisurf->surface_rotation.matrix);
--      weston_matrix_init(&ivisurf->layer_rotation.matrix);
--      weston_matrix_init(&ivisurf->surface_pos.matrix);
--      weston_matrix_init(&ivisurf->layer_pos.matrix);
--      weston_matrix_init(&ivisurf->scaling.matrix);
--
--      wl_list_init(&ivisurf->surface_rotation.link);
--      wl_list_init(&ivisurf->layer_rotation.link);
--      wl_list_init(&ivisurf->surface_pos.link);
--      wl_list_init(&ivisurf->layer_pos.link);
--      wl_list_init(&ivisurf->scaling.link);
-+      weston_matrix_init(&ivisurf->transform.matrix);
-+      wl_list_init(&ivisurf->transform.link);
-       init_surface_properties(&ivisurf->prop);
-       ivisurf->event_mask = 0;
-@@ -2927,7 +2911,7 @@ static struct ivi_controller_interface ivi_controller_interface = {
-       .add_notification_remove_layer          = ivi_layout_add_notification_remove_layer,
-       .remove_notification_remove_layer       = ivi_layout_remove_notification_remove_layer,
-       .layer_create_with_dimension            = ivi_layout_layer_create_with_dimension,
--      .layer_remove                           = ivi_layout_layer_remove,
-+      .layer_destroy                          = ivi_layout_layer_destroy,
-       .get_layers                             = ivi_layout_get_layers,
-       .get_id_of_layer                        = ivi_layout_get_id_of_layer,
-       .get_layer_from_id                      = ivi_layout_get_layer_from_id,
-@@ -2954,7 +2938,7 @@ static struct ivi_controller_interface ivi_controller_interface = {
-       .layer_set_transition                   = ivi_layout_layer_set_transition,
-       /**
--       * screen controller interfaces
-+       * screen controller interfaces part1
-        */
-       .get_screen_from_id             = ivi_layout_get_screen_from_id,
-       .get_screen_resolution          = ivi_layout_get_screen_resolution,
-@@ -2975,6 +2959,17 @@ static struct ivi_controller_interface ivi_controller_interface = {
-        */
-       .surface_get_size               = ivi_layout_surface_get_size,
-       .surface_dump                   = ivi_layout_surface_dump,
-+
-+      /**
-+       * remove notification by callback on property changes of ivi_surface/layer
-+       */
-+      .surface_remove_notification_by_callback        = ivi_layout_surface_remove_notification_by_callback,
-+      .layer_remove_notification_by_callback          = ivi_layout_layer_remove_notification_by_callback,
-+
-+      /**
-+       * screen controller interfaces part2
-+       */
-+      .get_id_of_screen       = ivi_layout_get_id_of_screen
- };
- int
-diff --git a/ivi-shell/ivi-shell.c b/ivi-shell/ivi-shell.c
-index 4a688cc..4c63410 100644
---- a/ivi-shell/ivi-shell.c
-+++ b/ivi-shell/ivi-shell.c
-@@ -1,23 +1,26 @@
- /*
-  * 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.
-+ * Permission is hereby granted, free of charge, to any person obtaining
-+ * a copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sublicense, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-  *
-- * 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.
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial
-+ * portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ * SOFTWARE.
-  */
- /*
-@@ -126,6 +129,22 @@ ivi_shell_surface_configure(struct weston_surface *surface,
-       }
- }
-+static void
-+layout_surface_cleanup(struct ivi_shell_surface *ivisurf)
-+{
-+      assert(ivisurf->layout_surface != NULL);
-+
-+      ivi_layout_surface_destroy(ivisurf->layout_surface);
-+      ivisurf->layout_surface = NULL;
-+
-+      ivisurf->surface->configure = NULL;
-+      ivisurf->surface->configure_private = NULL;
-+      ivisurf->surface = NULL;
-+
-+      // destroy weston_surface destroy signal.
-+      wl_list_remove(&ivisurf->surface_destroy_listener.link);
-+}
-+
- /*
-  * The ivi_surface wl_resource destructor.
-  *
-@@ -135,9 +154,18 @@ static void
- shell_destroy_shell_surface(struct wl_resource *resource)
- {
-       struct ivi_shell_surface *ivisurf = wl_resource_get_user_data(resource);
--      if (ivisurf != NULL) {
--              ivisurf->resource = NULL;
--      }
-+
-+      if (ivisurf == NULL)
-+              return;
-+
-+      assert(ivisurf->resource == resource);
-+
-+      if (ivisurf->layout_surface != NULL)
-+              layout_surface_cleanup(ivisurf);
-+
-+      wl_list_remove(&ivisurf->link);
-+
-+      free(ivisurf);
- }
- /* Gets called through the weston_surface destroy signal. */
-@@ -150,21 +178,8 @@ shell_handle_surface_destroy(struct wl_listener *listener, void *data)
-       assert(ivisurf != NULL);
--      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);
--
--      if (ivisurf->resource != NULL) {
--              wl_resource_set_user_data(ivisurf->resource, NULL);
--              ivisurf->resource = NULL;
--      }
--      free(ivisurf);
--
-+      if (ivisurf->layout_surface != NULL)
-+              layout_surface_cleanup(ivisurf);
- }
- /* Gets called, when a client sends ivi_surface.destroy request. */
-@@ -219,7 +234,7 @@ application_surface_create(struct wl_client *client,
-       layout_surface = ivi_layout_surface_create(weston_surface, id_surface);
-       /* check if id_ivi is already used for wl_surface*/
--      if (layout_surface == NULL){
-+      if (layout_surface == NULL) {
-               wl_resource_post_error(resource,
-                                      IVI_APPLICATION_ERROR_IVI_ID,
-                                      "surface_id is already assigned "
-@@ -338,8 +353,8 @@ shell_destroy(struct wl_listener *listener, void *data)
- }
- static void
--terminate_binding(struct weston_seat *seat, uint32_t time, uint32_t key,
--                void *data)
-+terminate_binding(struct weston_seat *seat, uint32_t time,
-+                uint32_t key, void *data)
- {
-       struct weston_compositor *compositor = data;
-@@ -423,6 +438,8 @@ module_init(struct weston_compositor *compositor,
-       if (input_panel_setup(shell) < 0)
-               goto out_settings;
-+      text_backend_init(compositor);
-+
-       if (wl_global_create(compositor->wl_display,
-                            &ivi_application_interface, 1,
-                            shell, bind_ivi_application) == NULL)
-diff --git a/ivi-shell/ivi-shell.h b/ivi-shell/ivi-shell.h
-index 2f42173..9a05eb2 100644
---- a/ivi-shell/ivi-shell.h
-+++ b/ivi-shell/ivi-shell.h
-@@ -1,23 +1,26 @@
- /*
-  * 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.
-+ * Permission is hereby granted, free of charge, to any person obtaining
-+ * a copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sublicense, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-  *
-- * 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.
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial
-+ * portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ * SOFTWARE.
-  */
- #include <stdbool.h>
-@@ -32,6 +35,8 @@ struct ivi_shell
-       struct wl_list ivi_surface_list; /* struct ivi_shell_surface::link */
-+      struct text_backend *text_backend;
-+
-       struct wl_listener show_input_panel_listener;
-       struct wl_listener hide_input_panel_listener;
-       struct wl_listener update_input_panel_listener;
--- 
-1.8.3.1
-
@@ -2,8 +2,7 @@ FILESEXTRAPATHS_prepend := ":${THISDIR}/weston-ivi-shell:"
 
 
 SRC_URI_append = " \
-                  file://0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.8.0.patch \
-                  file://0002-IVI-Shell-use-primary-screen-for-resolution.patch \
+                  file://0001-IVI-Shell-use-primary-screen-for-resolution.patch \
                  "
 
 EXTRA_OECONF_append = " --enable-ivi-shell"