From 4ac99c3a1447119363935fb986f5d9c05f032362 Mon Sep 17 00:00:00 2001 From: Jan-Simon Möller Date: Tue, 24 Apr 2018 15:13:18 +0200 Subject: 2nd part of the layer/profile rework [1/2] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../packagegroups/packagegroup-agl-appfw-agl.bb | 16 + .../packagegroup-agl-appfw-automotive.bb | 16 + .../packagegroup-agl-appfw-connectivity.bb | 28 + .../packagegroup-agl-appfw-graphics.bb | 17 + .../packagegroup-agl-appfw-multimedia.bb | 15 + .../packagegroups/packagegroup-agl-appfw-native.bb | 17 + .../packagegroup-agl-appfw-navi-lbs.bb | 17 + .../packagegroup-agl-appfw-security.bb | 16 + .../packagegroup-agl-appfw-speech-services.bb | 16 + .../packagegroups/packagegroup-agl-appfw-web.bb | 16 + .../packagegroups/packagegroup-agl-appfw.bb | 25 + .../0001_fix_compile_issue_when_using_in_c++.patch | 23 + .../recipes-connectivity/bluez5/bluez5_%.bbappend | 7 + .../recipes-connectivity/libnfc/libnfc_git.bb | 18 + .../recipes-kernel/mocca-usb/mocca-usb.bb | 22 + .../0002-src-most-add-auto-conf-feature.patch | 472 +++++++++ ...003-core-remove-kernel-log-for-MBO-status.patch | 26 + .../files/0004-most-video-set-device_caps.patch | 25 + ...-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch | 25 + .../files/0006-dim2-fix-startup-sequence.patch | 186 ++++ .../most/files/0007-dim2-use-device-tree.patch | 378 +++++++ ...im2-read-clock-speed-from-the-device-tree.patch | 92 ++ ...use-device-for-coherent-memory-allocation.patch | 47 + meta-agl-profile-demo/recipes-kernel/most/most.bb | 14 + .../recipes-kernel/most/most.bbappend | 12 + meta-agl-profile-demo/recipes-qt/.gitkeep | 0 .../packagegroup-agl-appfw-native-qt5.bb | 32 + .../packagegroup-agl-demo-qt-examples.bb | 26 + .../packagegroup-qt5-toolchain-target.bbappend | 23 + .../qml-execscript-plugin_1.0.bb | 25 + .../recipes-qt/qt5/qtbase-native_git.bbappend | 3 + ...-to-make-introspect-for-every-findMetaObj.patch | 30 + .../recipes-qt/qt5/qtbase_%.bbappend | 16 + ...age-support-with-the-data-URL-scheme-for-.patch | 80 ++ .../recipes-qt/qt5/qtmultimedia_%.bbappend | 7 + .../recipes-qt/qt5/qtsystems_%.bbappend | 3 + ...nitial-IVI-shell-support-with-shell-integ.patch | 693 +++++++++++++ ...update-3rd-party-ivi-application-protocol.patch | 56 ++ .../qt5/qtwayland/0002-Fix-multiple-QWindow.patch | 62 ++ ...dow-add-support-for-IVI-Surface-ID-proper.patch | 34 + ...est-file-according-to-smack-3-domain-mode.patch | 33 + ...Add-xdg-shell-protocol-file-version-1.4.0.patch | 468 +++++++++ ...dd-minimize-feature-to-QWindow-using-wayl.patch | 1029 ++++++++++++++++++++ ...pgrade-to-support-current-version-weston-.patch | 772 +++++++++++++++ ...-IVI-Shell-protocol-file-version-patch-v6.patch | 128 +++ .../0021-Implement-initial-IVI-Shell-support.patch | 539 ++++++++++ .../qt5/qtwayland/0099_qtwayland_no_evdev.patch | 14 + ...018-packaging-enable-xdg-shell-at-runtime.patch | 31 + ..._egl_qt_wayland_client_buffer_integration.patch | 12 + .../recipes-qt/qt5/qtwayland_%.bbappend | 36 + .../recipes-qt/qt5/qtwebkit_%.bbappend | 1 + 51 files changed, 5699 insertions(+) create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-agl.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-automotive.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-connectivity.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-graphics.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-multimedia.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-native.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-navi-lbs.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-security.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-speech-services.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-web.bb create mode 100644 meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw.bb create mode 100644 meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5/0001_fix_compile_issue_when_using_in_c++.patch create mode 100644 meta-agl-profile-demo/recipes-connectivity/libnfc/libnfc_git.bb create mode 100644 meta-agl-profile-demo/recipes-kernel/mocca-usb/mocca-usb.bb create mode 100644 meta-agl-profile-demo/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch create mode 100644 meta-agl-profile-demo/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch create mode 100644 meta-agl-profile-demo/recipes-kernel/most/files/0004-most-video-set-device_caps.patch create mode 100644 meta-agl-profile-demo/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch create mode 100644 meta-agl-profile-demo/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch create mode 100644 meta-agl-profile-demo/recipes-kernel/most/files/0007-dim2-use-device-tree.patch create mode 100644 meta-agl-profile-demo/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch create mode 100644 meta-agl-profile-demo/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch create mode 100644 meta-agl-profile-demo/recipes-kernel/most/most.bb create mode 100644 meta-agl-profile-demo/recipes-kernel/most/most.bbappend create mode 100644 meta-agl-profile-demo/recipes-qt/.gitkeep create mode 100644 meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-appfw-native-qt5.bb create mode 100644 meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-demo-qt-examples.bb create mode 100644 meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bbappend create mode 100644 meta-agl-profile-demo/recipes-qt/qml-execscript-plugin/qml-execscript-plugin_1.0.bb create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtbase-native_git.bbappend create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtbase_%.bbappend create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia_%.bbappend create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtsystems_%.bbappend create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-Implement-initial-IVI-shell-support-with-shell-integ.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-Fix-multiple-QWindow.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0021-Implement-initial-IVI-Shell-support.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0099_qtwayland_no_evdev.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland/disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwayland_%.bbappend create mode 100644 meta-agl-profile-demo/recipes-qt/qt5/qtwebkit_%.bbappend (limited to 'meta-agl-profile-demo') diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-agl.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-agl.bb new file mode 100644 index 000000000..cc923fd4a --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-agl.bb @@ -0,0 +1,16 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +AGL App Fw Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-agl \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + " diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-automotive.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-automotive.bb new file mode 100644 index 000000000..333195b74 --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-automotive.bb @@ -0,0 +1,16 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +Automotive Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-automotive \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + " diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-connectivity.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-connectivity.bb new file mode 100644 index 000000000..fa45c97d6 --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-connectivity.bb @@ -0,0 +1,28 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +Connectivity Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-connectivity \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + " + +AGL_APPS = " \ + " +# restricted due to dependency on Kernel >= 4.8 which is not available in all repositories +AGL_APPS_append_m3ulcb = " agl-service-can-low-level " +AGL_APPS_append_intel-corei7-64 = " agl-service-can-low-level " +AGL_APPS_append_qemux86-64 = " agl-service-can-low-level " + +RDEPENDS_${PN}_append = " \ + ${AGL_APPS} \ + " + diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-graphics.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-graphics.bb new file mode 100644 index 000000000..1e707ce46 --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-graphics.bb @@ -0,0 +1,17 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +Graphics Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-graphics \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + opencv \ + " diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-multimedia.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-multimedia.bb new file mode 100644 index 000000000..ed395f4f0 --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-multimedia.bb @@ -0,0 +1,15 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +Multimedia Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-multimedia \ + " + +RDEPENDS_${PN} += "\ + agl-service-mediaplayer \ + " diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-native.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-native.bb new file mode 100644 index 000000000..a31c666ca --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-native.bb @@ -0,0 +1,17 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +Native App Fw Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-native \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-appfw-native-qt5 \ + " diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-navi-lbs.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-navi-lbs.bb new file mode 100644 index 000000000..3e5c9b396 --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-navi-lbs.bb @@ -0,0 +1,17 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +Navigation and Location-Based Services Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-navi-lbs \ + " + +RDEPENDS_${PN} += "\ + agl-service-gps \ + agl-service-geoclue \ + agl-service-geofence \ + " diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-security.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-security.bb new file mode 100644 index 000000000..3806899da --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-security.bb @@ -0,0 +1,16 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +Security Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-security \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + " diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-speech-services.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-speech-services.bb new file mode 100644 index 000000000..5f716c21e --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-speech-services.bb @@ -0,0 +1,16 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +Speech Services Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-speech-services \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + " diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-web.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-web.bb new file mode 100644 index 000000000..6da656573 --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw-web.bb @@ -0,0 +1,16 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework which required by \ +Web App Fw Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-web \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + " diff --git a/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw.bb b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw.bb new file mode 100644 index 000000000..cb5636bfd --- /dev/null +++ b/meta-agl-profile-demo/recipes-appfw/packagegroups/packagegroup-agl-appfw.bb @@ -0,0 +1,25 @@ +SUMMARY = "The software for application framework of AGL IVI profile" +DESCRIPTION = "A set of packages belong to AGL application framework" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-appfw-automotive \ + packagegroup-agl-appfw-connectivity \ + packagegroup-agl-appfw-graphics \ + packagegroup-agl-appfw-multimedia \ + packagegroup-agl-appfw-navi-lbs \ + packagegroup-agl-appfw-agl \ + packagegroup-agl-appfw-native \ + packagegroup-agl-appfw-web \ + packagegroup-agl-appfw-security \ + packagegroup-agl-appfw-speech-services \ + " diff --git a/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5/0001_fix_compile_issue_when_using_in_c++.patch b/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5/0001_fix_compile_issue_when_using_in_c++.patch new file mode 100644 index 000000000..ba2f33c62 --- /dev/null +++ b/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5/0001_fix_compile_issue_when_using_in_c++.patch @@ -0,0 +1,23 @@ +diff -urN bluez-5.22.orig/lib/bluetooth.h bluez-5.22/lib/bluetooth.h +--- bluez-5.22.orig/lib/bluetooth.h 2013-12-10 15:59:06.000000000 +0900 ++++ bluez-5.22/lib/bluetooth.h 2015-10-28 13:34:25.749335768 +0900 +@@ -158,16 +158,16 @@ + #define bt_get_unaligned(ptr) \ + ({ \ + struct __attribute__((packed)) { \ +- typeof(*(ptr)) __v; \ +- } *__p = (typeof(__p)) (ptr); \ ++ __typeof__(*(ptr)) __v; \ ++ } *__p = (__typeof__(__p)) (ptr); \ + __p->__v; \ + }) + + #define bt_put_unaligned(val, ptr) \ + do { \ + struct __attribute__((packed)) { \ +- typeof(*(ptr)) __v; \ +- } *__p = (typeof(__p)) (ptr); \ ++ __typeof__(*(ptr)) __v; \ ++ } *__p = (__typeof__(__p)) (ptr); \ + __p->__v = (val); \ + } while(0) diff --git a/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend b/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend index ffb9d5b53..c5afa875f 100644 --- a/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend +++ b/meta-agl-profile-demo/recipes-connectivity/bluez5/bluez5_%.bbappend @@ -1,6 +1,13 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" SRC_URI_append = " file://bluetooth.conf" +APPLY_v522 = "${@str('no' if '${PV}' != '5.22' else 'yes')}" + +SRC_URI_append = "\ + file://0001_fix_compile_issue_when_using_in_c++.patch;apply=${APPLY_v522} \ +" + + do_install_append() { install -m 0644 ${WORKDIR}/bluetooth.conf ${D}${sysconfdir}/dbus-1/system.d/bluetooth.conf } diff --git a/meta-agl-profile-demo/recipes-connectivity/libnfc/libnfc_git.bb b/meta-agl-profile-demo/recipes-connectivity/libnfc/libnfc_git.bb new file mode 100644 index 000000000..bd216f815 --- /dev/null +++ b/meta-agl-profile-demo/recipes-connectivity/libnfc/libnfc_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "libnfc" +DESCRIPTION = "Platform independent Near Field Communication (NFC) library" +HOMEPAGE = "https://github.com/nfc-tools/libnfc" +SECTION = "apps" + +DEPENDS = "libusb" + +LICENSE = "LGPLv3" +LIC_FILES_CHKSUM = "file://${S}/COPYING;md5=b52f2d57d10c4f7ee67a7eb9615d5d24" + +inherit cmake pkgconfig + +SRC_URI = "git://github.com/nfc-tools/libnfc;protocol=https;branch=master" +SRCREV = "2d4543673e9b76c02679ca8b89259659f1afd932" + +PV = "1.7.1+git${SRCPV}" +S = "${WORKDIR}/git" + diff --git a/meta-agl-profile-demo/recipes-kernel/mocca-usb/mocca-usb.bb b/meta-agl-profile-demo/recipes-kernel/mocca-usb/mocca-usb.bb new file mode 100644 index 000000000..cf4e5856b --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/mocca-usb/mocca-usb.bb @@ -0,0 +1,22 @@ +DESCRIPTION = "Build USB driver for MOCCA box" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" + +inherit module + +PV = "0.1" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/can-lin/;protocol=https;branch=${AGL_BRANCH}" +S = "${WORKDIR}/git/Usb-Driver" +SRCREV = "02ba272c0eb51b06160307b6cb71f91684772c8c" + +# The inherit of module.bbclass will automatically name module packages with +# "kernel-module-" prefix as required by the oe-core build environment. + +do_install_append () { + # modprobe automatically at boot + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + install -d ${D}${sysconfdir}/modules-load.d + echo "mocca_usb" > ${D}${sysconfdir}/modules-load.d/mocca_usb.conf + fi +} diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch new file mode 100644 index 000000000..dd811c81b --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch @@ -0,0 +1,472 @@ +From 9cb7cb85f59509ac445116e9458c502cf6cb74e6 Mon Sep 17 00:00:00 2001 +From: Christian Gromm +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 +--- + 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 ++ ++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 "); ++MODULE_DESCRIPTION("Default configuration for the MOST channels"); +diff --git a/include/mostcore.h b/include/mostcore.h +index dc87121..3c00efb 100644 +--- a/include/mostcore.h ++++ b/include/mostcore.h +@@ -145,6 +145,39 @@ struct most_channel_config { + u16 dbr_size; + }; + ++/** ++ * struct most_config_probe - matching rule, channel configuration and ++ * the optional AIM name used for the automatic configuration and linking ++ * of the channel ++ * @dev_name: optional matching device id ++ * ("usb_device 1-1:1.0," "dim2-12345678", etc.) ++ * @ch_name: matching channel name ("ep8f", "ca2", etc.) ++ * @cfg: configuration that will be applied for the found channel ++ * @aim_name: optional name of the AIM that will be linked to the channel ++ * ("cdev", "networking", "v4l", "sound") ++ * @aim_param: AIM dependent parameter (it is the character device name ++ * for the cdev AIM, PCM format for the audio AIM, etc.) ++ */ ++struct most_config_probe { ++ const char *dev_name; ++ const char *ch_name; ++ struct most_channel_config cfg; ++ const char *aim_name; ++ const char *aim_param; ++}; ++ ++/** ++ * struct most_config_set - the configuration set containing ++ * several automatic configurations for the different channels ++ * @probes: list of the matching rules and the configurations, ++ * that must be ended with the empty structure ++ * @list: list head used by the MostCore ++ */ ++struct most_config_set { ++ const struct most_config_probe *probes; ++ struct list_head list; ++}; ++ + /* + * struct mbo - MOST Buffer Object. + * @context: context for core completion handler +@@ -285,6 +318,37 @@ struct most_aim { + }; + + /** ++ * most_register_config_set - registers the configuration set ++ * ++ * @cfg_set: configuration set to be registered for the future probes ++ * ++ * The function registers the given configuration set. ++ * ++ * It is possible to register or deregister several configuration sets ++ * independently. Different configuration sets may contain the ++ * overlapped matching rules but later registered configuration set has ++ * the higher priority over the prior registered set. ++ * ++ * The only the first matched configuration is applied for each ++ * channel. ++ * ++ * The configuration for the channel is applied at the time of ++ * registration of the parent most_interface. ++ */ ++void most_register_config_set(struct most_config_set *cfg_set); ++ ++/** ++ * most_deregister_config_set - deregisters the prior registered ++ * configuration set ++ * ++ * @cfg_set: configuration set to be deregistered ++ * ++ * The calling of this function does not change the current ++ * configuration of the channels. ++ */ ++void most_deregister_config_set(struct most_config_set *cfg_set); ++ ++/** + * most_register_interface - Registers instance of the interface. + * @iface: Pointer to the interface instance description. + * +diff --git a/mostcore/core.c b/mostcore/core.c +index 9e0a352..6035cf0 100644 +--- a/mostcore/core.c ++++ b/mostcore/core.c +@@ -36,6 +36,8 @@ static struct class *most_class; + static struct device *core_dev; + static struct ida mdev_id; + static int dummy_num_buffers; ++static struct list_head config_probes; ++struct mutex config_probes_mt; /* config_probes */ + + struct most_c_aim_obj { + struct most_aim *ptr; +@@ -918,6 +920,30 @@ most_c_obj *get_channel_by_name(char *mdev, char *mdev_ch) + return c; + } + ++static int link_channel_to_aim(struct most_c_obj *c, struct most_aim *aim, ++ char *aim_param) ++{ ++ int ret; ++ struct most_aim **aim_ptr; ++ ++ if (!c->aim0.ptr) ++ aim_ptr = &c->aim0.ptr; ++ else if (!c->aim1.ptr) ++ aim_ptr = &c->aim1.ptr; ++ else ++ return -ENOSPC; ++ ++ *aim_ptr = aim; ++ ret = aim->probe_channel(c->iface, c->channel_id, ++ &c->cfg, &c->kobj, aim_param); ++ if (ret) { ++ *aim_ptr = NULL; ++ return ret; ++ } ++ ++ return 0; ++} ++ + /** + * add_link_store - store() function for add_link attribute + * @aim_obj: pointer to AIM object +@@ -946,45 +972,33 @@ static ssize_t add_link_store(struct most_aim_obj *aim_obj, + size_t len) + { + struct most_c_obj *c; +- struct most_aim **aim_ptr; + char buffer[STRING_SIZE]; + char *mdev; + char *mdev_ch; +- char *mdev_devnod; ++ char *aim_param; + char devnod_buf[STRING_SIZE]; + int ret; + size_t max_len = min_t(size_t, len + 1, STRING_SIZE); + + strlcpy(buffer, buf, max_len); + +- ret = split_string(buffer, &mdev, &mdev_ch, &mdev_devnod); ++ ret = split_string(buffer, &mdev, &mdev_ch, &aim_param); + if (ret) + return ret; + +- if (!mdev_devnod || *mdev_devnod == 0) { ++ if (!aim_param || *aim_param == 0) { + snprintf(devnod_buf, sizeof(devnod_buf), "%s-%s", mdev, + mdev_ch); +- mdev_devnod = devnod_buf; ++ aim_param = devnod_buf; + } + + c = get_channel_by_name(mdev, mdev_ch); + if (IS_ERR(c)) + return -ENODEV; + +- if (!c->aim0.ptr) +- aim_ptr = &c->aim0.ptr; +- else if (!c->aim1.ptr) +- aim_ptr = &c->aim1.ptr; +- else +- return -ENOSPC; +- +- *aim_ptr = aim_obj->driver; +- ret = aim_obj->driver->probe_channel(c->iface, c->channel_id, +- &c->cfg, &c->kobj, mdev_devnod); +- if (ret) { +- *aim_ptr = NULL; ++ ret = link_channel_to_aim(c, aim_obj->driver, aim_param); ++ if (ret) + return ret; +- } + + return len; + } +@@ -1679,6 +1693,73 @@ int most_deregister_aim(struct most_aim *aim) + } + EXPORT_SYMBOL_GPL(most_deregister_aim); + ++void most_register_config_set(struct most_config_set *cfg_set) ++{ ++ mutex_lock(&config_probes_mt); ++ list_add(&cfg_set->list, &config_probes); ++ mutex_unlock(&config_probes_mt); ++} ++EXPORT_SYMBOL(most_register_config_set); ++ ++void most_deregister_config_set(struct most_config_set *cfg_set) ++{ ++ mutex_lock(&config_probes_mt); ++ list_del(&cfg_set->list); ++ mutex_unlock(&config_probes_mt); ++} ++EXPORT_SYMBOL(most_deregister_config_set); ++ ++static int probe_aim(struct most_c_obj *c, ++ const char *aim_name, const char *aim_param) ++{ ++ struct most_aim_obj *aim_obj; ++ char buf[STRING_SIZE]; ++ ++ list_for_each_entry(aim_obj, &aim_list, list) { ++ if (!strcmp(aim_obj->driver->name, aim_name)) { ++ strlcpy(buf, aim_param ? aim_param : "", sizeof(buf)); ++ return link_channel_to_aim(c, aim_obj->driver, buf); ++ } ++ } ++ return 0; ++} ++ ++static bool probe_config_set(struct most_c_obj *c, ++ const char *dev_name, const char *ch_name, ++ const struct most_config_probe *p) ++{ ++ int err; ++ ++ for (; p->ch_name; p++) { ++ if ((p->dev_name && strcmp(dev_name, p->dev_name)) || ++ strcmp(ch_name, p->ch_name)) ++ continue; ++ ++ c->cfg = p->cfg; ++ if (p->aim_name) { ++ err = probe_aim(c, p->aim_name, p->aim_param); ++ if (err) ++ pr_err("failed to autolink %s to %s: %d\n", ++ ch_name, p->aim_name, err); ++ } ++ return true; ++ } ++ return false; ++} ++ ++static void find_configuration(struct most_c_obj *c, const char *dev_name, ++ const char *ch_name) ++{ ++ struct most_config_set *plist; ++ ++ mutex_lock(&config_probes_mt); ++ list_for_each_entry(plist, &config_probes, list) { ++ if (probe_config_set(c, dev_name, ch_name, plist->probes)) ++ break; ++ } ++ mutex_unlock(&config_probes_mt); ++} ++ + /** + * most_register_interface - registers an interface with core + * @iface: pointer to the instance of the interface description. +@@ -1777,6 +1858,7 @@ struct kobject *most_register_interface(struct most_interface *iface) + mutex_init(&c->start_mutex); + mutex_init(&c->nq_mutex); + list_add_tail(&c->list, &inst->channel_list); ++ find_configuration(c, iface->description, channel_name); + } + pr_info("registered new MOST device mdev%d (%s)\n", + inst->dev_id, iface->description); +@@ -1880,6 +1962,8 @@ static int __init most_init(void) + pr_info("init()\n"); + INIT_LIST_HEAD(&instance_list); + INIT_LIST_HEAD(&aim_list); ++ INIT_LIST_HEAD(&config_probes); ++ mutex_init(&config_probes_mt); + ida_init(&mdev_id); + + err = bus_register(&most_bus); +-- +2.7.4 + diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch new file mode 100644 index 000000000..4703844a1 --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch @@ -0,0 +1,26 @@ +From b269994be937cbb31c0d73ecc899ca8a545a6a4a Mon Sep 17 00:00:00 2001 +From: Christian Gromm +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 +--- + driver/mostcore/core.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/mostcore/core.c b/mostcore/core.c +index 931efb9..595becc 100644 +--- a/mostcore/core.c ++++ b/mostcore/core.c +@@ -1348,8 +1348,6 @@ static void most_write_completion(struct mbo *mbo) + BUG_ON((!mbo) || (!mbo->context)); + + c = mbo->context; +- if (mbo->status == MBO_E_INVAL) +- pr_info("WARN: Tx MBO status: invalid\n"); + if (unlikely(c->is_poisoned || (mbo->status == MBO_E_CLOSE))) + trash_mbo(mbo); + else +-- +2.7.4 + diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0004-most-video-set-device_caps.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0004-most-video-set-device_caps.patch new file mode 100644 index 000000000..010d4b0d0 --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/files/0004-most-video-set-device_caps.patch @@ -0,0 +1,25 @@ +From a5fd2ae8d4a3b2a8f7a33a4ea469ea7ee0d946ef Mon Sep 17 00:00:00 2001 +From: Christian Gromm +Date: Mon, 4 Sep 2017 15:36:38 +0200 +Subject: [PATCH 4/5] most: video: set device_caps + +Signed-off-by: Christian Gromm +--- + driver/aim-v4l2/video.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/aim-v4l2/video.c b/aim-v4l2/video.c +index e074841..6405a03 100644 +--- a/aim-v4l2/video.c ++++ b/aim-v4l2/video.c +@@ -263,6 +263,7 @@ static int vidioc_querycap(struct file *file, void *priv, + snprintf(cap->bus_info, sizeof(cap->bus_info), + "%s", mdev->iface->description); + ++ cap->device_caps = + cap->capabilities = + V4L2_CAP_READWRITE | + V4L2_CAP_TUNER | +-- +2.7.4 + diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch new file mode 100644 index 000000000..ebaee9e14 --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch @@ -0,0 +1,25 @@ +From 7518453386ad3e82008186a6c9ca86ed8c136801 Mon Sep 17 00:00:00 2001 +From: Christian Gromm +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 +--- + driver/aim-v4l2/video.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/aim-v4l2/video.c b/aim-v4l2/video.c +index 6405a03..db75d4d 100644 +--- a/aim-v4l2/video.c ++++ b/aim-v4l2/video.c +@@ -265,6 +265,7 @@ static int vidioc_querycap(struct file *file, void *priv, + + cap->device_caps = + cap->capabilities = ++ V4L2_CAP_DEVICE_CAPS | + V4L2_CAP_READWRITE | + V4L2_CAP_TUNER | + V4L2_CAP_VIDEO_CAPTURE; +-- +2.7.4 + diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch new file mode 100644 index 000000000..59c6ae671 --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch @@ -0,0 +1,186 @@ +From 63bcd9b421ae7927948bffec9566db47f40ea290 Mon Sep 17 00:00:00 2001 +From: Andrey Shvetsov +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 +--- + hdm-dim2/dim2_hdm.c | 90 +++++++++++++++++++++++++++++++++++++++--------------------------------------------------- + 1 file changed, 39 insertions(+), 51 deletions(-) + +diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c +index 893b8e4..e4629a5 100644 +--- a/hdm-dim2/dim2_hdm.c ++++ b/hdm-dim2/dim2_hdm.c +@@ -155,38 +155,6 @@ void dimcb_on_error(u8 error_id, const char *error_message) + } + + /** +- * startup_dim - initialize the dim2 interface +- * @pdev: platform device +- */ +-static int startup_dim(struct platform_device *pdev) +-{ +- struct dim2_hdm *dev = platform_get_drvdata(pdev); +- struct dim2_platform_data *pdata = pdev->dev.platform_data; +- u8 hal_ret; +- int ret; +- +- if (!pdata) { +- pr_err("missing platform data\n"); +- return -EINVAL; +- } +- +- ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0; +- if (ret) +- return ret; +- +- pr_info("sync: num of frames per sub-buffer: %u\n", fcnt); +- hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt); +- if (hal_ret != DIM_NO_ERROR) { +- pr_err("dim_startup failed: %d\n", hal_ret); +- if (pdata && pdata->destroy) +- pdata->destroy(pdata); +- return -ENODEV; +- } +- +- return 0; +-} +- +-/** + * try_start_dim_transfer - try to transfer a buffer on a channel + * @hdm_ch: channel specific data + * +@@ -727,10 +695,12 @@ static void dma_free(struct mbo *mbo, u32 size) + */ + static int dim2_probe(struct platform_device *pdev) + { ++ struct dim2_platform_data *pdata = pdev->dev.platform_data; + struct dim2_hdm *dev; + struct resource *res; + int ret, i; + struct kobject *kobj; ++ u8 hal_ret; + int irq; + + dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); +@@ -745,38 +715,59 @@ static int dim2_probe(struct platform_device *pdev) + if (IS_ERR(dev->io_base)) + return PTR_ERR(dev->io_base); + ++ if (!pdata) { ++ dev_err(&pdev->dev, "missing platform data\n"); ++ return -EINVAL; ++ } ++ ++ ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0; ++ if (ret) ++ return ret; ++ ++ dev_info(&pdev->dev, "sync: num of frames per sub-buffer: %u\n", fcnt); ++ hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt); ++ if (hal_ret != DIM_NO_ERROR) { ++ dev_err(&pdev->dev, "dim_startup failed: %d\n", hal_ret); ++ ret = -ENODEV; ++ goto err_bsp_destroy; ++ } ++ + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get ahb0_int irq: %d\n", irq); +- return irq; ++ ret = irq; ++ goto err_shutdown_dim; + } + + ret = devm_request_irq(&pdev->dev, irq, dim2_ahb_isr, 0, + "dim2_ahb0_int", dev); + if (ret) { + dev_err(&pdev->dev, "failed to request ahb0_int irq %d\n", irq); +- return ret; ++ goto err_shutdown_dim; + } + + irq = platform_get_irq(pdev, 1); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get mlb_int irq: %d\n", irq); +- return irq; ++ ret = irq; ++ goto err_shutdown_dim; + } + + ret = devm_request_irq(&pdev->dev, irq, dim2_mlb_isr, 0, + "dim2_mlb_int", dev); + if (ret) { + dev_err(&pdev->dev, "failed to request mlb_int irq %d\n", irq); +- return ret; ++ goto err_shutdown_dim; + } + + init_waitqueue_head(&dev->netinfo_waitq); + dev->deliver_netinfo = 0; +- dev->netinfo_task = kthread_run(&deliver_netinfo_thread, (void *)dev, ++ dev->netinfo_task = kthread_run(&deliver_netinfo_thread, dev, + "dim2_netinfo"); +- if (IS_ERR(dev->netinfo_task)) +- return PTR_ERR(dev->netinfo_task); ++ if (IS_ERR(dev->netinfo_task)) { ++ ret = PTR_ERR(dev->netinfo_task); ++ goto err_shutdown_dim; ++ } + + for (i = 0; i < DMA_CHANNELS; i++) { + struct most_channel_capability *cap = dev->capabilities + i; +@@ -833,20 +824,17 @@ static int dim2_probe(struct platform_device *pdev) + if (ret) + goto err_unreg_iface; + +- ret = startup_dim(pdev); +- if (ret) { +- dev_err(&pdev->dev, "failed to initialize DIM2\n"); +- goto err_destroy_bus; +- } +- + return 0; + +-err_destroy_bus: +- dim2_sysfs_destroy(&dev->bus); + err_unreg_iface: + most_deregister_interface(&dev->most_iface); + err_stop_thread: + kthread_stop(dev->netinfo_task); ++err_shutdown_dim: ++ dim_shutdown(); ++err_bsp_destroy: ++ if (pdata && pdata->destroy) ++ pdata->destroy(pdata); + + return ret; + } +@@ -863,6 +851,10 @@ static int dim2_remove(struct platform_device *pdev) + struct dim2_platform_data *pdata = pdev->dev.platform_data; + unsigned long flags; + ++ dim2_sysfs_destroy(&dev->bus); ++ most_deregister_interface(&dev->most_iface); ++ kthread_stop(dev->netinfo_task); ++ + spin_lock_irqsave(&dim_lock, flags); + dim_shutdown(); + spin_unlock_irqrestore(&dim_lock, flags); +@@ -870,10 +862,6 @@ static int dim2_remove(struct platform_device *pdev) + if (pdata && pdata->destroy) + pdata->destroy(pdata); + +- dim2_sysfs_destroy(&dev->bus); +- most_deregister_interface(&dev->most_iface); +- kthread_stop(dev->netinfo_task); +- + /* + * break link to local platform_device_id struct + * to prevent crash by unload platform device module +-- +libgit2 0.26.0 diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0007-dim2-use-device-tree.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0007-dim2-use-device-tree.patch new file mode 100644 index 000000000..679fab79c --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/files/0007-dim2-use-device-tree.patch @@ -0,0 +1,378 @@ +From 8e16207392cd715ea88f6780981a3d55ab005588 Mon Sep 17 00:00:00 2001 +From: Andrey Shvetsov +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 +--- + 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 ++#include + #include + #include + #include +@@ -21,13 +22,13 @@ + #include + #include + #include ++#include + #include + #include + #include + + #include + #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 "); + MODULE_AUTHOR("Andrey Shvetsov "); + MODULE_DESCRIPTION("MediaLB DIM2 Hardware Dependent Module"); + MODULE_LICENSE("GPL"); +libgit2 0.26.0 diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch new file mode 100644 index 000000000..1b01fb156 --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch @@ -0,0 +1,92 @@ +From 839ad403a2d8081a6c15f6fc2836b01919338f3c Mon Sep 17 00:00:00 2001 +From: Andrey Shvetsov +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 +--- + Documentation/devicetree/bindings/inic/microchip,inic-dim2.txt | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + hdm-dim2/dim2_hdm.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 113 insertions(+), 1 deletion(-) + create mode 100644 Documentation/devicetree/bindings/inic/microchip,inic-dim2.txt + +diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c +index 2dba917..05e1896 100644 +--- a/hdm-dim2/dim2_hdm.c ++++ b/hdm-dim2/dim2_hdm.c +@@ -698,6 +698,42 @@ static void dma_free(struct mbo *mbo, u32 size) + + static const struct of_device_id dim2_of_match[]; + ++static struct { ++ const char *clock_speed; ++ u8 clk_speed; ++} clk_mt[] = { ++ { "256fs", CLK_256FS }, ++ { "512fs", CLK_512FS }, ++ { "1024fs", CLK_1024FS }, ++ { "2048fs", CLK_2048FS }, ++ { "3072fs", CLK_3072FS }, ++ { "4096fs", CLK_4096FS }, ++ { "6144fs", CLK_6144FS }, ++ { "8192fs", CLK_8192FS }, ++}; ++ ++/** ++ * get_dim2_clk_speed - converts string to DIM2 clock speed value ++ * ++ * @clock_speed: string in the format "{NUMBER}fs" ++ * @val: pointer to get one of the CLK_{NUMBER}FS values ++ * ++ * By success stores one of the CLK_{NUMBER}FS in the *val and returns 0, ++ * otherwise returns -EINVAL. ++ */ ++static int get_dim2_clk_speed(const char *clock_speed, u8 *val) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(clk_mt); i++) { ++ if (!strcmp(clock_speed, clk_mt[i].clock_speed)) { ++ *val = clk_mt[i].clk_speed; ++ return 0; ++ } ++ } ++ return -EINVAL; ++} ++ + /* + * dim2_probe - dim2 probe handler + * @pdev: platform device structure +@@ -708,6 +744,7 @@ static const struct of_device_id dim2_of_match[]; + static int dim2_probe(struct platform_device *pdev) + { + const struct dim2_platform_data *pdata; ++ const char *clock_speed; + struct dim2_hdm *dev; + struct resource *res; + int ret, i; +@@ -725,7 +762,18 @@ static int dim2_probe(struct platform_device *pdev) + + platform_set_drvdata(pdev, dev); + +- dev->clk_speed = CLK_4096FS; ++ ret = of_property_read_string(pdev->dev.of_node, ++ "microchip,clock-speed", &clock_speed); ++ if (ret) { ++ dev_err(&pdev->dev, "missing dt property clock-speed\n"); ++ return ret; ++ } ++ ++ ret = get_dim2_clk_speed(clock_speed, &dev->clk_speed); ++ if (ret) { ++ dev_err(&pdev->dev, "bad dt property clock-speed\n"); ++ return ret; ++ } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + dev->io_base = devm_ioremap_resource(&pdev->dev, res); +-- +libgit2 0.26.0 diff --git a/meta-agl-profile-demo/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch b/meta-agl-profile-demo/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch new file mode 100644 index 000000000..08cd6f99d --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch @@ -0,0 +1,47 @@ +From 756f2f1f90524c2620ed7951e436d13bdb929a6b Mon Sep 17 00:00:00 2001 +From: Andrey Shvetsov +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 +--- + hdm-dim2/dim2_hdm.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c +index 05e1896..1847091 100644 +--- a/hdm-dim2/dim2_hdm.c ++++ b/hdm-dim2/dim2_hdm.c +@@ -688,12 +688,16 @@ static int poison_channel(struct most_interface *most_iface, int ch_idx) + + static void *dma_alloc(struct mbo *mbo, u32 size) + { +- return dma_alloc_coherent(NULL, size, &mbo->bus_address, GFP_KERNEL); ++ struct device *dev = mbo->ifp->dev; ++ ++ return dma_alloc_coherent(dev, size, &mbo->bus_address, GFP_KERNEL); + } + + static void dma_free(struct mbo *mbo, u32 size) + { +- dma_free_coherent(NULL, size, mbo->virt_address, mbo->bus_address); ++ struct device *dev = mbo->ifp->dev; ++ ++ dma_free_coherent(dev, size, mbo->virt_address, mbo->bus_address); + } + + static const struct of_device_id dim2_of_match[]; +@@ -875,6 +879,7 @@ static int dim2_probe(struct platform_device *pdev) + dev->most_iface.poison_channel = poison_channel; + dev->most_iface.request_netinfo = request_netinfo; + dev->most_iface.extra_attrs = DBR_ATTRS; ++ dev->most_iface.dev = &pdev->dev; + + kobj = most_register_interface(&dev->most_iface); + if (IS_ERR(kobj)) { +-- +libgit2 0.26.0 diff --git a/meta-agl-profile-demo/recipes-kernel/most/most.bb b/meta-agl-profile-demo/recipes-kernel/most/most.bb new file mode 100644 index 000000000..222c8aa18 --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/most.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "Build MOST driver" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" + +inherit module + +PV = "0.1" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/most;protocol=https;branch=${AGL_BRANCH}" + +S = "${WORKDIR}/git/driver" +SRCREV = "794e6dc552e626eb6dd506baf941873414d9ef73" + +KERNEL_MODULE_AUTOLOAD += "aim_cdev aim_sound aim_network aim_v4l2 hdm_i2c hdm_dim2 hdm_usb mostcore" \ No newline at end of file diff --git a/meta-agl-profile-demo/recipes-kernel/most/most.bbappend b/meta-agl-profile-demo/recipes-kernel/most/most.bbappend new file mode 100644 index 000000000..d85565fc2 --- /dev/null +++ b/meta-agl-profile-demo/recipes-kernel/most/most.bbappend @@ -0,0 +1,12 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + +SRC_URI_append = " \ + file://0002-src-most-add-auto-conf-feature.patch \ + file://0003-core-remove-kernel-log-for-MBO-status.patch \ + file://0004-most-video-set-device_caps.patch \ + file://0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch \ + file://0006-dim2-fix-startup-sequence.patch \ + file://0007-dim2-use-device-tree.patch \ + file://0008-dim2-read-clock-speed-from-the-device-tree.patch \ + file://0009-dim2-use-device-for-coherent-memory-allocation.patch \ + " diff --git a/meta-agl-profile-demo/recipes-qt/.gitkeep b/meta-agl-profile-demo/recipes-qt/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-appfw-native-qt5.bb b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-appfw-native-qt5.bb new file mode 100644 index 000000000..a22401ffb --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-appfw-native-qt5.bb @@ -0,0 +1,32 @@ +SUMMARY = "Qt5 for native GUI framework of AGL IVI profile" +DESCRIPTION = "A set of Qt5 packages which required by Native App Fw Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-native-qt5 \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + qtbase \ + qtbase-dev \ + qtbase-plugins \ + qtbase-staticdev \ + qtbase-tools \ + qtdeclarative \ + qtdeclarative-qmlplugins \ + qtdeclarative-tools \ + qtcharts \ + qtwayland \ + qtwayland-plugins \ + qtwayland-tools \ + qtgraphicaleffects-qmlplugins \ + qtvirtualkeyboard \ + " +RDEPENDS_${PN}_checkforkrogoth += "\ + qtwayland-examples \ + " diff --git a/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-demo-qt-examples.bb b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-demo-qt-examples.bb new file mode 100644 index 000000000..adebabe76 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-agl-demo-qt-examples.bb @@ -0,0 +1,26 @@ +SUMMARY = "The examples to test Qt5 on AGL Demo Platform" +DESCRIPTION = "A set of packages which contains Qt5 examples" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-demo-qt-examples \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + qt3d-examples \ + qtbase-examples \ + qtconnectivity-examples \ + qtdeclarative-examples \ + qtlocation-examples \ + qtmultimedia-examples \ + qtsensors-examples \ + qtsystems-examples \ + qttools-examples \ + qtwayland-examples \ + qtxmlpatterns-examples \ + " diff --git a/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bbappend b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bbappend new file mode 100644 index 000000000..300227e16 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bbappend @@ -0,0 +1,23 @@ +# add missing dependencies for SDK + +RDEPENDS_${PN} += " \ + qttools-plugins \ + qtquickcontrols-dev \ + qtquickcontrols-qmlplugins \ + qtquickcontrols2-dev \ + qtquickcontrols2-mkspecs \ + qtquickcontrols2-qmlplugins \ +" + +# remove dependency on qtwebkit (still added to SDK by packagegroup-qt5-toolchain-target) +# see SPEC-1159 +RDEPENDS_${PN}_remove = " \ + qtwebkit-dev \ + qtwebkit-mkspecs \ + qtwebkit-qmlplugins \ +" + +# add QtAGLExtras +RDEPENDS_${PN} += " \ + ${@bb.utils.contains("DISTRO_FEATURES", "agl-hmi-framework", " qtaglextras-dev qtaglextras-mkspecs", "",d)} \ +" diff --git a/meta-agl-profile-demo/recipes-qt/qml-execscript-plugin/qml-execscript-plugin_1.0.bb b/meta-agl-profile-demo/recipes-qt/qml-execscript-plugin/qml-execscript-plugin_1.0.bb new file mode 100644 index 000000000..dbeda2d11 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qml-execscript-plugin/qml-execscript-plugin_1.0.bb @@ -0,0 +1,25 @@ +SUMMARY = "Execute Script QML plugin" +DESCRIPTION = "This provides a simple QML plugin able to execute script file." + +LICENSE = "CLOSED" + +DEPENDS = "qtbase-native qtdeclarative" + +SRC_URI = "git://github.com/ntanibata/qml-execscript-plugin.git;protocol=git;" +SRCREV = "1f05c44cccd8aef485d8df8206c8df4e5ad6f310" +S = "${WORKDIR}/git" + +inherit qmake5 + +EXTRA_OECONF = "--with-moc-dir=${STAGING_BINDIR_NATIVE}/qt5" +QML_LIBDIR = "${libdir}/qt5/qml" + +do_install() { + install -d ${D}${libdir}/qt5/qml/execScript/ + install -m 0755 execScript/*.so ${D}${libdir}/qt5/qml/execScript/ + install -m 0644 ../git/execScript/qmldir ${D}${libdir}/qt5/qml/execScript/ +} + +FILES_${PN} += "${QML_LIBDIR}/execScript/libexecscriptplugin.so" +FILES_${PN} += "${QML_LIBDIR}/execScript/qmldir" +FILES_${PN}-dbg += "${QML_LIBDIR}/execScript/.debug" diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtbase-native_git.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtbase-native_git.bbappend new file mode 100644 index 000000000..b7cfe8dce --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtbase-native_git.bbappend @@ -0,0 +1,3 @@ +# Backport this fix from meta-qt5: +# https://github.com/meta-qt5/meta-qt5/commit/bf7cdd963008f2d61bc4c324fff2bfafe511fb5f +SRC_URI_remove = "file://0012-qdbuscpp2xml.pro-do-not-build-with-bootstrapped-depe.patch" diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch new file mode 100644 index 000000000..10a1ddd88 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch @@ -0,0 +1,30 @@ +From a4943bb5c7fdf5eb297223d2c3bb02d2271bea48 Mon Sep 17 00:00:00 2001 +From: Risto Avila +Date: Thu, 17 Dec 2015 04:22:53 +0200 +Subject: [PATCH] Force qdbus to make introspect for every findMetaObject + +--- + src/dbus/qdbusintegrator.cpp | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp +index cce8b9c..ae2a9dc 100644 +--- a/src/dbus/qdbusintegrator.cpp ++++ b/src/dbus/qdbusintegrator.cpp +@@ -2512,8 +2512,11 @@ QDBusConnectionPrivate::findMetaObject(const QString &service, const QString &pa + if (!interface.isEmpty()) { + QDBusReadLocker locker(FindMetaObject1Action, this); + QDBusMetaObject *mo = cachedMetaObjects.value(interface, 0); +- if (mo) +- return mo; ++ if (mo) { ++ // service is not unique. Remove cached object to force introspect ++ cachedMetaObjects.remove(interface); ++ delete mo; ++ } + } + + // introspect the target object +-- +1.9.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtbase_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtbase_%.bbappend new file mode 100644 index 000000000..d568b1284 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtbase_%.bbappend @@ -0,0 +1,16 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +DEPENDS_append_koelsch = " libegl" +#DEPENDS_append_porter = " libegl" +DEPENDS_append_porter = " ${@base_conditional('PREFERRED_PROVIDER_virtual/egl', 'mesa', 'mesa', 'libegl', d)}" + +PACKAGECONFIG_WAYLAND = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)}" +PACKAGECONFIG_GL = "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2', '', d)}" +PACKAGECONFIG_append = " ${PACKAGECONFIG_WAYLAND} icu accessibility" +PACKAGECONFIG_append = " fontconfig" +PACKAGECONFIG_append = " sql-sqlite" + +EXTRA_OECONF_append = "" + +# '-qpa wayland-egl' set wayland-egl as default of platform plagins +PACKAGECONFIG[wayland]="-qpa wayland-egl -no-qpa-platform-guard" diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch new file mode 100644 index 000000000..007e46763 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch @@ -0,0 +1,80 @@ +From ed61f1d932c5c6d38458fcd2e1d5d154383f017e Mon Sep 17 00:00:00 2001 +From: Tasuku Suzuki +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 ++#include ++#include + #include + #include + #include +@@ -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(); ++ QByteArray data; ++ QBuffer buffer(&data); ++ buffer.open(QBuffer::WriteOnly); ++ QImageWriter png(&buffer, "png"); ++ if (!png.write(image)) { ++ return QUrl(); ++ } ++ buffer.close(); ++ return QUrl(QStringLiteral("data:image/png;base64,") + data.toBase64()); ++ } ++ + QMediaObject *m_mediaObject; + QMetaDataWriterControl *m_writerControl; + bool m_requestedWriterControl; +-- +2.7.4 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia_%.bbappend new file mode 100644 index 000000000..a06ac2d89 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtmultimedia_%.bbappend @@ -0,0 +1,7 @@ +FILESEXTRAPATHS_append := ":${THISDIR}/${PN}" + +PACKAGECONFIG_append = " gstreamer" + +SRC_URI_append = " \ + file://0001-metadata-image-support-with-the-data-URL-scheme-for-.patch \ + " diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtsystems_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtsystems_%.bbappend new file mode 100644 index 000000000..550c58d05 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtsystems_%.bbappend @@ -0,0 +1,3 @@ +DEPENDS_remove = "bluez4" +# currently Qt5 does not support bluez5 "Nothing PROVIDES 'gconfbluez5'" +#DEPENDS_append = "bluez5" diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-Implement-initial-IVI-shell-support-with-shell-integ.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-Implement-initial-IVI-shell-support-with-shell-integ.patch new file mode 100644 index 000000000..9495dcc88 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-Implement-initial-IVI-shell-support-with-shell-integ.patch @@ -0,0 +1,693 @@ +From f41ceb82b1adb1bae15d36a426bf39ea0e75cb68 Mon Sep 17 00:00:00 2001 +From: Nobuhiko Tanibata +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 +#include + +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 +--- + .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 @@ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ ++ ++ +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: ++** 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 ++#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 ¶mList) Q_DECL_OVERRIDE; ++}; ++ ++QWaylandShellIntegration *QWaylandIviShellIntegrationPlugin::create(const QString &key, const QStringList ¶mList) ++{ ++ 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: ++** 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 ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#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(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: ++** 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 ++ ++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 ++#include ++#include ++#include ++#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 ++ ++#include ++#include ++#include "qwayland-ivi-application.h" ++ ++QT_BEGIN_NAMESPACE ++ ++namespace QtWaylandClient { ++ ++class QWaylandWindow; ++ ++class Q_WAYLAND_CLIENT_EXPORT QWaylandIviSurface : public QtWayland::ivi_surface ++ , public QWaylandShellSurface ++{ ++public: ++ QWaylandIviSurface(struct ::ivi_surface *shell_surface, QWaylandWindow *window); ++ virtual ~QWaylandIviSurface(); ++ ++private: ++ virtual void ivi_surface_configure(int32_t width, int32_t height); ++ ++ QWaylandWindow *m_window; ++ ++ friend class QWaylandWindow; ++}; ++ ++} ++ ++QT_END_NAMESPACE ++ ++#endif // QWAYLANDIVISURFACE_H +diff --git a/src/plugins/shellintegration/shellintegration.pro b/src/plugins/shellintegration/shellintegration.pro +new file mode 100644 +index 0000000..7abd6cc +--- /dev/null ++++ b/src/plugins/shellintegration/shellintegration.pro +@@ -0,0 +1,3 @@ ++TEMPLATE=subdirs ++ ++SUBDIRS += ivi-shell +-- +1.8.3.1 diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch new file mode 100644 index 000000000..c91e11704 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch @@ -0,0 +1,56 @@ +From 8caaf802a8b42e9bb1d74fc335a571882c75d73e Mon Sep 17 00:00:00 2001 +From: Holger Behrens +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 +--- + 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 @@ + + + +- +- +- 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. +- +- +- +- +- +- +- +- 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]. +- +- +- ++ ++ ++ + + + +-- +2.2.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-Fix-multiple-QWindow.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-Fix-multiple-QWindow.patch new file mode 100644 index 000000000..177710516 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-Fix-multiple-QWindow.patch @@ -0,0 +1,62 @@ +From 23534d35587a8b62c945fef1adb29109e5c01bfa Mon Sep 17 00:00:00 2001 +From: Nobuhiko Tanibata +Date: Fri, 6 Nov 2015 09:59:48 +0900 +Subject: [PATCH 2/2] Fix multiple QWindow + +Signed-off-by: Nobuhiko Tanibata +--- + .../ivi-shell/qwaylandivishellintegration.cpp | 16 ++++++++++------ + .../ivi-shell/qwaylandivishellintegration.h | 1 + + 2 files changed, 11 insertions(+), 6 deletions(-) + +diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp +index 763fafb..c42f283 100644 +--- a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp ++++ b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp +@@ -58,6 +58,7 @@ namespace QtWaylandClient { + + QWaylandIviShellIntegration::QWaylandIviShellIntegration() + : m_iviApplication(Q_NULLPTR) ++ , m_surfaceId(0) + { + } + +@@ -79,15 +80,18 @@ QWaylandShellSurface *QWaylandIviShellIntegration::createShellSurface(QWaylandWi + if (!m_iviApplication) + return Q_NULLPTR; + +- uint32_t id = 0; +- QVariant value = window->property("IVI-Surface-ID"); +- if (value.isValid()) { +- id = value.toUInt(); ++ if (m_surfaceId == 0) { ++ QVariant value = window->property("IVI-Surface-ID"); ++ if (value.isValid()) { ++ m_surfaceId = value.toUInt(); ++ } else { ++ m_surfaceId = IVI_SURFACE_ID + getpid(); ++ } + } else { +- id = IVI_SURFACE_ID + getpid(); ++ m_surfaceId++; + } + +- struct ivi_surface *surface = m_iviApplication->surface_create(id, window->object()); ++ struct ivi_surface *surface = m_iviApplication->surface_create(m_surfaceId, window->object()); + + return new QWaylandIviSurface(surface, window); + } +diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h +index 4856ec6..1d10e91 100644 +--- a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h ++++ b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h +@@ -70,6 +70,7 @@ private: + + private: + QtWayland::ivi_application *m_iviApplication; ++ uint32_t m_surfaceId; + }; + + } +-- +1.8.3.1 diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch new file mode 100644 index 000000000..591ef71c5 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch @@ -0,0 +1,34 @@ +From 31c60aedf415fd06b5c1aa16fdcef1504b67b96d Mon Sep 17 00:00:00 2001 +From: Holger Behrens +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 +--- + src/client/qwaylandwindow.cpp | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index 45a58f2..781081a 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -100,7 +100,14 @@ QWaylandWindow::QWaylandWindow(QWindow *window) + + if (!(window->flags() & Qt::BypassWindowManagerHint)) { + if (mDisplay->shellIvi()) { +- mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(IVI_SURFACE_ID + getpid(), object()), this); ++ unsigned int id = 0; ++ QVariant value = window->property("IVI-Surface-ID"); ++ if (value.isValid()) { ++ id = value.toUInt(); ++ } else { ++ id = IVI_SURFACE_ID + getpid(); ++ } ++ mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(id, object()), this); + } else if (mDisplay->shellXdg()) { + if (window->type() & Qt::Window) { + mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this); +-- +2.2.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch new file mode 100644 index 000000000..39296c769 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch @@ -0,0 +1,33 @@ +Add qt5wayland.manifest. Removed specfile change from patch. + +Adapted from: + +From 424c23191d81b072255bd7f178ad0ee2c2ea091a Mon Sep 17 00:00:00 2001 +From: Tomasz Olszak +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 +--- + 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 @@ ++ ++ ++ ++ ++ +-- +1.9.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch new file mode 100644 index 000000000..6bea62621 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch @@ -0,0 +1,468 @@ +From 5cd43dc7519f54f9786fb6c686a2ce1e682d4366 Mon Sep 17 00:00:00 2001 +From: Philippe Coval +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 +Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/c2a22eea6716e073875474adf624d8463eba836c +Bug-Tizen: TIVI-3113/part +Signed-off-by: Philippe Coval +--- + 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 @@ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ This interface is implemented by servers that provide ++ desktop-style user interfaces. ++ ++ It allows clients to associate a xdg_surface with ++ a basic surface. ++ ++ ++ ++ ++ Use this enum to check the protocol version, and it will be updated ++ automatically. ++ ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ Create a shell surface for an existing surface. ++ ++ Only one shell or popup surface can be associated with a given ++ surface. ++ ++ ++ ++ ++ ++ ++ ++ Create a popup surface for an existing surface. ++ ++ Only one shell or popup surface can be associated with a given ++ surface. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ A client must respond to a ping event with a pong request or ++ the client may be deemed unresponsive. ++ ++ ++ ++ ++ ++ ++ Ping a client to check if it is receiving events and sending ++ requests. A client is expected to reply with a pong request. ++ ++ ++ ++ ++ ++ ++ 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). ++ ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 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). ++ ++ ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ Unset the surface fullscreen state. ++ ++ Same negotiation as set_fullscreen must be used. ++ ++ ++ ++ ++ ++ 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 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. ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ Unset the surface maximized state. ++ ++ Same negotiation as set_maximized must be used. ++ ++ ++ ++ ++ ++ Set the surface minimized state. ++ ++ Setting one state won't unset another state. ++ ++ ++ ++ ++ ++ The focused_set event is sent when this surface has been ++ activated. Window decorations should be updated accordingly. ++ ++ ++ ++ ++ ++ The focused_unset event is sent when this surface has been ++ deactivated, because another surface has been activated. Window ++ decorations should be updated accordingly. ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ A client must respond to a ping event with a pong request or ++ the client may be deemed unresponsive. ++ ++ ++ ++ ++ ++ ++ Ping a client to check if it is receiving events and sending ++ requests. A client is expected to reply with a pong request. ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ +-- +1.9.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch new file mode 100644 index 000000000..fe1bb50e8 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch @@ -0,0 +1,1029 @@ +From 0edba039247ce888dbb7ff0a93c7b9ec01bac46e Mon Sep 17 00:00:00 2001 +From: Philippe Coval +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 +Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/768484daaa64bea965bef981a16f59be8db0c190 +Bug-Tizen: TIVI-3113/part +Signed-off-by: Philippe Coval +--- + 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 ++#include + + #include + #include +@@ -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(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 + #include ++#include + + 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 inputDevices() const { return mInputDevices; } + QWaylandInputDevice *defaultInputDevice() const; +@@ -168,6 +171,7 @@ private: + QThread *mEventThread; + QWaylandEventThread *mEventThreadObject; + QScopedPointer mShell; ++ QScopedPointer mShellXdg; + QList mScreens; + QList mInputDevices; + QList 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 +- +-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(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(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(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 ++ ++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(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 ++ ++#include ++ ++#include ++#include ++#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 ++ ++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(&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(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 ++ ++#include ++ ++#include ++#include ++#include "qwaylandshellsurface_p.h" ++ ++QT_BEGIN_NAMESPACE ++ ++class QWaylandWindow; ++class QWaylandInputDevice; ++class QWindow; ++ ++class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgSurface : public QtWayland::xdg_surface ++ , public QWaylandShellSurface ++{ ++public: ++ QWaylandXdgSurface(struct ::xdg_surface *shell_surface, QWaylandWindow *window); ++ virtual ~QWaylandXdgSurface(); ++ ++ using QtWayland::xdg_surface::resize; ++ void resize(QWaylandInputDevice *inputDevice, enum resize_edge edges); ++ ++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE; ++ ++ using QtWayland::xdg_surface::move; ++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE; ++ ++ void setTitle(const QString &title) Q_DECL_OVERRIDE; ++ void setAppId(const QString &appId) Q_DECL_OVERRIDE; ++ ++ bool isFullscreen() const { return m_fullscreen; } ++ bool isMaximized() const { return m_maximized; } ++ ++private: ++ void setMaximized() Q_DECL_OVERRIDE; ++ void setFullscreen() Q_DECL_OVERRIDE; ++ void setNormal() Q_DECL_OVERRIDE; ++ void setMinimized() Q_DECL_OVERRIDE; ++ ++ void setTopLevel() Q_DECL_OVERRIDE; ++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE; ++ ++private: ++ QWaylandWindow *m_window; ++ bool m_maximized; ++ bool m_minimized; ++ bool m_fullscreen; ++ QSize m_size; ++ ++ void xdg_surface_ping(uint32_t serial) Q_DECL_OVERRIDE; ++ void xdg_surface_configure(uint32_t edges, ++ int32_t width, ++ int32_t height) Q_DECL_OVERRIDE; ++ friend class QWaylandWindow; ++}; ++ ++QT_END_NAMESPACE ++ ++#endif // QWAYLANDXDGSURFACE_H +-- +1.9.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch new file mode 100644 index 000000000..8f0425a76 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch @@ -0,0 +1,772 @@ +From c4219cca0febd7119e0bec776fdc2877b3448e0b Mon Sep 17 00:00:00 2001 +From: Philippe Coval +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 +Reviewed-by: Philippe Coval +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 @@ + + + +- 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. + +- ++ + + + + + +- 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. + + + +@@ -84,6 +87,28 @@ + + + ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ A client must respond to a ping event with a pong request or ++ the client may be deemed unresponsive. ++ ++ ++ + + + +@@ -124,6 +149,32 @@ + + + ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ + + + Set a short title for the surface. +@@ -150,22 +201,6 @@ + + + +- +- +- A client must respond to a ping event with a pong request or +- the client may be deemed unresponsive. +- +- +- +- +- +- +- Ping a client to check if it is receiving events and sending +- requests. A client is expected to reply with a pong request. +- +- +- +- + + + 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. + + +- + + + +@@ -250,128 +278,122 @@ + + + +- +- +- 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. +- +- +- +- +- +- 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. +- +- ++ ++ ++ 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. + +- +- +- 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 + +- ++ ++ A non-zero value indicates the surface is maximized. Otherwise, ++ the surface is unmaximized. ++ ++ ++ A non-zero value indicates the surface is fullscreen. Otherwise, ++ the surface is not fullscreen. ++ ++ + +- +- +- Unset the surface fullscreen 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. + ++ ++ ++ ++ This serial is so the client can know which change_state event corresponds ++ to which request_change_state request it sent out. ++ + + +- +- +- 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. ++ ++ ++ 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. + +- + +- +- +- 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. +- ++ ++ ++ + + +- +- +- 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. ++ ++ ++ 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. + ++ ++ ++ + + +- +- +- Unset the surface maximized state. +- +- Same negotiation as set_maximized must be used. ++ ++ ++ Minimize the surface. + + + +- +- +- Set the surface minimized state. +- +- Setting one state won't unset another state. ++ ++ ++ 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. + +- ++ + +- +- +- The focused_set event is sent when this surface has been +- activated. Window decorations should be updated accordingly. ++ ++ ++ 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. + + + +- +- +- The focused_unset event is sent when this surface has been +- deactivated, because another surface has been activated. Window +- decorations should be updated accordingly. ++ ++ ++ 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... + + + +@@ -409,22 +431,6 @@ + + + +- +- +- A client must respond to a ping event with a pong request or +- the client may be deemed unresponsive. +- +- +- +- +- +- +- Ping a client to check if it is receiving events and sending +- requests. A client is expected to reply with a pong request. +- +- +- +- + + + 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(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 inputDevices() const { return mInputDevices; } + QWaylandInputDevice *defaultInputDevice() const; +@@ -171,7 +172,7 @@ private: + QThread *mEventThread; + QWaylandEventThread *mEventThreadObject; + QScopedPointer mShell; +- QScopedPointer mShellXdg; ++ QScopedPointer mShellXdg; + QList mScreens; + QList mInputDevices; + QList 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: ++** 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 ++ ++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: ++** 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 ++ ++#include ++ ++#include ++#include ++#include "qwaylandshellsurface_p.h" ++ ++QT_BEGIN_NAMESPACE ++ ++class QWaylandWindow; ++class QWaylandInputDevice; ++class QWindow; ++ ++class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShell : public QtWayland::xdg_shell ++{ ++public: ++ QWaylandXdgShell(struct ::xdg_shell *shell); ++ QWaylandXdgShell(struct ::wl_registry *registry, uint32_t id); ++ ++ virtual ~QWaylandXdgShell(); ++ ++private: ++ void xdg_shell_ping(uint32_t serial) Q_DECL_OVERRIDE; ++}; ++ ++QT_END_NAMESPACE ++ ++#endif // QWAYLANDXDGSHELL_H +diff --git a/src/client/qwaylandxdgsurface.cpp b/src/client/qwaylandxdgsurface.cpp +index 1b8affa..5fb74d2 100644 +--- a/src/client/qwaylandxdgsurface.cpp ++++ b/src/client/qwaylandxdgsurface.cpp +@@ -87,23 +87,25 @@ void QWaylandXdgSurface::move(QWaylandInputDevice *inputDevice) + + void QWaylandXdgSurface::setMaximized() + { +- m_maximized = true; +- m_size = m_window->window()->geometry().size(); +- set_maximized(); ++ if (!m_maximized) ++ request_change_state(XDG_SURFACE_STATE_MAXIMIZED, true, 0); + } + + void QWaylandXdgSurface::setFullscreen() + { +- m_fullscreen = true; +- m_size = m_window->window()->geometry().size(); +- set_fullscreen(); ++ if (!m_fullscreen) ++ request_change_state(XDG_SURFACE_STATE_FULLSCREEN, true, 0); + } + + void QWaylandXdgSurface::setNormal() + { + if (m_fullscreen || m_maximized || m_minimized) { +- if (m_maximized) { unset_maximized(); } +- if (m_fullscreen) { unset_fullscreen(); } ++ if (m_maximized) { ++ request_change_state(XDG_SURFACE_STATE_MAXIMIZED, false, 0); ++ } ++ if (m_fullscreen) { ++ request_change_state(XDG_SURFACE_STATE_FULLSCREEN, false, 0); ++ } + + m_fullscreen = m_maximized = m_minimized = false; + setTopLevel(); +@@ -158,16 +160,48 @@ void QWaylandXdgSurface::setAppId(const QString & appId) + return QtWayland::xdg_surface::set_app_id(appId); + } + +-void QWaylandXdgSurface::xdg_surface_ping(uint32_t serial) ++void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height) + { +- pong(serial); ++ m_window->configure(0 , width, height); + } + +-void QWaylandXdgSurface::xdg_surface_configure(uint32_t edges, int32_t width, +- int32_t height) ++void QWaylandXdgSurface::xdg_surface_change_state(uint32_t state, ++ uint32_t value, ++ uint32_t serial) + { +- m_window->configure(edges, width, height); ++ ++ if (state == XDG_SURFACE_STATE_MAXIMIZED ++ || state == XDG_SURFACE_STATE_FULLSCREEN) { ++ if (value) { ++ m_size = m_window->window()->geometry().size(); ++ } else { ++ QMargins m = m_window->frameMargins(); ++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom()); ++ } ++ } ++ ++ switch (state) { ++ case XDG_SURFACE_STATE_MAXIMIZED: ++ m_maximized = value; ++ break; ++ case XDG_SURFACE_STATE_FULLSCREEN: ++ m_fullscreen = value; ++ break; ++ } ++ ++ xdg_surface_ack_change_state(object(), state, value, serial); + } + ++void QWaylandXdgSurface::xdg_surface_activated() ++{ ++} ++ ++void QWaylandXdgSurface::xdg_surface_deactivated() ++{ ++} ++ ++void QWaylandXdgSurface::xdg_surface_close() ++{ ++} + + QT_END_NAMESPACE +diff --git a/src/client/qwaylandxdgsurface_p.h b/src/client/qwaylandxdgsurface_p.h +index 744d3f3..d2a154e 100644 +--- a/src/client/qwaylandxdgsurface_p.h ++++ b/src/client/qwaylandxdgsurface_p.h +@@ -93,10 +93,15 @@ private: + bool m_fullscreen; + QSize m_size; + +- void xdg_surface_ping(uint32_t serial) Q_DECL_OVERRIDE; +- void xdg_surface_configure(uint32_t edges, +- int32_t width, ++ void xdg_surface_configure(int32_t width, + int32_t height) Q_DECL_OVERRIDE; ++ void xdg_surface_change_state(uint32_t state, ++ uint32_t value, ++ uint32_t serial) Q_DECL_OVERRIDE; ++ void xdg_surface_activated() Q_DECL_OVERRIDE; ++ void xdg_surface_deactivated() Q_DECL_OVERRIDE; ++ void xdg_surface_close() Q_DECL_OVERRIDE; ++ + friend class QWaylandWindow; + }; + +-- +1.9.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch new file mode 100644 index 000000000..413459fb6 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch @@ -0,0 +1,128 @@ +From b4f032b13338ad6c21024177b031c75063ef7493 Mon Sep 17 00:00:00 2001 +From: Manuel Bachmann +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 +--- + 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 @@ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ ++ This removes link from ivi_id to wl_surface and destroys ivi_surface. ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ ++ 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]. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ This interface is implemented by servers that provide desktop-style user interfaces. ++ It allows clients to associate a ivi_surface with a basic surface. ++ ++ ++ ++ ++ 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. ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +1.9.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0021-Implement-initial-IVI-Shell-support.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0021-Implement-initial-IVI-Shell-support.patch new file mode 100644 index 000000000..8723def26 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0021-Implement-initial-IVI-Shell-support.patch @@ -0,0 +1,539 @@ +From 1ddfa43692cabae0f552351cfbc09377e479471e Mon Sep 17 00:00:00 2001 +From: Manuel Bachmann +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 +--- + 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 + #include ++#include + + #include + #include +@@ -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(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 + #include + #include ++#include + + 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 inputDevices() const { return mInputDevices; } + QWaylandInputDevice *defaultInputDevice() const; +@@ -173,6 +177,7 @@ private: + QWaylandEventThread *mEventThreadObject; + QScopedPointer mShell; + QScopedPointer mShellXdg; ++ QScopedPointer mShellIvi; + QList mScreens; + QList mInputDevices; + QList 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: ++** 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 ++ ++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: ++** 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 ++ ++#include ++ ++#include ++#include ++#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 ++ ++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 ++ ++#include ++ ++#include ++#include ++#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 ++ + #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 + #include +@@ -95,7 +99,9 @@ QWaylandWindow::QWaylandWindow(QWindow *window) + mWindowId = id++; + + if (!(window->flags() & Qt::BypassWindowManagerHint)) { +- if (mDisplay->shellXdg()) { ++ if (mDisplay->shellIvi()) { ++ mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(IVI_SURFACE_ID + getpid(), object()), this); ++ } else if (mDisplay->shellXdg()) { + if (window->type() & Qt::Window) { + mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this); + } +-- +1.9.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0099_qtwayland_no_evdev.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0099_qtwayland_no_evdev.patch new file mode 100644 index 000000000..99b519399 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/0099_qtwayland_no_evdev.patch @@ -0,0 +1,14 @@ +diff --git a/tests/auto/compositor/compositor/compositor.pro b/tests/auto/compositor/compositor/compositor.pro +index f0cdaf32..64b60218 100644 +--- a/tests/auto/compositor/compositor/compositor.pro ++++ b/tests/auto/compositor/compositor/compositor.pro +@@ -7,9 +7,6 @@ QT += core-private gui-private waylandcompositor waylandcompositor-private + + QMAKE_USE += wayland-client wayland-server + +-qtConfig(xkbcommon-evdev): \ +- QMAKE_USE += xkbcommon_evdev +- + WAYLANDCLIENTSOURCES += \ + ../../../../src/3rdparty/protocol/xdg-shell.xml \ + ../../../../src/3rdparty/protocol/ivi-application.xml \ diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch new file mode 100644 index 000000000..bca61b5db --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch @@ -0,0 +1,31 @@ +From 9617c349a212d5407087daf4f4a2386bce94ecc1 Mon Sep 17 00:00:00 2001 +From: Philippe Coval +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 +--- + packaging/qt5-qtwayland.spec | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/packaging/qt5-qtwayland.spec b/packaging/qt5-qtwayland.spec +index cba18e2..ff32185 100644 +--- a/packaging/qt5-qtwayland.spec ++++ b/packaging/qt5-qtwayland.spec +@@ -97,6 +97,11 @@ rm -rf %{buildroot} + + %post + /sbin/ldconfig ++ ++f="/etc/profile.d/qt.sh" ++grep QT_WAYLAND_USE_XDG_SHELL $f \ ++ || echo "QT_WAYLAND_USE_XDG_SHELL='defined'; export QT_WAYLAND_USE_XDG_SHELL" >> $f ++ + %postun + /sbin/ldconfig + +-- +1.9.1 + diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch new file mode 100644 index 000000000..f113266e4 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland/disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch @@ -0,0 +1,12 @@ +Index: git/qtwayland.pro +=================================================================== +--- git.orig/qtwayland.pro 2014-09-18 12:01:23.883582734 +0300 ++++ git/qtwayland.pro 2014-09-18 12:05:49.743574961 +0300 +@@ -7,7 +7,6 @@ + qtCompileTest(egl) + qtCompileTest(brcm_egl) + qtCompileTest(glx) +-qtCompileTest(xcomposite) + qtCompileTest(drm_egl_server) + + load(qt_parts) diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwayland_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland_%.bbappend new file mode 100644 index 000000000..9807840ca --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwayland_%.bbappend @@ -0,0 +1,36 @@ +FILESEXTRAPATHS_append := ":${THISDIR}/${PN}" + +# QT_MODULE_BRANCH = "5.4" + +# TODO: +# These patches for IVI-SHELL are tempolary disabled because of issues. And new +# patches are proposed. +# +# file://0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch \ +# file://0021-Implement-initial-IVI-Shell-support.patch \ +# file://0001-protocol-update-3rd-party-ivi-application-protocol.patch \ +# file://0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch \ +# +# The xdg-shell merged into upstream, so we don't need these patch anymore. +# But xdg-shell doesn't work well in current AGL Distro because of +# mismatch of protocol versions between server(weston) and client(Qt Apps). +# +# file://0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch \ +# file://0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch \ +# file://0019-xdg-shell-upgrade-to-support-current-version-weston-.patch \ +# + +SRC_URI_append = "\ + file://0010-Added-manifest-file-according-to-smack-3-domain-mode.patch \ + " +SRC_URI_append_checkforkrogoth = "\ + file://disable_xcomposite_egl_qt_wayland_client_buffer_integration.patch \ + file://0001-Implement-initial-IVI-shell-support-with-shell-integ.patch \ + file://0002-Fix-multiple-QWindow.patch \ + " + + +DEPENDS_append_koelsch = " libegl gles-user-module" +DEPENDS_append_porter = " ${@base_conditional('PREFERRED_PROVIDER_virtual/egl', 'mesa', 'mesa', 'libegl gles-user-module', d)}" + +SRC_URI_append = " file://0099_qtwayland_no_evdev.patch " diff --git a/meta-agl-profile-demo/recipes-qt/qt5/qtwebkit_%.bbappend b/meta-agl-profile-demo/recipes-qt/qt5/qtwebkit_%.bbappend new file mode 100644 index 000000000..0420578e1 --- /dev/null +++ b/meta-agl-profile-demo/recipes-qt/qt5/qtwebkit_%.bbappend @@ -0,0 +1 @@ +PACKAGECONFIG = "gstreamer qtlocation qtmultimedia qtsensors" -- cgit 1.2.3-korg