summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan-Simon Möller <jsmoeller@linuxfoundation.org>2018-04-24 15:13:18 +0200
committerJan-Simon Möller <jsmoeller@linuxfoundation.org>2018-04-28 00:28:55 +0200
commit4ac99c3a1447119363935fb986f5d9c05f032362 (patch)
treed4fdce1f65606af5111e6e4d5d21b198de9f2bf2
parentbb0882c5dad030f676e424265ebcd869bb3ff899 (diff)
2nd part of the layer/profile rework [1/2]
Main goal of this is to move the agl-service-* bindings into the core and to unify common recipes like wayland/weston into meta-agl-profile-graphical. As a placeholder for recipes is meta-agl-profile-demo which are being reshuffled. TLDR: agl-service move to meta-agl-profile-core. wayland/weston moves to meta-agl-profile-graphical. This patchset needs the 2nd patchset of the series to build (meta-agl-demo). Bug-AGL: SPEC-145 , SPEC-876 , SPEC-877 v2: rebase including udiscs patches from meta-agl-demo Change-Id: I5e33f72d01707fa8b826d382bccaca3addcbbc47 Signed-off-by: Jan-Simon Möller <jsmoeller@linuxfoundation.org>
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb18
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb17
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb17
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb18
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-gps/agl-service-gps_git.bb18
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb17
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb18
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb18
-rwxr-xr-xmeta-agl-profile-core/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb17
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb17
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-radio/agl-service-radio_git.bb20
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb19
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-steering-wheel/agl-service-steering-wheel_0.1.bb15
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb19
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-weather/agl-service-weather_git.bb18
-rw-r--r--meta-agl-profile-core/recipes-apis/agl-service-wifi/agl-service-wifi_git.bb15
-rw-r--r--meta-agl-profile-core/recipes-apis/high-level-viwi-service/high-level-viwi-service.bb19
-rw-r--r--meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch45
-rw-r--r--meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++_0.9.0.bbappend2
-rw-r--r--meta-agl-profile-core/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch45
-rw-r--r--meta-agl-profile-core/recipes-core/dbus/libdbus-c++_0.9.0.bbappend2
-rw-r--r--meta-agl-profile-core/recipes-extended/gperf/gperf_%.bbappend1
-rw-r--r--meta-agl-profile-core/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch40
-rw-r--r--meta-agl-profile-core/recipes-multimedia/libmp4v2/libmp4v2_git.bb18
-rw-r--r--meta-agl-profile-core/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend10
-rw-r--r--meta-agl-profile-core/recipes-support/opencv/opencv_3.3.bbappend1
-rw-r--r--meta-agl-profile-core/recipes-support/udisks/files/automount.service9
-rwxr-xr-xmeta-agl-profile-core/recipes-support/udisks/files/automount.sh19
-rw-r--r--meta-agl-profile-core/recipes-support/udisks/files/org.freedesktop.UDisks.conf32
-rw-r--r--meta-agl-profile-core/recipes-support/udisks/files/udisks.service11
-rw-r--r--meta-agl-profile-core/recipes-support/udisks/udisks_1.0.5.bbappend28
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-agl.bb16
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-automotive.bb16
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-connectivity.bb28
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-graphics.bb17
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-multimedia.bb15
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-native.bb17
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-navi-lbs.bb17
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-security.bb16
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-speech-services.bb16
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-web.bb16
-rw-r--r--meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw.bb25
-rw-r--r--meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5/0001_fix_compile_issue_when_using_in_c++.patch23
-rw-r--r--meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend7
-rw-r--r--meta-agl-profile-demo/recipes-connectivity/libnfc/libnfc_git.bb18
-rw-r--r--meta-agl-profile-demo/recipes-kernel/mocca-usb/mocca-usb.bb22
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch472
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch26
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/files/0004-most-video-set-device_caps.patch25
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch25
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch186
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/files/0007-dim2-use-device-tree.patch378
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch92
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch47
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/most.bb14
-rw-r--r--meta-agl-profile-demo/recipes-kernel/most/most.bbappend12
-rw-r--r--meta-agl-profile-demo/recipes-qt/.gitkeep0
-rw-r--r--meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-appfw-native-qt5.bb32
-rw-r--r--meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-demo-qt-examples.bb26
-rw-r--r--meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bbappend23
-rw-r--r--meta-agl-profile-demo/recipes-qt/qml-execscript-plugin/qml-execscript-plugin_1.0.bb25
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtbase-native_git.bbappend3
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch30
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtbase_%.bbappend16
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch80
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia_%.bbappend7
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtsystems_%.bbappend3
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-Implement-initial-IVI-shell-support-with-shell-integ.patch693
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch56
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-Fix-multiple-QWindow.patch62
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch34
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch33
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch468
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch1029
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch772
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch128
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0021-Implement-initial-IVI-Shell-support.patch539
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0099_qtwayland_no_evdev.patch14
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch31
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland/disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch12
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwayland_%.bbappend36
-rw-r--r--meta-agl-profile-demo/recipes-qt/qt5/qtwebkit_%.bbappend1
-rw-r--r--meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/cmake-find-gtest.patch22
-rw-r--r--meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/test-path.patch55
-rw-r--r--meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension_1.1%.bbappend27
-rw-r--r--meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf.bbappend15
-rw-r--r--meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf/virtualoutput.cfg7
-rw-r--r--meta-agl-profile-graphical/recipes-graphics/wayland/weston_%.bbappend1
-rw-r--r--meta-agl-profile-graphical/recipes-sdl/packagegroups/packagegroup-agl-smartdevicelink.bb17
89 files changed, 6406 insertions, 0 deletions
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb
new file mode 100644
index 000000000..da0e80919
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Bluetooth Service Binding"
+DESCRIPTION = "AGL Bluetooth Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-bluetooth"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-bluetooth;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "glib-2.0 json-c"
+RDEPENDS_${PN} = "agl-service-data-persistence"
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb
new file mode 100644
index 000000000..488c9ea05
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "AGL low level user database binding"
+HOMEPAGE = "https://github.com/iotbzh/agl-identity"
+SECTION = "base"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8089a3c40cff9caffd1b9ba5aa3dfd67"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-data-persistence;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+inherit cmake aglwgt pkgconfig
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS += " af-binder json-c gdbm "
+
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb
new file mode 100644
index 000000000..1f93877dd
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb
@@ -0,0 +1,17 @@
+SUMMARY = "GeoClue Service Binding"
+DESCRIPTION = "AGL GeoClue Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-geoclue"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-geoclue;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c geoclue"
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb
new file mode 100644
index 000000000..a6b57ae94
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Geofence Service Binding"
+DESCRIPTION = "AGL Geofence Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-geofence"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-geofence;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c"
+RDEPENDS_${PN} = "agl-service-gps"
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-gps/agl-service-gps_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-gps/agl-service-gps_git.bb
new file mode 100644
index 000000000..d1fee9ddb
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-gps/agl-service-gps_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "GPS/GNSS Service Binding"
+DESCRIPTION = "AGL GPS/GNSS Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-gps"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-gps;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c gpsd"
+RDEPENDS_${PN} = "libgps"
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb
new file mode 100644
index 000000000..298374aab
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "AGL identity agent binding"
+HOMEPAGE = "https://gitlab.com/iotbzh/aia-binding"
+SECTION = "base"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-identity-agent;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+PV = "1.0+git${SRCPV}"
+
+inherit cmake aglwgt pkgconfig
+
+S = "${WORKDIR}/git"
+
+DEPENDS = "curl af-binder json-c systemd"
+
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb
new file mode 100644
index 000000000..c5cf71c12
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Mediaplayer Service Binding"
+DESCRIPTION = "AGL Mediaplayer Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-mediaplayer"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-mediaplayer;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c gstreamer1.0 gstreamer1.0-plugins-base"
+RDEPENDS_${PN} = "agl-service-mediascanner gstreamer1.0-plugins-bad-waylandsink"
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb
new file mode 100644
index 000000000..c1f00015f
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Mediascanner Service Binding"
+DESCRIPTION = "AGL Mediascanner Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-mediascanner"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-mediascanner;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c sqlite3"
+RDEPENDS_${PN} = "lightmediascanner"
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb
new file mode 100755
index 000000000..0c245b3e0
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Navigation Service Binding"
+DESCRIPTION = "AGL Navigation Service API Binding"
+HOMEPAGE = "https://github.com/AGLExport/agl-service-navigation"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://github.com/AGLExport/agl-service-navigation;protocol=git;branch=master"
+SRCREV = "1f1ffc92fcc882aa5e885badbc91a3384f5d77b1"
+
+PV = "0.1+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = " json-c libdbus-c++ "
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb
new file mode 100644
index 000000000..2862da070
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb
@@ -0,0 +1,17 @@
+SUMMARY = "agl-service-nfc"
+DESCRIPTION = ""
+HOMEPAGE = "https://www.github.com/iotbzh/nfc-binding"
+SECTION = "apps"
+DEPENDS = "af-binder json-c libnfc"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit cmake pkgconfig aglwgt
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-nfc;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-radio/agl-service-radio_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-radio/agl-service-radio_git.bb
new file mode 100644
index 000000000..0e913af15
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-radio/agl-service-radio_git.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Radio Service Binding"
+DESCRIPTION = "AGL Radio Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-radio"
+SECTION = "apps"
+
+
+LICENSE = "Apache-2.0 & GPLv2+"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984 \
+ file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-radio;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+# build-time dependencies
+DEPENDS = "rtl-sdr glib-2.0 pulseaudio alsa-lib"
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb
new file mode 100644
index 000000000..0d308d0f8
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb
@@ -0,0 +1,19 @@
+SUMMARY = "agl-service-signal-composer"
+DESCRIPTION = "AGL High Level Signaling service to handle CAN, LIN, and others signaling sources"
+HOMEPAGE = "https://git.automotivelinux.org/apps/agl-service-signal-composer/"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit cmake pkgconfig aglwgt
+
+DEPENDS += "lua lua-native"
+RDEPENDS_${PN} += "lua"
+
+SRC_URI = "gitsm://git.automotivelinux.org/apps/agl-service-signal-composer;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "b77795e5c12be30a1fd2cc14b1b2b8cb83a58f4d"
+
+PV = "4.0-RC5+git${SRCPV}"
+S = "${WORKDIR}/git"
+
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-steering-wheel/agl-service-steering-wheel_0.1.bb b/meta-agl-profile-core/recipes-apis/agl-service-steering-wheel/agl-service-steering-wheel_0.1.bb
new file mode 100644
index 000000000..65328ff0e
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-steering-wheel/agl-service-steering-wheel_0.1.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "logitech g29 wheel service"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-steering-wheel"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+SECTION = "apps"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-steering-wheel;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "44e29d0b7b0382214dfae5b82c1c038d6bf7877f"
+
+PN = "agl-service-steering-wheel"
+S = "${WORKDIR}/git"
+
+DEPENDS = "glib-2.0 af-binder"
+
+inherit cmake aglwgt
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb
new file mode 100644
index 000000000..9590ad956
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb
@@ -0,0 +1,19 @@
+SUMMARY = "4A - Infotainment network setup and access"
+DESCRIPTION = "Infotainment network setup and access (using Unified Centralized Network Stack)"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-unicens"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-unicens;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "0.1+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+inherit cmake aglwgt pkgconfig
+
+DEPENDS += "alsa-lib json-c systemd af-binder glib-2.0 libxml2"
+RDEPENDS_${PN} += "libxml2 "
+
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-weather/agl-service-weather_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-weather/agl-service-weather_git.bb
new file mode 100644
index 000000000..340bbd7d9
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-weather/agl-service-weather_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Weather Service Binding"
+DESCRIPTION = "AGL Weather Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-weather"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-weather;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "glib-2.0 json-c"
+RDEPENDS_${PN} = "agl-service-geoclue"
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/agl-service-wifi/agl-service-wifi_git.bb b/meta-agl-profile-core/recipes-apis/agl-service-wifi/agl-service-wifi_git.bb
new file mode 100644
index 000000000..2b680f45c
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/agl-service-wifi/agl-service-wifi_git.bb
@@ -0,0 +1,15 @@
+SUMMARY = "WiFi Service Binding"
+DESCRIPTION = "AGL WiFi Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-wifi"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-wifi;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+inherit cmake aglwgt pkgconfig
diff --git a/meta-agl-profile-core/recipes-apis/high-level-viwi-service/high-level-viwi-service.bb b/meta-agl-profile-core/recipes-apis/high-level-viwi-service/high-level-viwi-service.bb
new file mode 100644
index 000000000..3d4cc4505
--- /dev/null
+++ b/meta-agl-profile-core/recipes-apis/high-level-viwi-service/high-level-viwi-service.bb
@@ -0,0 +1,19 @@
+SUMMARY = "High level ViWi service"
+DESCRIPTION = "AGL High Level service using ViWi protocol to expose CAN API."
+HOMEPAGE = "https://github.com/iotbzh/high-level-viwi-service"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5de84541278ea4e62cacfdc0f890c459"
+
+SRC_URI = "gitsm://github.com/iotbzh/high-level-viwi-service.git;protocol=https"
+SRCREV = "c4935e58769966a9b79b21c45798ab8828fe0ad0"
+
+PV = "4.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+# Run-time dependencies
+RDEPENDS_${PN} += "agl-service-can-low-level"
+
+inherit cmake aglwgt
+
+AGLWGT_AUTOINSTALL_${PN} := "0"
diff --git a/meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch b/meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch
new file mode 100644
index 000000000..c4fafef62
--- /dev/null
+++ b/meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch
@@ -0,0 +1,45 @@
+--- libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h.threading 2017-02-15 13:40:53.796004263 +0000
++++ libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h 2017-02-15 13:40:46.907000493 +0000
+@@ -188,6 +188,7 @@
+ /* classes for multithreading support
+ */
+
++#if 0
+ class DXXAPI Mutex
+ {
+ public:
+@@ -243,9 +244,11 @@
+ typedef bool (*CondVarWaitTimeoutFn)(CondVar *cv, Mutex *mx, int timeout);
+ typedef void (*CondVarWakeOneFn)(CondVar *cv);
+ typedef void (*CondVarWakeAllFn)(CondVar *cv);
++#endif
+
+ void DXXAPI _init_threading();
+
++#if 0
+ void DXXAPI _init_threading(
+ MutexNewFn, MutexFreeFn, MutexLockFn, MutexUnlockFn,
+ CondVarNewFn, CondVarFreeFn, CondVarWaitFn, CondVarWaitTimeoutFn, CondVarWakeOneFn, CondVarWakeAllFn
+@@ -312,6 +315,7 @@
+ cv->wake_all();
+ }
+ };
++#endif
+
+ } /* namespace DBus */
+
+--- libdbus-c++-0.9.0/src/dispatcher.cpp.threading 2017-02-15 13:48:22.627249868 +0000
++++ libdbus-c++-0.9.0/src/dispatcher.cpp 2017-02-15 13:48:29.164253445 +0000
+@@ -253,6 +253,7 @@
+ #endif//DBUS_HAS_THREADS_INIT_DEFAULT
+ }
+
++#if 0
+ void DBus::_init_threading(
+ MutexNewFn m1,
+ MutexFreeFn m2,
+@@ -318,3 +319,4 @@
+ #endif//DBUS_HAS_RECURSIVE_MUTEX
+ dbus_threads_init(&functions);
+ }
++#endif
diff --git a/meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++_0.9.0.bbappend b/meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++_0.9.0.bbappend
new file mode 100644
index 000000000..dac44b5e6
--- /dev/null
+++ b/meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++_0.9.0.bbappend
@@ -0,0 +1,2 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
+SRC_URI_append = "file://dbus-c++-threading.patch"
diff --git a/meta-agl-profile-core/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch b/meta-agl-profile-core/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch
new file mode 100644
index 000000000..c4fafef62
--- /dev/null
+++ b/meta-agl-profile-core/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch
@@ -0,0 +1,45 @@
+--- libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h.threading 2017-02-15 13:40:53.796004263 +0000
++++ libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h 2017-02-15 13:40:46.907000493 +0000
+@@ -188,6 +188,7 @@
+ /* classes for multithreading support
+ */
+
++#if 0
+ class DXXAPI Mutex
+ {
+ public:
+@@ -243,9 +244,11 @@
+ typedef bool (*CondVarWaitTimeoutFn)(CondVar *cv, Mutex *mx, int timeout);
+ typedef void (*CondVarWakeOneFn)(CondVar *cv);
+ typedef void (*CondVarWakeAllFn)(CondVar *cv);
++#endif
+
+ void DXXAPI _init_threading();
+
++#if 0
+ void DXXAPI _init_threading(
+ MutexNewFn, MutexFreeFn, MutexLockFn, MutexUnlockFn,
+ CondVarNewFn, CondVarFreeFn, CondVarWaitFn, CondVarWaitTimeoutFn, CondVarWakeOneFn, CondVarWakeAllFn
+@@ -312,6 +315,7 @@
+ cv->wake_all();
+ }
+ };
++#endif
+
+ } /* namespace DBus */
+
+--- libdbus-c++-0.9.0/src/dispatcher.cpp.threading 2017-02-15 13:48:22.627249868 +0000
++++ libdbus-c++-0.9.0/src/dispatcher.cpp 2017-02-15 13:48:29.164253445 +0000
+@@ -253,6 +253,7 @@
+ #endif//DBUS_HAS_THREADS_INIT_DEFAULT
+ }
+
++#if 0
+ void DBus::_init_threading(
+ MutexNewFn m1,
+ MutexFreeFn m2,
+@@ -318,3 +319,4 @@
+ #endif//DBUS_HAS_RECURSIVE_MUTEX
+ dbus_threads_init(&functions);
+ }
++#endif
diff --git a/meta-agl-profile-core/recipes-core/dbus/libdbus-c++_0.9.0.bbappend b/meta-agl-profile-core/recipes-core/dbus/libdbus-c++_0.9.0.bbappend
new file mode 100644
index 000000000..dac44b5e6
--- /dev/null
+++ b/meta-agl-profile-core/recipes-core/dbus/libdbus-c++_0.9.0.bbappend
@@ -0,0 +1,2 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
+SRC_URI_append = "file://dbus-c++-threading.patch"
diff --git a/meta-agl-profile-core/recipes-extended/gperf/gperf_%.bbappend b/meta-agl-profile-core/recipes-extended/gperf/gperf_%.bbappend
new file mode 100644
index 000000000..2a590838b
--- /dev/null
+++ b/meta-agl-profile-core/recipes-extended/gperf/gperf_%.bbappend
@@ -0,0 +1 @@
+BBCLASSEXTEND += "nativesdk"
diff --git a/meta-agl-profile-core/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch b/meta-agl-profile-core/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch
new file mode 100644
index 000000000..51896e8db
--- /dev/null
+++ b/meta-agl-profile-core/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch
@@ -0,0 +1,40 @@
+From 530a31e3eb24b2f1ed7b30859ed62a2d1b24bd91 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@googlemail.com>
+Date: Tue, 7 Feb 2017 11:51:58 +0100
+Subject: [PATCH] add a configure option to disable build of man-pages
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Upstream-Status: Pending
+
+Signed-off-by: Andreas Müller <schnitzeltony@googlemail.com>
+---
+ configure.ac | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 8316c67..099fc0c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -67,6 +67,8 @@ AC_ARG_ENABLE([largefile],
+ [AS_HELP_STRING([--disable-largefile],[disable LFS (large file support)])])
+ AC_ARG_ENABLE([util],
+ [AS_HELP_STRING([--disable-util],[disable build of command-line utilities])])
++AC_ARG_ENABLE([man],
++ [AS_HELP_STRING([--disable-man],[disable build of man-pages])])
+ AC_ARG_ENABLE([bi],
+ [AS_HELP_STRING([--enable-bi=ARCH],[enable -mARCH for bi-arch compilation])])
+ AC_ARG_ENABLE([ub],
+@@ -395,7 +397,7 @@ AM_CONDITIONAL([ADD_PLATFORM_POSIX],[test "$X_PLATFORM" = "posix"])
+ AM_CONDITIONAL([ADD_PLATFORM_WIN32],[test "$X_PLATFORM" = "win32"])
+
+ AM_CONDITIONAL([ADD_UTIL],[test "$enable_util" != "no"])
+-AM_CONDITIONAL([ADD_MANS],[test "$X_PLATFORM" != "win32"])
++AM_CONDITIONAL([ADD_MANS],[test "$enable_man" != "no"])
+
+ ###############################################################################
+ # declare common substitutions
+--
+2.9.3
+
diff --git a/meta-agl-profile-core/recipes-multimedia/libmp4v2/libmp4v2_git.bb b/meta-agl-profile-core/recipes-multimedia/libmp4v2/libmp4v2_git.bb
new file mode 100644
index 000000000..dd1b34747
--- /dev/null
+++ b/meta-agl-profile-core/recipes-multimedia/libmp4v2/libmp4v2_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "The MP4v2 library provides an API to create and modify mp4 files"
+HOMEPAGE = "https://github.com/sergiomb2/libmp4v2/wiki"
+LICENSE = "MPLv1.1"
+LIC_FILES_CHKSUM = "file://COPYING;md5=eb3014b036b6d2151d944aef6a84c36f"
+
+inherit autotools-brokensep pkgconfig
+
+SRC_URI = " \
+ git://github.com/sergiomb2/${BPN}.git \
+ file://0001-add-a-configure-option-to-disable-build-of-man-pages.patch \
+"
+SRCREV = "855e9674232808ff3be7191b697dfb56917db21f"
+S = "${WORKDIR}/git"
+PV = "2.1.0+git${SRCPV}"
+
+
+SECURITY_CFLAGS = "${SECURITY_NO_PIE_CFLAGS}"
+EXTRA_OECONF = "--disable-man"
diff --git a/meta-agl-profile-core/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend b/meta-agl-profile-core/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend
index cf248d3fd..7a1dd1a4e 100644
--- a/meta-agl-profile-core/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend
+++ b/meta-agl-profile-core/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend
@@ -31,3 +31,13 @@ do_install_append() {
FILES_${PN} += " \
${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_user_unitdir}/lightmediascanner.service', '', d)} \
"
+
+# for DEMO
+EXTRA_OECONF = "--enable-static"
+PACKAGECONFIG[mp4] = "--enable-mp4,--disable-mp4,libmp4v2"
+
+# add support MP3 because of the format of music files for AGL CES/ALS2017 Demo
+PACKAGECONFIG_append = " id3 mp4"
+
+# add required character sets for id3 tag scanning
+RDEPENDS_${PN}_append = " glibc-gconv-utf-16 glibc-gconv-iso8859-1"
diff --git a/meta-agl-profile-core/recipes-support/opencv/opencv_3.3.bbappend b/meta-agl-profile-core/recipes-support/opencv/opencv_3.3.bbappend
new file mode 100644
index 000000000..8656abf09
--- /dev/null
+++ b/meta-agl-profile-core/recipes-support/opencv/opencv_3.3.bbappend
@@ -0,0 +1 @@
+PACKAGECONFIG ?= "jpeg png v4l libv4l gstreamer"
diff --git a/meta-agl-profile-core/recipes-support/udisks/files/automount.service b/meta-agl-profile-core/recipes-support/udisks/files/automount.service
new file mode 100644
index 000000000..64c36e76b
--- /dev/null
+++ b/meta-agl-profile-core/recipes-support/udisks/files/automount.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Automount Disk Manager
+After=udisks.service
+
+[Service]
+ExecStart=/usr/libexec/automount.sh
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-agl-profile-core/recipes-support/udisks/files/automount.sh b/meta-agl-profile-core/recipes-support/udisks/files/automount.sh
new file mode 100755
index 000000000..bb0b1ae91
--- /dev/null
+++ b/meta-agl-profile-core/recipes-support/udisks/files/automount.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+pathtoname() {
+ udevadm info -p /sys/"$1" | awk -v FS== '/DEVNAME/ {print $2}'
+}
+
+MOUNT_OPTIONS="ro,flush"
+
+rmdir /media/* &> /dev/null || true
+for DEVNAME in $(udisks --enumerate-device-files|grep -e sd[a-z]); do
+ udisks --mount-options $MOUNT_OPTIONS --mount $DEVNAME
+done
+
+stdbuf -oL -- udevadm monitor --udev -s block | while read -r -- _ _ event devpath _; do
+ if [ "$event" = add ]; then
+ DEVNAME=$(pathtoname "$devpath")
+ udisks --mount-options $MOUNT_OPTIONS --mount $DEVNAME
+ fi
+done
diff --git a/meta-agl-profile-core/recipes-support/udisks/files/org.freedesktop.UDisks.conf b/meta-agl-profile-core/recipes-support/udisks/files/org.freedesktop.UDisks.conf
new file mode 100644
index 000000000..0098b94e1
--- /dev/null
+++ b/meta-agl-profile-core/recipes-support/udisks/files/org.freedesktop.UDisks.conf
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
+
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <!-- Only root can own the service -->
+ <policy user="root">
+ <allow own="org.freedesktop.UDisks"/>
+ </policy>
+
+ <policy context="default">
+ <allow send_destination="org.freedesktop.UDisks"/>
+
+ <allow send_destination="org.freedesktop.UDisks"
+ send_interface="org.freedesktop.DBus.Properties"/>
+ <allow send_destination="org.freedesktop.UDisks"
+ send_interface="org.freedesktop.DBus.Introspectable"/>
+ <allow send_destination="org.freedesktop.UDisks"
+ send_interface="org.freedesktop.UDisks"/>
+ <allow send_destination="org.freedesktop.UDisks"
+ send_interface="org.freedesktop.UDisks.Device"/>
+ <allow send_destination="org.freedesktop.UDisks"
+ send_interface="org.freedesktop.UDisks.Adapter"/>
+ <allow send_destination="org.freedesktop.UDisks"
+ send_interface="org.freedesktop.UDisks.Expander"/>
+ <allow send_destination="org.freedesktop.UDisks"
+ send_interface="org.freedesktop.UDisks.Port"/>
+ <allow receive_sender="org.freedesktop.UDisks" receive_type="signal"
+ receive_interface="org.freedesktop.UDisks"/>
+ </policy>
+</busconfig>
diff --git a/meta-agl-profile-core/recipes-support/udisks/files/udisks.service b/meta-agl-profile-core/recipes-support/udisks/files/udisks.service
new file mode 100644
index 000000000..4bd558449
--- /dev/null
+++ b/meta-agl-profile-core/recipes-support/udisks/files/udisks.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Disk Manager (legacy version)
+Documentation=man:udisks(7)
+
+[Service]
+Type=dbus
+BusName=org.freedesktop.UDisks
+ExecStart=/usr/libexec/udisks-daemon --no-debug
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-agl-profile-core/recipes-support/udisks/udisks_1.0.5.bbappend b/meta-agl-profile-core/recipes-support/udisks/udisks_1.0.5.bbappend
new file mode 100644
index 000000000..d55a167a6
--- /dev/null
+++ b/meta-agl-profile-core/recipes-support/udisks/udisks_1.0.5.bbappend
@@ -0,0 +1,28 @@
+SRC_URI += "file://org.freedesktop.UDisks.conf \
+ file://udisks.service \
+ file://automount.service \
+ file://automount.sh \
+ "
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+FILES_${PN} += "${base_libdir}/systemd/system/automount.service \
+ ${base_libdir}/systemd/system/udisks.service \
+ ${libexecdir}/automount.sh \
+ "
+
+SYSTEMD_AUTO_ENABLE = "enable"
+SYSTEMD_SERVICE_${PN} = "udisks.service automount.service"
+
+do_install_append () {
+ install -d ${D}${sysconfdir}/dbus-1/system.d
+ install -m 644 ${WORKDIR}/org.freedesktop.UDisks.conf ${D}${sysconfdir}/dbus-1/system.d/
+
+ install -d ${D}${base_libdir}/systemd/system
+ install -m 0644 ${WORKDIR}/udisks.service ${D}${base_libdir}/systemd/system
+
+ install -d ${D}${base_libdir}/systemd/system
+ install -m 0644 ${WORKDIR}/automount.service ${D}${base_libdir}/systemd/system
+
+ install -d ${D}${libexecdir}
+ install -m 0755 ${WORKDIR}/automount.sh ${D}${libexecdir}/automount.sh
+}
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-agl.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-agl.bb
new file mode 100644
index 000000000..cc923fd4a
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-agl.bb
@@ -0,0 +1,16 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+AGL App Fw Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-agl \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ "
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-automotive.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-automotive.bb
new file mode 100644
index 000000000..333195b74
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-automotive.bb
@@ -0,0 +1,16 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+Automotive Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-automotive \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ "
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-connectivity.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-connectivity.bb
new file mode 100644
index 000000000..fa45c97d6
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-connectivity.bb
@@ -0,0 +1,28 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+Connectivity Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-connectivity \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ "
+
+AGL_APPS = " \
+ "
+# restricted due to dependency on Kernel >= 4.8 which is not available in all repositories
+AGL_APPS_append_m3ulcb = " agl-service-can-low-level "
+AGL_APPS_append_intel-corei7-64 = " agl-service-can-low-level "
+AGL_APPS_append_qemux86-64 = " agl-service-can-low-level "
+
+RDEPENDS_${PN}_append = " \
+ ${AGL_APPS} \
+ "
+
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-graphics.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-graphics.bb
new file mode 100644
index 000000000..1e707ce46
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-graphics.bb
@@ -0,0 +1,17 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+Graphics Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-graphics \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ opencv \
+ "
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-multimedia.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-multimedia.bb
new file mode 100644
index 000000000..ed395f4f0
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-multimedia.bb
@@ -0,0 +1,15 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+Multimedia Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-multimedia \
+ "
+
+RDEPENDS_${PN} += "\
+ agl-service-mediaplayer \
+ "
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-native.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-native.bb
new file mode 100644
index 000000000..a31c666ca
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-native.bb
@@ -0,0 +1,17 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+Native App Fw Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-native \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-appfw-native-qt5 \
+ "
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-navi-lbs.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-navi-lbs.bb
new file mode 100644
index 000000000..3e5c9b396
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-navi-lbs.bb
@@ -0,0 +1,17 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+Navigation and Location-Based Services Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-navi-lbs \
+ "
+
+RDEPENDS_${PN} += "\
+ agl-service-gps \
+ agl-service-geoclue \
+ agl-service-geofence \
+ "
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-security.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-security.bb
new file mode 100644
index 000000000..3806899da
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-security.bb
@@ -0,0 +1,16 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+Security Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-security \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ "
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-speech-services.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-speech-services.bb
new file mode 100644
index 000000000..5f716c21e
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-speech-services.bb
@@ -0,0 +1,16 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+Speech Services Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-speech-services \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ "
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-web.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-web.bb
new file mode 100644
index 000000000..6da656573
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-web.bb
@@ -0,0 +1,16 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework which required by \
+Web App Fw Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-web \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ "
diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw.bb
new file mode 100644
index 000000000..cb5636bfd
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw.bb
@@ -0,0 +1,25 @@
+SUMMARY = "The software for application framework of AGL IVI profile"
+DESCRIPTION = "A set of packages belong to AGL application framework"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-appfw-automotive \
+ packagegroup-agl-appfw-connectivity \
+ packagegroup-agl-appfw-graphics \
+ packagegroup-agl-appfw-multimedia \
+ packagegroup-agl-appfw-navi-lbs \
+ packagegroup-agl-appfw-agl \
+ packagegroup-agl-appfw-native \
+ packagegroup-agl-appfw-web \
+ packagegroup-agl-appfw-security \
+ packagegroup-agl-appfw-speech-services \
+ "
diff --git a/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5/0001_fix_compile_issue_when_using_in_c++.patch b/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5/0001_fix_compile_issue_when_using_in_c++.patch
new file mode 100644
index 000000000..ba2f33c62
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5/0001_fix_compile_issue_when_using_in_c++.patch
@@ -0,0 +1,23 @@
+diff -urN bluez-5.22.orig/lib/bluetooth.h bluez-5.22/lib/bluetooth.h
+--- bluez-5.22.orig/lib/bluetooth.h 2013-12-10 15:59:06.000000000 +0900
++++ bluez-5.22/lib/bluetooth.h 2015-10-28 13:34:25.749335768 +0900
+@@ -158,16 +158,16 @@
+ #define bt_get_unaligned(ptr) \
+ ({ \
+ struct __attribute__((packed)) { \
+- typeof(*(ptr)) __v; \
+- } *__p = (typeof(__p)) (ptr); \
++ __typeof__(*(ptr)) __v; \
++ } *__p = (__typeof__(__p)) (ptr); \
+ __p->__v; \
+ })
+
+ #define bt_put_unaligned(val, ptr) \
+ do { \
+ struct __attribute__((packed)) { \
+- typeof(*(ptr)) __v; \
+- } *__p = (typeof(__p)) (ptr); \
++ __typeof__(*(ptr)) __v; \
++ } *__p = (__typeof__(__p)) (ptr); \
+ __p->__v = (val); \
+ } while(0)
diff --git a/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend b/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend
index ffb9d5b53..c5afa875f 100644
--- a/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend
+++ b/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend
@@ -1,6 +1,13 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
SRC_URI_append = " file://bluetooth.conf"
+APPLY_v522 = "${@str('no' if '${PV}' != '5.22' else 'yes')}"
+
+SRC_URI_append = "\
+ file://0001_fix_compile_issue_when_using_in_c++.patch;apply=${APPLY_v522} \
+"
+
+
do_install_append() {
install -m 0644 ${WORKDIR}/bluetooth.conf ${D}${sysconfdir}/dbus-1/system.d/bluetooth.conf
}
diff --git a/meta-agl-profile-demo/recipes-connectivity/libnfc/libnfc_git.bb b/meta-agl-profile-demo/recipes-connectivity/libnfc/libnfc_git.bb
new file mode 100644
index 000000000..bd216f815
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-connectivity/libnfc/libnfc_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "libnfc"
+DESCRIPTION = "Platform independent Near Field Communication (NFC) library"
+HOMEPAGE = "https://github.com/nfc-tools/libnfc"
+SECTION = "apps"
+
+DEPENDS = "libusb"
+
+LICENSE = "LGPLv3"
+LIC_FILES_CHKSUM = "file://${S}/COPYING;md5=b52f2d57d10c4f7ee67a7eb9615d5d24"
+
+inherit cmake pkgconfig
+
+SRC_URI = "git://github.com/nfc-tools/libnfc;protocol=https;branch=master"
+SRCREV = "2d4543673e9b76c02679ca8b89259659f1afd932"
+
+PV = "1.7.1+git${SRCPV}"
+S = "${WORKDIR}/git"
+
diff --git a/meta-agl-profile-demo/recipes-kernel/mocca-usb/mocca-usb.bb b/meta-agl-profile-demo/recipes-kernel/mocca-usb/mocca-usb.bb
new file mode 100644
index 000000000..cf4e5856b
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/mocca-usb/mocca-usb.bb
@@ -0,0 +1,22 @@
+DESCRIPTION = "Build USB driver for MOCCA box"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"
+
+inherit module
+
+PV = "0.1"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/can-lin/;protocol=https;branch=${AGL_BRANCH}"
+S = "${WORKDIR}/git/Usb-Driver"
+SRCREV = "02ba272c0eb51b06160307b6cb71f91684772c8c"
+
+# The inherit of module.bbclass will automatically name module packages with
+# "kernel-module-" prefix as required by the oe-core build environment.
+
+do_install_append () {
+ # modprobe automatically at boot
+ if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+ install -d ${D}${sysconfdir}/modules-load.d
+ echo "mocca_usb" > ${D}${sysconfdir}/modules-load.d/mocca_usb.conf
+ fi
+}
diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch
new file mode 100644
index 000000000..dd811c81b
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch
@@ -0,0 +1,472 @@
+From 9cb7cb85f59509ac445116e9458c502cf6cb74e6 Mon Sep 17 00:00:00 2001
+From: Christian Gromm <christian.gromm@microchip.com>
+Date: Thu, 9 Nov 2017 13:20:23 +0100
+Subject: [PATCH 2/2] src: most: add auto conf feature
+
+This patch adds the auto configuration feature to the driver
+sources. It is needed to have the driver configured automatically
+upon start up w/o the need for userspace to set up sysfs.
+
+Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
+---
+ driver/Makefile | 3 +
+ driver/default_conf.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++
+ driver/include/mostcore.h | 64 ++++++++++++++++++
+ driver/mostcore/core.c | 120 ++++++++++++++++++++++++++++------
+ 4 files changed, 331 insertions(+), 18 deletions(-)
+ create mode 100644 driver/default_conf.c
+
+diff --git a/Makefile b/Makefile
+index e77a4b6..6d74ebe 100644
+--- a/Makefile
++++ b/Makefile
+@@ -6,6 +6,9 @@ obj-m := mostcore.o
+ mostcore-y := mostcore/core.o
+ CFLAGS_core.o := -I$(src)/include/
+
++obj-m += default_conf.o
++CFLAGL_default_conf.o := -I$(src)/include
++
+ obj-m += aim_cdev.o
+ aim_cdev-y := aim-cdev/cdev.o
+ CFLAGS_cdev.o := -I$(src)/include/
+diff --git a/default_conf.c b/default_conf.c
+new file mode 100644
+index 0000000..adb1786
+--- /dev/null
++++ b/default_conf.c
+@@ -0,0 +1,162 @@
++/*
++ * default_conf.c - Default configuration for the MOST channels.
++ *
++ * Copyright (C) 2017, Microchip Technology Germany II GmbH & Co. KG
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * This file is licensed under GPLv2.
++ */
++
++#include "include/mostcore.h"
++#include <linux/module.h>
++
++static struct most_config_probe config_probes[] = {
++
++ /* OS81118 Control */
++ {
++ .ch_name = "ep8f",
++ .cfg = {
++ .direction = MOST_CH_RX,
++ .data_type = MOST_CH_CONTROL,
++ .num_buffers = 16,
++ .buffer_size = 64,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-crx",
++ },
++ {
++ .ch_name = "ep0f",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_CONTROL,
++ .num_buffers = 16,
++ .buffer_size = 64,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-ctx",
++ },
++ /* OS81118 Async */
++ {
++ .ch_name = "ep8e",
++ .cfg = {
++ .direction = MOST_CH_RX,
++ .data_type = MOST_CH_ASYNC,
++ .num_buffers = 20,
++ .buffer_size = 1522,
++ },
++ .aim_name = "networking",
++ .aim_param = "inic-usb-arx",
++ },
++ {
++ .ch_name = "ep0e",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_ASYNC,
++ .num_buffers = 20,
++ .buffer_size = 1522,
++ },
++ .aim_name = "networking",
++ .aim_param = "inic-usb-atx",
++ },
++ /* OS81210 Control */
++ {
++ .ch_name = "ep87",
++ .cfg = {
++ .direction = MOST_CH_RX,
++ .data_type = MOST_CH_CONTROL,
++ .num_buffers = 16,
++ .buffer_size = 64,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-crx",
++ },
++ {
++ .ch_name = "ep07",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_CONTROL,
++ .num_buffers = 16,
++ .buffer_size = 64,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-ctx",
++ },
++ /* OS81210 Async */
++ {
++ .ch_name = "ep86",
++ .cfg = {
++ .direction = MOST_CH_RX,
++ .data_type = MOST_CH_ASYNC,
++ .num_buffers = 20,
++ .buffer_size = 1522,
++ },
++ .aim_name = "networking",
++ .aim_param = "inic-usb-arx",
++ },
++ {
++ .ch_name = "ep06",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_ASYNC,
++ .num_buffers = 20,
++ .buffer_size = 1522,
++ },
++ .aim_name = "networking",
++ .aim_param = "inic-usb-atx",
++ },
++ /* Streaming channels (common for all INICs) */
++ {
++ .ch_name = "ep01",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_SYNC,
++ .num_buffers = 8,
++ .buffer_size = 2 * 12 * 42,
++ .subbuffer_size = 12,
++ .packets_per_xact = 42,
++ },
++ .aim_name = "sound",
++ .aim_param = "ep01-6ch.6x16",
++ },
++ {
++ .ch_name = "ep02",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_ISOC,
++ .num_buffers = 8,
++ .buffer_size = 40 * 188,
++ .subbuffer_size = 188,
++ .packets_per_xact = 2,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-itx1",
++ },
++
++ /* sentinel */
++ {}
++};
++
++static struct most_config_set config_set = {
++ .probes = config_probes
++};
++
++static int __init mod_init(void)
++{
++ most_register_config_set(&config_set);
++ return 0;
++}
++
++static void __exit mod_exit(void)
++{
++ most_deregister_config_set(&config_set);
++}
++
++module_init(mod_init);
++module_exit(mod_exit);
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andrey Shvetsov <andrey.shvetsov@k2l.de>");
++MODULE_DESCRIPTION("Default configuration for the MOST channels");
+diff --git a/include/mostcore.h b/include/mostcore.h
+index dc87121..3c00efb 100644
+--- a/include/mostcore.h
++++ b/include/mostcore.h
+@@ -145,6 +145,39 @@ struct most_channel_config {
+ u16 dbr_size;
+ };
+
++/**
++ * struct most_config_probe - matching rule, channel configuration and
++ * the optional AIM name used for the automatic configuration and linking
++ * of the channel
++ * @dev_name: optional matching device id
++ * ("usb_device 1-1:1.0," "dim2-12345678", etc.)
++ * @ch_name: matching channel name ("ep8f", "ca2", etc.)
++ * @cfg: configuration that will be applied for the found channel
++ * @aim_name: optional name of the AIM that will be linked to the channel
++ * ("cdev", "networking", "v4l", "sound")
++ * @aim_param: AIM dependent parameter (it is the character device name
++ * for the cdev AIM, PCM format for the audio AIM, etc.)
++ */
++struct most_config_probe {
++ const char *dev_name;
++ const char *ch_name;
++ struct most_channel_config cfg;
++ const char *aim_name;
++ const char *aim_param;
++};
++
++/**
++ * struct most_config_set - the configuration set containing
++ * several automatic configurations for the different channels
++ * @probes: list of the matching rules and the configurations,
++ * that must be ended with the empty structure
++ * @list: list head used by the MostCore
++ */
++struct most_config_set {
++ const struct most_config_probe *probes;
++ struct list_head list;
++};
++
+ /*
+ * struct mbo - MOST Buffer Object.
+ * @context: context for core completion handler
+@@ -285,6 +318,37 @@ struct most_aim {
+ };
+
+ /**
++ * most_register_config_set - registers the configuration set
++ *
++ * @cfg_set: configuration set to be registered for the future probes
++ *
++ * The function registers the given configuration set.
++ *
++ * It is possible to register or deregister several configuration sets
++ * independently. Different configuration sets may contain the
++ * overlapped matching rules but later registered configuration set has
++ * the higher priority over the prior registered set.
++ *
++ * The only the first matched configuration is applied for each
++ * channel.
++ *
++ * The configuration for the channel is applied at the time of
++ * registration of the parent most_interface.
++ */
++void most_register_config_set(struct most_config_set *cfg_set);
++
++/**
++ * most_deregister_config_set - deregisters the prior registered
++ * configuration set
++ *
++ * @cfg_set: configuration set to be deregistered
++ *
++ * The calling of this function does not change the current
++ * configuration of the channels.
++ */
++void most_deregister_config_set(struct most_config_set *cfg_set);
++
++/**
+ * most_register_interface - Registers instance of the interface.
+ * @iface: Pointer to the interface instance description.
+ *
+diff --git a/mostcore/core.c b/mostcore/core.c
+index 9e0a352..6035cf0 100644
+--- a/mostcore/core.c
++++ b/mostcore/core.c
+@@ -36,6 +36,8 @@ static struct class *most_class;
+ static struct device *core_dev;
+ static struct ida mdev_id;
+ static int dummy_num_buffers;
++static struct list_head config_probes;
++struct mutex config_probes_mt; /* config_probes */
+
+ struct most_c_aim_obj {
+ struct most_aim *ptr;
+@@ -918,6 +920,30 @@ most_c_obj *get_channel_by_name(char *mdev, char *mdev_ch)
+ return c;
+ }
+
++static int link_channel_to_aim(struct most_c_obj *c, struct most_aim *aim,
++ char *aim_param)
++{
++ int ret;
++ struct most_aim **aim_ptr;
++
++ if (!c->aim0.ptr)
++ aim_ptr = &c->aim0.ptr;
++ else if (!c->aim1.ptr)
++ aim_ptr = &c->aim1.ptr;
++ else
++ return -ENOSPC;
++
++ *aim_ptr = aim;
++ ret = aim->probe_channel(c->iface, c->channel_id,
++ &c->cfg, &c->kobj, aim_param);
++ if (ret) {
++ *aim_ptr = NULL;
++ return ret;
++ }
++
++ return 0;
++}
++
+ /**
+ * add_link_store - store() function for add_link attribute
+ * @aim_obj: pointer to AIM object
+@@ -946,45 +972,33 @@ static ssize_t add_link_store(struct most_aim_obj *aim_obj,
+ size_t len)
+ {
+ struct most_c_obj *c;
+- struct most_aim **aim_ptr;
+ char buffer[STRING_SIZE];
+ char *mdev;
+ char *mdev_ch;
+- char *mdev_devnod;
++ char *aim_param;
+ char devnod_buf[STRING_SIZE];
+ int ret;
+ size_t max_len = min_t(size_t, len + 1, STRING_SIZE);
+
+ strlcpy(buffer, buf, max_len);
+
+- ret = split_string(buffer, &mdev, &mdev_ch, &mdev_devnod);
++ ret = split_string(buffer, &mdev, &mdev_ch, &aim_param);
+ if (ret)
+ return ret;
+
+- if (!mdev_devnod || *mdev_devnod == 0) {
++ if (!aim_param || *aim_param == 0) {
+ snprintf(devnod_buf, sizeof(devnod_buf), "%s-%s", mdev,
+ mdev_ch);
+- mdev_devnod = devnod_buf;
++ aim_param = devnod_buf;
+ }
+
+ c = get_channel_by_name(mdev, mdev_ch);
+ if (IS_ERR(c))
+ return -ENODEV;
+
+- if (!c->aim0.ptr)
+- aim_ptr = &c->aim0.ptr;
+- else if (!c->aim1.ptr)
+- aim_ptr = &c->aim1.ptr;
+- else
+- return -ENOSPC;
+-
+- *aim_ptr = aim_obj->driver;
+- ret = aim_obj->driver->probe_channel(c->iface, c->channel_id,
+- &c->cfg, &c->kobj, mdev_devnod);
+- if (ret) {
+- *aim_ptr = NULL;
++ ret = link_channel_to_aim(c, aim_obj->driver, aim_param);
++ if (ret)
+ return ret;
+- }
+
+ return len;
+ }
+@@ -1679,6 +1693,73 @@ int most_deregister_aim(struct most_aim *aim)
+ }
+ EXPORT_SYMBOL_GPL(most_deregister_aim);
+
++void most_register_config_set(struct most_config_set *cfg_set)
++{
++ mutex_lock(&config_probes_mt);
++ list_add(&cfg_set->list, &config_probes);
++ mutex_unlock(&config_probes_mt);
++}
++EXPORT_SYMBOL(most_register_config_set);
++
++void most_deregister_config_set(struct most_config_set *cfg_set)
++{
++ mutex_lock(&config_probes_mt);
++ list_del(&cfg_set->list);
++ mutex_unlock(&config_probes_mt);
++}
++EXPORT_SYMBOL(most_deregister_config_set);
++
++static int probe_aim(struct most_c_obj *c,
++ const char *aim_name, const char *aim_param)
++{
++ struct most_aim_obj *aim_obj;
++ char buf[STRING_SIZE];
++
++ list_for_each_entry(aim_obj, &aim_list, list) {
++ if (!strcmp(aim_obj->driver->name, aim_name)) {
++ strlcpy(buf, aim_param ? aim_param : "", sizeof(buf));
++ return link_channel_to_aim(c, aim_obj->driver, buf);
++ }
++ }
++ return 0;
++}
++
++static bool probe_config_set(struct most_c_obj *c,
++ const char *dev_name, const char *ch_name,
++ const struct most_config_probe *p)
++{
++ int err;
++
++ for (; p->ch_name; p++) {
++ if ((p->dev_name && strcmp(dev_name, p->dev_name)) ||
++ strcmp(ch_name, p->ch_name))
++ continue;
++
++ c->cfg = p->cfg;
++ if (p->aim_name) {
++ err = probe_aim(c, p->aim_name, p->aim_param);
++ if (err)
++ pr_err("failed to autolink %s to %s: %d\n",
++ ch_name, p->aim_name, err);
++ }
++ return true;
++ }
++ return false;
++}
++
++static void find_configuration(struct most_c_obj *c, const char *dev_name,
++ const char *ch_name)
++{
++ struct most_config_set *plist;
++
++ mutex_lock(&config_probes_mt);
++ list_for_each_entry(plist, &config_probes, list) {
++ if (probe_config_set(c, dev_name, ch_name, plist->probes))
++ break;
++ }
++ mutex_unlock(&config_probes_mt);
++}
++
+ /**
+ * most_register_interface - registers an interface with core
+ * @iface: pointer to the instance of the interface description.
+@@ -1777,6 +1858,7 @@ struct kobject *most_register_interface(struct most_interface *iface)
+ mutex_init(&c->start_mutex);
+ mutex_init(&c->nq_mutex);
+ list_add_tail(&c->list, &inst->channel_list);
++ find_configuration(c, iface->description, channel_name);
+ }
+ pr_info("registered new MOST device mdev%d (%s)\n",
+ inst->dev_id, iface->description);
+@@ -1880,6 +1962,8 @@ static int __init most_init(void)
+ pr_info("init()\n");
+ INIT_LIST_HEAD(&instance_list);
+ INIT_LIST_HEAD(&aim_list);
++ INIT_LIST_HEAD(&config_probes);
++ mutex_init(&config_probes_mt);
+ ida_init(&mdev_id);
+
+ err = bus_register(&most_bus);
+--
+2.7.4
+
diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch
new file mode 100644
index 000000000..4703844a1
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch
@@ -0,0 +1,26 @@
+From b269994be937cbb31c0d73ecc899ca8a545a6a4a Mon Sep 17 00:00:00 2001
+From: Christian Gromm <christian.gromm@microchip.com>
+Date: Mon, 4 Sep 2017 11:09:17 +0200
+Subject: [PATCH 3/5] core: remove kernel log for MBO status
+
+Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
+---
+ driver/mostcore/core.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/mostcore/core.c b/mostcore/core.c
+index 931efb9..595becc 100644
+--- a/mostcore/core.c
++++ b/mostcore/core.c
+@@ -1348,8 +1348,6 @@ static void most_write_completion(struct mbo *mbo)
+ BUG_ON((!mbo) || (!mbo->context));
+
+ c = mbo->context;
+- if (mbo->status == MBO_E_INVAL)
+- pr_info("WARN: Tx MBO status: invalid\n");
+ if (unlikely(c->is_poisoned || (mbo->status == MBO_E_CLOSE)))
+ trash_mbo(mbo);
+ else
+--
+2.7.4
+
diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0004-most-video-set-device_caps.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0004-most-video-set-device_caps.patch
new file mode 100644
index 000000000..010d4b0d0
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/files/0004-most-video-set-device_caps.patch
@@ -0,0 +1,25 @@
+From a5fd2ae8d4a3b2a8f7a33a4ea469ea7ee0d946ef Mon Sep 17 00:00:00 2001
+From: Christian Gromm <christian.gromm@microchip.com>
+Date: Mon, 4 Sep 2017 15:36:38 +0200
+Subject: [PATCH 4/5] most: video: set device_caps
+
+Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
+---
+ driver/aim-v4l2/video.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/aim-v4l2/video.c b/aim-v4l2/video.c
+index e074841..6405a03 100644
+--- a/aim-v4l2/video.c
++++ b/aim-v4l2/video.c
+@@ -263,6 +263,7 @@ static int vidioc_querycap(struct file *file, void *priv,
+ snprintf(cap->bus_info, sizeof(cap->bus_info),
+ "%s", mdev->iface->description);
+
++ cap->device_caps =
+ cap->capabilities =
+ V4L2_CAP_READWRITE |
+ V4L2_CAP_TUNER |
+--
+2.7.4
+
diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch
new file mode 100644
index 000000000..ebaee9e14
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch
@@ -0,0 +1,25 @@
+From 7518453386ad3e82008186a6c9ca86ed8c136801 Mon Sep 17 00:00:00 2001
+From: Christian Gromm <christian.gromm@microchip.com>
+Date: Mon, 4 Sep 2017 16:08:38 +0200
+Subject: [PATCH 5/5] most: video: set V4L2_CAP_DEVICE_CAPS flag
+
+Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
+---
+ driver/aim-v4l2/video.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/aim-v4l2/video.c b/aim-v4l2/video.c
+index 6405a03..db75d4d 100644
+--- a/aim-v4l2/video.c
++++ b/aim-v4l2/video.c
+@@ -265,6 +265,7 @@ static int vidioc_querycap(struct file *file, void *priv,
+
+ cap->device_caps =
+ cap->capabilities =
++ V4L2_CAP_DEVICE_CAPS |
+ V4L2_CAP_READWRITE |
+ V4L2_CAP_TUNER |
+ V4L2_CAP_VIDEO_CAPTURE;
+--
+2.7.4
+
diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch
new file mode 100644
index 000000000..59c6ae671
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch
@@ -0,0 +1,186 @@
+From 63bcd9b421ae7927948bffec9566db47f40ea290 Mon Sep 17 00:00:00 2001
+From: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+Date: Tue, 30 Jan 2018 17:34:09 +0100
+Subject: [PATCH] staging: most: dim2: fix startup sequence
+
+Platform specific initializations (pdata->init) must be done before DIM2
+IP module startup (dim_startup).
+
+Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+---
+ hdm-dim2/dim2_hdm.c | 90 +++++++++++++++++++++++++++++++++++++++---------------------------------------------------
+ 1 file changed, 39 insertions(+), 51 deletions(-)
+
+diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c
+index 893b8e4..e4629a5 100644
+--- a/hdm-dim2/dim2_hdm.c
++++ b/hdm-dim2/dim2_hdm.c
+@@ -155,38 +155,6 @@ void dimcb_on_error(u8 error_id, const char *error_message)
+ }
+
+ /**
+- * startup_dim - initialize the dim2 interface
+- * @pdev: platform device
+- */
+-static int startup_dim(struct platform_device *pdev)
+-{
+- struct dim2_hdm *dev = platform_get_drvdata(pdev);
+- struct dim2_platform_data *pdata = pdev->dev.platform_data;
+- u8 hal_ret;
+- int ret;
+-
+- if (!pdata) {
+- pr_err("missing platform data\n");
+- return -EINVAL;
+- }
+-
+- ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0;
+- if (ret)
+- return ret;
+-
+- pr_info("sync: num of frames per sub-buffer: %u\n", fcnt);
+- hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt);
+- if (hal_ret != DIM_NO_ERROR) {
+- pr_err("dim_startup failed: %d\n", hal_ret);
+- if (pdata && pdata->destroy)
+- pdata->destroy(pdata);
+- return -ENODEV;
+- }
+-
+- return 0;
+-}
+-
+-/**
+ * try_start_dim_transfer - try to transfer a buffer on a channel
+ * @hdm_ch: channel specific data
+ *
+@@ -727,10 +695,12 @@ static void dma_free(struct mbo *mbo, u32 size)
+ */
+ static int dim2_probe(struct platform_device *pdev)
+ {
++ struct dim2_platform_data *pdata = pdev->dev.platform_data;
+ struct dim2_hdm *dev;
+ struct resource *res;
+ int ret, i;
+ struct kobject *kobj;
++ u8 hal_ret;
+ int irq;
+
+ dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
+@@ -745,38 +715,59 @@ static int dim2_probe(struct platform_device *pdev)
+ if (IS_ERR(dev->io_base))
+ return PTR_ERR(dev->io_base);
+
++ if (!pdata) {
++ dev_err(&pdev->dev, "missing platform data\n");
++ return -EINVAL;
++ }
++
++ ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0;
++ if (ret)
++ return ret;
++
++ dev_info(&pdev->dev, "sync: num of frames per sub-buffer: %u\n", fcnt);
++ hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt);
++ if (hal_ret != DIM_NO_ERROR) {
++ dev_err(&pdev->dev, "dim_startup failed: %d\n", hal_ret);
++ ret = -ENODEV;
++ goto err_bsp_destroy;
++ }
++
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "failed to get ahb0_int irq: %d\n", irq);
+- return irq;
++ ret = irq;
++ goto err_shutdown_dim;
+ }
+
+ ret = devm_request_irq(&pdev->dev, irq, dim2_ahb_isr, 0,
+ "dim2_ahb0_int", dev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to request ahb0_int irq %d\n", irq);
+- return ret;
++ goto err_shutdown_dim;
+ }
+
+ irq = platform_get_irq(pdev, 1);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "failed to get mlb_int irq: %d\n", irq);
+- return irq;
++ ret = irq;
++ goto err_shutdown_dim;
+ }
+
+ ret = devm_request_irq(&pdev->dev, irq, dim2_mlb_isr, 0,
+ "dim2_mlb_int", dev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to request mlb_int irq %d\n", irq);
+- return ret;
++ goto err_shutdown_dim;
+ }
+
+ init_waitqueue_head(&dev->netinfo_waitq);
+ dev->deliver_netinfo = 0;
+- dev->netinfo_task = kthread_run(&deliver_netinfo_thread, (void *)dev,
++ dev->netinfo_task = kthread_run(&deliver_netinfo_thread, dev,
+ "dim2_netinfo");
+- if (IS_ERR(dev->netinfo_task))
+- return PTR_ERR(dev->netinfo_task);
++ if (IS_ERR(dev->netinfo_task)) {
++ ret = PTR_ERR(dev->netinfo_task);
++ goto err_shutdown_dim;
++ }
+
+ for (i = 0; i < DMA_CHANNELS; i++) {
+ struct most_channel_capability *cap = dev->capabilities + i;
+@@ -833,20 +824,17 @@ static int dim2_probe(struct platform_device *pdev)
+ if (ret)
+ goto err_unreg_iface;
+
+- ret = startup_dim(pdev);
+- if (ret) {
+- dev_err(&pdev->dev, "failed to initialize DIM2\n");
+- goto err_destroy_bus;
+- }
+-
+ return 0;
+
+-err_destroy_bus:
+- dim2_sysfs_destroy(&dev->bus);
+ err_unreg_iface:
+ most_deregister_interface(&dev->most_iface);
+ err_stop_thread:
+ kthread_stop(dev->netinfo_task);
++err_shutdown_dim:
++ dim_shutdown();
++err_bsp_destroy:
++ if (pdata && pdata->destroy)
++ pdata->destroy(pdata);
+
+ return ret;
+ }
+@@ -863,6 +851,10 @@ static int dim2_remove(struct platform_device *pdev)
+ struct dim2_platform_data *pdata = pdev->dev.platform_data;
+ unsigned long flags;
+
++ dim2_sysfs_destroy(&dev->bus);
++ most_deregister_interface(&dev->most_iface);
++ kthread_stop(dev->netinfo_task);
++
+ spin_lock_irqsave(&dim_lock, flags);
+ dim_shutdown();
+ spin_unlock_irqrestore(&dim_lock, flags);
+@@ -870,10 +862,6 @@ static int dim2_remove(struct platform_device *pdev)
+ if (pdata && pdata->destroy)
+ pdata->destroy(pdata);
+
+- dim2_sysfs_destroy(&dev->bus);
+- most_deregister_interface(&dev->most_iface);
+- kthread_stop(dev->netinfo_task);
+-
+ /*
+ * break link to local platform_device_id struct
+ * to prevent crash by unload platform device module
+--
+libgit2 0.26.0
diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0007-dim2-use-device-tree.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0007-dim2-use-device-tree.patch
new file mode 100644
index 000000000..679fab79c
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/files/0007-dim2-use-device-tree.patch
@@ -0,0 +1,378 @@
+From 8e16207392cd715ea88f6780981a3d55ab005588 Mon Sep 17 00:00:00 2001
+From: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+Date: Mon, 12 Feb 2018 12:23:37 +0100
+Subject: [PATCH] staging: most: dim2: use device tree
+
+Current dim2 driver expects the existence of a platform driver that
+implements the platform specific initialization and delivery of the irq
+numbers.
+
+This patch integrates the device tree activity and platform specific
+code into the driver.
+
+Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+---
+ hdm-dim2/dim2_hdm.c | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
+ hdm-dim2/dim2_hdm.h | 28 ----------------------------
+ hdm-dim2/platform/dim2_arwen_mlb3.c | 165 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ hdm-dim2/platform/dim2_arwen_mlb6.c | 169 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ hdm-dim2/platform/dim2_h2_dt.c | 227 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ hdm-dim2/platform/dim2_mx6q.c | 192 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ hdm-dim2/platform/dim2_mx6q_dt.c | 224 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ 7 files changed, 193 insertions(+), 1034 deletions(-)
+ delete mode 100644 hdm-dim2/dim2_hdm.h
+ delete mode 100644 hdm-dim2/platform/dim2_arwen_mlb3.c
+ delete mode 100644 hdm-dim2/platform/dim2_arwen_mlb6.c
+ delete mode 100644 hdm-dim2/platform/dim2_h2_dt.c
+ delete mode 100644 hdm-dim2/platform/dim2_mx6q.c
+ delete mode 100644 hdm-dim2/platform/dim2_mx6q_dt.c
+
+diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c
+index e4629a5..2dba917 100644
+--- a/hdm-dim2/dim2_hdm.c
++++ b/hdm-dim2/dim2_hdm.c
+@@ -14,6 +14,7 @@
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+ #include <linux/module.h>
++#include <linux/of_platform.h>
+ #include <linux/printk.h>
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+@@ -21,13 +22,13 @@
+ #include <linux/interrupt.h>
+ #include <linux/slab.h>
+ #include <linux/io.h>
++#include <linux/clk.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/sched.h>
+ #include <linux/kthread.h>
+
+ #include <mostcore.h>
+ #include "dim2_hal.h"
+-#include "dim2_hdm.h"
+ #include "dim2_errors.h"
+ #include "dim2_sysfs.h"
+
+@@ -93,6 +94,9 @@ struct dim2_hdm {
+ struct most_interface most_iface;
+ char name[16 + sizeof "dim2-"];
+ void __iomem *io_base;
++ u8 clk_speed;
++ struct clk *clk;
++ struct clk *clk_pll;
+ struct task_struct *netinfo_task;
+ wait_queue_head_t netinfo_waitq;
+ int deliver_netinfo;
+@@ -102,6 +106,12 @@ struct dim2_hdm {
+ struct medialb_bus bus;
+ void (*on_netinfo)(struct most_interface *,
+ unsigned char, unsigned char *);
++ void (*disable_platform)(struct platform_device *);
++};
++
++struct dim2_platform_data {
++ int (*enable)(struct platform_device *);
++ void (*disable)(struct platform_device *);
+ };
+
+ #define iface_to_hdm(iface) container_of(iface, struct dim2_hdm, most_iface)
+@@ -686,6 +696,8 @@ static void dma_free(struct mbo *mbo, u32 size)
+ dma_free_coherent(NULL, size, mbo->virt_address, mbo->bus_address);
+ }
+
++static const struct of_device_id dim2_of_match[];
++
+ /*
+ * dim2_probe - dim2 probe handler
+ * @pdev: platform device structure
+@@ -695,7 +707,7 @@ static void dma_free(struct mbo *mbo, u32 size)
+ */
+ static int dim2_probe(struct platform_device *pdev)
+ {
+- struct dim2_platform_data *pdata = pdev->dev.platform_data;
++ const struct dim2_platform_data *pdata;
+ struct dim2_hdm *dev;
+ struct resource *res;
+ int ret, i;
+@@ -703,6 +715,8 @@ static int dim2_probe(struct platform_device *pdev)
+ u8 hal_ret;
+ int irq;
+
++ enum { MLB_INT_IDX, AHB0_INT_IDX };
++
+ dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+ return -ENOMEM;
+@@ -710,29 +724,30 @@ static int dim2_probe(struct platform_device *pdev)
+ dev->atx_idx = -1;
+
+ platform_set_drvdata(pdev, dev);
++
++ dev->clk_speed = CLK_4096FS;
++
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ dev->io_base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(dev->io_base))
+ return PTR_ERR(dev->io_base);
+
+- if (!pdata) {
+- dev_err(&pdev->dev, "missing platform data\n");
+- return -EINVAL;
+- }
+-
+- ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0;
++ pdata = of_match_node(dim2_of_match, pdev->dev.of_node)->data;
++ ret = pdata && pdata->enable ? pdata->enable(pdev) : 0;
+ if (ret)
+ return ret;
+
++ dev->disable_platform = pdata ? pdata->disable : 0;
++
+ dev_info(&pdev->dev, "sync: num of frames per sub-buffer: %u\n", fcnt);
+- hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt);
++ hal_ret = dim_startup(dev->io_base, dev->clk_speed, fcnt);
+ if (hal_ret != DIM_NO_ERROR) {
+ dev_err(&pdev->dev, "dim_startup failed: %d\n", hal_ret);
+ ret = -ENODEV;
+- goto err_bsp_destroy;
++ goto err_disable_platform;
+ }
+
+- irq = platform_get_irq(pdev, 0);
++ irq = platform_get_irq(pdev, AHB0_INT_IDX);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "failed to get ahb0_int irq: %d\n", irq);
+ ret = irq;
+@@ -746,7 +761,7 @@ static int dim2_probe(struct platform_device *pdev)
+ goto err_shutdown_dim;
+ }
+
+- irq = platform_get_irq(pdev, 1);
++ irq = platform_get_irq(pdev, MLB_INT_IDX);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "failed to get mlb_int irq: %d\n", irq);
+ ret = irq;
+@@ -832,9 +847,9 @@ static int dim2_probe(struct platform_device *pdev)
+ kthread_stop(dev->netinfo_task);
+ err_shutdown_dim:
+ dim_shutdown();
+-err_bsp_destroy:
+- if (pdata && pdata->destroy)
+- pdata->destroy(pdata);
++err_disable_platform:
++ if (dev->disable_platform)
++ dev->disable_platform(pdev);
+
+ return ret;
+ }
+@@ -848,7 +863,6 @@ static int dim2_probe(struct platform_device *pdev)
+ static int dim2_remove(struct platform_device *pdev)
+ {
+ struct dim2_hdm *dev = platform_get_drvdata(pdev);
+- struct dim2_platform_data *pdata = pdev->dev.platform_data;
+ unsigned long flags;
+
+ dim2_sysfs_destroy(&dev->bus);
+@@ -859,37 +873,187 @@ static int dim2_remove(struct platform_device *pdev)
+ dim_shutdown();
+ spin_unlock_irqrestore(&dim_lock, flags);
+
+- if (pdata && pdata->destroy)
+- pdata->destroy(pdata);
++ if (dev->disable_platform)
++ dev->disable_platform(pdev);
++
++ return 0;
++}
++
++/* platform specific functions [[ */
++
++static int fsl_mx6_enable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++ int ret;
++
++ dev->clk = devm_clk_get(&pdev->dev, "mlb");
++ if (IS_ERR_OR_NULL(dev->clk)) {
++ dev_err(&pdev->dev, "unable to get mlb clock\n");
++ return -EFAULT;
++ }
++
++ ret = clk_prepare_enable(dev->clk);
++ if (ret) {
++ dev_err(&pdev->dev, "%s\n", "clk_prepare_enable failed");
++ return ret;
++ }
++
++ if (dev->clk_speed >= CLK_2048FS) {
++ /* enable pll */
++ dev->clk_pll = devm_clk_get(&pdev->dev, "pll8_mlb");
++ if (IS_ERR_OR_NULL(dev->clk_pll)) {
++ dev_err(&pdev->dev, "unable to get mlb pll clock\n");
++ clk_disable_unprepare(dev->clk);
++ return -EFAULT;
++ }
++
++ writel(0x888, dev->io_base + 0x38);
++ clk_prepare_enable(dev->clk_pll);
++ }
++
++ return 0;
++}
++
++static void fsl_mx6_disable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++
++ if (dev->clk_speed >= CLK_2048FS)
++ clk_disable_unprepare(dev->clk_pll);
++
++ clk_disable_unprepare(dev->clk);
++}
++
++static int rcar_h2_enable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++ int ret;
++
++ dev->clk = devm_clk_get(&pdev->dev, NULL);
++ if (IS_ERR(dev->clk)) {
++ dev_err(&pdev->dev, "cannot get clock\n");
++ return PTR_ERR(dev->clk);
++ }
++
++ ret = clk_prepare_enable(dev->clk);
++ if (ret) {
++ dev_err(&pdev->dev, "%s\n", "clk_prepare_enable failed");
++ return ret;
++ }
++
++ if (dev->clk_speed >= CLK_2048FS) {
++ /* enable MLP pll and LVDS drivers */
++ writel(0x03, dev->io_base + 0x600);
++ /* set bias */
++ writel(0x888, dev->io_base + 0x38);
++ } else {
++ /* PLL */
++ writel(0x04, dev->io_base + 0x600);
++ }
++
+
+- /*
+- * break link to local platform_device_id struct
+- * to prevent crash by unload platform device module
+- */
+- pdev->id_entry = NULL;
++ /* BBCR = 0b11 */
++ writel(0x03, dev->io_base + 0x500);
++ writel(0x0002FF02, dev->io_base + 0x508);
+
+ return 0;
+ }
+
+-static const struct platform_device_id dim2_id[] = {
+- { "medialb_dim2" },
+- { }, /* Terminating entry */
++static void rcar_h2_disable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++
++ clk_disable_unprepare(dev->clk);
++
++ /* disable PLLs and LVDS drivers */
++ writel(0x0, dev->io_base + 0x600);
++}
++
++static int rcar_m3_enable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++ u32 enable_512fs = dev->clk_speed == CLK_512FS;
++ int ret;
++
++ dev->clk = devm_clk_get(&pdev->dev, NULL);
++ if (IS_ERR(dev->clk)) {
++ dev_err(&pdev->dev, "cannot get clock\n");
++ return PTR_ERR(dev->clk);
++ }
++
++ ret = clk_prepare_enable(dev->clk);
++ if (ret) {
++ dev_err(&pdev->dev, "%s\n", "clk_prepare_enable failed");
++ return ret;
++ }
++
++ /* PLL */
++ writel(0x04, dev->io_base + 0x600);
++
++ writel(enable_512fs, dev->io_base + 0x604);
++
++ /* BBCR = 0b11 */
++ writel(0x03, dev->io_base + 0x500);
++ writel(0x0002FF02, dev->io_base + 0x508);
++
++ return 0;
++}
++
++static void rcar_m3_disable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++
++ clk_disable_unprepare(dev->clk);
++
++ /* disable PLLs and LVDS drivers */
++ writel(0x0, dev->io_base + 0x600);
++}
++
++/* ]] platform specific functions */
++
++enum dim2_platforms { FSL_MX6, RCAR_H2, RCAR_M3 };
++
++static struct dim2_platform_data plat_data[] = {
++ [FSL_MX6] = { .enable = fsl_mx6_enable, .disable = fsl_mx6_disable },
++ [RCAR_H2] = { .enable = rcar_h2_enable, .disable = rcar_h2_disable },
++ [RCAR_M3] = { .enable = rcar_m3_enable, .disable = rcar_m3_disable },
++};
++
++static const struct of_device_id dim2_of_match[] = {
++ {
++ .compatible = "fsl,imx6q-mlb150",
++ .data = plat_data + FSL_MX6
++ },
++ {
++ .compatible = "renesas,mlp",
++ .data = plat_data + RCAR_H2
++ },
++ {
++ .compatible = "rcar,medialb-dim2",
++ .data = plat_data + RCAR_M3
++ },
++ {
++ .compatible = "xlnx,axi4-os62420_3pin-1.00.a",
++ },
++ {
++ .compatible = "xlnx,axi4-os62420_6pin-1.00.a",
++ },
++ {},
+ };
+
+-MODULE_DEVICE_TABLE(platform, dim2_id);
++MODULE_DEVICE_TABLE(of, dim2_of_match);
+
+ static struct platform_driver dim2_driver = {
+ .probe = dim2_probe,
+ .remove = dim2_remove,
+- .id_table = dim2_id,
+ .driver = {
+ .name = "hdm_dim2",
++ .of_match_table = dim2_of_match,
+ },
+ };
+
+ module_platform_driver(dim2_driver);
+
+-MODULE_AUTHOR("Jain Roy Ambi <JainRoy.Ambi@microchip.com>");
+ MODULE_AUTHOR("Andrey Shvetsov <andrey.shvetsov@k2l.de>");
+ MODULE_DESCRIPTION("MediaLB DIM2 Hardware Dependent Module");
+ MODULE_LICENSE("GPL");
+libgit2 0.26.0
diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch
new file mode 100644
index 000000000..1b01fb156
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch
@@ -0,0 +1,92 @@
+From 839ad403a2d8081a6c15f6fc2836b01919338f3c Mon Sep 17 00:00:00 2001
+From: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+Date: Mon, 12 Feb 2018 12:24:37 +0100
+Subject: [PATCH] staging: most: dim2: read clock speed from the device tree
+
+This implements reading of the clock speed parameter from the device
+tree.
+
+Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+---
+ Documentation/devicetree/bindings/inic/microchip,inic-dim2.txt | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ hdm-dim2/dim2_hdm.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 113 insertions(+), 1 deletion(-)
+ create mode 100644 Documentation/devicetree/bindings/inic/microchip,inic-dim2.txt
+
+diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c
+index 2dba917..05e1896 100644
+--- a/hdm-dim2/dim2_hdm.c
++++ b/hdm-dim2/dim2_hdm.c
+@@ -698,6 +698,42 @@ static void dma_free(struct mbo *mbo, u32 size)
+
+ static const struct of_device_id dim2_of_match[];
+
++static struct {
++ const char *clock_speed;
++ u8 clk_speed;
++} clk_mt[] = {
++ { "256fs", CLK_256FS },
++ { "512fs", CLK_512FS },
++ { "1024fs", CLK_1024FS },
++ { "2048fs", CLK_2048FS },
++ { "3072fs", CLK_3072FS },
++ { "4096fs", CLK_4096FS },
++ { "6144fs", CLK_6144FS },
++ { "8192fs", CLK_8192FS },
++};
++
++/**
++ * get_dim2_clk_speed - converts string to DIM2 clock speed value
++ *
++ * @clock_speed: string in the format "{NUMBER}fs"
++ * @val: pointer to get one of the CLK_{NUMBER}FS values
++ *
++ * By success stores one of the CLK_{NUMBER}FS in the *val and returns 0,
++ * otherwise returns -EINVAL.
++ */
++static int get_dim2_clk_speed(const char *clock_speed, u8 *val)
++{
++ int i;
++
++ for (i = 0; i < ARRAY_SIZE(clk_mt); i++) {
++ if (!strcmp(clock_speed, clk_mt[i].clock_speed)) {
++ *val = clk_mt[i].clk_speed;
++ return 0;
++ }
++ }
++ return -EINVAL;
++}
++
+ /*
+ * dim2_probe - dim2 probe handler
+ * @pdev: platform device structure
+@@ -708,6 +744,7 @@ static const struct of_device_id dim2_of_match[];
+ static int dim2_probe(struct platform_device *pdev)
+ {
+ const struct dim2_platform_data *pdata;
++ const char *clock_speed;
+ struct dim2_hdm *dev;
+ struct resource *res;
+ int ret, i;
+@@ -725,7 +762,18 @@ static int dim2_probe(struct platform_device *pdev)
+
+ platform_set_drvdata(pdev, dev);
+
+- dev->clk_speed = CLK_4096FS;
++ ret = of_property_read_string(pdev->dev.of_node,
++ "microchip,clock-speed", &clock_speed);
++ if (ret) {
++ dev_err(&pdev->dev, "missing dt property clock-speed\n");
++ return ret;
++ }
++
++ ret = get_dim2_clk_speed(clock_speed, &dev->clk_speed);
++ if (ret) {
++ dev_err(&pdev->dev, "bad dt property clock-speed\n");
++ return ret;
++ }
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ dev->io_base = devm_ioremap_resource(&pdev->dev, res);
+--
+libgit2 0.26.0
diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch
new file mode 100644
index 000000000..08cd6f99d
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch
@@ -0,0 +1,47 @@
+From 756f2f1f90524c2620ed7951e436d13bdb929a6b Mon Sep 17 00:00:00 2001
+From: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+Date: Mon, 12 Feb 2018 12:25:37 +0100
+Subject: [PATCH] staging: most: dim2: use device for coherent memory allocation
+
+On several modern architectures the allocation of coherent memory needs
+a device that has the dma_ops properly set. This patch enables use of
+the DIM2 platform device for the allocation process.
+
+Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+---
+ hdm-dim2/dim2_hdm.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c
+index 05e1896..1847091 100644
+--- a/hdm-dim2/dim2_hdm.c
++++ b/hdm-dim2/dim2_hdm.c
+@@ -688,12 +688,16 @@ static int poison_channel(struct most_interface *most_iface, int ch_idx)
+
+ static void *dma_alloc(struct mbo *mbo, u32 size)
+ {
+- return dma_alloc_coherent(NULL, size, &mbo->bus_address, GFP_KERNEL);
++ struct device *dev = mbo->ifp->dev;
++
++ return dma_alloc_coherent(dev, size, &mbo->bus_address, GFP_KERNEL);
+ }
+
+ static void dma_free(struct mbo *mbo, u32 size)
+ {
+- dma_free_coherent(NULL, size, mbo->virt_address, mbo->bus_address);
++ struct device *dev = mbo->ifp->dev;
++
++ dma_free_coherent(dev, size, mbo->virt_address, mbo->bus_address);
+ }
+
+ static const struct of_device_id dim2_of_match[];
+@@ -875,6 +879,7 @@ static int dim2_probe(struct platform_device *pdev)
+ dev->most_iface.poison_channel = poison_channel;
+ dev->most_iface.request_netinfo = request_netinfo;
+ dev->most_iface.extra_attrs = DBR_ATTRS;
++ dev->most_iface.dev = &pdev->dev;
+
+ kobj = most_register_interface(&dev->most_iface);
+ if (IS_ERR(kobj)) {
+--
+libgit2 0.26.0
diff --git a/meta-agl-profile-demo/recipes-kernel/most/most.bb b/meta-agl-profile-demo/recipes-kernel/most/most.bb
new file mode 100644
index 000000000..222c8aa18
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/most.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Build MOST driver"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"
+
+inherit module
+
+PV = "0.1"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/most;protocol=https;branch=${AGL_BRANCH}"
+
+S = "${WORKDIR}/git/driver"
+SRCREV = "794e6dc552e626eb6dd506baf941873414d9ef73"
+
+KERNEL_MODULE_AUTOLOAD += "aim_cdev aim_sound aim_network aim_v4l2 hdm_i2c hdm_dim2 hdm_usb mostcore" \ No newline at end of file
diff --git a/meta-agl-profile-demo/recipes-kernel/most/most.bbappend b/meta-agl-profile-demo/recipes-kernel/most/most.bbappend
new file mode 100644
index 000000000..d85565fc2
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-kernel/most/most.bbappend
@@ -0,0 +1,12 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+SRC_URI_append = " \
+ file://0002-src-most-add-auto-conf-feature.patch \
+ file://0003-core-remove-kernel-log-for-MBO-status.patch \
+ file://0004-most-video-set-device_caps.patch \
+ file://0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch \
+ file://0006-dim2-fix-startup-sequence.patch \
+ file://0007-dim2-use-device-tree.patch \
+ file://0008-dim2-read-clock-speed-from-the-device-tree.patch \
+ file://0009-dim2-use-device-for-coherent-memory-allocation.patch \
+ "
diff --git a/meta-agl-profile-demo/recipes-qt/.gitkeep b/meta-agl-profile-demo/recipes-qt/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/.gitkeep
diff --git a/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-appfw-native-qt5.bb b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-appfw-native-qt5.bb
new file mode 100644
index 000000000..a22401ffb
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-appfw-native-qt5.bb
@@ -0,0 +1,32 @@
+SUMMARY = "Qt5 for native GUI framework of AGL IVI profile"
+DESCRIPTION = "A set of Qt5 packages which required by Native App Fw Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-native-qt5 \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ qtbase \
+ qtbase-dev \
+ qtbase-plugins \
+ qtbase-staticdev \
+ qtbase-tools \
+ qtdeclarative \
+ qtdeclarative-qmlplugins \
+ qtdeclarative-tools \
+ qtcharts \
+ qtwayland \
+ qtwayland-plugins \
+ qtwayland-tools \
+ qtgraphicaleffects-qmlplugins \
+ qtvirtualkeyboard \
+ "
+RDEPENDS_${PN}_checkforkrogoth += "\
+ qtwayland-examples \
+ "
diff --git a/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-demo-qt-examples.bb b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-demo-qt-examples.bb
new file mode 100644
index 000000000..adebabe76
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-demo-qt-examples.bb
@@ -0,0 +1,26 @@
+SUMMARY = "The examples to test Qt5 on AGL Demo Platform"
+DESCRIPTION = "A set of packages which contains Qt5 examples"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-demo-qt-examples \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ qt3d-examples \
+ qtbase-examples \
+ qtconnectivity-examples \
+ qtdeclarative-examples \
+ qtlocation-examples \
+ qtmultimedia-examples \
+ qtsensors-examples \
+ qtsystems-examples \
+ qttools-examples \
+ qtwayland-examples \
+ qtxmlpatterns-examples \
+ "
diff --git a/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bbappend b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bbappend
new file mode 100644
index 000000000..300227e16
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bbappend
@@ -0,0 +1,23 @@
+# add missing dependencies for SDK
+
+RDEPENDS_${PN} += " \
+ qttools-plugins \
+ qtquickcontrols-dev \
+ qtquickcontrols-qmlplugins \
+ qtquickcontrols2-dev \
+ qtquickcontrols2-mkspecs \
+ qtquickcontrols2-qmlplugins \
+"
+
+# remove dependency on qtwebkit (still added to SDK by packagegroup-qt5-toolchain-target)
+# see SPEC-1159
+RDEPENDS_${PN}_remove = " \
+ qtwebkit-dev \
+ qtwebkit-mkspecs \
+ qtwebkit-qmlplugins \
+"
+
+# add QtAGLExtras
+RDEPENDS_${PN} += " \
+ ${@bb.utils.contains("DISTRO_FEATURES", "agl-hmi-framework", " qtaglextras-dev qtaglextras-mkspecs", "",d)} \
+"
diff --git a/meta-agl-profile-demo/recipes-qt/qml-execscript-plugin/qml-execscript-plugin_1.0.bb b/meta-agl-profile-demo/recipes-qt/qml-execscript-plugin/qml-execscript-plugin_1.0.bb
new file mode 100644
index 000000000..dbeda2d11
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qml-execscript-plugin/qml-execscript-plugin_1.0.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Execute Script QML plugin"
+DESCRIPTION = "This provides a simple QML plugin able to execute script file."
+
+LICENSE = "CLOSED"
+
+DEPENDS = "qtbase-native qtdeclarative"
+
+SRC_URI = "git://github.com/ntanibata/qml-execscript-plugin.git;protocol=git;"
+SRCREV = "1f05c44cccd8aef485d8df8206c8df4e5ad6f310"
+S = "${WORKDIR}/git"
+
+inherit qmake5
+
+EXTRA_OECONF = "--with-moc-dir=${STAGING_BINDIR_NATIVE}/qt5"
+QML_LIBDIR = "${libdir}/qt5/qml"
+
+do_install() {
+ install -d ${D}${libdir}/qt5/qml/execScript/
+ install -m 0755 execScript/*.so ${D}${libdir}/qt5/qml/execScript/
+ install -m 0644 ../git/execScript/qmldir ${D}${libdir}/qt5/qml/execScript/
+}
+
+FILES_${PN} += "${QML_LIBDIR}/execScript/libexecscriptplugin.so"
+FILES_${PN} += "${QML_LIBDIR}/execScript/qmldir"
+FILES_${PN}-dbg += "${QML_LIBDIR}/execScript/.debug"
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtbase-native_git.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtbase-native_git.bbappend
new file mode 100644
index 000000000..b7cfe8dce
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtbase-native_git.bbappend
@@ -0,0 +1,3 @@
+# Backport this fix from meta-qt5:
+# https://github.com/meta-qt5/meta-qt5/commit/bf7cdd963008f2d61bc4c324fff2bfafe511fb5f
+SRC_URI_remove = "file://0012-qdbuscpp2xml.pro-do-not-build-with-bootstrapped-depe.patch"
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch
new file mode 100644
index 000000000..10a1ddd88
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch
@@ -0,0 +1,30 @@
+From a4943bb5c7fdf5eb297223d2c3bb02d2271bea48 Mon Sep 17 00:00:00 2001
+From: Risto Avila <risto.avila@theqtcompany.com>
+Date: Thu, 17 Dec 2015 04:22:53 +0200
+Subject: [PATCH] Force qdbus to make introspect for every findMetaObject
+
+---
+ src/dbus/qdbusintegrator.cpp | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
+index cce8b9c..ae2a9dc 100644
+--- a/src/dbus/qdbusintegrator.cpp
++++ b/src/dbus/qdbusintegrator.cpp
+@@ -2512,8 +2512,11 @@ QDBusConnectionPrivate::findMetaObject(const QString &service, const QString &pa
+ if (!interface.isEmpty()) {
+ QDBusReadLocker locker(FindMetaObject1Action, this);
+ QDBusMetaObject *mo = cachedMetaObjects.value(interface, 0);
+- if (mo)
+- return mo;
++ if (mo) {
++ // service is not unique. Remove cached object to force introspect
++ cachedMetaObjects.remove(interface);
++ delete mo;
++ }
+ }
+
+ // introspect the target object
+--
+1.9.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtbase_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtbase_%.bbappend
new file mode 100644
index 000000000..d568b1284
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtbase_%.bbappend
@@ -0,0 +1,16 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+DEPENDS_append_koelsch = " libegl"
+#DEPENDS_append_porter = " libegl"
+DEPENDS_append_porter = " ${@base_conditional('PREFERRED_PROVIDER_virtual/egl', 'mesa', 'mesa', 'libegl', d)}"
+
+PACKAGECONFIG_WAYLAND = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)}"
+PACKAGECONFIG_GL = "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2', '', d)}"
+PACKAGECONFIG_append = " ${PACKAGECONFIG_WAYLAND} icu accessibility"
+PACKAGECONFIG_append = " fontconfig"
+PACKAGECONFIG_append = " sql-sqlite"
+
+EXTRA_OECONF_append = ""
+
+# '-qpa wayland-egl' set wayland-egl as default of platform plagins
+PACKAGECONFIG[wayland]="-qpa wayland-egl -no-qpa-platform-guard"
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch
new file mode 100644
index 000000000..007e46763
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch
@@ -0,0 +1,80 @@
+From ed61f1d932c5c6d38458fcd2e1d5d154383f017e Mon Sep 17 00:00:00 2001
+From: Tasuku Suzuki <tasuku.suzuki@qt.io>
+Date: Mon, 12 Dec 2016 16:32:47 +0900
+Subject: [PATCH] metadata image support with the "data" URL scheme for QtQuick
+
+add posterImage, coverArtImage and thumbnailImage to metadata
+
+Change-Id: I10b9bae10c219ffa41506d6e6b345020790217a6
+---
+ .../multimedia/qdeclarativemediametadata_p.h | 33 ++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+diff --git a/src/imports/multimedia/qdeclarativemediametadata_p.h b/src/imports/multimedia/qdeclarativemediametadata_p.h
+index ede7f87..6a6a815 100644
+--- a/src/imports/multimedia/qdeclarativemediametadata_p.h
++++ b/src/imports/multimedia/qdeclarativemediametadata_p.h
+@@ -51,6 +51,9 @@
+ // We mean it.
+ //
+
++#include <QtCore/QBuffer>
++#include <QtGui/QImage>
++#include <QtGui/QImageWriter>
+ #include <QtQml/qqml.h>
+ #include <QtMultimedia/qmediametadata.h>
+ #include <QtMultimedia/qmediaservice.h>
+@@ -153,6 +156,9 @@ class QDeclarativeMediaMetaData : public QObject
+ Q_PROPERTY(QVariant gpsProcessingMethod READ gpsProcessingMethod WRITE setGPSProcessingMethod NOTIFY metaDataChanged)
+ Q_PROPERTY(QVariant gpsAreaInformation READ gpsAreaInformation WRITE setGPSAreaInformation NOTIFY metaDataChanged)
+
++ Q_PROPERTY(QVariant posterImage READ posterImage NOTIFY metaDataChanged)
++ Q_PROPERTY(QVariant coverArtImage READ coverArtImage NOTIFY metaDataChanged)
++ Q_PROPERTY(QVariant thumbnailImage READ thumbnailImage NOTIFY metaDataChanged)
+ public:
+ QDeclarativeMediaMetaData(QMediaObject *player, QObject *parent = 0)
+ : QObject(parent)
+@@ -425,6 +431,16 @@ QT_WARNING_POP
+ void setGPSAreaInformation(const QVariant &information) {
+ setMetaData(QMediaMetaData::GPSAreaInformation, information); }
+
++ QVariant posterImage() const {
++ return convertImageToUrl(m_mediaObject->metaData(QMediaMetaData::PosterImage));
++ }
++ QVariant coverArtImage() const {
++ return convertImageToUrl(m_mediaObject->metaData(QMediaMetaData::CoverArtImage));
++ }
++ QVariant thumbnailImage() const {
++ return convertImageToUrl(m_mediaObject->metaData(QMediaMetaData::ThumbnailImage));
++ }
++
+ Q_SIGNALS:
+ void metaDataChanged();
+
+@@ -440,6 +456,23 @@ private:
+ m_writerControl->setMetaData(key, value);
+ }
+
++ QUrl convertImageToUrl(const QVariant &variant) const
++ {
++ if (variant.type() != QVariant::Image)
++ return QUrl();
++
++ QImage image = variant.value<QImage>();
++ QByteArray data;
++ QBuffer buffer(&data);
++ buffer.open(QBuffer::WriteOnly);
++ QImageWriter png(&buffer, "png");
++ if (!png.write(image)) {
++ return QUrl();
++ }
++ buffer.close();
++ return QUrl(QStringLiteral("data:image/png;base64,") + data.toBase64());
++ }
++
+ QMediaObject *m_mediaObject;
+ QMetaDataWriterControl *m_writerControl;
+ bool m_requestedWriterControl;
+--
+2.7.4
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia_%.bbappend
new file mode 100644
index 000000000..a06ac2d89
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia_%.bbappend
@@ -0,0 +1,7 @@
+FILESEXTRAPATHS_append := ":${THISDIR}/${PN}"
+
+PACKAGECONFIG_append = " gstreamer"
+
+SRC_URI_append = " \
+ file://0001-metadata-image-support-with-the-data-URL-scheme-for-.patch \
+ "
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtsystems_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtsystems_%.bbappend
new file mode 100644
index 000000000..550c58d05
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtsystems_%.bbappend
@@ -0,0 +1,3 @@
+DEPENDS_remove = "bluez4"
+# currently Qt5 does not support bluez5 "Nothing PROVIDES 'gconfbluez5'"
+#DEPENDS_append = "bluez5"
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-Implement-initial-IVI-shell-support-with-shell-integ.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-Implement-initial-IVI-shell-support-with-shell-integ.patch
new file mode 100644
index 000000000..9495dcc88
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-Implement-initial-IVI-shell-support-with-shell-integ.patch
@@ -0,0 +1,693 @@
+From f41ceb82b1adb1bae15d36a426bf39ea0e75cb68 Mon Sep 17 00:00:00 2001
+From: Nobuhiko Tanibata <ntanibata@jp.adit-jv.com>
+Date: Thu, 5 Nov 2015 20:13:26 +0900
+Subject: [PATCH 1/2] Implement initial IVI-shell support with shell
+ integration.
+
+QApplication can set numeric surface ID to its surface by
+following steps
+-------------------------------------------------------
+#include <QApplication>
+#include <QQuickView>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+ QQuickView view(QUrl(QStringLiteral("qrc:/main.qml")));
+
+ view.setProperty("IVI-Surface-ID", 8000);
+ view.show();
+ return app.exec();
+}
+-------------------------------------------------------
+
+If QApplication doesn't set the surface ID by itself, the ID is
+automatically assigned by qtwayland from 8000. When the application creates
+several surfaces, the ID is incremented like 8001,8002,,,,.
+
+Additionally, qtwayland now supports shell integration Framework. So
+The enviromental value QT_WAYLAND_SHELL_INTEGRATION=ivi-shell are required for
+Qt application.
+
+Signed-off-by: Nobuhiko Tanibata <ntanibata@jp.adit-jv.com>
+---
+ .gitignore | 6 ++
+ src/3rdparty/protocol/ivi-application.xml | 99 +++++++++++++++++++
+ src/client/client.pro | 3 +-
+ src/plugins/plugins.pro | 3 +-
+ .../shellintegration/ivi-shell/ivi-shell.json | 3 +
+ .../shellintegration/ivi-shell/ivi-shell.pro | 30 ++++++
+ src/plugins/shellintegration/ivi-shell/main.cpp | 69 +++++++++++++
+ .../ivi-shell/qwaylandivishellintegration.cpp | 109 +++++++++++++++++++++
+ .../ivi-shell/qwaylandivishellintegration.h | 79 +++++++++++++++
+ .../ivi-shell/qwaylandivisurface.cpp | 71 ++++++++++++++
+ .../ivi-shell/qwaylandivisurface_p.h | 76 ++++++++++++++
+ src/plugins/shellintegration/shellintegration.pro | 3 +
+ 12 files changed, 549 insertions(+), 2 deletions(-)
+ create mode 100644 src/3rdparty/protocol/ivi-application.xml
+ create mode 100644 src/plugins/shellintegration/ivi-shell/ivi-shell.json
+ create mode 100644 src/plugins/shellintegration/ivi-shell/ivi-shell.pro
+ create mode 100644 src/plugins/shellintegration/ivi-shell/main.cpp
+ create mode 100644 src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp
+ create mode 100644 src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h
+ create mode 100644 src/plugins/shellintegration/ivi-shell/qwaylandivisurface.cpp
+ create mode 100644 src/plugins/shellintegration/ivi-shell/qwaylandivisurface_p.h
+ create mode 100644 src/plugins/shellintegration/shellintegration.pro
+
+diff --git a/.gitignore b/.gitignore
+index b33ca90..924afb2 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -61,6 +61,12 @@ src/plugins/hardwareintegration/*/*/qwayland*.h
+ src/plugins/hardwareintegration/*/*/*-server-protocol.h
+ src/plugins/hardwareintegration/*/*/*-client-protocol.h
+ src/plugins/hardwareintegration/*/*/*-protocol.c
++src/plugins/shellintegration/ivi-shell/qwayland-ivi-application.h
++src/plugins/shellintegration/ivi-shell/qwayland-ivi-application.cpp
++src/plugins/shellintegration/ivi-shell/qwayland-ivi-controller.h
++src/plugins/shellintegration/ivi-shell/qwayland-ivi-controller.cpp
++src/plugins/shellintegration/*/*-client-protocol.h
++src/plugins/shellintegration/*/*-protocol.c
+ tests/auto/client/tst_client
+ tests/auto/compositor/tst_compositor
+ *~
+diff --git a/src/3rdparty/protocol/ivi-application.xml b/src/3rdparty/protocol/ivi-application.xml
+new file mode 100644
+index 0000000..61ec7d2
+--- /dev/null
++++ b/src/3rdparty/protocol/ivi-application.xml
+@@ -0,0 +1,99 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<protocol name="ivi_application">
++
++ <copyright>
++ Copyright (C) 2013 DENSO CORPORATION
++ Copyright (c) 2013 BMW Car IT GmbH
++
++ Permission to use, copy, modify, distribute, and sell this software and
++ its documentation for any purpose is hereby granted without fee, provided
++ that the above copyright notice appear in all copies and that both that
++ copyright notice and this permission notice appear in supporting
++ documentation, and that the name of the copyright holders not be used in
++ advertising or publicity pertaining to distribution of the software
++ without specific, written prior permission. The copyright holders make
++ no representations about the suitability of this software for any
++ purpose. It is provided "as is" without express or implied warranty.
++
++ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
++ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
++ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
++ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
++ RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
++ CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
++ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
++ </copyright>
++
++ <interface name="ivi_surface" version="1">
++ <description summary="application interface to surface in ivi compositor"/>
++
++ <request name="destroy" type="destructor">
++ <description summary="destroy ivi_surface">
++ This removes link from ivi_id to wl_surface and destroys ivi_surface.
++ The ID, ivi_id, is free and can be used for surface_create again.
++ </description>
++ </request>
++
++ <event name="configure">
++ <description summary="suggest resize">
++ The configure event asks the client to resize its surface.
++
++ The size is a hint, in the sense that the client is free to
++ ignore it if it doesn't resize, pick a smaller size (to
++ satisfy aspect ratio or resize in steps of NxM pixels).
++
++ The client is free to dismiss all but the last configure
++ event it received.
++
++ The width and height arguments specify the size of the window
++ in surface local coordinates.
++ </description>
++ <arg name="width" type="int"/>
++ <arg name="height" type="int"/>
++ </event>
++ </interface>
++
++ <interface name="ivi_application" version="1">
++ <description summary="create ivi-style surfaces">
++ This interface is exposed as a global singleton.
++ This interface is implemented by servers that provide IVI-style user interfaces.
++ It allows clients to associate a ivi_surface with wl_surface.
++ </description>
++
++ <enum name="error">
++ <entry name="role" value="0" summary="given wl_surface has another role"/>
++ <entry name="ivi_id" value="1" summary="given ivi_id is assigned to another wl_surface"/>
++ </enum>
++
++ <request name="surface_create">
++ <description summary="create ivi_surface with numeric ID in ivi compositor">
++ This request gives the wl_surface the role of an IVI Surface. Creating more than
++ one ivi_surface for a wl_surface is not allowed. Note, that this still allows the
++ following example:
++
++ 1. create a wl_surface
++ 2. create ivi_surface for the wl_surface
++ 3. destroy the ivi_surface
++ 4. create ivi_surface for the wl_surface (with the same or another ivi_id as before)
++
++ surface_create will create a interface:ivi_surface with numeric ID; ivi_id in
++ ivi compositor. These ivi_ids are defined as unique in the system to identify
++ it inside of ivi compositor. The ivi compositor implements business logic how to
++ set properties of the surface with ivi_id according to status of the system.
++ E.g. a unique ID for Car Navigation application is used for implementing special
++ logic of the application about where it shall be located.
++ The server regards following cases as protocol errors and disconnects the client.
++ - wl_surface already has an nother role.
++ - ivi_id is already assigned to an another wl_surface.
++
++ If client destroys ivi_surface or wl_surface which is assigne to the ivi_surface,
++ ivi_id which is assigned to the ivi_surface is free for reuse.
++ </description>
++ <arg name="ivi_id" type="uint"/>
++ <arg name="surface" type="object" interface="wl_surface"/>
++ <arg name="id" type="new_id" interface="ivi_surface"/>
++ </request>
++
++ </interface>
++
++</protocol>
+diff --git a/src/client/client.pro b/src/client/client.pro
+index 0c13a4a..ca48cce 100644
+--- a/src/client/client.pro
++++ b/src/client/client.pro
+@@ -6,7 +6,8 @@ MODULE=waylandclient
+ MODULE_PLUGIN_TYPES = \
+ wayland-graphics-integration-client \
+ wayland-inputdevice-integration \
+- wayland-decoration-client
++ wayland-decoration-client \
++ wayland-shell-integration
+
+ CONFIG += generated_privates
+
+diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
+index a1a8a5b..9b66b85 100644
+--- a/src/plugins/plugins.pro
++++ b/src/plugins/plugins.pro
+@@ -2,4 +2,5 @@ TEMPLATE=subdirs
+ SUBDIRS += \
+ platforms \
+ hardwareintegration \
+- decorations
++ decorations \
++ shellintegration
+diff --git a/src/plugins/shellintegration/ivi-shell/ivi-shell.json b/src/plugins/shellintegration/ivi-shell/ivi-shell.json
+new file mode 100644
+index 0000000..c48528e
+--- /dev/null
++++ b/src/plugins/shellintegration/ivi-shell/ivi-shell.json
+@@ -0,0 +1,3 @@
++{
++ "Keys":[ "ivi-shell" ]
++}
+diff --git a/src/plugins/shellintegration/ivi-shell/ivi-shell.pro b/src/plugins/shellintegration/ivi-shell/ivi-shell.pro
+new file mode 100644
+index 0000000..ac12858
+--- /dev/null
++++ b/src/plugins/shellintegration/ivi-shell/ivi-shell.pro
+@@ -0,0 +1,30 @@
++PLUGIN_TYPE = wayland-shell-integration
++load(qt_plugin)
++
++QT += waylandclient-private
++CONFIG += wayland-scanner
++
++!contains(QT_CONFIG, no-pkg-config) {
++ PKGCONFIG += wayland-client wayland-cursor
++ CONFIG += link_pkgconfig
++ contains(QT_CONFIG, glib): PKGCONFIG_PRIVATE += glib-2.0
++} else {
++ LIBS += -lwayland-client -lwayland-cursor $$QT_LIBS_GLIB
++}
++
++WAYLANDCLIENTSOURCES += \
++ ../../../3rdparty/protocol/ivi-application.xml
++
++include(../../../../include/QtWaylandClient/headers.pri)
++
++HEADERS += \
++ qwaylandivishellintegration.h \
++ qwaylandivisurface_p.h
++
++SOURCES += \
++ main.cpp \
++ qwaylandivishellintegration.cpp \
++ qwaylandivisurface.cpp
++
++OTHER_FILES += \
++ ivi-shell.json
+diff --git a/src/plugins/shellintegration/ivi-shell/main.cpp b/src/plugins/shellintegration/ivi-shell/main.cpp
+new file mode 100644
+index 0000000..2382ff7
+--- /dev/null
++++ b/src/plugins/shellintegration/ivi-shell/main.cpp
+@@ -0,0 +1,69 @@
++/****************************************************************************
++**
++** Copyright (C) 2015 ITAGE Corporation, author: <yusuke.binsaki@itage.co.jp>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include <QtWaylandClient/private/qwaylandshellintegrationplugin_p.h>
++#include "qwaylandivishellintegration.h"
++
++QT_BEGIN_NAMESPACE
++
++namespace QtWaylandClient {
++
++class QWaylandIviShellIntegrationPlugin : public QWaylandShellIntegrationPlugin
++{
++ Q_OBJECT
++ Q_PLUGIN_METADATA(IID QWaylandShellIntegrationFactoryInterface_iid FILE "ivi-shell.json")
++
++public:
++ virtual QWaylandShellIntegration *create(const QString &key, const QStringList &paramList) Q_DECL_OVERRIDE;
++};
++
++QWaylandShellIntegration *QWaylandIviShellIntegrationPlugin::create(const QString &key, const QStringList &paramList)
++{
++ Q_UNUSED(key);
++ Q_UNUSED(paramList);
++ return new QWaylandIviShellIntegration();
++}
++
++}
++
++QT_END_NAMESPACE
++
++#include "main.moc"
+diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp
+new file mode 100644
+index 0000000..763fafb
+--- /dev/null
++++ b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp
+@@ -0,0 +1,109 @@
++/****************************************************************************
++**
++** Copyright (C) 2015 ITAGE Corporation, author: <yusuke.binsaki@itage.co.jp>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include <sys/types.h>
++#include <unistd.h>
++#include <stdint.h>
++#include <stdlib.h>
++
++#include <QtWaylandClient/private/qwayland-wayland.h>
++#include <QtWaylandClient/private/qwaylanddisplay_p.h>
++#include <QtWaylandClient/private/qwaylandwindow_p.h>
++#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h>
++#include "qwaylandivishellintegration.h"
++#include "qwaylandivisurface_p.h"
++#include "qwayland-ivi-application.h"
++
++QT_BEGIN_NAMESPACE
++
++namespace QtWaylandClient {
++
++QWaylandIviShellIntegration::QWaylandIviShellIntegration()
++ : m_iviApplication(Q_NULLPTR)
++{
++}
++
++QWaylandIviShellIntegration::~QWaylandIviShellIntegration()
++{
++ delete m_iviApplication;
++}
++
++bool QWaylandIviShellIntegration::initialize(QWaylandDisplay *display)
++{
++ display->addRegistryListener(registryIvi, this);
++
++ return true;
++}
++
++QWaylandShellSurface *QWaylandIviShellIntegration::createShellSurface(QWaylandWindow *window)
++{
++ const int IVI_SURFACE_ID = 8000;
++ if (!m_iviApplication)
++ return Q_NULLPTR;
++
++ uint32_t id = 0;
++ QVariant value = window->property("IVI-Surface-ID");
++ if (value.isValid()) {
++ id = value.toUInt();
++ } else {
++ id = IVI_SURFACE_ID + getpid();
++ }
++
++ struct ivi_surface *surface = m_iviApplication->surface_create(id, window->object());
++
++ return new QWaylandIviSurface(surface, window);
++}
++
++void QWaylandIviShellIntegration::registryIvi(void *data,
++ struct wl_registry *registry,
++ uint32_t id,
++ const QString &interface,
++ uint32_t version)
++{
++ QWaylandIviShellIntegration *shell = static_cast<QWaylandIviShellIntegration *>(data);
++
++ if (interface == QStringLiteral("ivi_application"))
++ shell->m_iviApplication = new QtWayland::ivi_application(registry, id, version);
++}
++
++}
++
++QT_END_NAMESPACE
+diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h
+new file mode 100644
+index 0000000..4856ec6
+--- /dev/null
++++ b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h
+@@ -0,0 +1,79 @@
++/****************************************************************************
++**
++** Copyright (C) 2015 ITAGE Corporation, author: <yusuke.binsaki@itage.co.jp>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDIVIINTEGRATION_H
++#define QWAYLANDIVIINTEGRATION_H
++
++#include <QtWaylandClient/private/qwaylandshellintegration_p.h>
++
++QT_BEGIN_NAMESPACE
++
++namespace QtWayland {
++ struct wl_registry;
++ class ivi_application;
++}
++
++namespace QtWaylandClient {
++
++class QWaylandWindow;
++class QWaylandDisplay;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandIviShellIntegration : public QWaylandShellIntegration
++{
++public:
++ QWaylandIviShellIntegration();
++ ~QWaylandIviShellIntegration();
++ bool initialize(QWaylandDisplay *display);
++ QWaylandShellSurface *createShellSurface(QWaylandWindow *window);
++
++private:
++ static void registryIvi(void *data, struct wl_registry *registry
++ , uint32_t id, const QString &interface, uint32_t version);
++
++private:
++ QtWayland::ivi_application *m_iviApplication;
++};
++
++}
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDIVIINTEGRATION_H
+diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivisurface.cpp b/src/plugins/shellintegration/ivi-shell/qwaylandivisurface.cpp
+new file mode 100644
+index 0000000..3ce3b4e
+--- /dev/null
++++ b/src/plugins/shellintegration/ivi-shell/qwaylandivisurface.cpp
+@@ -0,0 +1,71 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include <QtWaylandClient/private/qwaylanddisplay_p.h>
++#include <QtWaylandClient/private/qwaylandwindow_p.h>
++#include <QtWaylandClient/private/qwaylandinputdevice_p.h>
++#include <QtWaylandClient/private/qwaylandscreen_p.h>
++#include "qwaylandivisurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++namespace QtWaylandClient {
++
++QWaylandIviSurface::QWaylandIviSurface(struct ::ivi_surface *ivi_surface, QWaylandWindow *window)
++ : QtWayland::ivi_surface(ivi_surface)
++ , QWaylandShellSurface(window)
++ , m_window(window)
++{
++}
++
++QWaylandIviSurface::~QWaylandIviSurface()
++{
++ ivi_surface::destroy();
++}
++
++void QWaylandIviSurface::ivi_surface_configure(int32_t width, int32_t height)
++{
++ this->m_window->configure(0, width, height);
++}
++
++}
++
++QT_END_NAMESPACE
+diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivisurface_p.h b/src/plugins/shellintegration/ivi-shell/qwaylandivisurface_p.h
+new file mode 100644
+index 0000000..d8331c5
+--- /dev/null
++++ b/src/plugins/shellintegration/ivi-shell/qwaylandivisurface_p.h
+@@ -0,0 +1,76 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDIVISURFACE_H
++#define QWAYLANDIVISURFACE_H
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include <QtWaylandClient/private/qwaylandshellsurface_p.h>
++#include "qwayland-ivi-application.h"
++
++QT_BEGIN_NAMESPACE
++
++namespace QtWaylandClient {
++
++class QWaylandWindow;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandIviSurface : public QtWayland::ivi_surface
++ , public QWaylandShellSurface
++{
++public:
++ QWaylandIviSurface(struct ::ivi_surface *shell_surface, QWaylandWindow *window);
++ virtual ~QWaylandIviSurface();
++
++private:
++ virtual void ivi_surface_configure(int32_t width, int32_t height);
++
++ QWaylandWindow *m_window;
++
++ friend class QWaylandWindow;
++};
++
++}
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDIVISURFACE_H
+diff --git a/src/plugins/shellintegration/shellintegration.pro b/src/plugins/shellintegration/shellintegration.pro
+new file mode 100644
+index 0000000..7abd6cc
+--- /dev/null
++++ b/src/plugins/shellintegration/shellintegration.pro
+@@ -0,0 +1,3 @@
++TEMPLATE=subdirs
++
++SUBDIRS += ivi-shell
+--
+1.8.3.1
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch
new file mode 100644
index 000000000..c91e11704
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch
@@ -0,0 +1,56 @@
+From 8caaf802a8b42e9bb1d74fc335a571882c75d73e Mon Sep 17 00:00:00 2001
+From: Holger Behrens <holger.behrens@windriver.com>
+Date: Tue, 3 Feb 2015 09:52:52 +0100
+Subject: [meta-ivi-demo][PATCH 1/2] protocol: update 3rd party ivi-application
+ protocol
+
+Signed-off-by: Holger Behrens <holger.behrens@windriver.com>
+---
+ src/3rdparty/protocol/ivi-application.xml | 31 +++----------------------------
+ 1 file changed, 3 insertions(+), 28 deletions(-)
+
+diff --git a/src/3rdparty/protocol/ivi-application.xml b/src/3rdparty/protocol/ivi-application.xml
+index 833fd38..b06ae6c 100644
+--- a/src/3rdparty/protocol/ivi-application.xml
++++ b/src/3rdparty/protocol/ivi-application.xml
+@@ -42,34 +42,9 @@
+ <arg name="visibility" type="int"/>
+ </event>
+
+- <enum name="warning_code">
+- <description summary="possible warning codes returned by ivi compositor">
+- These define all possible warning codes returned by ivi compositor on server-side warnings.
+- invalid_wl_surface:
+- - wl_surface already has a another role.
+- - wl_surface is destroyed before the ivi_surface is destroyed.
+- ivi_id_in_use: ivi_id is already assigned by another application.
+- </description>
+- <entry name="invalid_wl_surface" value="1" summary="wl_surface is invalid"/>
+- <entry name="ivi_id_in_use" value="2" summary="ivi_id is in use and can not be shared"/>
+- </enum>
+-
+- <event name="warning">
+- <description summary="server-side warning detected">
+- The ivi compositor encountered warning while processing a request by this
+- application. The warning is defined by argument warning_code and optional
+- warning_text. If the warning is detected, client shall destroy the ivi_surface
+- object.
+-
+- When a warning event is sent, the compositor turns the ivi_surface object inert.
+- The ivi_surface will not deliver further events, all requests on it are ignored
+- except 'destroy', and the association to the ivi_id is removed. The client
+- should destroy the ivi_surface object. If an inert ivi_surface object is used as
+- an argument to any other object's request, that request will [produce a fatal
+- error / produce a warning / be ignored].
+- </description>
+- <arg name="warning_code" type="int"/>
+- <arg name="warning_text" type="string" allow-null="true"/>
++ <event name="configure">
++ <arg name="width" type="int"/>
++ <arg name="height" type="int"/>
+ </event>
+
+ </interface>
+--
+2.2.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-Fix-multiple-QWindow.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-Fix-multiple-QWindow.patch
new file mode 100644
index 000000000..177710516
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-Fix-multiple-QWindow.patch
@@ -0,0 +1,62 @@
+From 23534d35587a8b62c945fef1adb29109e5c01bfa Mon Sep 17 00:00:00 2001
+From: Nobuhiko Tanibata <ntanibata@jp.adit-jv.com>
+Date: Fri, 6 Nov 2015 09:59:48 +0900
+Subject: [PATCH 2/2] Fix multiple QWindow
+
+Signed-off-by: Nobuhiko Tanibata <ntanibata@jp.adit-jv.com>
+---
+ .../ivi-shell/qwaylandivishellintegration.cpp | 16 ++++++++++------
+ .../ivi-shell/qwaylandivishellintegration.h | 1 +
+ 2 files changed, 11 insertions(+), 6 deletions(-)
+
+diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp
+index 763fafb..c42f283 100644
+--- a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp
++++ b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp
+@@ -58,6 +58,7 @@ namespace QtWaylandClient {
+
+ QWaylandIviShellIntegration::QWaylandIviShellIntegration()
+ : m_iviApplication(Q_NULLPTR)
++ , m_surfaceId(0)
+ {
+ }
+
+@@ -79,15 +80,18 @@ QWaylandShellSurface *QWaylandIviShellIntegration::createShellSurface(QWaylandWi
+ if (!m_iviApplication)
+ return Q_NULLPTR;
+
+- uint32_t id = 0;
+- QVariant value = window->property("IVI-Surface-ID");
+- if (value.isValid()) {
+- id = value.toUInt();
++ if (m_surfaceId == 0) {
++ QVariant value = window->property("IVI-Surface-ID");
++ if (value.isValid()) {
++ m_surfaceId = value.toUInt();
++ } else {
++ m_surfaceId = IVI_SURFACE_ID + getpid();
++ }
+ } else {
+- id = IVI_SURFACE_ID + getpid();
++ m_surfaceId++;
+ }
+
+- struct ivi_surface *surface = m_iviApplication->surface_create(id, window->object());
++ struct ivi_surface *surface = m_iviApplication->surface_create(m_surfaceId, window->object());
+
+ return new QWaylandIviSurface(surface, window);
+ }
+diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h
+index 4856ec6..1d10e91 100644
+--- a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h
++++ b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h
+@@ -70,6 +70,7 @@ private:
+
+ private:
+ QtWayland::ivi_application *m_iviApplication;
++ uint32_t m_surfaceId;
+ };
+
+ }
+--
+1.8.3.1
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch
new file mode 100644
index 000000000..591ef71c5
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch
@@ -0,0 +1,34 @@
+From 31c60aedf415fd06b5c1aa16fdcef1504b67b96d Mon Sep 17 00:00:00 2001
+From: Holger Behrens <holger.behrens@windriver.com>
+Date: Tue, 3 Feb 2015 09:53:43 +0100
+Subject: [meta-ivi-demo][PATCH 2/2] qwaylandwindow: add support for
+ IVI-Surface-ID property
+
+Signed-off-by: Holger Behrens <holger.behrens@windriver.com>
+---
+ src/client/qwaylandwindow.cpp | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 45a58f2..781081a 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -100,7 +100,14 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
+
+ if (!(window->flags() & Qt::BypassWindowManagerHint)) {
+ if (mDisplay->shellIvi()) {
+- mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(IVI_SURFACE_ID + getpid(), object()), this);
++ unsigned int id = 0;
++ QVariant value = window->property("IVI-Surface-ID");
++ if (value.isValid()) {
++ id = value.toUInt();
++ } else {
++ id = IVI_SURFACE_ID + getpid();
++ }
++ mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(id, object()), this);
+ } else if (mDisplay->shellXdg()) {
+ if (window->type() & Qt::Window) {
+ mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this);
+--
+2.2.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch
new file mode 100644
index 000000000..39296c769
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch
@@ -0,0 +1,33 @@
+Add qt5wayland.manifest. Removed specfile change from patch.
+
+Adapted from:
+
+From 424c23191d81b072255bd7f178ad0ee2c2ea091a Mon Sep 17 00:00:00 2001
+From: Tomasz Olszak <olszak.tomasz@gmail.com>
+Date: Fri, 25 Apr 2014 14:32:22 +0200
+Subject: [PATCH 10/21] Added manifest file according to smack 3-domain model.
+
+Bug-Tizen:TIVI-2416
+
+Change-Id: I414e245a5c8847bec32ef6a97569d0f06221e1db
+Signed-off-by: Tomasz Olszak <olszak.tomasz@gmail.com>
+---
+ packaging/qt5-qtwayland.manifest | 5 +++++
+ packaging/qt5-qtwayland.spec | 4 ++++
+ 2 files changed, 9 insertions(+)
+ create mode 100644 packaging/qt5-qtwayland.manifest
+
+diff --git a/packaging/qt5-qtwayland.manifest b/packaging/qt5-qtwayland.manifest
+new file mode 100644
+index 0000000..75b0fa5
+--- /dev/null
++++ b/packaging/qt5-qtwayland.manifest
+@@ -0,0 +1,5 @@
++<manifest>
++ <request>
++ <domain name="_"/>
++ </request>
++</manifest>
+--
+1.9.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch
new file mode 100644
index 000000000..6bea62621
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch
@@ -0,0 +1,468 @@
+From 5cd43dc7519f54f9786fb6c686a2ce1e682d4366 Mon Sep 17 00:00:00 2001
+From: Philippe Coval <philippe.coval@open.eurogiciel.org>
+Date: Fri, 25 Apr 2014 10:31:42 +0200
+Subject: [PATCH 16/21] xdg-shell: Add xdg-shell protocol file version 1.4.0
+
+Source: http://cgit.freedesktop.org/wayland/weston/plain/protocol/xdg-shell.xml?id=1.4.0
+
+This file will need to be refreshed on protocol update
+until xdg-shell land in wayland's public headers
+
+Task-number: QTBUG-38633/part/1of2
+Change-Id: I397d863dcfc2223ac6eb234c37dbcd7449ecffff
+Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
+Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/c2a22eea6716e073875474adf624d8463eba836c
+Bug-Tizen: TIVI-3113/part
+Signed-off-by: Philippe Coval <philippe.coval@open.eurogiciel.org>
+---
+ src/3rdparty/protocol/xdg-shell.xml | 438 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 438 insertions(+)
+ create mode 100644 src/3rdparty/protocol/xdg-shell.xml
+
+diff --git a/src/3rdparty/protocol/xdg-shell.xml b/src/3rdparty/protocol/xdg-shell.xml
+new file mode 100644
+index 0000000..4e5cff8
+--- /dev/null
++++ b/src/3rdparty/protocol/xdg-shell.xml
+@@ -0,0 +1,438 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<protocol name="xdg_shell">
++
++ <copyright>
++ Copyright © 2008-2013 Kristian Høgsberg
++ Copyright © 2013 Rafael Antognolli
++ Copyright © 2013 Jasper St. Pierre
++ Copyright © 2010-2013 Intel Corporation
++
++ Permission to use, copy, modify, distribute, and sell this
++ software and its documentation for any purpose is hereby granted
++ without fee, provided that the above copyright notice appear in
++ all copies and that both that copyright notice and this permission
++ notice appear in supporting documentation, and that the name of
++ the copyright holders not be used in advertising or publicity
++ pertaining to distribution of the software without specific,
++ written prior permission. The copyright holders make no
++ representations about the suitability of this software for any
++ purpose. It is provided "as is" without express or implied
++ warranty.
++
++ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
++ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
++ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
++ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
++ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
++ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
++ THIS SOFTWARE.
++ </copyright>
++
++ <interface name="xdg_shell" version="1">
++ <description summary="create desktop-style surfaces">
++ This interface is implemented by servers that provide
++ desktop-style user interfaces.
++
++ It allows clients to associate a xdg_surface with
++ a basic surface.
++ </description>
++
++ <enum name="version">
++ <description summary="latest protocol version">
++ Use this enum to check the protocol version, and it will be updated
++ automatically.
++ </description>
++ <entry name="current" value="1" summary="Always the latest version"/>
++ </enum>
++
++
++ <request name="use_unstable_version">
++ <description summary="enable use of this unstable version">
++ Use this request in order to enable use of this interface.
++
++ Understand and agree that one is using an unstable interface,
++ that will likely change in the future, breaking the API.
++ </description>
++ <arg name="version" type="int"/>
++ </request>
++
++ <request name="get_xdg_surface">
++ <description summary="create a shell surface from a surface">
++ Create a shell surface for an existing surface.
++
++ Only one shell or popup surface can be associated with a given
++ surface.
++ </description>
++ <arg name="id" type="new_id" interface="xdg_surface"/>
++ <arg name="surface" type="object" interface="wl_surface"/>
++ </request>
++
++ <request name="get_xdg_popup">
++ <description summary="create a shell surface from a surface">
++ Create a popup surface for an existing surface.
++
++ Only one shell or popup surface can be associated with a given
++ surface.
++ </description>
++ <arg name="id" type="new_id" interface="xdg_popup"/>
++ <arg name="surface" type="object" interface="wl_surface"/>
++ <arg name="parent" type="object" interface="wl_surface"/>
++ <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
++ <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
++ <arg name="x" type="int"/>
++ <arg name="y" type="int"/>
++ <arg name="flags" type="uint"/>
++ </request>
++ </interface>
++
++ <interface name="xdg_surface" version="1">
++
++ <description summary="desktop-style metadata interface">
++ An interface that may be implemented by a wl_surface, for
++ implementations that provide a desktop-style user interface.
++
++ It provides requests to treat surfaces like windows, allowing to set
++ properties like maximized, fullscreen, minimized, and to move and resize
++ them, and associate metadata like title and app id.
++
++ On the server side the object is automatically destroyed when
++ the related wl_surface is destroyed. On client side,
++ xdg_surface.destroy() must be called before destroying
++ the wl_surface object.
++ </description>
++
++ <request name="destroy" type="destructor">
++ <description summary="remove xdg_surface interface">
++ The xdg_surface interface is removed from the wl_surface object
++ that was turned into a xdg_surface with
++ xdg_shell.get_xdg_surface request. The xdg_surface properties,
++ like maximized and fullscreen, are lost. The wl_surface loses
++ its role as a xdg_surface. The wl_surface is unmapped.
++ </description>
++ </request>
++
++ <request name="set_transient_for">
++ <description summary="surface is a child of another surface">
++ Setting a surface as transient of another means that it is child
++ of another surface.
++
++ Child surfaces are stacked above their parents, and will be
++ unmapped if the parent is unmapped too. They should not appear
++ on task bars and alt+tab.
++ </description>
++ <arg name="parent" type="object" interface="wl_surface" allow-null="true"/>
++ </request>
++
++ <request name="set_title">
++ <description summary="set surface title">
++ Set a short title for the surface.
++
++ This string may be used to identify the surface in a task bar,
++ window list, or other user interface elements provided by the
++ compositor.
++
++ The string must be encoded in UTF-8.
++ </description>
++ <arg name="title" type="string"/>
++ </request>
++
++ <request name="set_app_id">
++ <description summary="set surface class">
++ Set an id for the surface.
++
++ The app id identifies the general class of applications to which
++ the surface belongs.
++
++ It should be the ID that appears in the new desktop entry
++ specification, the interface name.
++ </description>
++ <arg name="app_id" type="string"/>
++ </request>
++
++ <request name="pong">
++ <description summary="respond to a ping event">
++ A client must respond to a ping event with a pong request or
++ the client may be deemed unresponsive.
++ </description>
++ <arg name="serial" type="uint" summary="serial of the ping event"/>
++ </request>
++
++ <event name="ping">
++ <description summary="ping client">
++ Ping a client to check if it is receiving events and sending
++ requests. A client is expected to reply with a pong request.
++ </description>
++ <arg name="serial" type="uint"/>
++ </event>
++
++ <request name="move">
++ <description summary="start an interactive move">
++ Start a pointer-driven move of the surface.
++
++ This request must be used in response to a button press event.
++ The server may ignore move requests depending on the state of
++ the surface (e.g. fullscreen or maximized).
++ </description>
++ <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
++ <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
++ </request>
++
++ <enum name="resize_edge">
++ <description summary="edge values for resizing">
++ These values are used to indicate which edge of a surface
++ is being dragged in a resize operation. The server may
++ use this information to adapt its behavior, e.g. choose
++ an appropriate cursor image.
++ </description>
++ <entry name="none" value="0"/>
++ <entry name="top" value="1"/>
++ <entry name="bottom" value="2"/>
++ <entry name="left" value="4"/>
++ <entry name="top_left" value="5"/>
++ <entry name="bottom_left" value="6"/>
++ <entry name="right" value="8"/>
++ <entry name="top_right" value="9"/>
++ <entry name="bottom_right" value="10"/>
++ </enum>
++
++ <request name="resize">
++ <description summary="start an interactive resize">
++ Start a pointer-driven resizing of the surface.
++
++ This request must be used in response to a button press event.
++ The server may ignore resize requests depending on the state of
++ the surface (e.g. fullscreen or maximized).
++ </description>
++ <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
++ <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
++ <arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
++ </request>
++
++ <event name="configure">
++ <description summary="suggest resize">
++ The configure event asks the client to resize its surface.
++
++ The size is a hint, in the sense that the client is free to
++ ignore it if it doesn't resize, pick a smaller size (to
++ satisfy aspect ratio or resize in steps of NxM pixels).
++
++ The edges parameter provides a hint about how the surface
++ was resized. The client may use this information to decide
++ how to adjust its content to the new size (e.g. a scrolling
++ area might adjust its content position to leave the viewable
++ content unmoved). Valid edge values are from resize_edge enum.
++
++ The client is free to dismiss all but the last configure
++ event it received.
++
++ The width and height arguments specify the size of the window
++ in surface local coordinates.
++ </description>
++
++ <arg name="edges" type="uint"/>
++ <arg name="width" type="int"/>
++ <arg name="height" type="int"/>
++ </event>
++
++ <request name="set_output">
++ <description summary="set the default output used by this surface">
++ Set the default output used by this surface when it is first mapped.
++
++ If this value is NULL (default), it's up to the compositor to choose
++ which display will be used to map this surface.
++
++ When fullscreen or maximized state are set on this surface, and it
++ wasn't mapped yet, the output set with this method will be used.
++ Otherwise, the output where the surface is currently mapped will be
++ used.
++ </description>
++ <arg name="output" type="object" interface="wl_output" allow-null="true"/>
++ </request>
++
++ <event name="request_set_fullscreen">
++ <description summary="server requests that the client set fullscreen">
++ Event sent from the compositor to the client requesting that the client
++ goes to a fullscreen state. It's the client job to call set_fullscreen
++ and really trigger the fullscreen state.
++ </description>
++ </event>
++
++ <event name="request_unset_fullscreen">
++ <description summary="server requests that the client unset fullscreen">
++ Event sent from the compositor to the client requesting that the client
++ leaves the fullscreen state. It's the client job to call
++ unset_fullscreen and really leave the fullscreen state.
++ </description>
++ </event>
++
++ <request name="set_fullscreen">
++ <description summary="set the surface state as fullscreen">
++ Set the surface as fullscreen.
++
++ After this request, the compositor should send a configure event
++ informing the output size.
++
++ This request informs the compositor that the next attached buffer
++ committed will be in a fullscreen state. The buffer size should be the
++ same size as the size informed in the configure event, if the client
++ doesn't want to leave any empty area.
++
++ In other words: the next attached buffer after set_maximized is the new
++ maximized buffer. And the surface will be positioned at the maximized
++ position on commit.
++
++ A simple way to synchronize and wait for the correct configure event is
++ to use a wl_display.sync request right after the set_fullscreen
++ request. When the sync callback returns, the last configure event
++ received just before it will be the correct one, and should contain the
++ right size for the surface to maximize.
++
++ Setting one state won't unset another state. Use
++ xdg_surface.unset_fullscreen for unsetting it.
++ </description>
++ </request>
++
++ <request name="unset_fullscreen">
++ <description summary="unset the surface state as fullscreen">
++ Unset the surface fullscreen state.
++
++ Same negotiation as set_fullscreen must be used.
++ </description>
++ </request>
++
++ <event name="request_set_maximized">
++ <description summary="server requests that the client set maximized">
++ Event sent from the compositor to the client requesting that the client
++ goes to a maximized state. It's the client job to call set_maximized
++ and really trigger the maximized state.
++ </description>
++ </event>
++
++ <event name="request_unset_maximized">
++ <description summary="server requests that the client unset maximized">
++ Event sent from the compositor to the client requesting that the client
++ leaves the maximized state. It's the client job to call unset_maximized
++ and really leave the maximized state.
++ </description>
++ </event>
++
++ <request name="set_maximized">
++ <description summary="set the surface state as maximized">
++ Set the surface as maximized.
++
++ After this request, the compositor will send a configure event
++ informing the output size minus panel and other MW decorations.
++
++ This request informs the compositor that the next attached buffer
++ committed will be in a maximized state. The buffer size should be the
++ same size as the size informed in the configure event, if the client
++ doesn't want to leave any empty area.
++
++ In other words: the next attached buffer after set_maximized is the new
++ maximized buffer. And the surface will be positioned at the maximized
++ position on commit.
++
++ A simple way to synchronize and wait for the correct configure event is
++ to use a wl_display.sync request right after the set_maximized request.
++ When the sync callback returns, the last configure event received just
++ before it will be the correct one, and should contain the right size
++ for the surface to maximize.
++
++ Setting one state won't unset another state. Use
++ xdg_surface.unset_maximized for unsetting it.
++ </description>
++ </request>
++
++ <request name="unset_maximized">
++ <description summary="unset the surface state as maximized">
++ Unset the surface maximized state.
++
++ Same negotiation as set_maximized must be used.
++ </description>
++ </request>
++
++ <request name="set_minimized">
++ <description summary="set the surface state as minimized">
++ Set the surface minimized state.
++
++ Setting one state won't unset another state.
++ </description>
++ </request>
++
++ <event name="focused_set">
++ <description summary="surface was focused">
++ The focused_set event is sent when this surface has been
++ activated. Window decorations should be updated accordingly.
++ </description>
++ </event>
++
++ <event name="focused_unset">
++ <description summary="surface was unfocused">
++ The focused_unset event is sent when this surface has been
++ deactivated, because another surface has been activated. Window
++ decorations should be updated accordingly.
++ </description>
++ </event>
++ </interface>
++
++ <interface name="xdg_popup" version="1">
++ <description summary="desktop-style metadata interface">
++ An interface that may be implemented by a wl_surface, for
++ implementations that provide a desktop-style popups/menus. A popup
++ surface is a transient surface with an added pointer grab.
++
++ An existing implicit grab will be changed to owner-events mode,
++ and the popup grab will continue after the implicit grab ends
++ (i.e. releasing the mouse button does not cause the popup to be
++ unmapped).
++
++ The popup grab continues until the window is destroyed or a mouse
++ button is pressed in any other clients window. A click in any of
++ the clients surfaces is reported as normal, however, clicks in
++ other clients surfaces will be discarded and trigger the callback.
++
++ The x and y arguments specify the locations of the upper left
++ corner of the surface relative to the upper left corner of the
++ parent surface, in surface local coordinates.
++
++ xdg_popup surfaces are always transient for another surface.
++ </description>
++
++ <request name="destroy" type="destructor">
++ <description summary="remove xdg_surface interface">
++ The xdg_surface interface is removed from the wl_surface object
++ that was turned into a xdg_surface with
++ xdg_shell.get_xdg_surface request. The xdg_surface properties,
++ like maximized and fullscreen, are lost. The wl_surface loses
++ its role as a xdg_surface. The wl_surface is unmapped.
++ </description>
++ </request>
++
++ <request name="pong">
++ <description summary="respond to a ping event">
++ A client must respond to a ping event with a pong request or
++ the client may be deemed unresponsive.
++ </description>
++ <arg name="serial" type="uint" summary="serial of the ping event"/>
++ </request>
++
++ <event name="ping">
++ <description summary="ping client">
++ Ping a client to check if it is receiving events and sending
++ requests. A client is expected to reply with a pong request.
++ </description>
++ <arg name="serial" type="uint"/>
++ </event>
++
++ <event name="popup_done">
++ <description summary="popup interaction is done">
++ The popup_done event is sent out when a popup grab is broken,
++ that is, when the users clicks a surface that doesn't belong
++ to the client owning the popup surface.
++ </description>
++ <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
++ </event>
++
++ </interface>
++</protocol>
+--
+1.9.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch
new file mode 100644
index 000000000..fe1bb50e8
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch
@@ -0,0 +1,1029 @@
+From 0edba039247ce888dbb7ff0a93c7b9ec01bac46e Mon Sep 17 00:00:00 2001
+From: Philippe Coval <philippe.coval@open.eurogiciel.org>
+Date: Wed, 26 Mar 2014 10:16:01 +0100
+Subject: [PATCH 17/21] xdg-shell: Add minimize feature to QWindow using
+ wayland's xdg-shell
+
+The feature is disabled by default,
+and can be enabled at runtime
+by exporting QT_WAYLAND_USE_XDG_SHELL env variable.
+
+This patch relies on presence of protocol file
+which has been imported from weston-1.4.0 sources,
+until the xdg-shell is merge into wayland itself.
+
+Because xdg-shell is experimental,
+code fallback to WaylandShell if no XdgShell
+but keep in mind those shells are exclusive.
+
+Since xdg-shell and wayland-shell share most of the API,
+some factorization is done by an (empty) abstraction class
+to keep the code more readable.
+
+Despite xdg-shell introduces new popups concept,
+they're not used on this change for maitainance purpose.
+
+Notes:
+
+* This change depends on presence of xdg-shell protocol file.
+
+* You can check a demo video
+ (qt-tizen-cinematic-experience-20140430-rzr)
+ of the test case at :
+ https://www.youtube.com/watch?v=pY_XXvKc_0E#
+
+* Use Super+Tab to show window again if hidden
+
+Task-number: QTBUG-38633/part/2of2
+Change-Id: I2d7ed85bea1847d82439fdfc893a3dbb2581ffff
+Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
+Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/768484daaa64bea965bef981a16f59be8db0c190
+Bug-Tizen: TIVI-3113/part
+Signed-off-by: Philippe Coval <philippe.coval@open.eurogiciel.org>
+---
+ src/client/client.pro | 5 +
+ src/client/qwaylanddisplay.cpp | 5 +
+ src/client/qwaylanddisplay_p.h | 4 +
+ src/client/qwaylandshellsurface.cpp | 134 ------------------------
+ src/client/qwaylandshellsurface_p.h | 40 +++-----
+ src/client/qwaylandwindow.cpp | 40 ++++++--
+ src/client/qwaylandwlshellsurface.cpp | 186 ++++++++++++++++++++++++++++++++++
+ src/client/qwaylandwlshellsurface_p.h | 101 ++++++++++++++++++
+ src/client/qwaylandxdgsurface.cpp | 173 +++++++++++++++++++++++++++++++
+ src/client/qwaylandxdgsurface_p.h | 105 +++++++++++++++++++
+ 10 files changed, 625 insertions(+), 168 deletions(-)
+ create mode 100644 src/client/qwaylandwlshellsurface.cpp
+ create mode 100644 src/client/qwaylandwlshellsurface_p.h
+ create mode 100644 src/client/qwaylandxdgsurface.cpp
+ create mode 100644 src/client/qwaylandxdgsurface_p.h
+
+diff --git a/src/client/client.pro b/src/client/client.pro
+index 10cbd31..9ecf82f 100644
+--- a/src/client/client.pro
++++ b/src/client/client.pro
+@@ -41,6 +41,7 @@ WAYLANDCLIENTSOURCES += \
+ ../extensions/qtkey-extension.xml \
+ ../extensions/windowmanager.xml \
+ ../3rdparty/protocol/text.xml \
++ ../3rdparty/protocol/xdg-shell.xml \
+
+ SOURCES += qwaylandintegration.cpp \
+ qwaylandnativeinterface.cpp \
+@@ -57,6 +58,8 @@ SOURCES += qwaylandintegration.cpp \
+ qwaylanddatadevicemanager.cpp \
+ qwaylanddatasource.cpp \
+ qwaylandshellsurface.cpp \
++ qwaylandwlshellsurface.cpp \
++ qwaylandxdgsurface.cpp \
+ qwaylandextendedoutput.cpp \
+ qwaylandextendedsurface.cpp \
+ qwaylandsubsurface.cpp \
+@@ -85,6 +88,8 @@ HEADERS += qwaylandintegration_p.h \
+ qwaylanddatadevicemanager_p.h \
+ qwaylanddatasource_p.h \
+ qwaylandshellsurface_p.h \
++ qwaylandwlshellsurface_p.h \
++ qwaylandxdgsurface_p.h \
+ qwaylandextendedoutput_p.h \
+ qwaylandextendedsurface_p.h \
+ qwaylandsubsurface_p.h \
+diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
+index 0b715c0..7f953ad 100644
+--- a/src/client/qwaylanddisplay.cpp
++++ b/src/client/qwaylanddisplay.cpp
+@@ -61,6 +61,7 @@
+ #include "qwaylandqtkey_p.h"
+
+ #include <QtWaylandClient/private/qwayland-text.h>
++#include <QtWaylandClient/private/qwayland-xdg-shell.h>
+
+ #include <QtCore/QAbstractEventDispatcher>
+ #include <QtGui/private/qguiapplication_p.h>
+@@ -206,6 +207,10 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
+ mCompositor.init(registry, id);
+ } else if (interface == QStringLiteral("wl_shm")) {
+ mShm = static_cast<struct wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface,1));
++ } else if (interface == QStringLiteral("xdg_shell")
++ && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) {
++ mShellXdg.reset(new QtWayland::xdg_shell(registry, id));
++ mShellXdg->use_unstable_version(QtWayland::xdg_shell::version_current);
+ } else if (interface == QStringLiteral("wl_shell")){
+ mShell.reset(new QtWayland::wl_shell(registry, id));
+ } else if (interface == QStringLiteral("wl_seat")) {
+diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
+index 40cb2b2..cf5dfc2 100644
+--- a/src/client/qwaylanddisplay_p.h
++++ b/src/client/qwaylanddisplay_p.h
+@@ -51,6 +51,7 @@
+
+ #include <QtWaylandClient/private/qwayland-wayland.h>
+ #include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include <QtWaylandClient/private/qwayland-xdg-shell.h>
+
+ struct wl_cursor_image;
+
+@@ -78,6 +79,7 @@ namespace QtWayland {
+ class qt_sub_surface_extension;
+ class qt_surface_extension;
+ class wl_text_input_manager;
++ class xdg_shell;
+ }
+
+ typedef void (*RegistryListener)(void *data,
+@@ -113,6 +115,7 @@ public:
+ QtWayland::wl_compositor *compositor() { return &mCompositor; }
+
+ QtWayland::wl_shell *shell() { return mShell.data(); }
++ QtWayland::xdg_shell *shellXdg() { return mShellXdg.data(); }
+
+ QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
+ QWaylandInputDevice *defaultInputDevice() const;
+@@ -168,6 +171,7 @@ private:
+ QThread *mEventThread;
+ QWaylandEventThread *mEventThreadObject;
+ QScopedPointer<QtWayland::wl_shell> mShell;
++ QScopedPointer<QtWayland::xdg_shell> mShellXdg;
+ QList<QPlatformScreen *> mScreens;
+ QList<QWaylandInputDevice *> mInputDevices;
+ QList<Listener> mRegistryListeners;
+diff --git a/src/client/qwaylandshellsurface.cpp b/src/client/qwaylandshellsurface.cpp
+index b7a819f..80e509b 100644
+--- a/src/client/qwaylandshellsurface.cpp
++++ b/src/client/qwaylandshellsurface.cpp
+@@ -40,137 +40,3 @@
+ ****************************************************************************/
+
+ #include "qwaylandshellsurface_p.h"
+-
+-#include "qwaylanddisplay_p.h"
+-#include "qwaylandwindow_p.h"
+-#include "qwaylandinputdevice_p.h"
+-#include "qwaylanddecoration_p.h"
+-#include "qwaylandscreen_p.h"
+-
+-#include <QtCore/QDebug>
+-
+-QT_BEGIN_NAMESPACE
+-
+-QWaylandShellSurface::QWaylandShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window)
+- : QtWayland::wl_shell_surface(shell_surface)
+- , m_window(window)
+- , m_maximized(false)
+- , m_fullscreen(false)
+-{
+-}
+-
+-QWaylandShellSurface::~QWaylandShellSurface()
+-{
+- wl_shell_surface_destroy(object());
+-}
+-
+-void QWaylandShellSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges)
+-{
+- resize(inputDevice->wl_seat(),
+- inputDevice->serial(),
+- edges);
+-}
+-
+-void QWaylandShellSurface::move(QWaylandInputDevice *inputDevice)
+-{
+- move(inputDevice->wl_seat(),
+- inputDevice->serial());
+-}
+-
+-void QWaylandShellSurface::setMaximized()
+-{
+- m_maximized = true;
+- m_size = m_window->window()->geometry().size();
+- set_maximized(0);
+-}
+-
+-void QWaylandShellSurface::setFullscreen()
+-{
+- m_fullscreen = true;
+- m_size = m_window->window()->geometry().size();
+- set_fullscreen(WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, 0);
+-}
+-
+-void QWaylandShellSurface::setNormal()
+-{
+- if (m_fullscreen || m_maximized) {
+- m_fullscreen = m_maximized = false;
+- setTopLevel();
+- QMargins m = m_window->frameMargins();
+- m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom());
+- }
+-}
+-
+-void QWaylandShellSurface::setMinimized()
+-{
+- // TODO: There's no wl_shell_surface API for this
+-}
+-
+-void QWaylandShellSurface::setTopLevel()
+-{
+- set_toplevel();
+-}
+-
+-void QWaylandShellSurface::updateTransientParent(QWindow *parent)
+-{
+- QWaylandWindow *parent_wayland_window = static_cast<QWaylandWindow *>(parent->handle());
+- if (!parent_wayland_window)
+- return;
+-
+- // set_transient expects a position relative to the parent
+- QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
+- QWindow *parentWin = m_window->window()->transientParent();
+- transientPos -= parentWin->geometry().topLeft();
+- if (parent_wayland_window->decoration()) {
+- transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
+- transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
+- }
+-
+- uint32_t flags = 0;
+- Qt::WindowFlags wf = m_window->window()->flags();
+- if (wf.testFlag(Qt::ToolTip)
+- || wf.testFlag(Qt::WindowTransparentForInput))
+- flags |= WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
+-
+- set_transient(parent_wayland_window->object(),
+- transientPos.x(),
+- transientPos.y(),
+- flags);
+-}
+-
+-void QWaylandShellSurface::setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial)
+-{
+- QWaylandWindow *parent_wayland_window = parent;
+- if (!parent_wayland_window)
+- return;
+-
+- // set_popup expects a position relative to the parent
+- QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
+- transientPos -= parent_wayland_window->geometry().topLeft();
+- if (parent_wayland_window->decoration()) {
+- transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
+- transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
+- }
+-
+- set_popup(device->wl_seat(), serial, parent_wayland_window->object(),
+- transientPos.x(), transientPos.y(), 0);
+-}
+-
+-void QWaylandShellSurface::shell_surface_ping(uint32_t serial)
+-{
+- pong(serial);
+-}
+-
+-void QWaylandShellSurface::shell_surface_configure(uint32_t edges,
+- int32_t width,
+- int32_t height)
+-{
+- m_window->configure(edges, width, height);
+-}
+-
+-void QWaylandShellSurface::shell_surface_popup_done()
+-{
+- QCoreApplication::postEvent(m_window->window(), new QCloseEvent());
+-}
+-
+-QT_END_NAMESPACE
+diff --git a/src/client/qwaylandshellsurface_p.h b/src/client/qwaylandshellsurface_p.h
+index 2477c3f..2f59f60 100644
+--- a/src/client/qwaylandshellsurface_p.h
++++ b/src/client/qwaylandshellsurface_p.h
+@@ -55,39 +55,25 @@ class QWaylandWindow;
+ class QWaylandInputDevice;
+ class QWindow;
+
+-class Q_WAYLAND_CLIENT_EXPORT QWaylandShellSurface : public QtWayland::wl_shell_surface
++class Q_WAYLAND_CLIENT_EXPORT QWaylandShellSurface
+ {
+ public:
+- QWaylandShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window);
+- ~QWaylandShellSurface();
++ virtual ~QWaylandShellSurface() {}
++ virtual void resize(QWaylandInputDevice * /*inputDevice*/, enum wl_shell_surface_resize /*edges*/)
++ {}
+
+- using QtWayland::wl_shell_surface::resize;
+- void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges);
+-
+- using QtWayland::wl_shell_surface::move;
+- void move(QWaylandInputDevice *inputDevice);
++ virtual void move(QWaylandInputDevice * /*inputDevice*/) {}
++ virtual void setTitle(const QString & /*title*/) {}
++ virtual void setAppId(const QString & /*appId*/) {}
+
+ private:
+- void setMaximized();
+- void setFullscreen();
+- void setNormal();
+- void setMinimized();
+-
+- void setTopLevel();
+- void updateTransientParent(QWindow *parent);
+- void setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial);
+-
+- QWaylandWindow *m_window;
+- bool m_maximized;
+- bool m_fullscreen;
+- QSize m_size;
+-
+- void shell_surface_ping(uint32_t serial) Q_DECL_OVERRIDE;
+- void shell_surface_configure(uint32_t edges,
+- int32_t width,
+- int32_t height) Q_DECL_OVERRIDE;
+- void shell_surface_popup_done() Q_DECL_OVERRIDE;
++ virtual void setMaximized() {}
++ virtual void setFullscreen() {}
++ virtual void setNormal() {}
++ virtual void setMinimized() {}
+
++ virtual void setTopLevel() {}
++ virtual void updateTransientParent(QWindow * /*parent*/) {}
+ friend class QWaylandWindow;
+ };
+
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 920c977..3fb3a49 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -46,6 +46,8 @@
+ #include "qwaylandinputdevice_p.h"
+ #include "qwaylandscreen_p.h"
+ #include "qwaylandshellsurface_p.h"
++#include "qwaylandwlshellsurface_p.h"
++#include "qwaylandxdgsurface_p.h"
+ #include "qwaylandextendedsurface_p.h"
+ #include "qwaylandsubsurface_p.h"
+ #include "qwaylanddecoration_p.h"
+@@ -92,8 +94,16 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
+ static WId id = 1;
+ mWindowId = id++;
+
+- if (mDisplay->shell() && window->type() & Qt::Window && !(window->flags() & Qt::BypassWindowManagerHint))
+- mShellSurface = new QWaylandShellSurface(mDisplay->shell()->get_shell_surface(object()), this);
++ if (!(window->flags() & Qt::BypassWindowManagerHint)) {
++ if (mDisplay->shellXdg()) {
++ if (window->type() & Qt::Window) {
++ mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this);
++ }
++ } else if (mDisplay->shell() && window->type() & Qt::Window) {
++ mShellSurface = new QWaylandWlShellSurface(mDisplay->shell()->get_shell_surface(object()), this);
++ }
++ }
++
+ if (mDisplay->windowExtension())
+ mExtendedWindow = new QWaylandExtendedSurface(this, mDisplay->windowExtension()->get_extended_surface(object()));
+ if (mDisplay->subSurfaceExtension())
+@@ -101,12 +111,12 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
+
+ if (mShellSurface) {
+ // Set initial surface title
+- mShellSurface->set_title(window->title());
++ mShellSurface->setTitle(window->title());
+
+ // Set surface class to the .desktop file name (obtained from executable name)
+ QFileInfo exeFileInfo(qApp->applicationFilePath());
+ QString className = exeFileInfo.baseName() + QLatin1String(".desktop");
+- mShellSurface->set_class(className);
++ mShellSurface->setAppId(className);
+ }
+
+ if (QPlatformWindow::parent() && mSubSurfaceWindow) {
+@@ -170,7 +180,7 @@ void QWaylandWindow::setParent(const QPlatformWindow *parent)
+ void QWaylandWindow::setWindowTitle(const QString &title)
+ {
+ if (mShellSurface) {
+- mShellSurface->set_title(title);
++ mShellSurface->setTitle(title);
+ }
+
+ if (mWindowDecoration && window()->isVisible())
+@@ -212,8 +222,10 @@ void QWaylandWindow::setVisible(bool visible)
+ mMouseDevice = parent->mMouseDevice;
+ mMouseSerial = parent->mMouseSerial;
+
+- if (mMouseDevice)
+- mShellSurface->setPopup(transientParent(), mMouseDevice, mMouseSerial);
++ QWaylandWlShellSurface *wlshellSurface = dynamic_cast<QWaylandWlShellSurface*>(mShellSurface);
++ if (mMouseDevice && wlshellSurface) {
++ wlshellSurface->setPopup(transientParent(), mMouseDevice, mMouseSerial);
++ }
+ }
+
+ if (!mSentInitialResize) {
+@@ -428,6 +440,20 @@ void QWaylandWindow::setWindowFlags(Qt::WindowFlags flags)
+
+ bool QWaylandWindow::createDecoration()
+ {
++ // so far only xdg-shell support this "unminimize" trick, may be moved elsewhere
++ if (mState == Qt::WindowMinimized) {
++ QWaylandXdgSurface *xdgSurface = dynamic_cast<QWaylandXdgSurface *>(mShellSurface);
++ if ( xdgSurface ) {
++ if (xdgSurface->isFullscreen()) {
++ setWindowStateInternal(Qt::WindowFullScreen);
++ } else if (xdgSurface->isMaximized()) {
++ setWindowStateInternal(Qt::WindowMaximized);
++ } else {
++ setWindowStateInternal(Qt::WindowNoState);
++ }
++ }
++ }
++
+ static bool disableWaylandDecorations = !qgetenv("QT_WAYLAND_DISABLE_WINDOWDECORATION").isEmpty();
+ if (disableWaylandDecorations)
+ return false;
+diff --git a/src/client/qwaylandwlshellsurface.cpp b/src/client/qwaylandwlshellsurface.cpp
+new file mode 100644
+index 0000000..4b73ec2
+--- /dev/null
++++ b/src/client/qwaylandwlshellsurface.cpp
+@@ -0,0 +1,186 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandwlshellsurface_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandWlShellSurface::QWaylandWlShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window)
++ : QtWayland::wl_shell_surface(shell_surface)
++ , m_window(window)
++ , m_maximized(false)
++ , m_fullscreen(false)
++{
++}
++
++QWaylandWlShellSurface::~QWaylandWlShellSurface()
++{
++ wl_shell_surface_destroy(object());
++}
++
++void QWaylandWlShellSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges)
++{
++ resize(inputDevice->wl_seat(),
++ inputDevice->serial(),
++ edges);
++}
++
++void QWaylandWlShellSurface::move(QWaylandInputDevice *inputDevice)
++{
++ move(inputDevice->wl_seat(),
++ inputDevice->serial());
++}
++
++void QWaylandWlShellSurface::setTitle(const QString & title)
++{
++ return QtWayland::wl_shell_surface::set_title(title);
++}
++
++void QWaylandWlShellSurface::setAppId(const QString & appId)
++{
++ return QtWayland::wl_shell_surface::set_class(appId);
++}
++
++void QWaylandWlShellSurface::setMaximized()
++{
++ m_maximized = true;
++ m_size = m_window->window()->geometry().size();
++ set_maximized(0);
++}
++
++void QWaylandWlShellSurface::setFullscreen()
++{
++ m_fullscreen = true;
++ m_size = m_window->window()->geometry().size();
++ set_fullscreen(WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, 0);
++}
++
++void QWaylandWlShellSurface::setNormal()
++{
++ if (m_fullscreen || m_maximized) {
++ m_fullscreen = m_maximized = false;
++ setTopLevel();
++ QMargins m = m_window->frameMargins();
++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom());
++ }
++}
++
++void QWaylandWlShellSurface::setMinimized()
++{
++ // TODO: There's no wl_shell_surface API for this
++}
++
++void QWaylandWlShellSurface::setTopLevel()
++{
++ set_toplevel();
++}
++
++void QWaylandWlShellSurface::updateTransientParent(QWindow *parent)
++{
++ QWaylandWindow *parent_wayland_window = static_cast<QWaylandWindow *>(parent->handle());
++ if (!parent_wayland_window)
++ return;
++
++ // set_transient expects a position relative to the parent
++ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
++ QWindow *parentWin = m_window->window()->transientParent();
++ transientPos -= parentWin->geometry().topLeft();
++ if (parent_wayland_window->decoration()) {
++ transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
++ transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
++ }
++
++ uint32_t flags = 0;
++ Qt::WindowFlags wf = m_window->window()->flags();
++ if (wf.testFlag(Qt::ToolTip)
++ || wf.testFlag(Qt::WindowTransparentForInput))
++ flags |= WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
++
++ set_transient(parent_wayland_window->object(),
++ transientPos.x(),
++ transientPos.y(),
++ flags);
++}
++
++void QWaylandWlShellSurface::setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial)
++{
++ QWaylandWindow *parent_wayland_window = parent;
++ if (!parent_wayland_window)
++ return;
++
++ // set_popup expects a position relative to the parent
++ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
++ transientPos -= parent_wayland_window->geometry().topLeft();
++ if (parent_wayland_window->decoration()) {
++ transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
++ transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
++ }
++
++ set_popup(device->wl_seat(), serial, parent_wayland_window->object(),
++ transientPos.x(), transientPos.y(), 0);
++}
++
++void QWaylandWlShellSurface::shell_surface_ping(uint32_t serial)
++{
++ pong(serial);
++}
++
++void QWaylandWlShellSurface::shell_surface_configure(uint32_t edges,
++ int32_t width,
++ int32_t height)
++{
++ m_window->configure(edges, width, height);
++}
++
++void QWaylandWlShellSurface::shell_surface_popup_done()
++{
++ QCoreApplication::postEvent(m_window->window(), new QCloseEvent());
++}
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandwlshellsurface_p.h b/src/client/qwaylandwlshellsurface_p.h
+new file mode 100644
+index 0000000..d02bb7b
+--- /dev/null
++++ b/src/client/qwaylandwlshellsurface_p.h
+@@ -0,0 +1,101 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDWLSHELLSURFACE_H
++#define QWAYLANDWLSHELLSURFACE_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-wayland.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandWlShellSurface : public QtWayland::wl_shell_surface
++ , public QWaylandShellSurface
++{
++public:
++ QWaylandWlShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window);
++ virtual ~QWaylandWlShellSurface();
++
++ using QtWayland::wl_shell_surface::resize;
++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE;
++
++ using QtWayland::wl_shell_surface::move;
++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE;
++
++ void setTitle(const QString & title) Q_DECL_OVERRIDE;
++ void setAppId(const QString &appId) Q_DECL_OVERRIDE;
++
++private:
++ void setMaximized() Q_DECL_OVERRIDE;
++ void setFullscreen() Q_DECL_OVERRIDE;
++ void setNormal() Q_DECL_OVERRIDE;
++ void setMinimized() Q_DECL_OVERRIDE;
++
++ void setTopLevel() Q_DECL_OVERRIDE;
++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE;
++ void setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial);
++
++ QWaylandWindow *m_window;
++ bool m_maximized;
++ bool m_fullscreen;
++ QSize m_size;
++
++ void shell_surface_ping(uint32_t serial) Q_DECL_OVERRIDE;
++ void shell_surface_configure(uint32_t edges,
++ int32_t width,
++ int32_t height) Q_DECL_OVERRIDE;
++ void shell_surface_popup_done() Q_DECL_OVERRIDE;
++
++ friend class QWaylandWindow;
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDSHELLSURFACE_H
+diff --git a/src/client/qwaylandxdgsurface.cpp b/src/client/qwaylandxdgsurface.cpp
+new file mode 100644
+index 0000000..1b8affa
+--- /dev/null
++++ b/src/client/qwaylandxdgsurface.cpp
+@@ -0,0 +1,173 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandxdgsurface_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandXdgSurface::QWaylandXdgSurface(struct ::xdg_surface *xdg_surface, QWaylandWindow *window)
++ : QtWayland::xdg_surface(xdg_surface)
++ , m_window(window)
++ , m_maximized(false)
++ , m_minimized(false)
++ , m_fullscreen(false)
++{
++}
++
++QWaylandXdgSurface::~QWaylandXdgSurface()
++{
++ xdg_surface_destroy(object());
++}
++
++void QWaylandXdgSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges)
++{
++ // May need some conversion if types get incompatibles, ATM they're identical
++ enum resize_edge const * const arg = reinterpret_cast<enum resize_edge const * const>(&edges);
++ resize(inputDevice, *arg);
++}
++
++void QWaylandXdgSurface::resize(QWaylandInputDevice *inputDevice, enum resize_edge edges)
++{
++ resize(inputDevice->wl_seat(),
++ inputDevice->serial(),
++ edges);
++}
++
++void QWaylandXdgSurface::move(QWaylandInputDevice *inputDevice)
++{
++ move(inputDevice->wl_seat(),
++ inputDevice->serial());
++}
++
++void QWaylandXdgSurface::setMaximized()
++{
++ m_maximized = true;
++ m_size = m_window->window()->geometry().size();
++ set_maximized();
++}
++
++void QWaylandXdgSurface::setFullscreen()
++{
++ m_fullscreen = true;
++ m_size = m_window->window()->geometry().size();
++ set_fullscreen();
++}
++
++void QWaylandXdgSurface::setNormal()
++{
++ if (m_fullscreen || m_maximized || m_minimized) {
++ if (m_maximized) { unset_maximized(); }
++ if (m_fullscreen) { unset_fullscreen(); }
++
++ m_fullscreen = m_maximized = m_minimized = false;
++ setTopLevel();
++ QMargins m = m_window->frameMargins();
++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom());
++ }
++}
++
++void QWaylandXdgSurface::setMinimized()
++{
++ m_minimized = true;
++ m_size = m_window->window()->geometry().size();
++ set_minimized();
++}
++
++void QWaylandXdgSurface::setTopLevel()
++{
++ // There's no xdg_shell_surface API for this, ignoring
++}
++
++void QWaylandXdgSurface::updateTransientParent(QWindow *parent)
++{
++ QWaylandWindow *parent_wayland_window = static_cast<QWaylandWindow *>(parent->handle());
++ if (!parent_wayland_window)
++ return;
++
++ // set_transient expects a position relative to the parent
++ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
++ QWindow *parentWin = m_window->window()->transientParent();
++ transientPos -= parentWin->geometry().topLeft();
++ if (parent_wayland_window->decoration()) {
++ transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
++ transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
++ }
++
++ uint32_t flags = 0;
++ Qt::WindowFlags wf = m_window->window()->flags();
++ if (wf.testFlag(Qt::ToolTip)
++ || wf.testFlag(Qt::WindowTransparentForInput))
++ flags |= XDG_SURFACE_SET_TRANSIENT_FOR;
++
++ set_transient_for(parent_wayland_window->object());
++}
++
++void QWaylandXdgSurface::setTitle(const QString & title)
++{
++ return QtWayland::xdg_surface::set_title(title);
++}
++
++void QWaylandXdgSurface::setAppId(const QString & appId)
++{
++ return QtWayland::xdg_surface::set_app_id(appId);
++}
++
++void QWaylandXdgSurface::xdg_surface_ping(uint32_t serial)
++{
++ pong(serial);
++}
++
++void QWaylandXdgSurface::xdg_surface_configure(uint32_t edges, int32_t width,
++ int32_t height)
++{
++ m_window->configure(edges, width, height);
++}
++
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandxdgsurface_p.h b/src/client/qwaylandxdgsurface_p.h
+new file mode 100644
+index 0000000..744d3f3
+--- /dev/null
++++ b/src/client/qwaylandxdgsurface_p.h
+@@ -0,0 +1,105 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDXDGSURFACE_H
++#define QWAYLANDXDGSURFACE_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-xdg-shell.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgSurface : public QtWayland::xdg_surface
++ , public QWaylandShellSurface
++{
++public:
++ QWaylandXdgSurface(struct ::xdg_surface *shell_surface, QWaylandWindow *window);
++ virtual ~QWaylandXdgSurface();
++
++ using QtWayland::xdg_surface::resize;
++ void resize(QWaylandInputDevice *inputDevice, enum resize_edge edges);
++
++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE;
++
++ using QtWayland::xdg_surface::move;
++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE;
++
++ void setTitle(const QString &title) Q_DECL_OVERRIDE;
++ void setAppId(const QString &appId) Q_DECL_OVERRIDE;
++
++ bool isFullscreen() const { return m_fullscreen; }
++ bool isMaximized() const { return m_maximized; }
++
++private:
++ void setMaximized() Q_DECL_OVERRIDE;
++ void setFullscreen() Q_DECL_OVERRIDE;
++ void setNormal() Q_DECL_OVERRIDE;
++ void setMinimized() Q_DECL_OVERRIDE;
++
++ void setTopLevel() Q_DECL_OVERRIDE;
++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE;
++
++private:
++ QWaylandWindow *m_window;
++ bool m_maximized;
++ bool m_minimized;
++ bool m_fullscreen;
++ QSize m_size;
++
++ void xdg_surface_ping(uint32_t serial) Q_DECL_OVERRIDE;
++ void xdg_surface_configure(uint32_t edges,
++ int32_t width,
++ int32_t height) Q_DECL_OVERRIDE;
++ friend class QWaylandWindow;
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDXDGSURFACE_H
+--
+1.9.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch
new file mode 100644
index 000000000..8f0425a76
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch
@@ -0,0 +1,772 @@
+From c4219cca0febd7119e0bec776fdc2877b3448e0b Mon Sep 17 00:00:00 2001
+From: Philippe Coval <philippe.coval@open.eurogiciel.org>
+Date: Tue, 10 Jun 2014 16:22:17 +0200
+Subject: [PATCH 19/21] xdg-shell: upgrade to support current version
+ (weston-1.5.0)
+
+The protocol file is a raw copy of
+
+Source: http://cgit.freedesktop.org/wayland/weston/plain/protocol/xdg-shell.xml?id=1.5.0
+
+Task-number: QTBUG-38633/related
+Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
+Reviewed-by: Philippe Coval <rzr@gna.org>
+Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/4bac130b97fbaa565aa9883eb302557ef0185d50
+Change-Id: I41ca2f89c09a8b6348ce2fbf6d59f44b4c81ffff
+---
+ src/3rdparty/protocol/xdg-shell.xml | 288 ++++++++++++++++++------------------
+ src/client/client.pro | 2 +
+ src/client/qwaylanddisplay.cpp | 10 +-
+ src/client/qwaylanddisplay_p.h | 5 +-
+ src/client/qwaylandxdgshell.cpp | 77 ++++++++++
+ src/client/qwaylandxdgshell_p.h | 73 +++++++++
+ src/client/qwaylandxdgsurface.cpp | 60 ++++++--
+ src/client/qwaylandxdgsurface_p.h | 11 +-
+ 8 files changed, 364 insertions(+), 162 deletions(-)
+ create mode 100644 src/client/qwaylandxdgshell.cpp
+ create mode 100644 src/client/qwaylandxdgshell_p.h
+
+diff --git a/src/3rdparty/protocol/xdg-shell.xml b/src/3rdparty/protocol/xdg-shell.xml
+index 4e5cff8..79a2831 100644
+--- a/src/3rdparty/protocol/xdg-shell.xml
++++ b/src/3rdparty/protocol/xdg-shell.xml
+@@ -40,19 +40,22 @@
+
+ <enum name="version">
+ <description summary="latest protocol version">
+- Use this enum to check the protocol version, and it will be updated
+- automatically.
++ The 'current' member of this enum gives the version of the
++ protocol. Implementations can compare this to the version
++ they implement using static_assert to ensure the protocol and
++ implementation versions match.
+ </description>
+- <entry name="current" value="1" summary="Always the latest version"/>
++ <entry name="current" value="3" summary="Always the latest version"/>
+ </enum>
+
+
+ <request name="use_unstable_version">
+ <description summary="enable use of this unstable version">
+- Use this request in order to enable use of this interface.
+-
+- Understand and agree that one is using an unstable interface,
+- that will likely change in the future, breaking the API.
++ Negotiate the unstable version of the interface. This
++ mechanism is in place to ensure client and server agree on the
++ unstable versions of the protocol that they speak or exit
++ cleanly if they don't agree. This request will go away once
++ the xdg-shell protocol is stable.
+ </description>
+ <arg name="version" type="int"/>
+ </request>
+@@ -84,6 +87,28 @@
+ <arg name="y" type="int"/>
+ <arg name="flags" type="uint"/>
+ </request>
++
++ <event name="ping">
++ <description summary="check if the client is alive">
++ The ping event asks the client if it's still alive. Pass the
++ serial specified in the event back to the compositor by sending
++ a "pong" request back with the specified serial.
++
++ Compositors can use this to determine if the client is still
++ alive. It's unspecified what will happen if the client doesn't
++ respond to the ping request, or in what timeframe. Clients should
++ try to respond in a reasonable amount of time.
++ </description>
++ <arg name="serial" type="uint" summary="pass this to the callback"/>
++ </event>
++
++ <request name="pong">
++ <description summary="respond to a ping event">
++ A client must respond to a ping event with a pong request or
++ the client may be deemed unresponsive.
++ </description>
++ <arg name="serial" type="uint" summary="serial of the ping event"/>
++ </request>
+ </interface>
+
+ <interface name="xdg_surface" version="1">
+@@ -124,6 +149,32 @@
+ <arg name="parent" type="object" interface="wl_surface" allow-null="true"/>
+ </request>
+
++ <request name="set_margin">
++ <description summary="set the visible frame boundaries">
++ This tells the compositor what the visible size of the window
++ should be, so it can use it to determine what borders to use for
++ constrainment and alignment.
++
++ CSD often has invisible areas for decoration purposes, like drop
++ shadows. These "shadow" drawings need to be subtracted out of the
++ normal boundaries of the window when computing where to place
++ windows (e.g. to set this window so it's centered on top of another,
++ or to put it to the left or right of the screen.)
++
++ This value should change as little as possible at runtime, to
++ prevent flicker.
++
++ This value is also ignored when the window is maximized or
++ fullscreen, and assumed to be 0.
++
++ If never called, this value is assumed to be 0.
++ </description>
++ <arg name="left_margin" type="int"/>
++ <arg name="right_margin" type="int"/>
++ <arg name="top_margin" type="int"/>
++ <arg name="bottom_margin" type="int"/>
++ </request>
++
+ <request name="set_title">
+ <description summary="set surface title">
+ Set a short title for the surface.
+@@ -150,22 +201,6 @@
+ <arg name="app_id" type="string"/>
+ </request>
+
+- <request name="pong">
+- <description summary="respond to a ping event">
+- A client must respond to a ping event with a pong request or
+- the client may be deemed unresponsive.
+- </description>
+- <arg name="serial" type="uint" summary="serial of the ping event"/>
+- </request>
+-
+- <event name="ping">
+- <description summary="ping client">
+- Ping a client to check if it is receiving events and sending
+- requests. A client is expected to reply with a pong request.
+- </description>
+- <arg name="serial" type="uint"/>
+- </event>
+-
+ <request name="move">
+ <description summary="start an interactive move">
+ Start a pointer-driven move of the surface.
+@@ -217,12 +252,6 @@
+ ignore it if it doesn't resize, pick a smaller size (to
+ satisfy aspect ratio or resize in steps of NxM pixels).
+
+- The edges parameter provides a hint about how the surface
+- was resized. The client may use this information to decide
+- how to adjust its content to the new size (e.g. a scrolling
+- area might adjust its content position to leave the viewable
+- content unmoved). Valid edge values are from resize_edge enum.
+-
+ The client is free to dismiss all but the last configure
+ event it received.
+
+@@ -230,7 +259,6 @@
+ in surface local coordinates.
+ </description>
+
+- <arg name="edges" type="uint"/>
+ <arg name="width" type="int"/>
+ <arg name="height" type="int"/>
+ </event>
+@@ -250,128 +278,122 @@
+ <arg name="output" type="object" interface="wl_output" allow-null="true"/>
+ </request>
+
+- <event name="request_set_fullscreen">
+- <description summary="server requests that the client set fullscreen">
+- Event sent from the compositor to the client requesting that the client
+- goes to a fullscreen state. It's the client job to call set_fullscreen
+- and really trigger the fullscreen state.
+- </description>
+- </event>
+-
+- <event name="request_unset_fullscreen">
+- <description summary="server requests that the client unset fullscreen">
+- Event sent from the compositor to the client requesting that the client
+- leaves the fullscreen state. It's the client job to call
+- unset_fullscreen and really leave the fullscreen state.
+- </description>
+- </event>
++ <enum name="state">
++ <description summary="types of state on the surface">
++ The different state values used on the surface. This is designed for
++ state values like maximized, fullscreen. It is paired with the
++ request_change_state event to ensure that both the client and the
++ compositor setting the state can be synchronized.
+
+- <request name="set_fullscreen">
+- <description summary="set the surface state as fullscreen">
+- Set the surface as fullscreen.
++ States set in this way are double-buffered. They will get applied on
++ the next commit.
+
+- After this request, the compositor should send a configure event
+- informing the output size.
++ Desktop environments may extend this enum by taking up a range of
++ values and documenting the range they chose in this description.
++ They are not required to document the values for the range that they
++ chose. Ideally, any good extensions from a desktop environment should
++ make its way into standardization into this enum.
+
+- This request informs the compositor that the next attached buffer
+- committed will be in a fullscreen state. The buffer size should be the
+- same size as the size informed in the configure event, if the client
+- doesn't want to leave any empty area.
++ The current reserved ranges are:
+
+- In other words: the next attached buffer after set_maximized is the new
+- maximized buffer. And the surface will be positioned at the maximized
+- position on commit.
+-
+- A simple way to synchronize and wait for the correct configure event is
+- to use a wl_display.sync request right after the set_fullscreen
+- request. When the sync callback returns, the last configure event
+- received just before it will be the correct one, and should contain the
+- right size for the surface to maximize.
+-
+- Setting one state won't unset another state. Use
+- xdg_surface.unset_fullscreen for unsetting it.
++ 0x0000 - 0x0FFF: xdg-shell core values, documented below.
++ 0x1000 - 0x1FFF: GNOME
+ </description>
+- </request>
++ <entry name="maximized" value="1" summary="the surface is maximized">
++ A non-zero value indicates the surface is maximized. Otherwise,
++ the surface is unmaximized.
++ </entry>
++ <entry name="fullscreen" value="2" summary="the surface is fullscreen">
++ A non-zero value indicates the surface is fullscreen. Otherwise,
++ the surface is not fullscreen.
++ </entry>
++ </enum>
+
+- <request name="unset_fullscreen">
+- <description summary="unset the surface state as fullscreen">
+- Unset the surface fullscreen state.
++ <request name="request_change_state">
++ <description summary="client requests to change a surface's state">
++ This asks the compositor to change the state. If the compositor wants
++ to change the state, it will send a change_state event with the same
++ state_type, value, and serial, and the event flow continues as if it
++ it was initiated by the compositor.
+
+- Same negotiation as set_fullscreen must be used.
++ If the compositor does not want to change the state, it will send a
++ change_state to the client with the old value of the state.
+ </description>
++ <arg name="state_type" type="uint" summary="the state to set"/>
++ <arg name="value" type="uint" summary="the value to change the state to"/>
++ <arg name="serial" type="uint" summary="an event serial">
++ This serial is so the client can know which change_state event corresponds
++ to which request_change_state request it sent out.
++ </arg>
+ </request>
+
+- <event name="request_set_maximized">
+- <description summary="server requests that the client set maximized">
+- Event sent from the compositor to the client requesting that the client
+- goes to a maximized state. It's the client job to call set_maximized
+- and really trigger the maximized state.
++ <event name="change_state">
++ <description summary="compositor wants to change a surface's state">
++ This event tells the client to change a surface's state. The client
++ should respond with an ack_change_state request to the compositor to
++ guarantee that the compositor knows that the client has seen it.
+ </description>
+- </event>
+
+- <event name="request_unset_maximized">
+- <description summary="server requests that the client unset maximized">
+- Event sent from the compositor to the client requesting that the client
+- leaves the maximized state. It's the client job to call unset_maximized
+- and really leave the maximized state.
+- </description>
++ <arg name="state_type" type="uint" summary="the state to set"/>
++ <arg name="value" type="uint" summary="the value to change the state to"/>
++ <arg name="serial" type="uint" summary="a serial for the compositor's own tracking"/>
+ </event>
+
+- <request name="set_maximized">
+- <description summary="set the surface state as maximized">
+- Set the surface as maximized.
+-
+- After this request, the compositor will send a configure event
+- informing the output size minus panel and other MW decorations.
+-
+- This request informs the compositor that the next attached buffer
+- committed will be in a maximized state. The buffer size should be the
+- same size as the size informed in the configure event, if the client
+- doesn't want to leave any empty area.
++ <request name="ack_change_state">
++ <description summary="ack a change_state event">
++ When a change_state event is received, a client should then ack it
++ using the ack_change_state request to ensure that the compositor
++ knows the client has seen the event.
+
+- In other words: the next attached buffer after set_maximized is the new
+- maximized buffer. And the surface will be positioned at the maximized
+- position on commit.
++ By this point, the state is confirmed, and the next attach should
++ contain the buffer drawn for the new state value.
+
+- A simple way to synchronize and wait for the correct configure event is
+- to use a wl_display.sync request right after the set_maximized request.
+- When the sync callback returns, the last configure event received just
+- before it will be the correct one, and should contain the right size
+- for the surface to maximize.
+-
+- Setting one state won't unset another state. Use
+- xdg_surface.unset_maximized for unsetting it.
++ The values here need to be the same as the values in the cooresponding
++ change_state event.
+ </description>
++ <arg name="state_type" type="uint" summary="the state to set"/>
++ <arg name="value" type="uint" summary="the value to change the state to"/>
++ <arg name="serial" type="uint" summary="a serial to pass to change_state"/>
+ </request>
+
+- <request name="unset_maximized">
+- <description summary="unset the surface state as maximized">
+- Unset the surface maximized state.
+-
+- Same negotiation as set_maximized must be used.
++ <request name="set_minimized">
++ <description summary="minimize the surface">
++ Minimize the surface.
+ </description>
+ </request>
+
+- <request name="set_minimized">
+- <description summary="set the surface state as minimized">
+- Set the surface minimized state.
+-
+- Setting one state won't unset another state.
++ <event name="activated">
++ <description summary="surface was activated">
++ The activated_set event is sent when this surface has been
++ activated, which means that the surface has user attention.
++ Window decorations should be updated accordingly. You should
++ not use this event for anything but the style of decorations
++ you display, use wl_keyboard.enter and wl_keyboard.leave for
++ determining keyboard focus.
+ </description>
+- </request>
++ </event>
+
+- <event name="focused_set">
+- <description summary="surface was focused">
+- The focused_set event is sent when this surface has been
+- activated. Window decorations should be updated accordingly.
++ <event name="deactivated">
++ <description summary="surface was deactivated">
++ The deactivate event is sent when this surface has been
++ deactivated, which means that the surface lost user attention.
++ Window decorations should be updated accordingly. You should
++ not use this event for anything but the style of decorations
++ you display, use wl_keyboard.enter and wl_keyboard.leave for
++ determining keyboard focus.
+ </description>
+ </event>
+
+- <event name="focused_unset">
+- <description summary="surface was unfocused">
+- The focused_unset event is sent when this surface has been
+- deactivated, because another surface has been activated. Window
+- decorations should be updated accordingly.
++ <event name="close">
++ <description summary="surface wants to be closed">
++ The close event is sent by the compositor when the user
++ wants the surface to be closed. This should be equivalent to
++ the user clicking the close button in client-side decorations,
++ if your application has any...
++
++ This is only a request that the user intends to close your
++ window. The client may choose to ignore this request, or show
++ a dialog to ask the user to save their data...
+ </description>
+ </event>
+ </interface>
+@@ -409,22 +431,6 @@
+ </description>
+ </request>
+
+- <request name="pong">
+- <description summary="respond to a ping event">
+- A client must respond to a ping event with a pong request or
+- the client may be deemed unresponsive.
+- </description>
+- <arg name="serial" type="uint" summary="serial of the ping event"/>
+- </request>
+-
+- <event name="ping">
+- <description summary="ping client">
+- Ping a client to check if it is receiving events and sending
+- requests. A client is expected to reply with a pong request.
+- </description>
+- <arg name="serial" type="uint"/>
+- </event>
+-
+ <event name="popup_done">
+ <description summary="popup interaction is done">
+ The popup_done event is sent out when a popup grab is broken,
+diff --git a/src/client/client.pro b/src/client/client.pro
+index 9ecf82f..73e3b7f 100644
+--- a/src/client/client.pro
++++ b/src/client/client.pro
+@@ -59,6 +59,7 @@ SOURCES += qwaylandintegration.cpp \
+ qwaylanddatasource.cpp \
+ qwaylandshellsurface.cpp \
+ qwaylandwlshellsurface.cpp \
++ qwaylandxdgshell.cpp \
+ qwaylandxdgsurface.cpp \
+ qwaylandextendedoutput.cpp \
+ qwaylandextendedsurface.cpp \
+@@ -89,6 +90,7 @@ HEADERS += qwaylandintegration_p.h \
+ qwaylanddatasource_p.h \
+ qwaylandshellsurface_p.h \
+ qwaylandwlshellsurface_p.h \
++ qwaylandxdgshell_p.h \
+ qwaylandxdgsurface_p.h \
+ qwaylandextendedoutput_p.h \
+ qwaylandextendedsurface_p.h \
+diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
+index 7f953ad..2e25672 100644
+--- a/src/client/qwaylanddisplay.cpp
++++ b/src/client/qwaylanddisplay.cpp
+@@ -50,7 +50,7 @@
+ #include "qwaylandclipboard_p.h"
+ #include "qwaylanddatadevicemanager_p.h"
+ #include "qwaylandhardwareintegration_p.h"
+-
++#include "qwaylandxdgshell_p.h"
+
+ #include "qwaylandwindowmanagerintegration_p.h"
+
+@@ -209,8 +209,7 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
+ mShm = static_cast<struct wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface,1));
+ } else if (interface == QStringLiteral("xdg_shell")
+ && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) {
+- mShellXdg.reset(new QtWayland::xdg_shell(registry, id));
+- mShellXdg->use_unstable_version(QtWayland::xdg_shell::version_current);
++ mShellXdg.reset(new QWaylandXdgShell(registry,id));
+ } else if (interface == QStringLiteral("wl_shell")){
+ mShell.reset(new QtWayland::wl_shell(registry, id));
+ } else if (interface == QStringLiteral("wl_seat")) {
+@@ -275,4 +274,9 @@ void QWaylandDisplay::forceRoundTrip()
+ wl_display_roundtrip(mDisplay);
+ }
+
++QtWayland::xdg_shell *QWaylandDisplay::shellXdg()
++{
++ return mShellXdg.data();
++}
++
+ QT_END_NAMESPACE
+diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
+index cf5dfc2..f1b35a7 100644
+--- a/src/client/qwaylanddisplay_p.h
++++ b/src/client/qwaylanddisplay_p.h
+@@ -72,6 +72,7 @@ class QWaylandWindow;
+ class QWaylandEventThread;
+ class QWaylandIntegration;
+ class QWaylandHardwareIntegration;
++class QWaylandXdgShell;
+
+ namespace QtWayland {
+ class qt_output_extension;
+@@ -115,7 +116,7 @@ public:
+ QtWayland::wl_compositor *compositor() { return &mCompositor; }
+
+ QtWayland::wl_shell *shell() { return mShell.data(); }
+- QtWayland::xdg_shell *shellXdg() { return mShellXdg.data(); }
++ QtWayland::xdg_shell *shellXdg();
+
+ QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
+ QWaylandInputDevice *defaultInputDevice() const;
+@@ -171,7 +172,7 @@ private:
+ QThread *mEventThread;
+ QWaylandEventThread *mEventThreadObject;
+ QScopedPointer<QtWayland::wl_shell> mShell;
+- QScopedPointer<QtWayland::xdg_shell> mShellXdg;
++ QScopedPointer<QWaylandXdgShell> mShellXdg;
+ QList<QPlatformScreen *> mScreens;
+ QList<QWaylandInputDevice *> mInputDevices;
+ QList<Listener> mRegistryListeners;
+diff --git a/src/client/qwaylandxdgshell.cpp b/src/client/qwaylandxdgshell.cpp
+new file mode 100644
+index 0000000..eb9f91c
+--- /dev/null
++++ b/src/client/qwaylandxdgshell.cpp
+@@ -0,0 +1,77 @@
++/****************************************************************************
++**
++** Copyright (C) 2014 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandxdgshell_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandXdgShell::QWaylandXdgShell(struct ::xdg_shell *shell)
++ : QtWayland::xdg_shell(shell)
++{
++}
++
++QWaylandXdgShell::QWaylandXdgShell(struct ::wl_registry *registry, uint32_t id)
++ : QtWayland::xdg_shell(registry, id)
++{
++ use_unstable_version(QtWayland::xdg_shell::version_current);
++}
++
++QWaylandXdgShell::~QWaylandXdgShell()
++{
++ xdg_shell_destroy(object());
++}
++
++
++void QWaylandXdgShell::xdg_shell_ping(uint32_t serial)
++{
++ pong(serial);
++}
++
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandxdgshell_p.h b/src/client/qwaylandxdgshell_p.h
+new file mode 100644
+index 0000000..6a396bd
+--- /dev/null
++++ b/src/client/qwaylandxdgshell_p.h
+@@ -0,0 +1,73 @@
++/****************************************************************************
++**
++** Copyright (C) 2014 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDXDGSHELL_H
++#define QWAYLANDXDGSHELL_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-xdg-shell.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShell : public QtWayland::xdg_shell
++{
++public:
++ QWaylandXdgShell(struct ::xdg_shell *shell);
++ QWaylandXdgShell(struct ::wl_registry *registry, uint32_t id);
++
++ virtual ~QWaylandXdgShell();
++
++private:
++ void xdg_shell_ping(uint32_t serial) Q_DECL_OVERRIDE;
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDXDGSHELL_H
+diff --git a/src/client/qwaylandxdgsurface.cpp b/src/client/qwaylandxdgsurface.cpp
+index 1b8affa..5fb74d2 100644
+--- a/src/client/qwaylandxdgsurface.cpp
++++ b/src/client/qwaylandxdgsurface.cpp
+@@ -87,23 +87,25 @@ void QWaylandXdgSurface::move(QWaylandInputDevice *inputDevice)
+
+ void QWaylandXdgSurface::setMaximized()
+ {
+- m_maximized = true;
+- m_size = m_window->window()->geometry().size();
+- set_maximized();
++ if (!m_maximized)
++ request_change_state(XDG_SURFACE_STATE_MAXIMIZED, true, 0);
+ }
+
+ void QWaylandXdgSurface::setFullscreen()
+ {
+- m_fullscreen = true;
+- m_size = m_window->window()->geometry().size();
+- set_fullscreen();
++ if (!m_fullscreen)
++ request_change_state(XDG_SURFACE_STATE_FULLSCREEN, true, 0);
+ }
+
+ void QWaylandXdgSurface::setNormal()
+ {
+ if (m_fullscreen || m_maximized || m_minimized) {
+- if (m_maximized) { unset_maximized(); }
+- if (m_fullscreen) { unset_fullscreen(); }
++ if (m_maximized) {
++ request_change_state(XDG_SURFACE_STATE_MAXIMIZED, false, 0);
++ }
++ if (m_fullscreen) {
++ request_change_state(XDG_SURFACE_STATE_FULLSCREEN, false, 0);
++ }
+
+ m_fullscreen = m_maximized = m_minimized = false;
+ setTopLevel();
+@@ -158,16 +160,48 @@ void QWaylandXdgSurface::setAppId(const QString & appId)
+ return QtWayland::xdg_surface::set_app_id(appId);
+ }
+
+-void QWaylandXdgSurface::xdg_surface_ping(uint32_t serial)
++void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height)
+ {
+- pong(serial);
++ m_window->configure(0 , width, height);
+ }
+
+-void QWaylandXdgSurface::xdg_surface_configure(uint32_t edges, int32_t width,
+- int32_t height)
++void QWaylandXdgSurface::xdg_surface_change_state(uint32_t state,
++ uint32_t value,
++ uint32_t serial)
+ {
+- m_window->configure(edges, width, height);
++
++ if (state == XDG_SURFACE_STATE_MAXIMIZED
++ || state == XDG_SURFACE_STATE_FULLSCREEN) {
++ if (value) {
++ m_size = m_window->window()->geometry().size();
++ } else {
++ QMargins m = m_window->frameMargins();
++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom());
++ }
++ }
++
++ switch (state) {
++ case XDG_SURFACE_STATE_MAXIMIZED:
++ m_maximized = value;
++ break;
++ case XDG_SURFACE_STATE_FULLSCREEN:
++ m_fullscreen = value;
++ break;
++ }
++
++ xdg_surface_ack_change_state(object(), state, value, serial);
+ }
+
++void QWaylandXdgSurface::xdg_surface_activated()
++{
++}
++
++void QWaylandXdgSurface::xdg_surface_deactivated()
++{
++}
++
++void QWaylandXdgSurface::xdg_surface_close()
++{
++}
+
+ QT_END_NAMESPACE
+diff --git a/src/client/qwaylandxdgsurface_p.h b/src/client/qwaylandxdgsurface_p.h
+index 744d3f3..d2a154e 100644
+--- a/src/client/qwaylandxdgsurface_p.h
++++ b/src/client/qwaylandxdgsurface_p.h
+@@ -93,10 +93,15 @@ private:
+ bool m_fullscreen;
+ QSize m_size;
+
+- void xdg_surface_ping(uint32_t serial) Q_DECL_OVERRIDE;
+- void xdg_surface_configure(uint32_t edges,
+- int32_t width,
++ void xdg_surface_configure(int32_t width,
+ int32_t height) Q_DECL_OVERRIDE;
++ void xdg_surface_change_state(uint32_t state,
++ uint32_t value,
++ uint32_t serial) Q_DECL_OVERRIDE;
++ void xdg_surface_activated() Q_DECL_OVERRIDE;
++ void xdg_surface_deactivated() Q_DECL_OVERRIDE;
++ void xdg_surface_close() Q_DECL_OVERRIDE;
++
+ friend class QWaylandWindow;
+ };
+
+--
+1.9.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch
new file mode 100644
index 000000000..413459fb6
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch
@@ -0,0 +1,128 @@
+From b4f032b13338ad6c21024177b031c75063ef7493 Mon Sep 17 00:00:00 2001
+From: Manuel Bachmann <manuel.bachmann@open.eurogiciel.org>
+Date: Sun, 7 Sep 2014 08:19:30 +0200
+Subject: [PATCH 20/21] Add IVI-Shell protocol file version patch v6
+
+Source : http://lists.freedesktop.org/archives/wayland-devel/2014-June/015617.html
+
+This file comes from the last proposed definition of the IVI-Shell protocol,
+and will need to be refreshed on protocol update.
+
+Task-number: QTBUG-XXXXX/part/1of2
+
+Signed-off-by: Manuel Bachmann <manuel.bachmann@open.eurogiciel.org>
+---
+ src/3rdparty/protocol/ivi-application.xml | 101 ++++++++++++++++++++++++++++++
+ 1 file changed, 101 insertions(+)
+ create mode 100644 src/3rdparty/protocol/ivi-application.xml
+
+diff --git a/src/3rdparty/protocol/ivi-application.xml b/src/3rdparty/protocol/ivi-application.xml
+new file mode 100644
+index 0000000..833fd38
+--- /dev/null
++++ b/src/3rdparty/protocol/ivi-application.xml
+@@ -0,0 +1,101 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<protocol name="ivi_application">
++
++ <copyright>
++ Copyright (C) 2013 DENSO CORPORATION
++ Copyright (c) 2013 BMW Car IT GmbH
++
++ 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 above copyright notice and this permission notice 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.
++ </copyright>
++
++ <interface name="ivi_surface" version="1">
++ <description summary="application interface to surface in ivi compositor"/>
++
++ <request name="destroy" type="destructor">
++ <description summary="destroy ivi_surface">
++ This removes link from ivi_id to wl_surface and destroys ivi_surface.
++ </description>
++ </request>
++
++ <event name="visibility">
++ <description summary="visibility of surface in ivi compositor has changed">
++ The new visibility state is provided in argument visibility.
++ If visibility is 0, the surface has become invisible.
++ If visibility is not 0, the surface has become visible.
++ </description>
++ <arg name="visibility" type="int"/>
++ </event>
++
++ <enum name="warning_code">
++ <description summary="possible warning codes returned by ivi compositor">
++ These define all possible warning codes returned by ivi compositor on server-side warnings.
++ invalid_wl_surface:
++ - wl_surface already has a another role.
++ - wl_surface is destroyed before the ivi_surface is destroyed.
++ ivi_id_in_use: ivi_id is already assigned by another application.
++ </description>
++ <entry name="invalid_wl_surface" value="1" summary="wl_surface is invalid"/>
++ <entry name="ivi_id_in_use" value="2" summary="ivi_id is in use and can not be shared"/>
++ </enum>
++
++ <event name="warning">
++ <description summary="server-side warning detected">
++ The ivi compositor encountered warning while processing a request by this
++ application. The warning is defined by argument warning_code and optional
++ warning_text. If the warning is detected, client shall destroy the ivi_surface
++ object.
++
++ When a warning event is sent, the compositor turns the ivi_surface object inert.
++ The ivi_surface will not deliver further events, all requests on it are ignored
++ except 'destroy', and the association to the ivi_id is removed. The client
++ should destroy the ivi_surface object. If an inert ivi_surface object is used as
++ an argument to any other object's request, that request will [produce a fatal
++ error / produce a warning / be ignored].
++ </description>
++ <arg name="warning_code" type="int"/>
++ <arg name="warning_text" type="string" allow-null="true"/>
++ </event>
++
++ </interface>
++
++ <interface name="ivi_application" version="1">
++ <description summary="create ivi-style surfaces">
++ This interface is implemented by servers that provide desktop-style user interfaces.
++ It allows clients to associate a ivi_surface with a basic surface.
++ </description>
++
++ <request name="surface_create">
++ <description summary="create ivi_surface with numeric ID in ivi compositor">
++ surface_create will create a interface:ivi_surface with numeric ID; ivi_id in
++ ivi compositor. These ivi_ids are defined as unique in the system to identify
++ it inside of ivi compositor. The ivi compositor implements business logic how to
++ set properties of the surface with ivi_id according to status of the system.
++ E.g. a unique ID for Car Navigation application is used for implementing special
++ logic of the application about where it shall be located.
++ if a wl_surface which already has another role is set, the server regards this as
++ error and disconnects the client.
++ </description>
++ <arg name="ivi_id" type="uint"/>
++ <arg name="surface" type="object" interface="wl_surface"/>
++ <arg name="id" type="new_id" interface="ivi_surface"/>
++ </request>
++
++ </interface>
++
++</protocol>
+--
+1.9.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0021-Implement-initial-IVI-Shell-support.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0021-Implement-initial-IVI-Shell-support.patch
new file mode 100644
index 000000000..8723def26
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0021-Implement-initial-IVI-Shell-support.patch
@@ -0,0 +1,539 @@
+From 1ddfa43692cabae0f552351cfbc09377e479471e Mon Sep 17 00:00:00 2001
+From: Manuel Bachmann <manuel.bachmann@open.eurogiciel.org>
+Date: Mon, 8 Sep 2014 11:38:01 +0200
+Subject: [PATCH 21/21] Implement initial IVI-Shell support
+
+IVI-Shell provides a shell interface for Weston, which maps the GENIVI API (http://www.genivi.org) for In-Vehicle Infotainment.
+
+This patch enables detecting the IVI-Shell interface at runtime, and creating compatible surfaces if found.
+
+Task-number: QTBUG-XXXXX/part/2of2
+
+Change-Id: I1f6c11bf56b727a54fb48faab9c076b61d635440
+Signed-off-by: Manuel Bachmann <manuel.bachmann@open.eurogiciel.org>
+---
+ src/client/client.pro | 5 ++
+ src/client/qwaylanddisplay.cpp | 9 ++++
+ src/client/qwaylanddisplay_p.h | 5 ++
+ src/client/qwaylandivishell.cpp | 69 +++++++++++++++++++++++++
+ src/client/qwaylandivishell_p.h | 70 +++++++++++++++++++++++++
+ src/client/qwaylandivisurface.cpp | 105 ++++++++++++++++++++++++++++++++++++++
+ src/client/qwaylandivisurface_p.h | 90 ++++++++++++++++++++++++++++++++
+ src/client/qwaylandwindow.cpp | 8 ++-
+ 8 files changed, 360 insertions(+), 1 deletion(-)
+ create mode 100644 src/client/qwaylandivishell.cpp
+ create mode 100644 src/client/qwaylandivishell_p.h
+ create mode 100644 src/client/qwaylandivisurface.cpp
+ create mode 100644 src/client/qwaylandivisurface_p.h
+
+diff --git a/src/client/client.pro b/src/client/client.pro
+index 73e3b7f..adb526d 100644
+--- a/src/client/client.pro
++++ b/src/client/client.pro
+@@ -42,6 +42,7 @@ WAYLANDCLIENTSOURCES += \
+ ../extensions/windowmanager.xml \
+ ../3rdparty/protocol/text.xml \
+ ../3rdparty/protocol/xdg-shell.xml \
++ ../3rdparty/protocol/ivi-application.xml \
+
+ SOURCES += qwaylandintegration.cpp \
+ qwaylandnativeinterface.cpp \
+@@ -61,6 +62,8 @@ SOURCES += qwaylandintegration.cpp \
+ qwaylandwlshellsurface.cpp \
+ qwaylandxdgshell.cpp \
+ qwaylandxdgsurface.cpp \
++ qwaylandivishell.cpp \
++ qwaylandivisurface.cpp \
+ qwaylandextendedoutput.cpp \
+ qwaylandextendedsurface.cpp \
+ qwaylandsubsurface.cpp \
+@@ -92,6 +95,8 @@ HEADERS += qwaylandintegration_p.h \
+ qwaylandwlshellsurface_p.h \
+ qwaylandxdgshell_p.h \
+ qwaylandxdgsurface_p.h \
++ qwaylandivishell_p.h \
++ qwaylandivisurface_p.h \
+ qwaylandextendedoutput_p.h \
+ qwaylandextendedsurface_p.h \
+ qwaylandsubsurface_p.h \
+diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
+index 2e25672..2a93db7 100644
+--- a/src/client/qwaylanddisplay.cpp
++++ b/src/client/qwaylanddisplay.cpp
+@@ -51,6 +51,7 @@
+ #include "qwaylanddatadevicemanager_p.h"
+ #include "qwaylandhardwareintegration_p.h"
+ #include "qwaylandxdgshell_p.h"
++#include "qwaylandivishell_p.h"
+
+ #include "qwaylandwindowmanagerintegration_p.h"
+
+@@ -62,6 +63,7 @@
+
+ #include <QtWaylandClient/private/qwayland-text.h>
+ #include <QtWaylandClient/private/qwayland-xdg-shell.h>
++#include <QtWaylandClient/private/qwayland-ivi-application.h>
+
+ #include <QtCore/QAbstractEventDispatcher>
+ #include <QtGui/private/qguiapplication_p.h>
+@@ -207,6 +209,8 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
+ mCompositor.init(registry, id);
+ } else if (interface == QStringLiteral("wl_shm")) {
+ mShm = static_cast<struct wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface,1));
++ } else if (interface == QStringLiteral("ivi_application")) {
++ mShellIvi.reset(new QWaylandIviShell(registry,id));
+ } else if (interface == QStringLiteral("xdg_shell")
+ && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) {
+ mShellXdg.reset(new QWaylandXdgShell(registry,id));
+@@ -279,4 +283,9 @@ QtWayland::xdg_shell *QWaylandDisplay::shellXdg()
+ return mShellXdg.data();
+ }
+
++QtWayland::ivi_application *QWaylandDisplay::shellIvi()
++{
++ return mShellIvi.data();
++}
++
+ QT_END_NAMESPACE
+diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
+index f1b35a7..b9c686c 100644
+--- a/src/client/qwaylanddisplay_p.h
++++ b/src/client/qwaylanddisplay_p.h
+@@ -52,6 +52,7 @@
+ #include <QtWaylandClient/private/qwayland-wayland.h>
+ #include <QtWaylandClient/private/qwaylandclientexport_p.h>
+ #include <QtWaylandClient/private/qwayland-xdg-shell.h>
++#include <QtWaylandClient/private/qwayland-ivi-application.h>
+
+ struct wl_cursor_image;
+
+@@ -72,6 +73,7 @@ class QWaylandWindow;
+ class QWaylandEventThread;
+ class QWaylandIntegration;
+ class QWaylandHardwareIntegration;
++class QWaylandIviShell;
+ class QWaylandXdgShell;
+
+ namespace QtWayland {
+@@ -81,6 +83,7 @@ namespace QtWayland {
+ class qt_surface_extension;
+ class wl_text_input_manager;
+ class xdg_shell;
++ class ivi_application;
+ }
+
+ typedef void (*RegistryListener)(void *data,
+@@ -117,6 +120,7 @@ public:
+
+ QtWayland::wl_shell *shell() { return mShell.data(); }
+ QtWayland::xdg_shell *shellXdg();
++ QtWayland::ivi_application *shellIvi();
+
+ QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
+ QWaylandInputDevice *defaultInputDevice() const;
+@@ -173,6 +177,7 @@ private:
+ QWaylandEventThread *mEventThreadObject;
+ QScopedPointer<QtWayland::wl_shell> mShell;
+ QScopedPointer<QWaylandXdgShell> mShellXdg;
++ QScopedPointer<QWaylandIviShell> mShellIvi;
+ QList<QPlatformScreen *> mScreens;
+ QList<QWaylandInputDevice *> mInputDevices;
+ QList<Listener> mRegistryListeners;
+diff --git a/src/client/qwaylandivishell.cpp b/src/client/qwaylandivishell.cpp
+new file mode 100644
+index 0000000..9d63d0d
+--- /dev/null
++++ b/src/client/qwaylandivishell.cpp
+@@ -0,0 +1,69 @@
++/****************************************************************************
++**
++** Copyright (C) 2014 Eurogiciel, author: <manuel.bachmann@open.eurogiciel.org>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandivishell_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandIviShell::QWaylandIviShell(struct ::ivi_application *shell)
++ : QtWayland::ivi_application(shell)
++{
++}
++
++QWaylandIviShell::QWaylandIviShell(struct ::wl_registry *registry, uint32_t id)
++ : QtWayland::ivi_application(registry, id)
++{
++}
++
++QWaylandIviShell::~QWaylandIviShell()
++{
++ ivi_application_destroy(object());
++}
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandivishell_p.h b/src/client/qwaylandivishell_p.h
+new file mode 100644
+index 0000000..f9f6983
+--- /dev/null
++++ b/src/client/qwaylandivishell_p.h
+@@ -0,0 +1,70 @@
++/****************************************************************************
++**
++** Copyright (C) 2014 Eurogiciel, author: <manuel.bachmann@open.eurogiciel.org>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDIVISHELL_H
++#define QWAYLANDIVISHELL_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-ivi-application.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandIviShell : public QtWayland::ivi_application
++{
++public:
++ QWaylandIviShell(struct ::ivi_application *shell);
++ QWaylandIviShell(struct ::wl_registry *registry, uint32_t id);
++
++ virtual ~QWaylandIviShell();
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDIVISHELL_H
+diff --git a/src/client/qwaylandivisurface.cpp b/src/client/qwaylandivisurface.cpp
+new file mode 100644
+index 0000000..a12309e
+--- /dev/null
++++ b/src/client/qwaylandivisurface.cpp
+@@ -0,0 +1,105 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandivisurface_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandIviSurface::QWaylandIviSurface(struct ::ivi_surface *ivi_surface, QWaylandWindow *window)
++ : QtWayland::ivi_surface(ivi_surface)
++ , m_window(window)
++{
++}
++
++QWaylandIviSurface::~QWaylandIviSurface()
++{
++ ivi_surface_destroy(object());
++}
++
++void QWaylandIviSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges)
++{
++}
++
++void QWaylandIviSurface::move(QWaylandInputDevice *inputDevice)
++{
++}
++
++void QWaylandIviSurface::setMaximized()
++{
++}
++
++void QWaylandIviSurface::setFullscreen()
++{
++}
++
++void QWaylandIviSurface::setNormal()
++{
++}
++
++void QWaylandIviSurface::setMinimized()
++{
++}
++
++void QWaylandIviSurface::setTopLevel()
++{
++}
++
++void QWaylandIviSurface::updateTransientParent(QWindow *parent)
++{
++}
++
++void QWaylandIviSurface::setTitle(const QString & title)
++{
++}
++
++void QWaylandIviSurface::setAppId(const QString & appId)
++{
++}
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandivisurface_p.h b/src/client/qwaylandivisurface_p.h
+new file mode 100644
+index 0000000..c6a7ce6
+--- /dev/null
++++ b/src/client/qwaylandivisurface_p.h
+@@ -0,0 +1,90 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDIVISURFACE_H
++#define QWAYLANDIVISURFACE_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-ivi-application.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++class QWaylandExtendedSurface;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandIviSurface : public QtWayland::ivi_surface
++ , public QWaylandShellSurface
++{
++public:
++ QWaylandIviSurface(struct ::ivi_surface *shell_surface, QWaylandWindow *window);
++ virtual ~QWaylandIviSurface();
++
++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE;
++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE;
++
++ void setTitle(const QString &title) Q_DECL_OVERRIDE;
++ void setAppId(const QString &appId) Q_DECL_OVERRIDE;
++
++private:
++ void setMaximized() Q_DECL_OVERRIDE;
++ void setFullscreen() Q_DECL_OVERRIDE;
++ void setNormal() Q_DECL_OVERRIDE;
++ void setMinimized() Q_DECL_OVERRIDE;
++
++ void setTopLevel() Q_DECL_OVERRIDE;
++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE;
++
++private:
++ QWaylandWindow *m_window;
++
++ friend class QWaylandWindow;
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDIVISURFACE_H
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 3fb3a49..45a58f2 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -39,6 +39,8 @@
+ **
+ ****************************************************************************/
+
++#include <unistd.h>
++
+ #include "qwaylandwindow_p.h"
+
+ #include "qwaylandbuffer_p.h"
+@@ -48,10 +50,12 @@
+ #include "qwaylandshellsurface_p.h"
+ #include "qwaylandwlshellsurface_p.h"
+ #include "qwaylandxdgsurface_p.h"
++#include "qwaylandivisurface_p.h"
+ #include "qwaylandextendedsurface_p.h"
+ #include "qwaylandsubsurface_p.h"
+ #include "qwaylanddecoration_p.h"
+ #include "qwaylandwindowmanagerintegration_p.h"
++#define IVI_SURFACE_ID 8000
+
+ #include <QtCore/QFileInfo>
+ #include <QtGui/QWindow>
+@@ -95,7 +99,9 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
+ mWindowId = id++;
+
+ if (!(window->flags() & Qt::BypassWindowManagerHint)) {
+- if (mDisplay->shellXdg()) {
++ if (mDisplay->shellIvi()) {
++ mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(IVI_SURFACE_ID + getpid(), object()), this);
++ } else if (mDisplay->shellXdg()) {
+ if (window->type() & Qt::Window) {
+ mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this);
+ }
+--
+1.9.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0099_qtwayland_no_evdev.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0099_qtwayland_no_evdev.patch
new file mode 100644
index 000000000..99b519399
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0099_qtwayland_no_evdev.patch
@@ -0,0 +1,14 @@
+diff --git a/tests/auto/compositor/compositor/compositor.pro b/tests/auto/compositor/compositor/compositor.pro
+index f0cdaf32..64b60218 100644
+--- a/tests/auto/compositor/compositor/compositor.pro
++++ b/tests/auto/compositor/compositor/compositor.pro
+@@ -7,9 +7,6 @@ QT += core-private gui-private waylandcompositor waylandcompositor-private
+
+ QMAKE_USE += wayland-client wayland-server
+
+-qtConfig(xkbcommon-evdev): \
+- QMAKE_USE += xkbcommon_evdev
+-
+ WAYLANDCLIENTSOURCES += \
+ ../../../../src/3rdparty/protocol/xdg-shell.xml \
+ ../../../../src/3rdparty/protocol/ivi-application.xml \
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch
new file mode 100644
index 000000000..bca61b5db
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch
@@ -0,0 +1,31 @@
+From 9617c349a212d5407087daf4f4a2386bce94ecc1 Mon Sep 17 00:00:00 2001
+From: Philippe Coval <philippe.coval@open.eurogiciel.org>
+Date: Thu, 12 Jun 2014 11:55:29 +0200
+Subject: [PATCH 18/21] packaging: enable xdg-shell at runtime
+
+Change-Id: Iffbae496f1e09c8fa44a28d4eb515678e3bbb297
+Bug-Tizen: TIVI-3113/part
+Signed-off-by: Philippe Coval <philippe.coval@open.eurogiciel.org>
+---
+ packaging/qt5-qtwayland.spec | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/packaging/qt5-qtwayland.spec b/packaging/qt5-qtwayland.spec
+index cba18e2..ff32185 100644
+--- a/packaging/qt5-qtwayland.spec
++++ b/packaging/qt5-qtwayland.spec
+@@ -97,6 +97,11 @@ rm -rf %{buildroot}
+
+ %post
+ /sbin/ldconfig
++
++f="/etc/profile.d/qt.sh"
++grep QT_WAYLAND_USE_XDG_SHELL $f \
++ || echo "QT_WAYLAND_USE_XDG_SHELL='defined'; export QT_WAYLAND_USE_XDG_SHELL" >> $f
++
+ %postun
+ /sbin/ldconfig
+
+--
+1.9.1
+
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch
new file mode 100644
index 000000000..f113266e4
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch
@@ -0,0 +1,12 @@
+Index: git/qtwayland.pro
+===================================================================
+--- git.orig/qtwayland.pro 2014-09-18 12:01:23.883582734 +0300
++++ git/qtwayland.pro 2014-09-18 12:05:49.743574961 +0300
+@@ -7,7 +7,6 @@
+ qtCompileTest(egl)
+ qtCompileTest(brcm_egl)
+ qtCompileTest(glx)
+-qtCompileTest(xcomposite)
+ qtCompileTest(drm_egl_server)
+
+ load(qt_parts)
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland_%.bbappend
new file mode 100644
index 000000000..9807840ca
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland_%.bbappend
@@ -0,0 +1,36 @@
+FILESEXTRAPATHS_append := ":${THISDIR}/${PN}"
+
+# QT_MODULE_BRANCH = "5.4"
+
+# TODO:
+# These patches for IVI-SHELL are tempolary disabled because of issues. And new
+# patches are proposed.
+#
+# file://0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch \
+# file://0021-Implement-initial-IVI-Shell-support.patch \
+# file://0001-protocol-update-3rd-party-ivi-application-protocol.patch \
+# file://0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch \
+#
+# The xdg-shell merged into upstream, so we don't need these patch anymore.
+# But xdg-shell doesn't work well in current AGL Distro because of
+# mismatch of protocol versions between server(weston) and client(Qt Apps).
+#
+# file://0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch \
+# file://0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch \
+# file://0019-xdg-shell-upgrade-to-support-current-version-weston-.patch \
+#
+
+SRC_URI_append = "\
+ file://0010-Added-manifest-file-according-to-smack-3-domain-mode.patch \
+ "
+SRC_URI_append_checkforkrogoth = "\
+ file://disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch \
+ file://0001-Implement-initial-IVI-shell-support-with-shell-integ.patch \
+ file://0002-Fix-multiple-QWindow.patch \
+ "
+
+
+DEPENDS_append_koelsch = " libegl gles-user-module"
+DEPENDS_append_porter = " ${@base_conditional('PREFERRED_PROVIDER_virtual/egl', 'mesa', 'mesa', 'libegl gles-user-module', d)}"
+
+SRC_URI_append = " file://0099_qtwayland_no_evdev.patch "
diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwebkit_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtwebkit_%.bbappend
new file mode 100644
index 000000000..0420578e1
--- /dev/null
+++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwebkit_%.bbappend
@@ -0,0 +1 @@
+PACKAGECONFIG = "gstreamer qtlocation qtmultimedia qtsensors"
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/cmake-find-gtest.patch b/meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/cmake-find-gtest.patch
new file mode 100644
index 000000000..5371174d5
--- /dev/null
+++ b/meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/cmake-find-gtest.patch
@@ -0,0 +1,22 @@
+diff -Naur old/ivi-input-api/test/CMakeLists.txt new/ivi-input-api/test/CMakeLists.txt
+--- old/ivi-input-api/test/CMakeLists.txt 2015-10-19 23:31:13.000000000 +1000
++++ new/ivi-input-api/test/CMakeLists.txt 2015-10-19 23:30:32.000000000 +1000
+@@ -18,6 +18,7 @@
+ ############################################################################
+
+ CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
++SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/modules)
+
+ FIND_PACKAGE(gtest)
+
+diff -Naur old/ivi-layermanagement-api/test/CMakeLists.txt new/ivi-layermanagement-api/test/CMakeLists.txt
+--- old/ivi-layermanagement-api/test/CMakeLists.txt 2015-10-19 23:31:20.000000000 +1000
++++ new/ivi-layermanagement-api/test/CMakeLists.txt 2015-10-19 23:30:48.000000000 +1000
+@@ -18,6 +18,7 @@
+ ############################################################################
+
+ CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
++SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/modules)
+
+ FIND_PACKAGE(gtest)
+
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/test-path.patch b/meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/test-path.patch
new file mode 100644
index 000000000..251bc58f0
--- /dev/null
+++ b/meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/test-path.patch
@@ -0,0 +1,55 @@
+From fbe0d0fd35ff79561dc2da853f1b0903bfde428d Mon Sep 17 00:00:00 2001
+From: Changhyeok Bae <changhyeok.bae@gmail.com>
+Date: Thu, 1 Jun 2017 07:45:20 +0000
+Subject: [PATCH] test patch
+
+---
+ ivi-input-api/test/CMakeLists.txt | 9 +++++----
+ ivi-layermanagement-api/test/CMakeLists.txt | 7 ++++---
+ 2 files changed, 9 insertions(+), 7 deletions(-)
+
+diff --git a/ivi-input-api/test/CMakeLists.txt b/ivi-input-api/test/CMakeLists.txt
+index db05d0f..db3b745 100644
+--- a/ivi-input-api/test/CMakeLists.txt
++++ b/ivi-input-api/test/CMakeLists.txt
+@@ -65,12 +65,13 @@ IF(BUILD_ILM_API_TESTS)
+
+ ADD_DEPENDENCIES(${PROJECT_NAME} ${LIBS})
+
+- INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
++ INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/test)
++ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/CTestTestfile.cmake DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/test/ivi-layermanagement-api)
+
+ # use CTest
+ ENABLE_TESTING()
+- ADD_TEST(ilmCommon ${PROJECT_NAME})
+- ADD_TEST(ilmControl ${PROJECT_NAME})
+- ADD_TEST(ilmInput ${PROJECT_NAME})
++ ADD_TEST(ilmCommon {CMAKE_INSTALL_LIBEXECDIR}/test/${PROJECT_NAME})
++ ADD_TEST(ilmControl {CMAKE_INSTALL_LIBEXECDIR}/test/${PROJECT_NAME})
++ ADD_TEST(ilmInput {CMAKE_INSTALL_LIBEXECDIR}/test/${PROJECT_NAME})
+
+ ENDIF()
+diff --git a/ivi-layermanagement-api/test/CMakeLists.txt b/ivi-layermanagement-api/test/CMakeLists.txt
+index fe9a0a4..090d734 100644
+--- a/ivi-layermanagement-api/test/CMakeLists.txt
++++ b/ivi-layermanagement-api/test/CMakeLists.txt
+@@ -63,11 +63,12 @@ IF(BUILD_ILM_API_TESTS)
+
+ ADD_DEPENDENCIES(${PROJECT_NAME} ${LIBS})
+
+- INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
++ INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/test)
++ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/CTestTestfile.cmake DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/test/ivi-layermanagement-api)
+
+ # use CTest
+ ENABLE_TESTING()
+- ADD_TEST(ilmCommon ${PROJECT_NAME})
+- ADD_TEST(ilmControl ${PROJECT_NAME})
++ ADD_TEST(ilmCommon ${CMAKE_INSTALL_LIBEXECDIR}/test/${PROJECT_NAME})
++ ADD_TEST(ilmControl ${CMAKE_INSTALL_LIBEXECDIR}/test/${PROJECT_NAME})
+
+ ENDIF()
+--
+2.7.4
+
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension_1.1%.bbappend b/meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension_1.1%.bbappend
new file mode 100644
index 000000000..9c29dee47
--- /dev/null
+++ b/meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension_1.1%.bbappend
@@ -0,0 +1,27 @@
+FILESEXTRAPATHS_append := ":${THISDIR}/${PN}"
+
+ENABLE_TEST = "-DBUILD_ILM_API_TESTS:BOOL=TRUE \
+ -DINSTALL_ILM_API_TESTS:BOOL=TRUE \
+ "
+
+DISABLE_TEST = "-DBUILD_ILM_API_TESTS:BOOL=FALSE \
+ -DINSTALL_ILM_API_TESTS:BOOL=FALSE \
+ "
+
+PACKAGECONFIG ??= "test"
+PACKAGECONFIG[test] = "${ENABLE_TEST},${DISABLE_TEST},gtest"
+
+SRC_URI_append = "\
+ file://cmake-find-gtest.patch \
+ file://test-path.patch \
+ "
+
+PACKAGES =+ "${PN}-test"
+
+FILES_${PN}-test = "${libdir}/${PN}/test/*/CTestTestfile.cmake \
+ ${libdir}/${PN}/test/ivi-layermanagement-api-test \
+ ${libdir}/${PN}/test/ivi-input-api-test \
+ "
+FILES_${PN}-dbg += "${libdir}/${PN}/test/.debug"
+
+RDEPENDS_${PN}-test += "cmake"
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf.bbappend b/meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf.bbappend
new file mode 100644
index 000000000..d778459f2
--- /dev/null
+++ b/meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf.bbappend
@@ -0,0 +1,15 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+#
+SRC_URI += "${@bb.utils.contains("DISTRO_FEATURES", "virtual-display", "file://virtualoutput.cfg", "",d)}"
+
+do_configure_append() {
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'virtual-display', 'true', 'false', d)}; then
+ echo virtual=1 >> ${WORKDIR}/core.cfg
+ fi
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'gst-record', 'true', 'false', d)}; then
+ echo recorder=true >> ${WORKDIR}/virtualoutput.cfg
+ fi
+}
+
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf/virtualoutput.cfg b/meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf/virtualoutput.cfg
new file mode 100644
index 000000000..76f536ff8
--- /dev/null
+++ b/meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf/virtualoutput.cfg
@@ -0,0 +1,7 @@
+[output]
+name=virtual1
+mode=1920x1080@30
+ip=192.168.20.99
+port=5005
+bitrate=3000000
+crop=384x368@0x0
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/weston_%.bbappend b/meta-agl-profile-graphical/recipes-graphics/wayland/weston_%.bbappend
new file mode 100644
index 000000000..38590dcdb
--- /dev/null
+++ b/meta-agl-profile-graphical/recipes-graphics/wayland/weston_%.bbappend
@@ -0,0 +1 @@
+DEPENDS_append_ulcb = " gstreamer1.0-plugins-base"
diff --git a/meta-agl-profile-graphical/recipes-sdl/packagegroups/packagegroup-agl-smartdevicelink.bb b/meta-agl-profile-graphical/recipes-sdl/packagegroups/packagegroup-agl-smartdevicelink.bb
new file mode 100644
index 000000000..7d135356a
--- /dev/null
+++ b/meta-agl-profile-graphical/recipes-sdl/packagegroups/packagegroup-agl-smartdevicelink.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "Set of packages for SmartDeviceLink"
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-smartdevicelink \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ sdl-core \
+ "
+
+# Porter does not have the required gstreamer version
+RDEPENDS_${PN}_porter := ""