summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* Fix popup positioningstablebaserock/v5.3.05.3Daniel Nicoletti2014-05-112-3/+2
| | | | | | | | | The popup coordinates were being stored in an unused variable and x,y offsets were left unmodified Change-Id: Idbae7127b65963be6ddbe165d98ac7daa92cac9f Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
* Fix QWaylandSurfaceItem to process hover eventsDaniel Nicoletti2014-04-302-0/+27
| | | | | | | | setAcceptHoverEvents was set to true but the methods to handle it werern't implemented Change-Id: I53719b00eac27b3b903a882fd2aa91fd6a51973e Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* build fix for MODULE_PLUGINS_TYPETomasz Olszak2014-04-1516-14/+17
| | | | | Change-Id: I8d44f50480440060eba84354e88fb2535e1d8e4a Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* Null check for window on pointer_axisrelease5.3.0Elvis Lee2014-04-071-0/+6
| | | | | | | | The window is already destroyed and server doesn't get a message yet. Change-Id: Ia9dd0ce891a712d1aa913fcb3313a5fe300788ab Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com> Reviewed-by: Robin Burchell <robin+qt@viroteck.net>
* Fix NPOT decoration texture bindingCedric Chedaleux2014-03-121-0/+4
| | | | | | | | If the context does not support the NPOTTextureRepeat (i.e. GL_OES_texture_npot extension), wrapping must be set to CLAMP_TO_EDGE to prevent invalid texture mapping. Change-Id: I3ededccc14a32188986529c14fa91161fb383cfc Reviewed-by: Jørgen Lind <jorgen.lind@digia.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* Make the compositor redraw when a surface gets a commit().Giulio Camuffo2014-03-113-1/+4
| | | | | | | | | | It must redraw, even if it doesn't actually redraw anything, irrespective of the fact that a attach/damage has come or not. Just calling frame();commit() is perfectly valid. Change-Id: If298654b8a7cb7c954cfbad8618f23134731cb9f Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com> Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* Flush the clients connection after sending the frame callbacksGiulio Camuffo2014-03-111-0/+1
| | | | | | | | We want to make sure the events reach the clients asap. Change-Id: I0783c6be4f4412fd5f3665faec1e57d141291ce7 Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com> Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* Take advantage of the Qt 5 plugin json structureJorgen Lind2014-03-1122-204/+61
| | | | | | | | | | | Also change naming scheme of plugins: buffer integrations doesn't start with "wayland-" but the platform plugins have to start with "wayland-". Also update the README Change-Id: I6dd2103ab287ed569ab06cfb6eb469e3db058831 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* Fixup for GLX integrationJorgen Lind2014-03-1113-24/+34
| | | | | Change-Id: I2de94481f7d3e109fdce7ca961f8969299cf5d9e Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* Make sure the frame callbacks are sent at the right timeGiulio Camuffo2014-03-114-3/+22
| | | | | | | | | | | | | | | | | | When there is a rendering thread, like with QtQuick compositors, there is a race condition where the frame callbacks are sent before the last buffer the client sent is released. Assume the following scenario: attach(B1)/frame(F1)/commit()...frame started...attach(B2)/frame(F2)/ commit()...frame finished. On frame finished the callback just installed is emitted before the buffer B2 is being used and B1 released. That forces the client to allocate a third buffer to draw the next frame. Now, do not send out the frame callbacks until a new frame started. The successive draw will release B1, use the new B2 and than send out F2. Change-Id: I5743c7baf9fdd3cde28c5f594ff646c06abb74b7 Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com> Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* Remove the buffer queue.Giulio Camuffo2014-03-118-100/+47
| | | | | | | | | | A client calling attach(A);commit();attach(B);commit() should result in its back buffer be set to B, and A be discarded. If the client wants to have a queue it should keep it client side or a protocol extension tailored for that purpose should be developed. Change-Id: Ia0048f311504d85821df9f5b9225887801efec71 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* Fix build breakLaszlo Agocs2014-03-111-1/+1
| | | | | | | Remove the removed argument from the EGL platform context constructor. Change-Id: I6203d07c356f7191a698d8d5bc958923cbdc2d96 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* Support changing the keymapGiulio Camuffo2014-03-104-9/+109
| | | | | | | | | This adds new API, but does not add a way for the user to set the keymap. That should be implemented in the compositors. Change-Id: I28ee7d372f8f578c0d7efb9223cabce49504be1f Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* Create the egl windows and context with the right configGiulio Camuffo2014-03-062-6/+6
| | | | | | | | | | The egl config should be calculated when creating the window, and the format of it should be set accordingly. The format of the window and the one of the context will then match if using the same format as input. Change-Id: Ie93735171d8945111a450263089e192919249b68 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* Change the minimum required Wayland version back to 1.2Giulio Camuffo2014-02-281-90/+15
| | | | | | | | | As discussed, Wayland 1.3 is not common in distributions yet, and that is a problem for the C.I. machines. Change-Id: Iec5c6d8ae1d1a50199f66d45ca9269694db78efe Reviewed-by: Andrew Knight <andrew.knight@digia.com> Reviewed-by: Robin Burchell <robin+qt@viroteck.net>
* Merge remote-tracking branch 'origin/dev' into stableOswald Buddenhagen2014-02-1956-271/+615
|\ | | | | | | | | | | | | Conflicts: src/compositor/wayland_wrapper/qwlsurface.cpp Change-Id: I3b6a4af41f272d3dc7fc920ba2542f2dd7978175
| * Making the buffer intgrations privateJorgen Lind2014-02-1132-158/+202
| | | | | | | | | | Change-Id: Ifb6e2456c781e80f84e27e68c3e279ea993f9307 Reviewed-by: Andy Nichols <andy.nichols@digia.com>
| * Cleanup extension and hw integration initializationJorgen Lind2014-02-113-36/+33
| | | | | | | | | | Change-Id: I84dc6581b93c213c88762dc3477b8f932d08519b Reviewed-by: Andy Nichols <andy.nichols@digia.com>
| * Fix connections in QWaylandSurfaceItemJorgen Lind2014-02-111-11/+10
| | | | | | | | | | Change-Id: I59a09b8725f7ba86bf273d5cce6fcc1f5c153840 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
| * Surface::currentSurfaceBuffer can be 0Jorgen Lind2014-02-111-1/+1
| | | | | | | | | | Change-Id: I107f74dbabb5d8192d44f3f76dc38852928847b9 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
| * Provide "kde" in the themeNamesMartin Gräßlin2014-02-071-3/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | KDE would like to get its integration plugin on Wayland. The name won't change for Wayland, so filtering it out because it is the name of the X11 desktop environment is wrong. The patch follows the approach of the QGenericUnixTheme. Change-Id: Ia9c253ae6b5d609bd3bc630ce5c36b89811b079a Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com> Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
| * Merge remote-tracking branch 'origin/stable' into devAndy Nichols2014-02-0446-629/+377
| |\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/client/hardwareintegration/qwaylandclientbufferintegrationplugin_p.h src/client/hardwareintegration/qwaylandserverbufferintegrationplugin_p.h src/compositor/hardware_integration/qwaylandclientbufferintegrationplugin.h src/compositor/hardware_integration/qwaylandserverbufferintegrationplugin.h src/plugins/hardwareintegration/client/brcm-egl/main.cpp src/plugins/hardwareintegration/client/drm-egl-server/main.cpp src/plugins/hardwareintegration/client/wayland-egl/main.cpp src/plugins/hardwareintegration/client/xcomposite-egl/main.cpp src/plugins/hardwareintegration/client/xcomposite-glx/main.cpp src/plugins/hardwareintegration/compositor/brcm-egl/main.cpp src/plugins/hardwareintegration/compositor/drm-egl-server/main.cpp src/plugins/hardwareintegration/compositor/wayland-egl/main.cpp src/plugins/hardwareintegration/compositor/xcomposite-egl/main.cpp src/plugins/hardwareintegration/compositor/xcomposite-glx/main.cpp Change-Id: I9a9b418075970dd334babc3590b9b0315c2afb0d
| * | Add the A8 MESA for mat patch for the Mesa v.10 branchJorgen Lind2014-02-032-0/+87
| | | | | | | | | | | | | | | Change-Id: I771e0478e274ef7cfabb417c9712d4dbb4d62f5b Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
| * | Fix compiler warnings because of deprecated apisJorgen Lind2014-01-176-19/+29
| | | | | | | | | | | | | | | Change-Id: I60faee3fb4b9a74a13c8489a5dd1df7a2a5a4ae4 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
| * | Update the required wayland version to 1.3Jorgen Lind2014-01-171-31/+221
| | | | | | | | | | | | | | | Change-Id: Id1c9d14061d513f6c37a59ed8161732366ab3526 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
| * | Fixup plugin interface versioningJorgen Lind2014-01-109-9/+9
| | | | | | | | | | | | | | | Change-Id: Ia4ab692fde0dee9224c9c0e3204cfee56144b50f Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
| * | Merge remote-tracking branch stable into devAndy Nichols2014-01-09282-3321/+10205
| |\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf src/compositor/hardware_integration/qwaylandclientbufferintegrationplugin.h src/plugins/hardwareintegration/compositor/brcm-egl/main.cpp src/plugins/hardwareintegration/compositor/wayland-egl/main.cpp src/plugins/hardwareintegration/compositor/xcomposite-egl/main.cpp src/plugins/hardwareintegration/compositor/xcomposite-glx/main.cpp src/plugins/platforms/qwayland-brcm-egl/main.cpp src/plugins/platforms/qwayland-egl/main.cpp src/plugins/platforms/qwayland-generic/main.cpp src/plugins/platforms/qwayland-xcomposite-egl/main.cpp src/plugins/platforms/qwayland-xcomposite-glx/main.cpp Change-Id: I957c9bee893a9e19fc8c93f0e51292007fb3a4a8
| * | | Bump version to 5.3Pier Luigi Fiorini2013-11-1510-10/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Follow Qt version in the dev branch which is now 5.3. Change-Id: Ib10a39cf8cc43dbbc7113d2ca06a9404d7b23a1e Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
| * | | Wayland platform: Do not claim threaded GL support in xcomposite-glxLaszlo Agocs2013-09-111-1/+1
| | | | | | | | | | | | | | | | | | | | Change-Id: Ie650bf0b4c243080d8f6173b9e299eb70afc8f90 Reviewed-by: Andy Nichols <andy.nichols@digia.com>
| * | | Wayland platform: Fix xcomposite backends not to hang after the first GL frameLaszlo Agocs2013-09-116-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | attach() needs to be called from swapBuffers(), not just once from createSurface(). Change-Id: I8545c1a16179d9e78ae45c0532c89a6298820aa4 Reviewed-by: Andy Nichols <andy.nichols@digia.com>
| * | | Wayland platform: Fix xcomposite-glx for GL apps on Qt 5.2Laszlo Agocs2013-09-111-2/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The surface format was not set properly in the client side integration, leading to mysterious errors e.g. in shader compilation. Change-Id: Id5913def1d82970680d71832ac5fadf87e0956c2 Reviewed-by: Andy Nichols <andy.nichols@digia.com>
| * | | Update to work with Qt 5.2Andy Nichols2013-09-1010-10/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Change-Id: Ide081251b32ade32d552fc949e10a518ff0fa89a Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com> Reviewed-by: Jan Arne Petersen <jan.petersen@kdab.com>
* | | | Strip custom prefix from interface namePier Luigi Fiorini2014-02-091-9/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Interface names for some protocols might not start with wl_ or qt_, with this change users can specify a prefix of their liking. Change-Id: I70d40985165c49114b525bdec2a872aa5b0dad6d Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | | Fix build with Wayland <= 1.1Giulio Camuffo2014-02-091-0/+9
| | | | | | | | | | | | | | | | | | | | Change-Id: Idd12c0db73203daa008d93c0dc8053e25dff09e2 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | | Improve the frame callbacks handlingGiulio Camuffo2014-02-058-47/+73
| |_|/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Improve the way wl_surface's frame callbacks are handled. The sooner they are sent the better is for the clients, as they have more time to render the next frame, but reducing the time for the compositor to render its frame. The best compromise is probably to send them out after the compositor has issued its GL calls but before calling eglSwapBuffers(), and before the GPU actually draws anything. Rename the function to send the callbacks to only reflect its purpose, leaving the compositors free to choose when they want to send them. Change-Id: Ifcdfcad9e54b4d07d5c087898123ac724395a194 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | Fix the client behavior when showing or hiding a surfaceGiulio Camuffo2014-02-041-5/+2
| | | | | | | | | | | | | | | | | | | | | Reduce the chances of seeing a bad frame. Change-Id: Idac3450d92210fc5fc33cb68862b089964c9a8ce Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | init mTouchDevice to nullShawn Rutledge2014-02-031-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | Since QWaylandInputDevice::seat_capabilities checks the pointer before creating this object, it must be initially null so that the device will be registered. Change-Id: Ia15b407b1636eab41c04f30bb631306095e5aefb Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* | | Normalize signal & slot signatures in connectionThiago Macieira2014-02-031-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | Profiling shows Qt Creator spends 2% of its load time normalizing Change-Id: I48937197efac2ea93571f616ed4e94551540bd5d Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> Reviewed-by: Robin Burchell <robin+qt@viroteck.net>
* | | fix compile with Mesa 10.0Clemens Buchacher2014-01-291-6/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Mesa 10.0 replaces struct wl_buffer with struct wl_resource in the eglQueryWaylandBufferWL signature. The structures are binary compatible (struct wl_buffer is a superset of struct wl_resource), but C++ complains about the type mismatch: error: cannot convert ‘wl_buffer*’ to ‘wl_resource*’ in argument passing We are already using struct wl_resource on our side, so removing the now redundant reinterpret_cast would fix it. But then we could not compile with Mesa versions older than 10.0 any more, and those are still common in mainstream distributions today. A compile-time switch for different Mesa versions is possible, but unnecessarily clumsy. Instead, re-declare the new signature and use that independently of the Mesa version. The duplicate declaration can be removed when backwards compatibility is no longer needed. Change-Id: I3d0e326f5a0eb88d125b8c9fd23147682e23b94b Reviewed-by: Robin Burchell <robin+qt@viroteck.net>
* | | Support that clients queue up more than three buffers.Mikko Harju2014-01-282-8/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Though it is wrongful behavior on the clients part, a client should not be allowed to crash the compositor simply by posting it an extra buffer. Change-Id: Ia8ba0bbfc63273b0af13b81fbb9a74328289face Reviewed-by: Michael Brasser <michael.brasser@live.com> Reviewed-by: Robin Burchell <robin+qt@viroteck.net> Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | Don't clobber the m_damaged state during rendering.Gunnar Sletta2014-01-245-193/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the QWaylandSurfaceNode had m_damage during preprocess() (which it could get if the GUI thread got a surfaceDamaged) it would call into the item, update its texture and clear its m_damaged state. This resulted in that the next time we advanced the buffer queue, the item would not have m_damaged set and as a result, the texture would not be updated. Also, the call from preprocess() to updateTexture, though protected by a mutex in preprocess(), touched a number of variables on the GUI thread which were not being protected there, such as m_damaged and smooth(). The QWaylandSurfaceNode was doing this primarily to deal with direct rendering which has been removed pending a better solution, so we replace its use with the built-in QSGSimpleTextureNode. Change-Id: Ifccb6b1149980b4796a182fa8525446a00bbe57f Reviewed-by: Robin Burchell <robin+qt@viroteck.net> Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | Add a separate variable to keep track of surface mapping.Michael Brasser2014-01-242-3/+8
| | | | | | | | | | | | | | | | | | | | | | | | Mapping a surface should not override a "paintEnabled: false" in the QML. Change-Id: Ib28499c24f34fead80e9f9ad0bbe9d72da5e1e9e Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | Allow resizing the Qt window after the buffers swapGiulio Camuffo2014-01-223-8/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some EGL implementations resize the EGL buffers after eglSwapBuffers, so we need to send the geometry change event after the swap, or else the Qt window size and the physical buffer size will be different to each other. Do not force this behavior though, but use it only when the QT_WAYLAND_RESIZE_AFTER_SWAP environment variable is set. Change-Id: I79e39442b3010c563a81d7c94e747a982e158fc1 Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
* | | Removed directrender/pageflipper codepaths.Gunnar Sletta2014-01-2110-122/+11
| | | | | | | | | | | | | | | | | | | | | Change-Id: I770b79eb21fbc4ac7826cec5c47286dab6c74da5 Reviewed-by: Robin Burchell <robin+qt@viroteck.net> Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com> Reviewed-by: Andy Nichols <andy.nichols@digia.com>
* | | Fix buffer handling.Gunnar Sletta2014-01-2111-160/+148
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The surface now has a distinct back and front buffer. Front means it is on the screen and being used as a texture. Back means it should be put to screen in the next updatePaintNode(). For the purpose of QML and GUI-thread properties, the 'back' buffer is what contains the correct properties as it is what it will eventually be rendered with. For the purpose of rendering, the front buffer contains the right texture. If no back buffer is present, then there was no changes and front buffer applies to both. The Surface's buffer queue has been updated to only fire damage and advance once we swap back buffer to front buffer which happens during updatePaintNode(). The fact that the buffer advancing happens during sync also means that we are releasing buffers back to the client as soon as another buffer is ready to be displayed in the compositor. This is "half a frame" earlier than the current implementation (which releases after the next swap). We consider this safe because: - The compositor has a new buffer to display and does not need the old one. - If the GPU is not done rasterizing the scanout buffer for the previous frame, it should hold a read-lock on the buffer so preventing the client from starting a render to it. If this assumption fails on any hardware we can make the time of buffer-advance optional. Either during "sync" or during "after rendering" as it is today, but "after rendering" will not offer any guarantee, just more time, resulting in a higher chance of the buffers being ready. Aka, without an internal read-lock and no fence mechanism, there is no guarantee. Texture cleanup is now explicit as we have a well defined location to clean up textures, during updatePaintNode(). This avoids cleanup issues which previously existed as buffer cleanup was happening on the GUI thread. Surface and Buffer destruction coming over wayland is queued up in compositor and handled before the next "sync", when it is safe to do so. The change also removes doUpdate, postBuffer and frameSwappedInternal as these are no longer used. Direct rendering will need to be considered in a new light with the new buffering scheme, and anyway needs work. Change-Id: I2db0385b4b8859f96caba374f3530448178e1473 Reviewed-by: Robin Burchell <robin+qt@viroteck.net> Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* | | Fixup the iid versions for the pluginsJorgen Lind2014-01-2014-14/+14
| | | | | | | | | | | | | | | Change-Id: Iac1b8b070d3bf87b29d0be9a2a76fd56e7046f0f Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* | | Fix some typosLaszlo Agocs2014-01-161-2/+2
| | | | | | | | | | | | | | | Change-Id: I5c734561c0c13192acd9ffd590eb2e8eeb3ca4e1 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | Fix brcm keysLaszlo Agocs2014-01-161-2/+2
| | | | | | | | | | | | | | | | | | | | | Did not match the key used in the plugin metadata. Change-Id: I58cf08c684b33d8d7166a074dbafb4187b010498 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | Send the globals to new listenersLaszlo Agocs2014-01-162-8/+32
| | | | | | | | | | | | | | | Change-Id: I8d2a74cdc305fb086f3b5c63d0abe4c46c40bbde Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* | | Fix pkgconfig for brcm-egl hw integrationLaszlo Agocs2014-01-152-1/+14
| | | | | | | | | | | | | | | Change-Id: I092eaebad40785a68c0c9c22201c9e2d39666ea9 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>