2nd part of the layer/profile rework [1/2] 31/13831/4
authorJan-Simon Möller <jsmoeller@linuxfoundation.org>
Tue, 24 Apr 2018 13:13:18 +0000 (15:13 +0200)
committerJan-Simon Möller <jsmoeller@linuxfoundation.org>
Fri, 27 Apr 2018 22:28:55 +0000 (00:28 +0200)
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>
89 files changed:
meta-agl-profile-core/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-gps/agl-service-gps_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb [new file with mode: 0755]
meta-agl-profile-core/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-radio/agl-service-radio_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-steering-wheel/agl-service-steering-wheel_0.1.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-weather/agl-service-weather_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/agl-service-wifi/agl-service-wifi_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-apis/high-level-viwi-service/high-level-viwi-service.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch [new file with mode: 0644]
meta-agl-profile-core/recipes-core/dbus/dbus/libdbus-c++_0.9.0.bbappend [new file with mode: 0644]
meta-agl-profile-core/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch [new file with mode: 0644]
meta-agl-profile-core/recipes-core/dbus/libdbus-c++_0.9.0.bbappend [new file with mode: 0644]
meta-agl-profile-core/recipes-extended/gperf/gperf_%.bbappend [new file with mode: 0644]
meta-agl-profile-core/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch [new file with mode: 0644]
meta-agl-profile-core/recipes-multimedia/libmp4v2/libmp4v2_git.bb [new file with mode: 0644]
meta-agl-profile-core/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend
meta-agl-profile-core/recipes-support/opencv/opencv_3.3.bbappend [new file with mode: 0644]
meta-agl-profile-core/recipes-support/udisks/files/automount.service [new file with mode: 0644]
meta-agl-profile-core/recipes-support/udisks/files/automount.sh [new file with mode: 0755]
meta-agl-profile-core/recipes-support/udisks/files/org.freedesktop.UDisks.conf [new file with mode: 0644]
meta-agl-profile-core/recipes-support/udisks/files/udisks.service [new file with mode: 0644]
meta-agl-profile-core/recipes-support/udisks/udisks_1.0.5.bbappend [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-agl.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-automotive.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-connectivity.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-graphics.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-multimedia.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-native.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-navi-lbs.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-security.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-speech-services.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-web.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5/0001_fix_compile_issue_when_using_in_c++.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend
meta-agl-profile-demo/recipes-connectivity/libnfc/libnfc_git.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/mocca-usb/mocca-usb.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/files/0004-most-video-set-device_caps.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/files/0007-dim2-use-device-tree.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/most.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-kernel/most/most.bbappend [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/.gitkeep [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-appfw-native-qt5.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-demo-qt-examples.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bbappend [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qml-execscript-plugin/qml-execscript-plugin_1.0.bb [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtbase-native_git.bbappend [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtbase_%.bbappend [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia_%.bbappend [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtsystems_%.bbappend [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-Implement-initial-IVI-shell-support-with-shell-integ.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-Fix-multiple-QWindow.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0021-Implement-initial-IVI-Shell-support.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0099_qtwayland_no_evdev.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland/disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwayland_%.bbappend [new file with mode: 0644]
meta-agl-profile-demo/recipes-qt/qt5/qtwebkit_%.bbappend [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/cmake-find-gtest.patch [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension/test-path.patch [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/wayland-ivi-extension_1.1%.bbappend [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf.bbappend [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/weston-ini-conf/virtualoutput.cfg [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/weston_%.bbappend [new file with mode: 0644]
meta-agl-profile-graphical/recipes-sdl/packagegroups/packagegroup-agl-smartdevicelink.bb [new file with mode: 0644]

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 (file)
index 0000000..da0e809
--- /dev/null
@@ -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 (file)
index 0000000..488c9ea
--- /dev/null
@@ -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 (file)
index 0000000..1f93877
--- /dev/null
@@ -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 (file)
index 0000000..a6b57ae
--- /dev/null
@@ -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 (file)
index 0000000..d1fee9d
--- /dev/null
@@ -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 (file)
index 0000000..298374a
--- /dev/null
@@ -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 (file)
index 0000000..c5cf71c
--- /dev/null
@@ -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 (file)
index 0000000..c1f0001
--- /dev/null
@@ -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 (executable)
index 0000000..0c245b3
--- /dev/null
@@ -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 (file)
index 0000000..2862da0
--- /dev/null
@@ -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 (file)
index 0000000..0e913af
--- /dev/null
@@ -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 (file)
index 0000000..0d308d0
--- /dev/null
@@ -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 (file)
index 0000000..65328ff
--- /dev/null
@@ -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 (file)
index 0000000..9590ad9
--- /dev/null
@@ -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 (file)
index 0000000..340bbd7
--- /dev/null
@@ -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 (file)
index 0000000..2b680f4
--- /dev/null
@@ -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 (file)
index 0000000..3d4cc45
--- /dev/null
@@ -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 (file)
index 0000000..c4fafef
--- /dev/null
@@ -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 (file)
index 0000000..dac44b5
--- /dev/null
@@ -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 (file)
index 0000000..c4fafef
--- /dev/null
@@ -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 (file)
index 0000000..dac44b5
--- /dev/null
@@ -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 (file)
index 0000000..2a59083
--- /dev/null
@@ -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 (file)
index 0000000..51896e8
--- /dev/null
@@ -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 (file)
index 0000000..dd1b347
--- /dev/null
@@ -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"
index cf248d3..7a1dd1a 100644 (file)
@@ -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 (file)
index 0000000..8656abf
--- /dev/null
@@ -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 (file)
index 0000000..64c36e7
--- /dev/null
@@ -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 (executable)
index 0000000..bb0b1ae
--- /dev/null
@@ -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 (file)
index 0000000..0098b94
--- /dev/null
@@ -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 (file)
index 0000000..4bd5584
--- /dev/null
@@ -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 (file)
index 0000000..d55a167
--- /dev/null
@@ -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 (file)
index 0000000..cc923fd
--- /dev/null
@@ -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 (file)
index 0000000..333195b
--- /dev/null
@@ -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 (file)
index 0000000..fa45c97
--- /dev/null
@@ -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 (file)
index 0000000..1e707ce
--- /dev/null
@@ -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 (file)
index 0000000..ed395f4
--- /dev/null
@@ -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 (file)
index 0000000..a31c666
--- /dev/null
@@ -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 (file)
index 0000000..3e5c9b3
--- /dev/null
@@ -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 (file)
index 0000000..3806899
--- /dev/null
@@ -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 (file)
index 0000000..5f716c2
--- /dev/null
@@ -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 (file)
index 0000000..6da6565
--- /dev/null
@@ -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 (file)
index 0000000..cb5636b
--- /dev/null
@@ -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 (file)
index 0000000..ba2f33c
--- /dev/null
@@ -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)
index ffb9d5b..c5afa87 100644 (file)
@@ -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 (file)
index 0000000..bd216f8
--- /dev/null
@@ -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 (file)
index 0000000..cf4e585
--- /dev/null
@@ -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 (file)
index 0000000..dd811c8
--- /dev/null
@@ -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 (file)
index 0000000..4703844
--- /dev/null
@@ -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 (file)
index 0000000..010d4b0
--- /dev/null
@@ -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 (file)
index 0000000..ebaee9e
--- /dev/null
@@ -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 (file)
index 0000000..59c6ae6
--- /dev/null
@@ -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 (file)
index 0000000..679fab7
--- /dev/null
@@ -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 (file)
index 0000000..1b01fb1
--- /dev/null
@@ -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 (file)
index 0000000..08cd6f9
--- /dev/null
@@ -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 (file)
index 0000000..222c8aa
--- /dev/null
@@ -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 (file)
index 0000000..d85565f
--- /dev/null
@@ -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 (file)
index 0000000..e69de29
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 (file)
index 0000000..a22401f
--- /dev/null
@@ -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 (file)
index 0000000..adebabe
--- /dev/null
@@ -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 (file)
index 0000000..300227e
--- /dev/null
@@ -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 (file)
index 0000000..dbeda2d
--- /dev/null
@@ -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 (file)
index 0000000..b7cfe8d
--- /dev/null
@@ -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 (file)
index 0000000..10a1ddd
--- /dev/null
@@ -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 (file)
index 0000000..d568b12
--- /dev/null
@@ -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 (file)
index 0000000..007e467
--- /dev/null
@@ -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 (file)
index 0000000..a06ac2d
--- /dev/null
@@ -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 (file)
index 0000000..550c58d
--- /dev/null
@@ -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 (file)
index 0000000..9495dcc
--- /dev/null
@@ -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 (file)
index 0000000..c91e117
--- /dev/null
@@ -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 (file)
index 0000000..1777105
--- /dev/null
@@ -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 (file)
index 0000000..591ef71
--- /dev/null
@@ -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 (file)
index 0000000..39296c7
--- /dev/null
@@ -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 (file)
index 0000000..6bea626
--- /dev/null
@@ -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 (file)
index 0000000..fe1bb50
--- /dev/null
@@ -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 (file)
index 0000000..8f0425a
--- /dev/null
@@ -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 (file)
index 0000000..413459f
--- /dev/null
@@ -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 (file)
index 0000000..8723def
--- /dev/null
@@ -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 (file)
index 0000000..99b5193
--- /dev/null
@@ -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 (file)
index 0000000..bca61b5
--- /dev/null
@@ -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 (file)
index 0000000..f113266
--- /dev/null
@@ -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 (file)
index 0000000..9807840
--- /dev/null
@@ -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 (file)
index 0000000..0420578
--- /dev/null
@@ -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 (file)
index 0000000..5371174
--- /dev/null
@@ -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 (file)
index 0000000..251bc58
--- /dev/null
@@ -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 (file)
index 0000000..9c29dee
--- /dev/null
@@ -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 (file)
index 0000000..d778459
--- /dev/null
@@ -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 (file)
index 0000000..76f536f
--- /dev/null
@@ -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 (file)
index 0000000..38590dc
--- /dev/null
@@ -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 (file)
index 0000000..7d13535
--- /dev/null
@@ -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 := ""